implement _httpapi python module
[pykit.git] / PythonHTTP.cc
diff --git a/PythonHTTP.cc b/PythonHTTP.cc
new file mode 100644 (file)
index 0000000..04667d6
--- /dev/null
@@ -0,0 +1,128 @@
+// $Id$
+//
+// Copyright (C) 2011
+
+/** \file
+    \brief PythonHTTP non-inline non-template implementation */
+
+//#include "PythonHTTP.hh"
+//#include "PythonHTTP.ih"
+
+// Custom includes
+#include <boost/python.hpp>
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QTimer>
+
+//#include "PythonHTTP.mpp"
+#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+
+namespace py = boost::python;
+
+namespace {
+
+    class Manager
+    {
+    public:
+        void post(QString const & url, QByteArray const & data, boost::python::object callback);
+
+    private:
+        QNetworkAccessManager mgr_;
+    };
+
+    class ReplyHandler : public QObject
+    {
+        Q_OBJECT;
+    public:
+        explicit ReplyHandler(boost::python::object callback, QNetworkReply * reply);
+        virtual ~ReplyHandler();
+
+    public slots:
+        void finished();
+
+    private:
+        boost::python::object callback_;
+        QNetworkReply * reply_;
+    };
+
+    class TimeoutHandler : public QObject
+    {
+        Q_OBJECT;
+    public:
+        explicit TimeoutHandler(boost::python::object callback, unsigned msecs);
+
+    public slots:
+        void timeout();
+
+    private:
+        boost::python::object callback_;
+        QTimer timer_;
+    };
+
+    void timeout(boost::python::object callback, unsigned msecs)
+    {
+        new TimeoutHandler(callback, msecs);
+    }
+}
+
+prefix_ void Manager::post(QString const & url, QByteArray const & data,
+                           boost::python::object callback)
+{
+    QNetworkRequest req;
+    req.setUrl(QUrl(url));
+    QNetworkReply * reply (mgr_.post(req, data));
+    new ReplyHandler(callback, reply);
+}
+
+prefix_ ReplyHandler::ReplyHandler(boost::python::object callback, QNetworkReply * reply)
+    : callback_ (callback), reply_ (reply)
+{
+    connect(reply_,SIGNAL(finished()),this,SLOT(finished()));
+}
+
+prefix_ ReplyHandler::~ReplyHandler()
+{}
+
+prefix_ void ReplyHandler::finished()
+{
+    callback_(reply_->error() == QNetworkReply::NoError, reply_->readAll());
+    reply_->deleteLater();
+    deleteLater();
+}
+
+prefix_ TimeoutHandler::TimeoutHandler(boost::python::object callback, unsigned msecs)
+    : callback_ (callback)
+{
+    timer_.setSingleShot(true);
+    timer_.start(msecs);
+    connect(&timer_, SIGNAL(timeout()), this, SLOT(timeout()));
+}
+
+prefix_ void TimeoutHandler::timeout()
+{
+    callback_();
+    deleteLater();
+}
+
+BOOST_PYTHON_MODULE(_httpapi)
+{
+    py::class_<Manager, boost::noncopyable>("Manager")
+        .def("post", &Manager::post)
+        ;
+
+    py::def("timeout", &timeout);
+}
+
+#include "PythonHTTP.moc"
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_
+//#include "PythonHTTP.mpp"
+
+\f
+// Local Variables:
+// mode: c++
+// indent-tabs-mode: nil
+// End: