1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
/**
* Python plugin for Orthanc
* Copyright (C) 2020-2021 Osimis S.A., Belgium
*
* This program is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
**/
#include "OnStoredInstanceCallback.h"
#include "PythonString.h"
#include "Autogenerated/sdk.h"
#include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h"
static PyObject* storedInstanceCallback_ = NULL;
static OrthancPluginErrorCode OnStoredInstanceCallback(const OrthancPluginDicomInstance *instance,
const char *instanceId)
{
try
{
PythonLock lock;
/**
* Construct an instance object of the "orthanc.RestOutput"
* class. This is done by calling the constructor function
* "sdk_OrthancPluginRestOutput_Type".
**/
PythonObject args(lock, PyTuple_New(2));
PyTuple_SetItem(args.GetPyObject(), 0, PyLong_FromSsize_t((intptr_t) instance));
PyTuple_SetItem(args.GetPyObject(), 1, PyBool_FromLong(true /* borrowed, don't destruct */));
PyObject *pInst = PyObject_CallObject(GetOrthancPluginDicomInstanceType(), args.GetPyObject());
/**
* Construct the arguments tuple (output, uri)
**/
PythonString str(lock, instanceId);
PythonObject args2(lock, PyTuple_New(2));
PyTuple_SetItem(args2.GetPyObject(), 0, pInst);
PyTuple_SetItem(args2.GetPyObject(), 1, str.Release());
PythonObject result(lock, PyObject_CallObject(storedInstanceCallback_, args2.GetPyObject()));
std::string traceback;
if (lock.HasErrorOccurred(traceback))
{
OrthancPlugins::LogError("Error in the Python on-change callback, "
"traceback:\n" + traceback);
return OrthancPluginErrorCode_Plugin;
}
else
{
return OrthancPluginErrorCode_Success;
}
}
catch (OrthancPlugins::PluginException& e)
{
return e.GetErrorCode();
}
}
PyObject* RegisterOnStoredInstanceCallback(PyObject* module, PyObject* args)
{
// The GIL is locked at this point (no need to create "PythonLock")
// https://docs.python.org/3/extending/extending.html#calling-python-functions-from-c
PyObject* callback = NULL;
if (!PyArg_ParseTuple(args, "O", &callback) ||
callback == NULL)
{
PyErr_SetString(PyExc_ValueError, "Expected a callback function");
return NULL;
}
if (storedInstanceCallback_ != NULL)
{
PyErr_SetString(PyExc_RuntimeError, "Can only register one Python on-stored-instance callback");
return NULL;
}
OrthancPlugins::LogInfo("Registering a Python on-stored-instance callback");
OrthancPluginRegisterOnStoredInstanceCallback(
OrthancPlugins::GetGlobalContext(), OnStoredInstanceCallback);
storedInstanceCallback_ = callback;
Py_XINCREF(storedInstanceCallback_);
Py_INCREF(Py_None);
return Py_None;
}
void FinalizeOnStoredInstanceCallback()
{
PythonLock lock;
if (storedInstanceCallback_ != NULL)
{
Py_XDECREF(storedInstanceCallback_);
}
}
|