# HG changeset patch # User Sebastien Jodogne # Date 1447859488 -3600 # Node ID 6a2d507ef06453d8cb8981b2064c3e1603c8638b # Parent 1b1d5470233f698ff823fe0d96ada6ffc20edda0 getting rid of opaque data structures diff -r 1b1d5470233f -r 6a2d507ef064 OrthancServer/DicomDirWriter.cpp --- a/OrthancServer/DicomDirWriter.cpp Wed Nov 18 15:50:32 2015 +0100 +++ b/OrthancServer/DicomDirWriter.cpp Wed Nov 18 16:11:28 2015 +0100 @@ -527,7 +527,7 @@ path = directory + '\\' + filename; } - DcmFileFormat& fileFormat = *reinterpret_cast(dicom.GetDcmtkObject()); + DcmFileFormat& fileFormat = dicom.GetDcmtkObject(); DcmDirectoryRecord* instance; bool isNewInstance = pimpl_->CreateResource(instance, ResourceType_Instance, fileFormat, filename.c_str(), path.c_str()); diff -r 1b1d5470233f -r 6a2d507ef064 OrthancServer/DicomInstanceToStore.cpp --- a/OrthancServer/DicomInstanceToStore.cpp Wed Nov 18 15:50:32 2015 +0100 +++ b/OrthancServer/DicomInstanceToStore.cpp Wed Nov 18 16:11:28 2015 +0100 @@ -41,12 +41,6 @@ namespace Orthanc { - static DcmDataset& GetDataset(ParsedDicomFile& file) - { - return *reinterpret_cast(file.GetDcmtkObject())->getDataset(); - } - - void DicomInstanceToStore::AddMetadata(ResourceType level, MetadataType metadata, const std::string& value) @@ -75,7 +69,8 @@ { // Serialize the parsed DICOM file buffer_.Allocate(); - if (!FromDcmtkBridge::SaveToMemoryBuffer(buffer_.GetContent(), GetDataset(parsed_.GetContent()))) + if (!FromDcmtkBridge::SaveToMemoryBuffer(buffer_.GetContent(), + *parsed_.GetContent().GetDcmtkObject().getDataset())) { LOG(ERROR) << "Unable to serialize a DICOM file to a memory buffer"; throw OrthancException(ErrorCode_InternalError); @@ -103,13 +98,15 @@ if (!summary_.HasContent()) { summary_.Allocate(); - FromDcmtkBridge::Convert(summary_.GetContent(), GetDataset(parsed_.GetContent())); + FromDcmtkBridge::Convert(summary_.GetContent(), + *parsed_.GetContent().GetDcmtkObject().getDataset()); } if (!json_.HasContent()) { json_.Allocate(); - FromDcmtkBridge::ToJson(json_.GetContent(), GetDataset(parsed_.GetContent()), + FromDcmtkBridge::ToJson(json_.GetContent(), + *parsed_.GetContent().GetDcmtkObject().getDataset(), DicomToJsonFormat_Full, DicomToJsonFlags_Default, 256 /* max string length */); diff -r 1b1d5470233f -r 6a2d507ef064 OrthancServer/Internals/FindScp.cpp --- a/OrthancServer/Internals/FindScp.cpp Wed Nov 18 15:50:32 2015 +0100 +++ b/OrthancServer/Internals/FindScp.cpp Wed Nov 18 16:11:28 2015 +0100 @@ -133,10 +133,9 @@ { if (data.worklistHandler_ != NULL) { - // TODO - /*std::auto_ptr query(ParsedDicomFile::CreateFromDcmtkDataset(requestIdentifiers)); - DicomWorklistAnswers a; - data.worklistHandler_->Handle(a, *query, *data.remoteIp_, *data.remoteAet_);*/ + ParsedDicomFile query(*requestIdentifiers); + data.noCroppingOfResults_ = data.worklistHandler_->Handle(data.answers_, query, + *data.remoteIp_, *data.remoteAet_); ok = true; } else @@ -188,11 +187,10 @@ // There are pending results that are still to be sent response->DimseStatus = STATUS_Pending; - void* obj = data.answers_.GetAnswer(responseCount - 1).GetDcmtkObject(); - DcmFileFormat* fileFormat = static_cast(obj); - assert(fileFormat != NULL); + DcmFileFormat& fileFormat = data.answers_.GetAnswer(responseCount - 1).GetDcmtkObject(); - *responseIdentifiers = new DcmDataset(*fileFormat->getDataset()); + // TODO Is there a way to avoid this copy? + *responseIdentifiers = new DcmDataset(*fileFormat.getDataset()); } else if (data.noCroppingOfResults_) { diff -r 1b1d5470233f -r 6a2d507ef064 OrthancServer/ParsedDicomFile.cpp --- a/OrthancServer/ParsedDicomFile.cpp Wed Nov 18 15:50:32 2015 +0100 +++ b/OrthancServer/ParsedDicomFile.cpp Wed Nov 18 16:11:28 2015 +0100 @@ -863,15 +863,27 @@ } + ParsedDicomFile::ParsedDicomFile(DcmDataset& dicom) : pimpl_(new PImpl) + { + pimpl_->file_.reset(new DcmFileFormat(&dicom)); + } + + + ParsedDicomFile::ParsedDicomFile(DcmFileFormat& dicom) : pimpl_(new PImpl) + { + pimpl_->file_.reset(new DcmFileFormat(dicom)); + } + + ParsedDicomFile::~ParsedDicomFile() { delete pimpl_; } - void* ParsedDicomFile::GetDcmtkObject() + DcmFileFormat& ParsedDicomFile::GetDcmtkObject() { - return pimpl_->file_.get(); + return *pimpl_->file_.get(); } diff -r 1b1d5470233f -r 6a2d507ef064 OrthancServer/ParsedDicomFile.h --- a/OrthancServer/ParsedDicomFile.h Wed Nov 18 15:50:32 2015 +0100 +++ b/OrthancServer/ParsedDicomFile.h Wed Nov 18 16:11:28 2015 +0100 @@ -39,6 +39,9 @@ #include "../Core/Images/ImageBuffer.h" #include "../Core/IDynamicObject.h" +class DcmDataset; +class DcmFileFormat; + namespace Orthanc { class ParsedDicomFile : public IDynamicObject @@ -68,9 +71,13 @@ ParsedDicomFile(const std::string& content); + ParsedDicomFile(DcmDataset& dicom); + + ParsedDicomFile(DcmFileFormat& dicom); + ~ParsedDicomFile(); - void* GetDcmtkObject(); + DcmFileFormat& GetDcmtkObject(); ParsedDicomFile* Clone();