# HG changeset patch # User Sebastien Jodogne # Date 1531411276 -7200 # Node ID 46061a91c88a711080f3983bdb95b865094fd1d9 # Parent 7caf01aa4d7bca1993bde9d84146d8cf39a8ba65 new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata diff -r 7caf01aa4d7b -r 46061a91c88a NEWS --- a/NEWS Thu Jul 12 16:07:56 2018 +0200 +++ b/NEWS Thu Jul 12 18:01:16 2018 +0200 @@ -9,6 +9,8 @@ - "ConcurrentJobs": Max number of jobs that are simultanously running - "SynchronousCMove": Whether to run DICOM C-Move operations synchronously - "JobsHistorySize": Max number of completed jobs that are kept in memory +* New metadata automatically computed at the instance level: + "RemoteIp", "CalledAet" and "HttpUsername" Orthanc Explorer ---------------- @@ -35,6 +37,7 @@ * "/instances/.../frame/../image-uint8 and friends now accepts a "image/pam" MIME type to retrieve images in PAM format (https://en.wikipedia.org/wiki/Netpbm#PAM_graphics_format) +* New option "?expand" to "/instances/.../metadata" Plugins ------- diff -r 7caf01aa4d7b -r 46061a91c88a OrthancServer/DicomInstanceOrigin.cpp --- a/OrthancServer/DicomInstanceOrigin.cpp Thu Jul 12 16:07:56 2018 +0200 +++ b/OrthancServer/DicomInstanceOrigin.cpp Thu Jul 12 18:01:16 2018 +0200 @@ -127,40 +127,56 @@ } } - const std::string& DicomInstanceOrigin::GetRemoteIp() const + bool DicomInstanceOrigin::LookupRemoteAet(std::string& result) const + { + if (origin_ == RequestOrigin_DicomProtocol) + { + result = dicomRemoteAet_.c_str(); + return true; + } + else + { + return false; + } + } + + bool DicomInstanceOrigin::LookupRemoteIp(std::string& result) const { if (origin_ == RequestOrigin_DicomProtocol || origin_ == RequestOrigin_RestApi) { - return remoteIp_; + result = remoteIp_; + return true; } else { - throw OrthancException(ErrorCode_ParameterOutOfRange); + return false; } } - const std::string& DicomInstanceOrigin::GetCalledAet() const + bool DicomInstanceOrigin::LookupCalledAet(std::string& result) const { if (origin_ == RequestOrigin_DicomProtocol) { - return dicomCalledAet_; + result = dicomCalledAet_; + return true; } else { - throw OrthancException(ErrorCode_ParameterOutOfRange); + return false; } } - const std::string& DicomInstanceOrigin::GetHttpUsername() const + bool DicomInstanceOrigin::LookupHttpUsername(std::string& result) const { if (origin_ == RequestOrigin_RestApi) { - return httpUsername_; + result = httpUsername_; + return true; } else { - throw OrthancException(ErrorCode_ParameterOutOfRange); + return false; } } diff -r 7caf01aa4d7b -r 46061a91c88a OrthancServer/DicomInstanceOrigin.h --- a/OrthancServer/DicomInstanceOrigin.h Thu Jul 12 16:07:56 2018 +0200 +++ b/OrthancServer/DicomInstanceOrigin.h Thu Jul 12 18:01:16 2018 +0200 @@ -85,11 +85,13 @@ const char* GetRemoteAetC() const; - const std::string& GetRemoteIp() const; - - const std::string& GetCalledAet() const; + bool LookupRemoteAet(std::string& result) const; + + bool LookupRemoteIp(std::string& result) const; - const std::string& GetHttpUsername() const; + bool LookupCalledAet(std::string& result) const; + + bool LookupHttpUsername(std::string& result) const; void Format(Json::Value& result) const; diff -r 7caf01aa4d7b -r 46061a91c88a OrthancServer/OrthancRestApi/OrthancRestResources.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Thu Jul 12 16:07:56 2018 +0200 +++ b/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Thu Jul 12 18:01:16 2018 +0200 @@ -673,12 +673,33 @@ std::list metadata; OrthancRestApi::GetIndex(call).ListAvailableMetadata(metadata, publicId); - Json::Value result = Json::arrayValue; + + Json::Value result; - for (std::list::const_iterator - it = metadata.begin(); it != metadata.end(); ++it) + if (call.HasArgument("expand")) { - result.append(EnumerationToString(*it)); + result = Json::objectValue; + + for (std::list::const_iterator + it = metadata.begin(); it != metadata.end(); ++it) + { + std::string value; + if (OrthancRestApi::GetIndex(call).LookupMetadata(value, publicId, *it)) + { + std::string key = EnumerationToString(*it); + result[key] = value; + } + } + } + else + { + result = Json::arrayValue; + + for (std::list::const_iterator + it = metadata.begin(); it != metadata.end(); ++it) + { + result.append(EnumerationToString(*it)); + } } call.GetOutput().AnswerJson(result); diff -r 7caf01aa4d7b -r 46061a91c88a OrthancServer/ServerEnumerations.cpp --- a/OrthancServer/ServerEnumerations.cpp Thu Jul 12 16:07:56 2018 +0200 +++ b/OrthancServer/ServerEnumerations.cpp Thu Jul 12 18:01:16 2018 +0200 @@ -67,6 +67,9 @@ dictMetadataType_.Add(MetadataType_Instance_Origin, "Origin"); dictMetadataType_.Add(MetadataType_Instance_TransferSyntax, "TransferSyntax"); dictMetadataType_.Add(MetadataType_Instance_SopClassUid, "SopClassUid"); + dictMetadataType_.Add(MetadataType_Instance_RemoteIp, "RemoteIP"); + dictMetadataType_.Add(MetadataType_Instance_CalledAet, "CalledAET"); + dictMetadataType_.Add(MetadataType_Instance_HttpUsername, "HttpUsername"); dictContentType_.Add(FileContentType_Dicom, "dicom"); dictContentType_.Add(FileContentType_DicomAsJson, "dicom-as-json"); diff -r 7caf01aa4d7b -r 46061a91c88a OrthancServer/ServerEnumerations.h --- a/OrthancServer/ServerEnumerations.h Thu Jul 12 16:07:56 2018 +0200 +++ b/OrthancServer/ServerEnumerations.h Thu Jul 12 18:01:16 2018 +0200 @@ -104,6 +104,9 @@ MetadataType_Instance_Origin = 8, // New in Orthanc 0.9.5 MetadataType_Instance_TransferSyntax = 9, // New in Orthanc 1.2.0 MetadataType_Instance_SopClassUid = 10, // New in Orthanc 1.2.0 + MetadataType_Instance_RemoteIp = 11, // New in Orthanc 1.4.0 + MetadataType_Instance_CalledAet = 12, // New in Orthanc 1.4.0 + MetadataType_Instance_HttpUsername = 13, // New in Orthanc 1.4.0 // Make sure that the value "65535" can be stored into this enumeration MetadataType_StartUser = 1024, diff -r 7caf01aa4d7b -r 46061a91c88a OrthancServer/ServerIndex.cpp --- a/OrthancServer/ServerIndex.cpp Thu Jul 12 16:07:56 2018 +0200 +++ b/OrthancServer/ServerIndex.cpp Thu Jul 12 18:01:16 2018 +0200 @@ -785,13 +785,33 @@ instanceToStore.GetOrigin().GetRemoteAetC()); SetInstanceMetadata(instanceMetadata, instance, MetadataType_Instance_Origin, EnumerationToString(instanceToStore.GetOrigin().GetRequestOrigin())); - + { std::string s; + if (instanceToStore.LookupTransferSyntax(s)) { + // New in Orthanc 1.2.0 SetInstanceMetadata(instanceMetadata, instance, MetadataType_Instance_TransferSyntax, s); } + + if (instanceToStore.GetOrigin().LookupRemoteIp(s)) + { + // New in Orthanc 1.4.0 + SetInstanceMetadata(instanceMetadata, instance, MetadataType_Instance_RemoteIp, s); + } + + if (instanceToStore.GetOrigin().LookupCalledAet(s)) + { + // New in Orthanc 1.4.0 + SetInstanceMetadata(instanceMetadata, instance, MetadataType_Instance_CalledAet, s); + } + + if (instanceToStore.GetOrigin().LookupHttpUsername(s)) + { + // New in Orthanc 1.4.0 + SetInstanceMetadata(instanceMetadata, instance, MetadataType_Instance_HttpUsername, s); + } } const DicomValue* value; diff -r 7caf01aa4d7b -r 46061a91c88a UnitTestsSources/MultiThreadingTests.cpp --- a/UnitTestsSources/MultiThreadingTests.cpp Thu Jul 12 16:07:56 2018 +0200 +++ b/UnitTestsSources/MultiThreadingTests.cpp Thu Jul 12 18:01:16 2018 +0200 @@ -1095,6 +1095,7 @@ TEST(JobsSerialization, DicomInstanceOrigin) { Json::Value s; + std::string t; { DicomInstanceOrigin origin; @@ -1106,10 +1107,11 @@ { DicomInstanceOrigin origin(s); ASSERT_EQ(RequestOrigin_Unknown, origin.GetRequestOrigin()); - ASSERT_THROW(origin.GetRemoteIp(), OrthancException); ASSERT_EQ("", std::string(origin.GetRemoteAetC())); - ASSERT_THROW(origin.GetCalledAet(), OrthancException); - ASSERT_THROW(origin.GetHttpUsername(), OrthancException); + ASSERT_FALSE(origin.LookupRemoteIp(t)); + ASSERT_FALSE(origin.LookupRemoteAet(t)); + ASSERT_FALSE(origin.LookupCalledAet(t)); + ASSERT_FALSE(origin.LookupHttpUsername(t)); } { @@ -1122,10 +1124,11 @@ { DicomInstanceOrigin origin(s); ASSERT_EQ(RequestOrigin_DicomProtocol, origin.GetRequestOrigin()); - ASSERT_EQ("host", origin.GetRemoteIp()); ASSERT_EQ("aet", std::string(origin.GetRemoteAetC())); - ASSERT_EQ("called", origin.GetCalledAet()); - ASSERT_THROW(origin.GetHttpUsername(), OrthancException); + ASSERT_TRUE(origin.LookupRemoteIp(t)); ASSERT_EQ("host", t); + ASSERT_TRUE(origin.LookupRemoteAet(t)); ASSERT_EQ("aet", t); + ASSERT_TRUE(origin.LookupCalledAet(t)); ASSERT_EQ("called", t); + ASSERT_FALSE(origin.LookupHttpUsername(t)); } { @@ -1138,10 +1141,11 @@ { DicomInstanceOrigin origin(s); ASSERT_EQ(RequestOrigin_RestApi, origin.GetRequestOrigin()); - ASSERT_EQ("host", origin.GetRemoteIp()); ASSERT_EQ("", std::string(origin.GetRemoteAetC())); - ASSERT_THROW(origin.GetCalledAet(), OrthancException); - ASSERT_EQ("username", origin.GetHttpUsername()); + ASSERT_TRUE(origin.LookupRemoteIp(t)); ASSERT_EQ("host", t); + ASSERT_FALSE(origin.LookupRemoteAet(t)); + ASSERT_FALSE(origin.LookupCalledAet(t)); + ASSERT_TRUE(origin.LookupHttpUsername(t)); ASSERT_EQ("username", t); } { @@ -1154,6 +1158,10 @@ { DicomInstanceOrigin origin(s); ASSERT_EQ(RequestOrigin_Lua, origin.GetRequestOrigin()); + ASSERT_FALSE(origin.LookupRemoteIp(t)); + ASSERT_FALSE(origin.LookupRemoteAet(t)); + ASSERT_FALSE(origin.LookupCalledAet(t)); + ASSERT_FALSE(origin.LookupHttpUsername(t)); } { @@ -1166,6 +1174,10 @@ { DicomInstanceOrigin origin(s); ASSERT_EQ(RequestOrigin_Plugins, origin.GetRequestOrigin()); + ASSERT_FALSE(origin.LookupRemoteIp(t)); + ASSERT_FALSE(origin.LookupRemoteAet(t)); + ASSERT_FALSE(origin.LookupCalledAet(t)); + ASSERT_FALSE(origin.LookupHttpUsername(t)); } }