Boost :: python: using callback

I have a header file (fingisdk.h):

#ifndef FINGISDK_H_
#define FINGISDK_H_

#include "fingienum.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef void (*fingi_event)(FINGI_EVENT_ID eventId, char* msg);

FINGI_EVENT_ID start_fingi_sdk(char* ini_file_location);
FINGI_EVENT_ID download_room_info(char** roominfo);

void register_fingi_sdk_status_event_listener(fingi_event pointer_to_listener_fnc);


#ifdef __cplusplus
}
#endif
#endif

And then I wrote one Python script for this:

#include <fingisdk.h>
#include <fingienum.h>
#include <boost/python.hpp>


BOOST_PYTHON_MODULE(libpythonWrapper)
{
    using namespace boost::python;
    def("start_fingi_sdk", start_fingi_sdk);


}

And the python file to call it looks like this:

import libpythonWrapper

print libpythonWrapper.start_fingi_sdk('file_location.ini')

So far, this works great. However, I can’t find out how to set a double double pointer function:

FINGI_EVENT_ID download_room_info(char** roominfo);

And the callback function:

void register_fingi_sdk_status_event_listener(fingi_event pointer_to_listener_fnc);

Can someone point me to some documentation or help me solve it?

Thankyou


EDIT 1:

After some takeoff, I figured out how to make a pointer to a pointer function. Python does not support a pointer, so you need to wrap download_room_info (char ** roominfo) to return a simple string:

std::string download_room_info_python_wrapper() {
    char * value;
    FINGI_EVENT_ID result = download_room_info(&value);
    return std::string(value);
}

And then:

def("download_room_info", download_room_info_python_wrapper);

Looking for a solution for a callback function

+3
source share
1 answer

, API Python:

typedef void (*fingi_event)(FINGI_EVENT_ID eventId, char* msg);
void register_fingi_sdk_status_event_listener(fingi_event);

, , eventId . , ( extern "C", , API):

void my_callback(FINGI_EVENT_ID eventId, char* msg)
{
  // do something
}

register:

void my_register()
{
  register_fingi_sdk_status_event_listener(my_callback);
}

:

def("my_register", my_register);

. , . , , - ? , , Python - PyObject, Python Boost Python:

boost::python::object g_callback;
void my_callback(FINGI_EVENT_ID eventId, char* msg)
{
  if (g_callback)
    g_callback(eventId, msg);
}

, :

void set_callback(boost::python::object func)
{
  g_callback = func;
  register_fingi_sdk_status_event_listener(my_callback);
}

def("set_callback", set_callback);

Python:

def callback(eventId, msg):
  print eventId, msg

set_callback(callback)

, . , API "void * userData", API . PyObject - . API , -, , .

+3

All Articles