Mercurial > hg > orthanc
diff OrthancServer/Sources/ServerContext.cpp @ 4913:c1b19f95e166
fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 22 Feb 2022 22:12:43 +0100 |
parents | ea5f1c6ed07e |
children | 676e03e69703 |
line wrap: on
line diff
--- a/OrthancServer/Sources/ServerContext.cpp Tue Feb 22 17:46:28 2022 +0100 +++ b/OrthancServer/Sources/ServerContext.cpp Tue Feb 22 22:12:43 2022 +0100 @@ -687,34 +687,50 @@ StoreInstanceMode mode) { DicomInstanceToStore* dicom = &receivedDicom; + + // WARNING: The scope of "modifiedBuffer" and "modifiedDicom" must + // be the same as that of "dicom" + MallocMemoryBuffer modifiedBuffer; std::unique_ptr<DicomInstanceToStore> modifiedDicom; - std::unique_ptr<MallocMemoryBuffer> raii(new MallocMemoryBuffer); - #if ORTHANC_ENABLE_PLUGINS == 1 if (HasPlugins()) { - void* modifiedDicomBuffer = NULL; - size_t modifiedDicomBufferSize = 0; + // New in Orthanc 1.10.0 - bool store = GetPlugins().ApplyReceivedInstanceCallbacks(receivedDicom.GetBufferData(), - receivedDicom.GetBufferSize(), - &modifiedDicomBuffer, - modifiedDicomBufferSize); - raii->Assign(modifiedDicomBuffer, modifiedDicomBufferSize, ::free); + OrthancPluginReceivedInstanceCallbackResult action = GetPlugins().ApplyReceivedInstanceCallbacks( + modifiedBuffer, receivedDicom.GetBufferData(), receivedDicom.GetBufferSize()); - if (!store) + switch (action) { - StoreResult result; - result.SetStatus(StoreStatus_FilteredOut); - return result; - } + case OrthancPluginReceivedInstanceCallbackResult_Discard: + { + CLOG(INFO, PLUGINS) << "A plugin has discarded the instance in its ReceivedInstanceCallback"; + StoreResult result; + result.SetStatus(StoreStatus_FilteredOut); + return result; + } + + case OrthancPluginReceivedInstanceCallbackResult_KeepAsIs: + break; - if (modifiedDicomBufferSize > 0 && modifiedDicomBuffer != NULL) - { - modifiedDicom.reset(DicomInstanceToStore::CreateFromBuffer(modifiedDicomBuffer, modifiedDicomBufferSize)); - modifiedDicom->SetOrigin(dicom->GetOrigin()); - dicom = modifiedDicom.get(); + case OrthancPluginReceivedInstanceCallbackResult_Modify: + if (modifiedBuffer.GetSize() > 0 && + modifiedBuffer.GetData() != NULL) + { + CLOG(INFO, PLUGINS) << "A plugin has modified the instance in its ReceivedInstanceCallback"; + modifiedDicom.reset(DicomInstanceToStore::CreateFromBuffer(modifiedBuffer.GetData(), modifiedBuffer.GetSize())); + modifiedDicom->SetOrigin(dicom->GetOrigin()); + dicom = modifiedDicom.get(); + } + else + { + throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback plugin is not returning a modified buffer while it has modified the instance"); + } + break; + + default: + throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback has returned an invalid value"); } } #endif