Mercurial > hg > orthanc
comparison OrthancServer/OrthancRestApi/OrthancRestModalities.cpp @ 2940:4767d36679ed
refactoring access to Orthanc configuration
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 29 Nov 2018 11:47:00 +0100 |
parents | 9d277f8ad698 |
children | f395460af74d |
comparison
equal
deleted
inserted
replaced
2939:577786f59252 | 2940:4767d36679ed |
---|---|
35 #include "OrthancRestApi.h" | 35 #include "OrthancRestApi.h" |
36 | 36 |
37 #include "../../Core/DicomParsing/FromDcmtkBridge.h" | 37 #include "../../Core/DicomParsing/FromDcmtkBridge.h" |
38 #include "../../Core/Logging.h" | 38 #include "../../Core/Logging.h" |
39 #include "../../Core/SerializationToolbox.h" | 39 #include "../../Core/SerializationToolbox.h" |
40 #include "../OrthancInitialization.h" | 40 #include "../OrthancConfiguration.h" |
41 #include "../QueryRetrieveHandler.h" | 41 #include "../QueryRetrieveHandler.h" |
42 #include "../ServerJobs/DicomModalityStoreJob.h" | 42 #include "../ServerJobs/DicomModalityStoreJob.h" |
43 #include "../ServerJobs/DicomMoveScuJob.h" | 43 #include "../ServerJobs/DicomMoveScuJob.h" |
44 #include "../ServerJobs/OrthancPeerStoreJob.h" | 44 #include "../ServerJobs/OrthancPeerStoreJob.h" |
45 #include "../ServerToolbox.h" | 45 #include "../ServerToolbox.h" |
46 | 46 |
47 | 47 |
48 namespace Orthanc | 48 namespace Orthanc |
49 { | 49 { |
50 static RemoteModalityParameters MyGetModalityUsingSymbolicName(const std::string& name) | |
51 { | |
52 OrthancConfiguration::ReaderLock lock; | |
53 return lock.GetConfiguration().GetModalityUsingSymbolicName(name); | |
54 } | |
55 | |
56 | |
50 /*************************************************************************** | 57 /*************************************************************************** |
51 * DICOM C-Echo SCU | 58 * DICOM C-Echo SCU |
52 ***************************************************************************/ | 59 ***************************************************************************/ |
53 | 60 |
54 static void DicomEcho(RestApiPostCall& call) | 61 static void DicomEcho(RestApiPostCall& call) |
55 { | 62 { |
56 ServerContext& context = OrthancRestApi::GetContext(call); | 63 ServerContext& context = OrthancRestApi::GetContext(call); |
57 | 64 |
58 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | 65 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); |
59 RemoteModalityParameters remote = | 66 RemoteModalityParameters remote = |
60 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 67 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
61 | 68 |
62 try | 69 try |
63 { | 70 { |
64 DicomUserConnection connection(localAet, remote); | 71 DicomUserConnection connection(localAet, remote); |
65 connection.Open(); | 72 connection.Open(); |
179 return; | 186 return; |
180 } | 187 } |
181 | 188 |
182 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | 189 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); |
183 RemoteModalityParameters remote = | 190 RemoteModalityParameters remote = |
184 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 191 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
185 | 192 |
186 DicomFindAnswers answers(false); | 193 DicomFindAnswers answers(false); |
187 | 194 |
188 { | 195 { |
189 DicomUserConnection connection(localAet, remote); | 196 DicomUserConnection connection(localAet, remote); |
214 return; | 221 return; |
215 } | 222 } |
216 | 223 |
217 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | 224 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); |
218 RemoteModalityParameters remote = | 225 RemoteModalityParameters remote = |
219 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 226 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
220 | 227 |
221 DicomFindAnswers answers(false); | 228 DicomFindAnswers answers(false); |
222 | 229 |
223 { | 230 { |
224 DicomUserConnection connection(localAet, remote); | 231 DicomUserConnection connection(localAet, remote); |
250 return; | 257 return; |
251 } | 258 } |
252 | 259 |
253 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | 260 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); |
254 RemoteModalityParameters remote = | 261 RemoteModalityParameters remote = |
255 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 262 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
256 | 263 |
257 DicomFindAnswers answers(false); | 264 DicomFindAnswers answers(false); |
258 | 265 |
259 { | 266 { |
260 DicomUserConnection connection(localAet, remote); | 267 DicomUserConnection connection(localAet, remote); |
287 return; | 294 return; |
288 } | 295 } |
289 | 296 |
290 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | 297 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); |
291 RemoteModalityParameters remote = | 298 RemoteModalityParameters remote = |
292 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 299 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
293 | 300 |
294 DicomFindAnswers answers(false); | 301 DicomFindAnswers answers(false); |
295 | 302 |
296 { | 303 { |
297 DicomUserConnection connection(localAet, remote); | 304 DicomUserConnection connection(localAet, remote); |
329 return; | 336 return; |
330 } | 337 } |
331 | 338 |
332 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | 339 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); |
333 RemoteModalityParameters remote = | 340 RemoteModalityParameters remote = |
334 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 341 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
335 | 342 |
336 DicomUserConnection connection(localAet, remote); | 343 DicomUserConnection connection(localAet, remote); |
337 connection.Open(); | 344 connection.Open(); |
338 | 345 |
339 DicomFindAnswers patients(false); | 346 DicomFindAnswers patients(false); |
694 { | 701 { |
695 otherArguments[members[i]] = request[members[i]]; | 702 otherArguments[members[i]] = request[members[i]]; |
696 } | 703 } |
697 } | 704 } |
698 | 705 |
706 bool logExportedResources; | |
707 | |
708 { | |
709 OrthancConfiguration::ReaderLock lock; | |
710 logExportedResources = lock.GetConfiguration().GetBooleanParameter("LogExportedResources", false); | |
711 } | |
712 | |
699 for (Json::Value::ArrayIndex i = 0; i < resources->size(); i++) | 713 for (Json::Value::ArrayIndex i = 0; i < resources->size(); i++) |
700 { | 714 { |
701 if (!(*resources) [i].isString()) | 715 if (!(*resources) [i].isString()) |
702 { | 716 { |
703 return false; | 717 return false; |
707 if (!Toolbox::IsSHA1(stripped)) | 721 if (!Toolbox::IsSHA1(stripped)) |
708 { | 722 { |
709 return false; | 723 return false; |
710 } | 724 } |
711 | 725 |
712 if (Configuration::GetGlobalBoolParameter("LogExportedResources", false)) | 726 if (logExportedResources) |
713 { | 727 { |
714 context.GetIndex().LogExportedResource(stripped, remote); | 728 context.GetIndex().LogExportedResource(stripped, remote); |
715 } | 729 } |
716 | 730 |
717 context.AddChildInstances(job, stripped); | 731 context.AddChildInstances(job, stripped); |
738 (request, "MoveOriginatorAet", context.GetDefaultLocalApplicationEntityTitle()); | 752 (request, "MoveOriginatorAet", context.GetDefaultLocalApplicationEntityTitle()); |
739 int moveOriginatorID = Toolbox::GetJsonIntegerField | 753 int moveOriginatorID = Toolbox::GetJsonIntegerField |
740 (request, "MoveOriginatorID", 0 /* By default, not a C-MOVE */); | 754 (request, "MoveOriginatorID", 0 /* By default, not a C-MOVE */); |
741 | 755 |
742 job->SetLocalAet(localAet); | 756 job->SetLocalAet(localAet); |
743 job->SetRemoteModality(Configuration::GetModalityUsingSymbolicName(remote)); | 757 job->SetRemoteModality(MyGetModalityUsingSymbolicName(remote)); |
744 | 758 |
745 if (moveOriginatorID != 0) | 759 if (moveOriginatorID != 0) |
746 { | 760 { |
747 job->SetMoveOriginator(moveOriginatorAET, moveOriginatorID); | 761 job->SetMoveOriginator(moveOriginatorAET, moveOriginatorID); |
748 } | 762 } |
782 (request, "LocalAet", context.GetDefaultLocalApplicationEntityTitle()); | 796 (request, "LocalAet", context.GetDefaultLocalApplicationEntityTitle()); |
783 std::string targetAet = Toolbox::GetJsonStringField | 797 std::string targetAet = Toolbox::GetJsonStringField |
784 (request, "TargetAet", context.GetDefaultLocalApplicationEntityTitle()); | 798 (request, "TargetAet", context.GetDefaultLocalApplicationEntityTitle()); |
785 | 799 |
786 const RemoteModalityParameters source = | 800 const RemoteModalityParameters source = |
787 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 801 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
788 | 802 |
789 DicomUserConnection connection(localAet, source); | 803 DicomUserConnection connection(localAet, source); |
790 connection.Open(); | 804 connection.Open(); |
791 | 805 |
792 for (Json::Value::ArrayIndex i = 0; i < request[RESOURCES].size(); i++) | 806 for (Json::Value::ArrayIndex i = 0; i < request[RESOURCES].size(); i++) |
813 return peers.find(id) != peers.end(); | 827 return peers.find(id) != peers.end(); |
814 } | 828 } |
815 | 829 |
816 static void ListPeers(RestApiGetCall& call) | 830 static void ListPeers(RestApiGetCall& call) |
817 { | 831 { |
832 OrthancConfiguration::ReaderLock lock; | |
833 | |
818 OrthancRestApi::SetOfStrings peers; | 834 OrthancRestApi::SetOfStrings peers; |
819 Configuration::GetListOfOrthancPeers(peers); | 835 lock.GetConfiguration().GetListOfOrthancPeers(peers); |
820 | 836 |
821 if (call.HasArgument("expand")) | 837 if (call.HasArgument("expand")) |
822 { | 838 { |
823 Json::Value result = Json::objectValue; | 839 Json::Value result = Json::objectValue; |
824 for (OrthancRestApi::SetOfStrings::const_iterator | 840 for (OrthancRestApi::SetOfStrings::const_iterator |
825 it = peers.begin(); it != peers.end(); ++it) | 841 it = peers.begin(); it != peers.end(); ++it) |
826 { | 842 { |
827 WebServiceParameters peer; | 843 WebServiceParameters peer; |
828 | 844 |
829 if (Configuration::GetOrthancPeer(peer, *it)) | 845 if (lock.GetConfiguration().GetOrthancPeer(peer, *it)) |
830 { | 846 { |
831 Json::Value jsonPeer = Json::objectValue; | 847 Json::Value jsonPeer = Json::objectValue; |
832 // only return the minimum information to identify the | 848 // only return the minimum information to identify the |
833 // destination, do not include "security" information like | 849 // destination, do not include "security" information like |
834 // passwords | 850 // passwords |
855 } | 871 } |
856 } | 872 } |
857 | 873 |
858 static void ListPeerOperations(RestApiGetCall& call) | 874 static void ListPeerOperations(RestApiGetCall& call) |
859 { | 875 { |
876 OrthancConfiguration::ReaderLock lock; | |
877 | |
860 OrthancRestApi::SetOfStrings peers; | 878 OrthancRestApi::SetOfStrings peers; |
861 Configuration::GetListOfOrthancPeers(peers); | 879 lock.GetConfiguration().GetListOfOrthancPeers(peers); |
862 | 880 |
863 std::string id = call.GetUriComponent("id", ""); | 881 std::string id = call.GetUriComponent("id", ""); |
864 if (IsExistingPeer(peers, id)) | 882 if (IsExistingPeer(peers, id)) |
865 { | 883 { |
866 RestApi::AutoListChildren(call); | 884 RestApi::AutoListChildren(call); |
876 Json::Value request; | 894 Json::Value request; |
877 std::auto_ptr<OrthancPeerStoreJob> job(new OrthancPeerStoreJob(context)); | 895 std::auto_ptr<OrthancPeerStoreJob> job(new OrthancPeerStoreJob(context)); |
878 | 896 |
879 if (GetInstancesToExport(request, *job, remote, call)) | 897 if (GetInstancesToExport(request, *job, remote, call)) |
880 { | 898 { |
899 OrthancConfiguration::ReaderLock lock; | |
900 | |
881 WebServiceParameters peer; | 901 WebServiceParameters peer; |
882 if (Configuration::GetOrthancPeer(peer, remote)) | 902 if (lock.GetConfiguration().GetOrthancPeer(peer, remote)) |
883 { | 903 { |
884 job->SetPeer(peer); | 904 job->SetPeer(peer); |
885 OrthancRestApi::GetApi(call).SubmitCommandsJob | 905 OrthancRestApi::GetApi(call).SubmitCommandsJob |
886 (call, job.release(), true /* synchronous by default */, request); | 906 (call, job.release(), true /* synchronous by default */, request); |
887 } | 907 } |
902 return modalities.find(id) != modalities.end(); | 922 return modalities.find(id) != modalities.end(); |
903 } | 923 } |
904 | 924 |
905 static void ListModalities(RestApiGetCall& call) | 925 static void ListModalities(RestApiGetCall& call) |
906 { | 926 { |
927 OrthancConfiguration::ReaderLock lock; | |
928 | |
907 OrthancRestApi::SetOfStrings modalities; | 929 OrthancRestApi::SetOfStrings modalities; |
908 Configuration::GetListOfDicomModalities(modalities); | 930 lock.GetConfiguration().GetListOfDicomModalities(modalities); |
909 | 931 |
910 if (call.HasArgument("expand")) | 932 if (call.HasArgument("expand")) |
911 { | 933 { |
912 Json::Value result = Json::objectValue; | 934 Json::Value result = Json::objectValue; |
913 for (OrthancRestApi::SetOfStrings::const_iterator | 935 for (OrthancRestApi::SetOfStrings::const_iterator |
914 it = modalities.begin(); it != modalities.end(); ++it) | 936 it = modalities.begin(); it != modalities.end(); ++it) |
915 { | 937 { |
916 const RemoteModalityParameters& remote = Configuration::GetModalityUsingSymbolicName(*it); | 938 const RemoteModalityParameters& remote = lock.GetConfiguration().GetModalityUsingSymbolicName(*it); |
917 | 939 |
918 Json::Value info; | 940 Json::Value info; |
919 remote.Serialize(info, true /* force advanced format */); | 941 remote.Serialize(info, true /* force advanced format */); |
920 result[*it] = info; | 942 result[*it] = info; |
921 } | 943 } |
934 } | 956 } |
935 | 957 |
936 | 958 |
937 static void ListModalityOperations(RestApiGetCall& call) | 959 static void ListModalityOperations(RestApiGetCall& call) |
938 { | 960 { |
961 OrthancConfiguration::ReaderLock lock; | |
962 | |
939 OrthancRestApi::SetOfStrings modalities; | 963 OrthancRestApi::SetOfStrings modalities; |
940 Configuration::GetListOfDicomModalities(modalities); | 964 lock.GetConfiguration().GetListOfDicomModalities(modalities); |
941 | 965 |
942 std::string id = call.GetUriComponent("id", ""); | 966 std::string id = call.GetUriComponent("id", ""); |
943 if (IsExistingModality(modalities, id)) | 967 if (IsExistingModality(modalities, id)) |
944 { | 968 { |
945 RestApi::AutoListChildren(call); | 969 RestApi::AutoListChildren(call); |
955 Json::Reader reader; | 979 Json::Reader reader; |
956 if (reader.parse(call.GetBodyData(), call.GetBodyData() + call.GetBodySize(), json)) | 980 if (reader.parse(call.GetBodyData(), call.GetBodyData() + call.GetBodySize(), json)) |
957 { | 981 { |
958 RemoteModalityParameters modality; | 982 RemoteModalityParameters modality; |
959 modality.Unserialize(json); | 983 modality.Unserialize(json); |
960 Configuration::UpdateModality(context, call.GetUriComponent("id", ""), modality); | 984 |
985 { | |
986 OrthancConfiguration::WriterLock lock; | |
987 lock.GetConfiguration().UpdateModality(call.GetUriComponent("id", ""), modality); | |
988 } | |
989 | |
990 context.SignalUpdatedModalities(); | |
991 | |
961 call.GetOutput().AnswerBuffer("", MimeType_PlainText); | 992 call.GetOutput().AnswerBuffer("", MimeType_PlainText); |
962 } | 993 } |
963 } | 994 } |
964 | 995 |
965 | 996 |
966 static void DeleteModality(RestApiDeleteCall& call) | 997 static void DeleteModality(RestApiDeleteCall& call) |
967 { | 998 { |
968 ServerContext& context = OrthancRestApi::GetContext(call); | 999 ServerContext& context = OrthancRestApi::GetContext(call); |
969 | 1000 |
970 Configuration::RemoveModality(context, call.GetUriComponent("id", "")); | 1001 { |
1002 OrthancConfiguration::WriterLock lock; | |
1003 lock.GetConfiguration().RemoveModality(call.GetUriComponent("id", "")); | |
1004 } | |
1005 | |
1006 context.SignalUpdatedModalities(); | |
1007 | |
971 call.GetOutput().AnswerBuffer("", MimeType_PlainText); | 1008 call.GetOutput().AnswerBuffer("", MimeType_PlainText); |
972 } | 1009 } |
973 | 1010 |
974 | 1011 |
975 static void UpdatePeer(RestApiPutCall& call) | 1012 static void UpdatePeer(RestApiPutCall& call) |
980 Json::Reader reader; | 1017 Json::Reader reader; |
981 if (reader.parse(call.GetBodyData(), call.GetBodyData() + call.GetBodySize(), json)) | 1018 if (reader.parse(call.GetBodyData(), call.GetBodyData() + call.GetBodySize(), json)) |
982 { | 1019 { |
983 WebServiceParameters peer; | 1020 WebServiceParameters peer; |
984 peer.Unserialize(json); | 1021 peer.Unserialize(json); |
985 Configuration::UpdatePeer(context, call.GetUriComponent("id", ""), peer); | 1022 |
1023 { | |
1024 OrthancConfiguration::WriterLock lock; | |
1025 lock.GetConfiguration().UpdatePeer(call.GetUriComponent("id", ""), peer); | |
1026 } | |
1027 | |
1028 context.SignalUpdatedPeers(); | |
1029 | |
986 call.GetOutput().AnswerBuffer("", MimeType_PlainText); | 1030 call.GetOutput().AnswerBuffer("", MimeType_PlainText); |
987 } | 1031 } |
988 } | 1032 } |
989 | 1033 |
990 | 1034 |
991 static void DeletePeer(RestApiDeleteCall& call) | 1035 static void DeletePeer(RestApiDeleteCall& call) |
992 { | 1036 { |
993 ServerContext& context = OrthancRestApi::GetContext(call); | 1037 ServerContext& context = OrthancRestApi::GetContext(call); |
994 | 1038 |
995 Configuration::RemovePeer(context, call.GetUriComponent("id", "")); | 1039 { |
1040 OrthancConfiguration::WriterLock lock; | |
1041 lock.GetConfiguration().RemovePeer(call.GetUriComponent("id", "")); | |
1042 } | |
1043 | |
1044 context.SignalUpdatedPeers(); | |
1045 | |
996 call.GetOutput().AnswerBuffer("", MimeType_PlainText); | 1046 call.GetOutput().AnswerBuffer("", MimeType_PlainText); |
997 } | 1047 } |
998 | 1048 |
999 | 1049 |
1000 static void DicomFindWorklist(RestApiPostCall& call) | 1050 static void DicomFindWorklist(RestApiPostCall& call) |
1004 Json::Value json; | 1054 Json::Value json; |
1005 if (call.ParseJsonRequest(json)) | 1055 if (call.ParseJsonRequest(json)) |
1006 { | 1056 { |
1007 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | 1057 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); |
1008 RemoteModalityParameters remote = | 1058 RemoteModalityParameters remote = |
1009 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 1059 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
1010 | 1060 |
1011 std::auto_ptr<ParsedDicomFile> query(ParsedDicomFile::CreateFromJson(json, static_cast<DicomFromJsonFlags>(0))); | 1061 std::auto_ptr<ParsedDicomFile> query(ParsedDicomFile::CreateFromJson(json, static_cast<DicomFromJsonFlags>(0))); |
1012 | 1062 |
1013 DicomFindAnswers answers(true); | 1063 DicomFindAnswers answers(true); |
1014 | 1064 |