Mercurial > hg > orthanc
diff OrthancServer/Search/HierarchicalMatcher.cpp @ 3217:cf8cbeb35f33
preliminary support of Korean character set
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 13 Feb 2019 17:46:12 +0100 |
parents | 1b05fd072c57 |
children | 94f4a18a79cc |
line wrap: on
line diff
--- a/OrthancServer/Search/HierarchicalMatcher.cpp Tue Feb 12 17:27:33 2019 +0100 +++ b/OrthancServer/Search/HierarchicalMatcher.cpp Wed Feb 13 17:46:12 2019 +0100 @@ -53,7 +53,9 @@ caseSensitivePN = lock.GetConfiguration().GetBooleanParameter("CaseSensitivePN", false); } - Setup(*query.GetDcmtkObject().getDataset(), caseSensitivePN, query.GetEncoding()); + bool hasCodeExtensions; + Encoding encoding = query.DetectEncoding(hasCodeExtensions); + Setup(*query.GetDcmtkObject().getDataset(), caseSensitivePN, encoding, hasCodeExtensions); } @@ -72,7 +74,8 @@ void HierarchicalMatcher::Setup(DcmItem& dataset, bool caseSensitivePN, - Encoding encoding) + Encoding encoding, + bool hasCodeExtensions) { for (unsigned long i = 0; i < dataset.card(); i++) { @@ -108,7 +111,7 @@ } else if (sequence.card() == 1) { - sequences_[tag] = new HierarchicalMatcher(*sequence.getItem(0), caseSensitivePN, encoding); + sequences_[tag] = new HierarchicalMatcher(*sequence.getItem(0), caseSensitivePN, encoding, hasCodeExtensions); } else { @@ -122,7 +125,7 @@ std::set<DicomTag> ignoreTagLength; std::auto_ptr<DicomValue> value(FromDcmtkBridge::ConvertLeafElement (*element, DicomToJsonFlags_None, - 0, encoding, ignoreTagLength)); + 0, encoding, hasCodeExtensions, ignoreTagLength)); // WARNING: Also modify "DatabaseLookup::IsMatch()" if modifying this code if (value.get() == NULL || @@ -197,15 +200,19 @@ bool HierarchicalMatcher::Match(ParsedDicomFile& dicom) const { + bool hasCodeExtensions; + Encoding encoding = dicom.DetectEncoding(hasCodeExtensions); + return MatchInternal(*dicom.GetDcmtkObject().getDataset(), - dicom.GetEncoding()); + encoding, hasCodeExtensions); } bool HierarchicalMatcher::MatchInternal(DcmItem& item, - Encoding encoding) const + Encoding encoding, + bool hasCodeExtensions) const { - if (!flatConstraints_.IsMatch(item, encoding)) + if (!flatConstraints_.IsMatch(item, encoding, hasCodeExtensions)) { return false; } @@ -228,7 +235,7 @@ for (unsigned long i = 0; i < sequence->card(); i++) { - if (it->second->MatchInternal(*sequence->getItem(i), encoding)) + if (it->second->MatchInternal(*sequence->getItem(i), encoding, hasCodeExtensions)) { match = true; break; @@ -247,7 +254,8 @@ DcmDataset* HierarchicalMatcher::ExtractInternal(DcmItem& source, - Encoding encoding) const + Encoding encoding, + bool hasCodeExtensions) const { std::auto_ptr<DcmDataset> target(new DcmDataset); @@ -283,13 +291,13 @@ { cloned->append(new DcmItem(*sequence->getItem(i))); } - else if (it->second->MatchInternal(*sequence->getItem(i), encoding)) // TODO Might be optimized + else if (it->second->MatchInternal(*sequence->getItem(i), encoding, hasCodeExtensions)) // TODO Might be optimized { // It is necessary to encapsulate the child dataset into a // "DcmItem" object before it can be included in a // sequence. Otherwise, "dciodvfy" reports an error "Bad // tag in sequence - Expecting Item or Sequence Delimiter." - std::auto_ptr<DcmDataset> child(it->second->ExtractInternal(*sequence->getItem(i), encoding)); + std::auto_ptr<DcmDataset> child(it->second->ExtractInternal(*sequence->getItem(i), encoding, hasCodeExtensions)); cloned->append(new DcmItem(*child)); } } @@ -304,11 +312,14 @@ ParsedDicomFile* HierarchicalMatcher::Extract(ParsedDicomFile& dicom) const { + bool hasCodeExtensions; + Encoding encoding = dicom.DetectEncoding(hasCodeExtensions); + std::auto_ptr<DcmDataset> dataset(ExtractInternal(*dicom.GetDcmtkObject().getDataset(), - dicom.GetEncoding())); + encoding, hasCodeExtensions)); std::auto_ptr<ParsedDicomFile> result(new ParsedDicomFile(*dataset)); - result->SetEncoding(dicom.GetEncoding()); + result->SetEncoding(encoding); return result.release(); }