diff Sources/ICallbackRegistration.cpp @ 119:cf6decdf9e15

wrapped new SDK callback: orthanc.RegisterStorageCommitmentScpCallback()
author Alain Mazy <am@osimis.io>
date Mon, 28 Aug 2023 18:30:42 +0200
parents 65ec5597ec70
children 566df919b286 71d305c29cfa
line wrap: on
line diff
--- a/Sources/ICallbackRegistration.cpp	Mon Aug 28 16:44:41 2023 +0200
+++ b/Sources/ICallbackRegistration.cpp	Mon Aug 28 18:30:42 2023 +0200
@@ -58,6 +58,46 @@
 }
 
 
+PyObject *ICallbackRegistration::Apply2(ICallbackRegistration& registration,
+                                        PyObject* args,
+                                        PyObject*& singletonCallback1,
+                                        PyObject*& singletonCallback2,
+                                        const std::string& details)
+{
+  // https://docs.python.org/3/extending/extending.html#calling-python-functions-from-c
+  PyObject* callback1 = NULL;
+  PyObject* callback2 = NULL;
+
+  if (!PyArg_ParseTuple(args, "OO", &callback1, &callback2) ||
+      callback1 == NULL || callback2 == NULL)
+  {
+    const std::string message = "Expected two callback functions to register " + details;
+    PyErr_SetString(PyExc_ValueError, message.c_str());
+    return NULL;
+  }
+  else if (singletonCallback1 != NULL || singletonCallback2 != NULL)
+  {
+    const std::string message = "Can only register once for " + details;
+    PyErr_SetString(PyExc_RuntimeError, message.c_str());
+    return NULL;
+  }
+  else
+  {
+    OrthancPlugins::LogInfo("Registering callbacks " + details);
+    registration.Register();
+
+    singletonCallback1 = callback1;
+    Py_XINCREF(singletonCallback1);
+
+    singletonCallback2 = callback2;
+    Py_XINCREF(singletonCallback2);
+
+    Py_INCREF(Py_None);
+    return Py_None;
+  }
+}
+
+
 void ICallbackRegistration::Unregister(PyObject*& singletonCallback)
 {
   PythonLock lock;