]> sigrok.org Git - libsigrok.git/blobdiff - bindings/python/sigrok/core/classes.i
python: Give all enum values __doc__ strings.
[libsigrok.git] / bindings / python / sigrok / core / classes.i
index 93e03ef29e5203d9e45035a22da2aa7e93815fc8..46336549609cfc3a46cd665fbb97b6b8c1168db3 100644 (file)
@@ -47,12 +47,11 @@ which provides access to the error code and description."
 %{
 #include <stdio.h>
 #include <pygobject.h>
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
 #include <numpy/arrayobject.h>
 
 PyObject *PyGObject_lib;
 PyObject *GLib;
-PyTypeObject *IOChannel;
-PyTypeObject *PollFD;
 
 #include "config.h"
 
@@ -76,30 +75,21 @@ typedef guint pyg_flags_type;
     if (!GLib) {
         fprintf(stderr, "Import of gi.repository.GLib failed.\n");
 #if PY_VERSION_HEX >= 0x03000000
-        return NULL;
+        return nullptr;
 #else
         return;
 #endif
     }
-    IOChannel = (PyTypeObject *) PyObject_GetAttrString(GLib, "IOChannel");
-    PollFD = (PyTypeObject *) PyObject_GetAttrString(GLib, "PollFD");
     import_array();
 %}
 
+%include "../../../swig/templates.i"
+
 /* Map file objects to file descriptors. */
 %typecheck(SWIG_TYPECHECK_POINTER) int fd {
     $1 = (PyObject_AsFileDescriptor($input) != -1);
 }
 
-%typemap(in) int fd {
-    int fd = PyObject_AsFileDescriptor($input);
-    if (fd == -1)
-        SWIG_exception(SWIG_TypeError,
-            "Expected file object or integer file descriptor");
-    else
-      $1 = fd;
-}
-
 /* Map from Glib::Variant to native Python types. */
 %typemap(out) Glib::VariantBase {
     GValue *value = g_new0(GValue, 1);
@@ -107,160 +97,85 @@ typedef guint pyg_flags_type;
     g_value_set_variant(value, $1.gobj());
     PyObject *variant = pyg_value_as_pyobject(value, true);
     $result = PyObject_CallMethod(variant,
-        const_cast<char *>("unpack"),
-        const_cast<char *>(""), NULL);
+        const_cast<char *>("unpack"), nullptr);
     Py_XDECREF(variant);
     g_free(value);
 }
 
-/* Map from Glib::IOCondition to GLib.IOCondition. */
-%typecheck(SWIG_TYPECHECK_POINTER) Glib::IOCondition {
-    pyg_flags_type flags;
-    $1 = pygobject_check($input, &PyGFlags_Type) &&
-         (pyg_flags_get_value(G_TYPE_IO_CONDITION, $input, &flags) != -1);
-}
-
-%typemap(in) Glib::IOCondition {
-    if (!pygobject_check($input, &PyGFlags_Type))
-        SWIG_exception(SWIG_TypeError, "Expected GLib.IOCondition value");
-    pyg_flags_type flags;
-    if (pyg_flags_get_value(G_TYPE_IO_CONDITION, $input, &flags) == -1)
-        SWIG_exception(SWIG_TypeError, "Not a valid Glib.IOCondition value");
-    $1 = (Glib::IOCondition) flags;
-}
-
-/* And back */
-%typemap(out) Glib::IOCondition {
-    GValue *value = g_new0(GValue, 1);
-    g_value_init(value, G_TYPE_IO_CONDITION);
-    g_value_set_flags(value, &$1);
-    $result = pyg_value_as_pyobject(value, true);
-    g_free(value);
-}
-
-/* Map from GLib.PollFD to Glib::PollFD *. */
-%typecheck(SWIG_TYPECHECK_POINTER) Glib::PollFD {
-    $1 = pygobject_check($input, PollFD);
-}
-
-%typemap(in) Glib::PollFD {
-    if (!pygobject_check($input, PollFD))
-        SWIG_exception(SWIG_TypeError, "Expected GLib.PollFD");
-    PyObject *fd_obj = PyObject_GetAttrString($input, "fd");
-    PyObject *events_obj = PyObject_GetAttrString($input, "events");
-    pyg_flags_type flags;
-    pyg_flags_get_value(G_TYPE_IO_CONDITION, events_obj, &flags);
-    int fd = PyInt_AsLong(fd_obj);
-    Glib::IOCondition events = (Glib::IOCondition) flags;
-    $1 = Glib::PollFD(fd, events);
-}
-
-/* Map from GLib.IOChannel to Glib::IOChannel *. */
-%typecheck(SWIG_TYPECHECK_POINTER) Glib::RefPtr<Glib::IOChannel> {
-    $1 = pygobject_check($input, IOChannel);
-}
-
-%typemap(in) Glib::RefPtr<Glib::IOChannel> {
-    if (!pygobject_check($input, IOChannel))
-        SWIG_exception(SWIG_TypeError, "Expected GLib.IOChannel");
-    $1 = Glib::wrap((GIOChannel *) PyObject_Hash($input), true);
-}
-
-/* Map from callable PyObject to SourceCallbackFunction. */
-%typecheck(SWIG_TYPECHECK_POINTER) sigrok::SourceCallbackFunction {
+/* Map from callable PyObject to LogCallbackFunction */
+%typecheck(SWIG_TYPECHECK_POINTER) sigrok::LogCallbackFunction {
     $1 = PyCallable_Check($input);
 }
 
-%typemap(in) sigrok::SourceCallbackFunction {
+%typemap(in) sigrok::LogCallbackFunction {
     if (!PyCallable_Check($input))
         SWIG_exception(SWIG_TypeError, "Expected a callable Python object");
 
-    $1 = [=] (Glib::IOCondition revents) {
+    $1 = [=] (const sigrok::LogLevel *loglevel, std::string message) {
         auto gstate = PyGILState_Ensure();
 
-        GValue *value = g_new0(GValue, 1);
-        g_value_init(value, G_TYPE_IO_CONDITION);
-        g_value_set_flags(value, revents);
-        auto revents_obj = pyg_value_as_pyobject(value, true);
-        g_free(value);
+        auto log_obj = SWIG_NewPointerObj(
+                SWIG_as_voidptr(loglevel), SWIGTYPE_p_sigrok__LogLevel, 0);
+
+        auto string_obj = PyString_FromString(message.c_str());
 
-        auto arglist = Py_BuildValue("(O)", revents_obj);
+        auto arglist = Py_BuildValue("(OO)", log_obj, string_obj);
 
         auto result = PyEval_CallObject($input, arglist);
 
         Py_XDECREF(arglist);
-        Py_XDECREF(revents_obj);
+        Py_XDECREF(log_obj);
+        Py_XDECREF(string_obj);
 
         bool completed = !PyErr_Occurred();
 
         if (!completed)
             PyErr_Print();
 
-        bool valid_result = (completed && PyBool_Check(result));
+        bool valid_result = (completed && result == Py_None);
+
+        Py_XDECREF(result);
 
         if (completed && !valid_result)
         {
             PyErr_SetString(PyExc_TypeError,
-                "EventSource callback did not return a boolean");
+                "Log callback did not return None");
             PyErr_Print();
         }
 
-        bool retval = (valid_result && result == Py_True);
-
-        Py_XDECREF(result);
-
         PyGILState_Release(gstate);
 
         if (!valid_result)
             throw sigrok::Error(SR_ERR);
-
-        return retval;
     };
 
     Py_XINCREF($input);
 }
 
-/* Map from callable PyObject to LogCallbackFunction */
-%typecheck(SWIG_TYPECHECK_POINTER) sigrok::LogCallbackFunction {
+/* Map from callable PyObject to SessionStoppedCallback */
+%typecheck(SWIG_TYPECHECK_POINTER) sigrok::SessionStoppedCallback {
     $1 = PyCallable_Check($input);
 }
 
-%typemap(in) sigrok::LogCallbackFunction {
+%typemap(in) sigrok::SessionStoppedCallback {
     if (!PyCallable_Check($input))
         SWIG_exception(SWIG_TypeError, "Expected a callable Python object");
 
-    $1 = [=] (const sigrok::LogLevel *loglevel, std::string message) {
-        auto gstate = PyGILState_Ensure();
-
-        auto log_obj = SWIG_NewPointerObj(
-                SWIG_as_voidptr(loglevel), SWIGTYPE_p_sigrok__LogLevel, 0);
-
-        auto string_obj = PyString_FromString(message.c_str());
-
-        auto arglist = Py_BuildValue("(OO)", log_obj, string_obj);
-
-        auto result = PyEval_CallObject($input, arglist);
-
-        Py_XDECREF(arglist);
-        Py_XDECREF(log_obj);
-        Py_XDECREF(string_obj);
-
-        bool completed = !PyErr_Occurred();
-
-        if (!completed)
-            PyErr_Print();
-
-        bool valid_result = (completed && result == Py_None);
+    $1 = [=] () {
+        const auto gstate = PyGILState_Ensure();
 
-        Py_XDECREF(result);
+        const auto result = PyEval_CallObject($input, nullptr);
+        const bool completed = !PyErr_Occurred();
+        const bool valid_result = (completed && result == Py_None);
 
-        if (completed && !valid_result)
-        {
+        if (completed && !valid_result) {
             PyErr_SetString(PyExc_TypeError,
-                "Log callback did not return None");
-            PyErr_Print();
+                "Session stop callback did not return None");
         }
+        if (!valid_result)
+            PyErr_Print();
 
+        Py_XDECREF(result);
         PyGILState_Release(gstate);
 
         if (!valid_result)
@@ -469,7 +384,7 @@ std::map<std::string, Glib::VariantBase> dict_to_map_options(PyObject *dict,
 %ignore sigrok::InputFormat::create_input;
 %ignore sigrok::OutputFormat::create_output;
 
-%include "doc.i"
+%include "doc_start.i"
 
 %define %attributevector(Class, Type, Name, Get)
 %rename(_ ## Get) sigrok::Class::Get;
@@ -612,3 +527,5 @@ std::map<std::string, Glib::VariantBase> dict_to_map_options(PyObject *dict,
     data = property(_data)
 }
 }
+
+%include "doc_end.i"