comparison OrthancServer/Plugins/Engine/OrthancPlugins.cpp @ 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 5b929e6b3c36
comparison
equal deleted inserted replaced
4507:b4c58795f3a8 4508:8f9090b137f1
2125 2125
2126 2126
2127 class OrthancPlugins::DicomInstanceFromBuffer : public IDicomInstance 2127 class OrthancPlugins::DicomInstanceFromBuffer : public IDicomInstance
2128 { 2128 {
2129 private: 2129 private:
2130 std::string buffer_; 2130 std::string buffer_;
2131 DicomInstanceToStore instance_; 2131 std::unique_ptr<DicomInstanceToStore> instance_;
2132 2132
2133 public: 2133 public:
2134 DicomInstanceFromBuffer(const void* buffer, 2134 DicomInstanceFromBuffer(const void* buffer,
2135 size_t size) 2135 size_t size)
2136 { 2136 {
2137 buffer_.assign(reinterpret_cast<const char*>(buffer), size); 2137 buffer_.assign(reinterpret_cast<const char*>(buffer), size);
2138 instance_.SetBuffer(buffer_.empty() ? NULL : buffer_.c_str(), buffer_.size()); 2138
2139 instance_.SetOrigin(DicomInstanceOrigin::FromPlugins()); 2139 instance_.reset(DicomInstanceToStore::CreateFromBuffer(buffer_));
2140 instance_->SetOrigin(DicomInstanceOrigin::FromPlugins());
2140 } 2141 }
2141 2142
2142 virtual bool CanBeFreed() const ORTHANC_OVERRIDE 2143 virtual bool CanBeFreed() const ORTHANC_OVERRIDE
2143 { 2144 {
2144 return true; 2145 return true;
2145 } 2146 }
2146 2147
2147 virtual const DicomInstanceToStore& GetInstance() const ORTHANC_OVERRIDE 2148 virtual const DicomInstanceToStore& GetInstance() const ORTHANC_OVERRIDE
2148 { 2149 {
2149 return instance_; 2150 return *instance_;
2150 }; 2151 };
2151 }; 2152 };
2152 2153
2153 2154
2154 class OrthancPlugins::DicomInstanceFromTranscoded : public IDicomInstance 2155 class OrthancPlugins::DicomInstanceFromTranscoded : public IDicomInstance
2155 { 2156 {
2156 private: 2157 private:
2157 std::unique_ptr<ParsedDicomFile> parsed_; 2158 std::unique_ptr<ParsedDicomFile> parsed_;
2158 DicomInstanceToStore instance_; 2159 std::unique_ptr<DicomInstanceToStore> instance_;
2159 2160
2160 public: 2161 public:
2161 explicit DicomInstanceFromTranscoded(IDicomTranscoder::DicomImage& transcoded) : 2162 explicit DicomInstanceFromTranscoded(IDicomTranscoder::DicomImage& transcoded) :
2162 parsed_(transcoded.ReleaseAsParsedDicomFile()) 2163 parsed_(transcoded.ReleaseAsParsedDicomFile())
2163 { 2164 {
2164 instance_.SetParsedDicomFile(*parsed_); 2165 if (parsed_.get() == NULL)
2165 instance_.SetOrigin(DicomInstanceOrigin::FromPlugins()); 2166 {
2167 throw OrthancException(ErrorCode_InternalError);
2168 }
2169
2170 instance_.reset(DicomInstanceToStore::CreateFromParsedDicomFile(*parsed_));
2171 instance_->SetOrigin(DicomInstanceOrigin::FromPlugins());
2166 } 2172 }
2167 2173
2168 virtual bool CanBeFreed() const ORTHANC_OVERRIDE 2174 virtual bool CanBeFreed() const ORTHANC_OVERRIDE
2169 { 2175 {
2170 return true; 2176 return true;
2171 } 2177 }
2172 2178
2173 virtual const DicomInstanceToStore& GetInstance() const ORTHANC_OVERRIDE 2179 virtual const DicomInstanceToStore& GetInstance() const ORTHANC_OVERRIDE
2174 { 2180 {
2175 return instance_; 2181 return *instance_;
2176 }; 2182 };
2177 }; 2183 };
2178 2184
2179 2185
2180 void OrthancPlugins::SignalStoredInstance(const std::string& instanceId, 2186 void OrthancPlugins::SignalStoredInstance(const std::string& instanceId,