comparison OrthancServer/Sources/DicomInstanceToStore.h @ 4508:8f9090b137f1

Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 11 Feb 2021 11:00:05 +0100
parents b4c58795f3a8
children f0038043fb97 7053502fbf97
comparison
equal deleted inserted replaced
4507:b4c58795f3a8 4508:8f9090b137f1
37 #include "DicomInstanceOrigin.h" 37 #include "DicomInstanceOrigin.h"
38 #include "ServerEnumerations.h" 38 #include "ServerEnumerations.h"
39 39
40 #include <boost/shared_ptr.hpp> 40 #include <boost/shared_ptr.hpp>
41 41
42 class DcmDataset;
43
42 namespace Orthanc 44 namespace Orthanc
43 { 45 {
44 class ImageAccessor; 46 class ImageAccessor;
45 class ParsedDicomFile; 47 class ParsedDicomFile;
46 48
48 { 50 {
49 public: 51 public:
50 typedef std::map<std::pair<ResourceType, MetadataType>, std::string> MetadataMap; 52 typedef std::map<std::pair<ResourceType, MetadataType>, std::string> MetadataMap;
51 53
52 private: 54 private:
53 class PImpl; 55 class FromBuffer;
54 boost::shared_ptr<PImpl> pimpl_; 56 class FromParsedDicomFile;
57 class FromDcmDataset;
58
59 MetadataMap metadata_;
60 DicomInstanceOrigin origin_;
55 61
56 public: 62 public:
57 DicomInstanceToStore(); 63 virtual ~DicomInstanceToStore()
64 {
65 }
58 66
59 void SetOrigin(const DicomInstanceOrigin& origin); 67 // WARNING: The source in the factory methods is *not* copied and
68 // must *not* be deallocated as long as this wrapper object is alive
69 static DicomInstanceToStore* CreateFromBuffer(const void* buffer,
70 size_t size);
71
72 static DicomInstanceToStore* CreateFromBuffer(const std::string& buffer);
73
74 static DicomInstanceToStore* CreateFromParsedDicomFile(ParsedDicomFile& dicom);
75
76 static DicomInstanceToStore* CreateFromDcmDataset(DcmDataset& dataset);
77
78
79
80 void SetOrigin(const DicomInstanceOrigin& origin)
81 {
82 origin_ = origin;
83 }
60 84
61 const DicomInstanceOrigin& GetOrigin() const; 85 const DicomInstanceOrigin& GetOrigin() const
86 {
87 return origin_;
88 }
89
90 const MetadataMap& GetMetadata() const
91 {
92 return metadata_;
93 }
62 94
63 // WARNING: The buffer is not copied, it must not be removed as 95 void ClearMetadata()
64 // long as the "DicomInstanceToStore" object is alive 96 {
65 void SetBuffer(const void* dicom, 97 metadata_.clear();
66 size_t size); 98 }
67
68 // WARNING: The "ParsedDicomFile" is not copied
69 void SetParsedDicomFile(ParsedDicomFile& parsed);
70
71 const MetadataMap& GetMetadata() const;
72
73 void ClearMetadata();
74 99
75 // This function is notably used by modify/anonymize operations 100 // This function is notably used by modify/anonymize operations
76 void AddMetadata(ResourceType level, 101 void AddMetadata(ResourceType level,
77 MetadataType metadata, 102 MetadataType metadata,
78 const std::string& value); 103 const std::string& value)
79 104 {
80 const void* GetBufferData() const; 105 metadata_[std::make_pair(level, metadata)] = value;
81 106 }
82 size_t GetBufferSize() const;
83 107
84 bool LookupTransferSyntax(DicomTransferSyntax& result) const; 108 bool LookupTransferSyntax(DicomTransferSyntax& result) const;
85 109
86 bool HasPixelData() const; 110 virtual ParsedDicomFile& GetParsedDicomFile() const = 0;
87 111
88 ParsedDicomFile& GetParsedDicomFile() const; 112 virtual const void* GetBufferData() const = 0;
89 113
90 void GetSummary(DicomMap& summary) const; 114 virtual size_t GetBufferSize() const = 0;
91 115
92 void GetDicomAsJson(Json::Value& dicomAsJson) const; 116 virtual bool HasPixelData() const;
93 117
94 void DatasetToJson(Json::Value& target, 118 virtual void GetSummary(DicomMap& summary) const;
95 DicomToJsonFormat format,
96 DicomToJsonFlags flags,
97 unsigned int maxStringLength) const;
98 119
99 unsigned int GetFramesCount() const; 120 virtual void GetDicomAsJson(Json::Value& dicomAsJson) const;
121
122 virtual void DatasetToJson(Json::Value& target,
123 DicomToJsonFormat format,
124 DicomToJsonFlags flags,
125 unsigned int maxStringLength) const;
126
127 virtual unsigned int GetFramesCount() const;
100 128
101 ImageAccessor* DecodeFrame(unsigned int frame) const; 129 virtual ImageAccessor* DecodeFrame(unsigned int frame) const;
102 }; 130 };
103 } 131 }