comparison OrthancServer/OrthancRestApi.cpp @ 304:4eea080e6e7a

refactoring
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 19 Dec 2012 14:57:18 +0100
parents c76a35a85c69
children 86bb79522f19
comparison
equal deleted inserted replaced
303:c76a35a85c69 304:4eea080e6e7a
87 } 87 }
88 88
89 Json::Value::Members members = query.getMemberNames(); 89 Json::Value::Members members = query.getMemberNames();
90 for (size_t i = 0; i < members.size(); i++) 90 for (size_t i = 0; i < members.size(); i++)
91 { 91 {
92 DicomTag t = FromDcmtkBridge::FindTag(members[i]); 92 DicomTag t = FromDcmtkBridge::ParseTag(members[i]);
93 result.SetValue(t, query[members[i]].asString()); 93 result.SetValue(t, query[members[i]].asString());
94 } 94 }
95 95
96 return true; 96 return true;
97 } 97 }
763 return; 763 return;
764 } 764 }
765 765
766 LOG(INFO) << "Receiving a DICOM file of " << postData.size() << " bytes through HTTP"; 766 LOG(INFO) << "Receiving a DICOM file of " << postData.size() << " bytes through HTTP";
767 767
768 DcmFileFormat dicomFile; 768 std::string publicId;
769 769 StoreStatus status = context.Store(publicId, postData);
770 {
771 // Prepare an input stream for the memory buffer
772 DcmInputBufferStream is;
773 is.setBuffer(&postData[0], postData.size());
774 is.setEos();
775
776 dicomFile.transferInit();
777 if (!dicomFile.read(is).good())
778 {
779 call.GetOutput().SignalError(Orthanc_HttpStatus_415_UnsupportedMediaType);
780 return;
781 }
782 dicomFile.loadAllDataIntoMemory();
783 dicomFile.transferEnd();
784 }
785
786 DicomMap dicomSummary;
787 FromDcmtkBridge::Convert(dicomSummary, *dicomFile.getDataset());
788
789 DicomInstanceHasher hasher(dicomSummary);
790
791 Json::Value dicomJson;
792 FromDcmtkBridge::ToJson(dicomJson, *dicomFile.getDataset());
793
794 StoreStatus status = StoreStatus_Failure;
795 if (postData.size() > 0)
796 {
797 status = context.Store
798 (reinterpret_cast<const char*>(&postData[0]), postData.size(),
799 dicomSummary, dicomJson, "");
800 }
801
802 Json::Value result = Json::objectValue; 770 Json::Value result = Json::objectValue;
803 771
804 if (status != StoreStatus_Failure) 772 if (status != StoreStatus_Failure)
805 { 773 {
806 result["ID"] = hasher.HashInstance(); 774 result["ID"] = publicId;
807 result["Path"] = GetBasePath(ResourceType_Instance, hasher.HashInstance()); 775 result["Path"] = GetBasePath(ResourceType_Instance, publicId);
808 } 776 }
809 777
810 result["Status"] = ToString(status); 778 result["Status"] = ToString(status);
811 call.GetOutput().AnswerJson(result); 779 call.GetOutput().AnswerJson(result);
812 } 780 }
781
813 782
814 783
815 // DICOM bridge ------------------------------------------------------------- 784 // DICOM bridge -------------------------------------------------------------
816 785
817 static bool IsExistingModality(const OrthancRestApi::Modalities& modalities, 786 static bool IsExistingModality(const OrthancRestApi::Modalities& modalities,
868 dicom.SendPathValue(call.GetOutput(), call.GetTrailingUri()); 837 dicom.SendPathValue(call.GetOutput(), call.GetTrailingUri());
869 } 838 }
870 839
871 840
872 841
873 // Modification of DICOM tags ----------------------------------------------- 842 // Modification of DICOM instances ------------------------------------------
874 843
875 template <enum ResourceType resourceType> 844 static void ModifyInstanceInternal(ParsedDicomFile& toModify,
876 static void Modify(RestApi::PostCall& call) 845 const Json::Value& replacements)
846 {
847 if (!replacements.isObject())
848 {
849 throw OrthancException(ErrorCode_BadRequest);
850 }
851
852 Json::Value::Members members = replacements.getMemberNames();
853
854 for (size_t i = 0; i < members.size(); i++)
855 {
856 const std::string& name = members[i];
857 std::string value = replacements[name].asString();
858
859 DicomTag tag = FromDcmtkBridge::ParseTag(name);
860 toModify.Replace(tag, value);
861 }
862
863 // A new SOP instance UID is automatically generated
864 std::string instanceUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Instance);
865 toModify.Replace(DICOM_TAG_SOP_INSTANCE_UID, instanceUid);
866 }
867
868
869 static void ModifyInstance(RestApi::PostCall& call)
877 { 870 {
878 RETRIEVE_CONTEXT(call); 871 RETRIEVE_CONTEXT(call);
879 872
880 std::string id = call.GetUriComponent("id", ""); 873 std::string id = call.GetUriComponent("id", "");
881 ParsedDicomFile& dicom = context.GetDicomFile(id); 874 ParsedDicomFile& dicom = context.GetDicomFile(id);
882 875
883 std::auto_ptr<ParsedDicomFile> modified(dicom.Clone()); 876 Json::Value request;
884 877 if (call.ParseJsonRequest(request))
885 std::string studyUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Study); 878 {
879 std::auto_ptr<ParsedDicomFile> modified(dicom.Clone());
880 ModifyInstanceInternal(*modified, request);
881 modified->Answer(call.GetOutput());
882 }
883
884 /*std::string studyUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Study);
886 std::string seriesUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series); 885 std::string seriesUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Series);
887 std::string instanceUid = FromDcmtkBridge::GenerateUniqueIdentifier(DicomRootLevel_Instance);
888
889 modified->Replace(DICOM_TAG_SOP_INSTANCE_UID, instanceUid);
890 modified->Replace(DICOM_TAG_SERIES_INSTANCE_UID, seriesUid); 886 modified->Replace(DICOM_TAG_SERIES_INSTANCE_UID, seriesUid);
891 modified->Replace(DICOM_TAG_STUDY_INSTANCE_UID, studyUid); 887 modified->Replace(DICOM_TAG_STUDY_INSTANCE_UID, studyUid);*/
892 888
893 modified->InsertOrReplace(DicomTag(0x0010,0x0010), "0.42"); 889
894 //modified->Remove(DicomTag(0x0010,0x0020));
895 /*modified->Insert(DicomTag(0x0018,0x9082), "0.42");
896 modified->Replace(DicomTag(0x0010,0x0010), "Hello");*/
897 modified->Answer(call.GetOutput());
898 } 890 }
899 891
900 892
901 893
902 // Registration of the various REST handlers -------------------------------- 894 // Registration of the various REST handlers --------------------------------
952 Register("/modalities/{id}/find-study", DicomFindStudy); 944 Register("/modalities/{id}/find-study", DicomFindStudy);
953 Register("/modalities/{id}/find-series", DicomFindSeries); 945 Register("/modalities/{id}/find-series", DicomFindSeries);
954 Register("/modalities/{id}/find", DicomFind); 946 Register("/modalities/{id}/find", DicomFind);
955 Register("/modalities/{id}/store", DicomStore); 947 Register("/modalities/{id}/store", DicomStore);
956 948
957 Register("/instances/{id}/modify", Modify<ResourceType_Instance>); 949 Register("/instances/{id}/modify", ModifyInstance);
958 } 950 }
959 } 951 }