diff Plugins/Engine/PluginsHttpHandler.cpp @ 1037:6208ab500ffd

LookupResource service in plugin SDK
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 16 Jul 2014 14:29:37 +0200
parents 501880d76474
children 2c49b7dffcec
line wrap: on
line diff
--- a/Plugins/Engine/PluginsHttpHandler.cpp	Thu Jul 10 16:22:59 2014 +0200
+++ b/Plugins/Engine/PluginsHttpHandler.cpp	Wed Jul 16 14:29:37 2014 +0200
@@ -442,6 +442,70 @@
   }
 
 
+  void PluginsHttpHandler::LookupResource(ResourceType level,
+                                          const void* parameters)
+  {
+    const _OrthancPluginLookupResource& p = 
+      *reinterpret_cast<const _OrthancPluginLookupResource*>(parameters);
+
+    DicomTag tag(0, 0);
+    switch (level)
+    {
+      case ResourceType_Patient:
+        tag = DICOM_TAG_PATIENT_ID;
+        break;
+
+      case ResourceType_Study:
+        tag = DICOM_TAG_STUDY_INSTANCE_UID;
+        break;
+
+      case ResourceType_Series:
+        tag = DICOM_TAG_SERIES_INSTANCE_UID;
+        break;
+
+      case ResourceType_Instance:
+        tag = DICOM_TAG_SOP_INSTANCE_UID;
+        break;
+
+      default:
+        throw OrthancException(ErrorCode_InternalError);
+    }
+
+    std::list<std::string> result;
+    pimpl_->context_.GetIndex().LookupTagValue(result, tag, p.identifier, level);
+
+    if (result.size() == 1)
+    {
+      *p.result = CopyString(result.front());
+    }
+    else
+    {
+      throw OrthancException(ErrorCode_UnknownResource);
+    }
+  }
+
+
+  char* PluginsHttpHandler::CopyString(const std::string& str) const
+  {
+    char *result = reinterpret_cast<char*>(malloc(str.size() + 1));
+    if (result == NULL)
+    {
+      throw OrthancException(ErrorCode_NotEnoughMemory);
+    }
+
+    if (str.size() == 0)
+    {
+      result[0] = '\0';
+    }
+    else
+    {
+      memcpy(result, &str[0], str.size() + 1);
+    }
+
+    return result;
+  }
+
+
   bool PluginsHttpHandler::InvokeService(_OrthancPluginService service,
                                          const void* parameters)
   {
@@ -483,6 +547,22 @@
         Redirect(parameters);
         return true;
 
+      case _OrthancPluginService_LookupPatient:
+        LookupResource(ResourceType_Patient, parameters);
+        return true;
+
+      case _OrthancPluginService_LookupStudy:
+        LookupResource(ResourceType_Study, parameters);
+        return true;
+
+      case _OrthancPluginService_LookupSeries:
+        LookupResource(ResourceType_Series, parameters);
+        return true;
+
+      case _OrthancPluginService_LookupInstance:
+        LookupResource(ResourceType_Instance, parameters);
+        return true;
+
       default:
         return false;
     }