Mercurial > hg > orthanc
diff OrthancFramework/Sources/DicomParsing/ParsedDicomFile.cpp @ 4203:4d42408da117
improving const-correctness in ParsedDicomFile
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 17 Sep 2020 15:01:31 +0200 |
parents | 7112a8af0b63 |
children | afad57ac30ef |
line wrap: on
line diff
--- a/OrthancFramework/Sources/DicomParsing/ParsedDicomFile.cpp Thu Sep 17 08:35:11 2020 +0200 +++ b/OrthancFramework/Sources/DicomParsing/ParsedDicomFile.cpp Thu Sep 17 15:01:31 2020 +0200 @@ -72,6 +72,7 @@ #include "FromDcmtkBridge.h" #include "Internals/DicomFrameIndex.h" +#include "Internals/DicomImageDecoder.h" #include "ToDcmtkBridge.h" #include "../Images/PamReader.h" @@ -442,10 +443,10 @@ #if ORTHANC_ENABLE_CIVETWEB == 1 || ORTHANC_ENABLE_MONGOOSE == 1 void ParsedDicomFile::SendPathValue(RestApiOutput& output, - const UriComponents& uri) + const UriComponents& uri) const { - DcmItem* dicom = GetDcmtkObject().getDataset(); - E_TransferSyntax transferSyntax = GetDcmtkObject().getDataset()->getCurrentXfer(); + DcmItem* dicom = GetDcmtkObjectConst().getDataset(); + E_TransferSyntax transferSyntax = GetDcmtkObjectConst().getDataset()->getCurrentXfer(); // Special case: Accessing the pixel data if (uri.size() == 1 || @@ -853,10 +854,10 @@ #if ORTHANC_ENABLE_CIVETWEB == 1 || ORTHANC_ENABLE_MONGOOSE == 1 - void ParsedDicomFile::Answer(RestApiOutput& output) + void ParsedDicomFile::Answer(RestApiOutput& output) const { std::string serialized; - if (FromDcmtkBridge::SaveToMemoryBuffer(serialized, *GetDcmtkObject().getDataset())) + if (FromDcmtkBridge::SaveToMemoryBuffer(serialized, *GetDcmtkObjectConst().getDataset())) { output.AnswerBuffer(serialized, MimeType_Dicom); } @@ -865,10 +866,10 @@ bool ParsedDicomFile::GetTagValue(std::string& value, - const DicomTag& tag) + const DicomTag& tag) const { DcmTagKey k(tag.GetGroup(), tag.GetElement()); - DcmDataset& dataset = *GetDcmtkObject().getDataset(); + DcmDataset& dataset = *GetDcmtkObjectConst().getDataset(); if (tag.IsPrivate() || FromDcmtkBridge::IsUnknownTag(tag) || @@ -930,7 +931,7 @@ } - DicomInstanceHasher ParsedDicomFile::GetHasher() + DicomInstanceHasher ParsedDicomFile::GetHasher() const { std::string patientId, studyUid, seriesUid, instanceUid; @@ -1107,7 +1108,7 @@ bool keepSopInstanceUid) : pimpl_(new PImpl) { - pimpl_->file_.reset(dynamic_cast<DcmFileFormat*>(other.GetDcmtkObject().clone())); + pimpl_->file_.reset(dynamic_cast<DcmFileFormat*>(other.GetDcmtkObjectConst().clone())); if (!keepSopInstanceUid) { @@ -1135,7 +1136,7 @@ } - DcmFileFormat& ParsedDicomFile::GetDcmtkObject() const + DcmFileFormat& ParsedDicomFile::GetDcmtkObjectConst() const { if (pimpl_->file_.get() == NULL) { @@ -1164,7 +1165,7 @@ } - ParsedDicomFile* ParsedDicomFile::Clone(bool keepSopInstanceUid) + ParsedDicomFile* ParsedDicomFile::Clone(bool keepSopInstanceUid) const { return new ParsedDicomFile(*this, keepSopInstanceUid); } @@ -1403,7 +1404,7 @@ Encoding ParsedDicomFile::DetectEncoding(bool& hasCodeExtensions) const { return FromDcmtkBridge::DetectEncoding(hasCodeExtensions, - *GetDcmtkObject().getDataset(), + *GetDcmtkObjectConst().getDataset(), GetDefaultDicomEncoding()); } @@ -1424,10 +1425,10 @@ void ParsedDicomFile::DatasetToJson(Json::Value& target, DicomToJsonFormat format, DicomToJsonFlags flags, - unsigned int maxStringLength) + unsigned int maxStringLength) const { std::set<DicomTag> ignoreTagLength; - FromDcmtkBridge::ExtractDicomAsJson(target, *GetDcmtkObject().getDataset(), + FromDcmtkBridge::ExtractDicomAsJson(target, *GetDcmtkObjectConst().getDataset(), format, flags, maxStringLength, ignoreTagLength); } @@ -1436,24 +1437,24 @@ DicomToJsonFormat format, DicomToJsonFlags flags, unsigned int maxStringLength, - const std::set<DicomTag>& ignoreTagLength) + const std::set<DicomTag>& ignoreTagLength) const { - FromDcmtkBridge::ExtractDicomAsJson(target, *GetDcmtkObject().getDataset(), + FromDcmtkBridge::ExtractDicomAsJson(target, *GetDcmtkObjectConst().getDataset(), format, flags, maxStringLength, ignoreTagLength); } void ParsedDicomFile::HeaderToJson(Json::Value& target, - DicomToJsonFormat format) + DicomToJsonFormat format) const { - FromDcmtkBridge::ExtractHeaderAsJson(target, *GetDcmtkObject().getMetaInfo(), format, DicomToJsonFlags_None, 0); + FromDcmtkBridge::ExtractHeaderAsJson(target, *GetDcmtkObjectConst().getMetaInfo(), format, DicomToJsonFlags_None, 0); } bool ParsedDicomFile::HasTag(const DicomTag& tag) const { DcmTag key(tag.GetGroup(), tag.GetElement()); - return GetDcmtkObject().getDataset()->tagExists(key); + return GetDcmtkObjectConst().getDataset()->tagExists(key); } @@ -1505,7 +1506,7 @@ } - bool ParsedDicomFile::ExtractPdf(std::string& pdf) + bool ParsedDicomFile::ExtractPdf(std::string& pdf) const { std::string sop, mime; @@ -1582,18 +1583,18 @@ void ParsedDicomFile::GetRawFrame(std::string& target, MimeType& mime, - unsigned int frameId) + unsigned int frameId) const { if (pimpl_->frameIndex_.get() == NULL) { assert(pimpl_->file_ != NULL && - GetDcmtkObject().getDataset() != NULL); - pimpl_->frameIndex_.reset(new DicomFrameIndex(*GetDcmtkObject().getDataset())); + GetDcmtkObjectConst().getDataset() != NULL); + pimpl_->frameIndex_.reset(new DicomFrameIndex(*GetDcmtkObjectConst().getDataset())); } pimpl_->frameIndex_->GetRawFrame(target, frameId); - E_TransferSyntax transferSyntax = GetDcmtkObject().getDataset()->getCurrentXfer(); + E_TransferSyntax transferSyntax = GetDcmtkObjectConst().getDataset()->getCurrentXfer(); switch (transferSyntax) { case EXS_JPEGProcess1: @@ -1621,8 +1622,8 @@ unsigned int ParsedDicomFile::GetFramesCount() const { assert(pimpl_->file_ != NULL && - GetDcmtkObject().getDataset() != NULL); - return DicomFrameIndex::GetFramesCount(*GetDcmtkObject().getDataset()); + GetDcmtkObjectConst().getDataset() != NULL); + return DicomFrameIndex::GetFramesCount(*GetDcmtkObjectConst().getDataset()); } @@ -1643,7 +1644,7 @@ unsigned int maxTagLength) const { std::set<DicomTag> ignoreTagLength; - FromDcmtkBridge::ExtractDicomSummary(target, *GetDcmtkObject().getDataset(), + FromDcmtkBridge::ExtractDicomSummary(target, *GetDcmtkObjectConst().getDataset(), maxTagLength, ignoreTagLength); } @@ -1652,12 +1653,12 @@ unsigned int maxTagLength, const std::set<DicomTag>& ignoreTagLength) const { - FromDcmtkBridge::ExtractDicomSummary(target, *GetDcmtkObject().getDataset(), + FromDcmtkBridge::ExtractDicomSummary(target, *GetDcmtkObjectConst().getDataset(), maxTagLength, ignoreTagLength); } - bool ParsedDicomFile::LookupTransferSyntax(std::string& result) + bool ParsedDicomFile::LookupTransferSyntax(std::string& result) const { #if 0 // This was the implementation in Orthanc <= 1.6.1 @@ -1666,8 +1667,8 @@ // using the meta header? const char* value = NULL; - if (GetDcmtkObject().getMetaInfo() != NULL && - GetDcmtkObject().getMetaInfo()->findAndGetString(DCM_TransferSyntaxUID, value).good() && + if (GetDcmtkObjectConst().getMetaInfo() != NULL && + GetDcmtkObjectConst().getMetaInfo()->findAndGetString(DCM_TransferSyntaxUID, value).good() && value != NULL) { result.assign(value); @@ -1679,7 +1680,7 @@ } #else DicomTransferSyntax s; - if (FromDcmtkBridge::LookupOrthancTransferSyntax(s, GetDcmtkObject())) + if (FromDcmtkBridge::LookupOrthancTransferSyntax(s, GetDcmtkObjectConst())) { result.assign(GetTransferSyntaxUid(s)); return true; @@ -1697,7 +1698,7 @@ DcmTagKey k(DICOM_TAG_PHOTOMETRIC_INTERPRETATION.GetGroup(), DICOM_TAG_PHOTOMETRIC_INTERPRETATION.GetElement()); - DcmDataset& dataset = *GetDcmtkObject().getDataset(); + DcmDataset& dataset = *GetDcmtkObjectConst().getDataset(); const char *c = NULL; if (dataset.findAndGetString(k, c).good() && @@ -1713,8 +1714,21 @@ } - void ParsedDicomFile::Apply(ITagVisitor& visitor) + void ParsedDicomFile::Apply(ITagVisitor& visitor) const + { + FromDcmtkBridge::Apply(*GetDcmtkObjectConst().getDataset(), visitor, GetDefaultDicomEncoding()); + } + + + ImageAccessor* ParsedDicomFile::DecodeFrame(unsigned int frame) const { - FromDcmtkBridge::Apply(*GetDcmtkObject().getDataset(), visitor, GetDefaultDicomEncoding()); + if (GetDcmtkObjectConst().getDataset() == NULL) + { + throw OrthancException(ErrorCode_InternalError); + } + else + { + return DicomImageDecoder::Decode(*GetDcmtkObjectConst().getDataset(), frame); + } } }