# HG changeset patch # User Sebastien Jodogne # Date 1447338263 -3600 # Node ID 613df4362575a99e84d05f2b6f8e9c6e82399979 # Parent 53e045b5a8ec3f5d2ded66cdcc7fbda74e85b44d New UpdatedAttachment and UpdatedMetadata events in plugins diff -r 53e045b5a8ec -r 613df4362575 Core/Enumerations.cpp --- a/Core/Enumerations.cpp Thu Nov 12 14:36:27 2015 +0100 +++ b/Core/Enumerations.cpp Thu Nov 12 15:24:23 2015 +0100 @@ -1135,4 +1135,11 @@ return HttpStatus_500_InternalServerError; } } + + + bool IsUserContentType(FileContentType type) + { + return (type >= FileContentType_StartUser && + type <= FileContentType_EndUser); + } } diff -r 53e045b5a8ec -r 613df4362575 Core/Enumerations.h --- a/Core/Enumerations.h Thu Nov 12 14:36:27 2015 +0100 +++ b/Core/Enumerations.h Thu Nov 12 15:24:23 2015 +0100 @@ -463,4 +463,6 @@ const char* GetDicomSpecificCharacterSet(Encoding encoding); HttpStatus ConvertErrorCodeToHttpStatus(ErrorCode error); + + bool IsUserContentType(FileContentType type); } diff -r 53e045b5a8ec -r 613df4362575 NEWS --- a/NEWS Thu Nov 12 14:36:27 2015 +0100 +++ b/NEWS Thu Nov 12 15:24:23 2015 +0100 @@ -17,7 +17,8 @@ * New function "OrthancPluginRegisterErrorCode()" to declare custom error codes * New function "OrthancPluginRegisterDictionaryTag()" to declare custom DICOM tags -* New "OrthancStarted" and "OrthancStopped" events in change callbacks +* New "OrthancStarted", "OrthancStopped", "UpdatedAttachment" + and "UpdatedMetadata" events in change callbacks Lua --- diff -r 53e045b5a8ec -r 613df4362575 OrthancServer/OrthancRestApi/OrthancRestResources.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Thu Nov 12 14:36:27 2015 +0100 +++ b/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Thu Nov 12 15:24:23 2015 +0100 @@ -405,10 +405,8 @@ std::string name = call.GetUriComponent("name", ""); MetadataType metadata = StringToMetadata(name); - if (metadata >= MetadataType_StartUser && - metadata <= MetadataType_EndUser) - { - // It is forbidden to modify internal metadata + if (IsUserMetadata(metadata)) // It is forbidden to modify internal metadata + { OrthancRestApi::GetIndex(call).DeleteMetadata(publicId, metadata); call.GetOutput().AnswerBuffer("", "text/plain"); } @@ -426,8 +424,7 @@ std::string value; call.BodyToString(value); - if (metadata >= MetadataType_StartUser && - metadata <= MetadataType_EndUser) + if (IsUserMetadata(metadata)) // It is forbidden to modify internal metadata { // It is forbidden to modify internal metadata OrthancRestApi::GetIndex(call).SetMetadata(publicId, metadata, value); @@ -638,8 +635,7 @@ std::string name = call.GetUriComponent("name", ""); FileContentType contentType = StringToContentType(name); - if (contentType >= FileContentType_StartUser && // It is forbidden to modify internal attachments - contentType <= FileContentType_EndUser && + if (IsUserContentType(contentType) && // It is forbidden to modify internal attachments context.AddAttachment(publicId, StringToContentType(name), call.GetBodyData(), call.GetBodySize())) { call.GetOutput().AnswerBuffer("{}", "application/json"); @@ -655,10 +651,8 @@ std::string name = call.GetUriComponent("name", ""); FileContentType contentType = StringToContentType(name); - if (contentType >= FileContentType_StartUser && - contentType <= FileContentType_EndUser) + if (IsUserContentType(contentType)) // It is forbidden to delete internal attachments { - // It is forbidden to delete internal attachments OrthancRestApi::GetIndex(call).DeleteAttachment(publicId, contentType); call.GetOutput().AnswerBuffer("{}", "application/json"); } diff -r 53e045b5a8ec -r 613df4362575 OrthancServer/ServerEnumerations.cpp --- a/OrthancServer/ServerEnumerations.cpp Thu Nov 12 14:36:27 2015 +0100 +++ b/OrthancServer/ServerEnumerations.cpp Thu Nov 12 15:24:23 2015 +0100 @@ -73,8 +73,10 @@ { boost::mutex::scoped_lock lock(enumerationsMutex_); - if (metadata < static_cast(MetadataType_StartUser) || - metadata > static_cast(MetadataType_EndUser)) + MetadataType type = static_cast(metadata); + + if (metadata < 0 || + !IsUserMetadata(type)) { LOG(ERROR) << "A user content type must have index between " << static_cast(MetadataType_StartUser) << " and " @@ -84,8 +86,6 @@ throw OrthancException(ErrorCode_ParameterOutOfRange); } - MetadataType type = static_cast(metadata); - if (dictMetadataType_.Contains(type)) { LOG(ERROR) << "Cannot associate user content type \"" @@ -118,8 +118,10 @@ { boost::mutex::scoped_lock lock(enumerationsMutex_); - if (contentType < static_cast(FileContentType_StartUser) || - contentType > static_cast(FileContentType_EndUser)) + FileContentType type = static_cast(contentType); + + if (contentType < 0 || + !IsUserContentType(type)) { LOG(ERROR) << "A user content type must have index between " << static_cast(FileContentType_StartUser) << " and " @@ -129,7 +131,6 @@ throw OrthancException(ErrorCode_ParameterOutOfRange); } - FileContentType type = static_cast(contentType); if (dictContentType_.Contains(type)) { LOG(ERROR) << "Cannot associate user content type \"" @@ -301,6 +302,12 @@ case ChangeType_NewChildInstance: return "NewChildInstance"; + case ChangeType_UpdatedAttachment: + return "UpdatedAttachment"; + + case ChangeType_UpdatedMetadata: + return "UpdatedMetadata"; + default: throw OrthancException(ErrorCode_ParameterOutOfRange); } @@ -428,4 +435,11 @@ throw OrthancException(ErrorCode_ParameterOutOfRange); } } + + + bool IsUserMetadata(MetadataType metadata) + { + return (metadata >= MetadataType_StartUser && + metadata <= MetadataType_EndUser); + } } diff -r 53e045b5a8ec -r 613df4362575 OrthancServer/ServerEnumerations.h --- a/OrthancServer/ServerEnumerations.h Thu Nov 12 14:36:27 2015 +0100 +++ b/OrthancServer/ServerEnumerations.h Thu Nov 12 15:24:23 2015 +0100 @@ -178,6 +178,8 @@ ChangeType_StablePatient = 12, ChangeType_StableStudy = 13, ChangeType_StableSeries = 14, + ChangeType_UpdatedAttachment = 15, + ChangeType_UpdatedMetadata = 16, ChangeType_INTERNAL_LastLogged = 4095, @@ -223,4 +225,6 @@ const char* EnumerationToString(TransferSyntax syntax); ModalityManufacturer StringToModalityManufacturer(const std::string& manufacturer); + + bool IsUserMetadata(MetadataType type); } diff -r 53e045b5a8ec -r 613df4362575 OrthancServer/ServerIndex.cpp --- a/OrthancServer/ServerIndex.cpp Thu Nov 12 14:36:27 2015 +0100 +++ b/OrthancServer/ServerIndex.cpp Thu Nov 12 15:24:23 2015 +0100 @@ -1525,6 +1525,7 @@ const std::string& value) { boost::mutex::scoped_lock lock(mutex_); + Transaction t(*this); ResourceType rtype; int64_t id; @@ -1534,6 +1535,13 @@ } db_.SetMetadata(id, type, value); + + if (IsUserMetadata(type)) + { + LogChange(id, ChangeType_UpdatedMetadata, rtype, publicId); + } + + t.Commit(0); } @@ -1541,6 +1549,7 @@ MetadataType type) { boost::mutex::scoped_lock lock(mutex_); + Transaction t(*this); ResourceType rtype; int64_t id; @@ -1550,6 +1559,13 @@ } db_.DeleteMetadata(id, type); + + if (IsUserMetadata(type)) + { + LogChange(id, ChangeType_UpdatedMetadata, rtype, publicId); + } + + t.Commit(0); } @@ -1958,6 +1974,11 @@ db_.AddAttachment(resourceId, attachment); + if (IsUserContentType(attachment.GetContentType())) + { + LogChange(resourceId, ChangeType_UpdatedAttachment, resourceType, publicId); + } + t.Commit(attachment.GetCompressedSize()); return StoreStatus_Success; @@ -1979,6 +2000,11 @@ db_.DeleteAttachment(id, type); + if (IsUserContentType(type)) + { + LogChange(id, ChangeType_UpdatedAttachment, rtype, publicId); + } + t.Commit(0); } diff -r 53e045b5a8ec -r 613df4362575 Plugins/Engine/PluginsEnumerations.cpp --- a/Plugins/Engine/PluginsEnumerations.cpp Thu Nov 12 14:36:27 2015 +0100 +++ b/Plugins/Engine/PluginsEnumerations.cpp Thu Nov 12 15:24:23 2015 +0100 @@ -122,6 +122,12 @@ case ChangeType_StableStudy: return OrthancPluginChangeType_StableStudy; + case ChangeType_UpdatedAttachment: + return OrthancPluginChangeType_UpdatedAttachment; + + case ChangeType_UpdatedMetadata: + return OrthancPluginChangeType_UpdatedMetadata; + default: throw OrthancException(ErrorCode_ParameterOutOfRange); } diff -r 53e045b5a8ec -r 613df4362575 Plugins/Include/orthanc/OrthancCPlugin.h --- a/Plugins/Include/orthanc/OrthancCPlugin.h Thu Nov 12 14:36:27 2015 +0100 +++ b/Plugins/Include/orthanc/OrthancCPlugin.h Thu Nov 12 15:24:23 2015 +0100 @@ -576,6 +576,8 @@ OrthancPluginChangeType_StableStudy = 9, /*!< Timeout: No new instance in this study */ OrthancPluginChangeType_OrthancStarted = 10, /*!< Orthanc has started */ OrthancPluginChangeType_OrthancStopped = 11, /*!< Orthanc is stopping */ + OrthancPluginChangeType_UpdatedAttachment = 12, /*!< Some user-defined attachment has changed for this resource */ + OrthancPluginChangeType_UpdatedMetadata = 13, /*!< Some user-defined metadata has changed for this resource */ _OrthancPluginChangeType_INTERNAL = 0x7fffffff } OrthancPluginChangeType;