Mercurial > hg > orthanc
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 } |