Mercurial > hg > orthanc
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, |