//#include "PythonPublisher.ih"
// Custom includes
+#include <iostream>
+#include <boost/python.hpp>
#include "Publisher.hh"
//#include "PythonPublisher.mpp"
namespace py = boost::python;
+struct pykit::PythonPublisher::Impl
+{
+ boost::python::dict mainNamespace;
+ Publisher * pythonPublisher;
+};
+
+#define PYTHON_PREPARE_IMPORT(module) \
+ PyImport_AppendInittab(const_cast<char*>(#module), init ## module)
+
namespace {
struct PublisherPyWrapper
static PyObject * convert(QString const & s)
{
std::wstring ws (s.toStdWString());
- return PyUnicode_FromWideChar(ws.c_str(), ws.length());
+ return PyUnicode_FromWideChar(ws.data(), ws.length());
}
};
static void construct(PyObject * o,
py::converter::rvalue_from_python_stage1_data * data)
{
+ unsigned length (PyString_Size(o));
const char * value (PyString_AsString(o));
void * storage (((py::converter::rvalue_from_python_storage<QByteArray>*)
data)->storage.bytes);
- new (storage) QByteArray(value);
+ new (storage) QByteArray(value,length);
data->convertible = storage;
}
}
prefix_ pykit::PythonPublisher::PythonPublisher(std::string initPy)
+ : impl_ (new Impl)
{
- PYTHON_PREPARE_IMPORT(_pykit);
- PYTHON_PREPARE_IMPORT(_qt);
- Py_Initialize();
- py::object mainModule_ = py::import("__main__");
- mainNamespace_ = py::extract<py::dict>(mainModule_.attr("__dict__"));
- mainNamespace_["__file__"] = py::str(initPy.c_str());
- py::object ignored (
- py::exec_file(initPy.c_str(), mainNamespace_, mainNamespace_));
- pythonPublisher_ = py::extract<Publisher*>(mainNamespace_["publisher"]);
+ try {
+ PYTHON_PREPARE_IMPORT(_pykit);
+ PYTHON_PREPARE_IMPORT(_qt);
+ Py_Initialize();
+ py::object mainModule_ = py::import("__main__");
+ impl_->mainNamespace = py::extract<py::dict>(mainModule_.attr("__dict__"));
+ impl_->mainNamespace["__file__"] = py::str(initPy.c_str());
+ py::object ignored (
+ py::exec_file(initPy.c_str(), impl_->mainNamespace, impl_->mainNamespace));
+ impl_->pythonPublisher = py::extract<Publisher*>(impl_->mainNamespace["publisher"]);
+ }
+ catch (boost::python::error_already_set & ex) {
+ PyErr_Print();
+ throw;
+ }
}
+prefix_ pykit::PythonPublisher::~PythonPublisher()
+{}
+
prefix_ void pykit::PythonPublisher::publish(Request & request)
{
try {
- pythonPublisher_->publish(request);
+ impl_->pythonPublisher->publish(request);
}
catch (py::error_already_set & ex) {
PyErr_Print();