#include <boost/python.hpp>
#include "Publisher.hh"
#include <QDesktopServices>
+#include <QWebHistory>
+#include "Viewer.hh"
//#include "PythonPublisher.mpp"
#define prefix_
;
}
+namespace {
+
+ bool canGoBack()
+ {
+ return pykit::Viewer::instance()->page()->history()->canGoBack();
+ }
+
+ bool canGoForward()
+ {
+ return pykit::Viewer::instance()->page()->history()->canGoForward();
+ }
+
+ class ErrorCatcher
+ {
+ public:
+ explicit ErrorCatcher(std::string & out) : out_ (out) {}
+ void write(std::string const & msg)
+ { std::cerr << "append: " << msg; out_ += msg; }
+ private:
+ std::string & out_;
+ };
+
+}
+
BOOST_PYTHON_MODULE(_pykit)
{
py::class_<pykit::Request>("Request", py::no_init)
.def("publish", py::pure_virtual(&pykit::Publisher::publish))
;
+ py::class_<ErrorCatcher>("ErrorCatcher", py::no_init)
+ .def("write", &ErrorCatcher::write)
+ ;
+
py::def("openUrl", &QDesktopServices::openUrl);
+
+ py::def("canGoBack", &canGoBack);
+ py::def("canGoForward", &canGoForward);
}
PYTHON_EXTERN_MODULE(_httpapi);
prefix_ pykit::PythonPublisher::PythonPublisher()
: impl_ (new Impl)
{
+ std::string pyError;
try {
PYTHON_PREPARE_IMPORT(_pykit);
PYTHON_PREPARE_IMPORT(_qt);
PYTHON_PREPARE_IMPORT(_httpapi);
Py_Initialize();
- py::object initModule = py::import("init");
+
+ py::import("_pykit");
+ py::object sysModule (py::import("sys"));
+ py::object origStderr (sysModule.attr("stderr"));
+ ErrorCatcher catcher (pyError);
+ sysModule.attr("stderr") = catcher;
+
+ py::object initModule (py::import("init"));
impl_->mainNamespace = py::extract<py::dict>(initModule.attr("__dict__"));
impl_->pythonPublisher = py::extract<Publisher*>(impl_->mainNamespace["initialize"]());
+
+ sysModule.attr("stderr") = origStderr;
}
catch (boost::python::error_already_set & ex) {
PyErr_Print();
- throw;
+ throw PythonError(pyError);
}
}
}
catch (py::error_already_set & ex) {
PyErr_Print();
+ PyErr_Clear();
}
}