6 \brief InternalNetworkAccessManager non-inline non-template implementation */
8 #include "Publisher.hh"
9 //#include "Publisher.ih"
13 #include <QNetworkProxy>
15 #include "Publisher.hh"
16 #include <boost/python.hpp>
18 //#include "Publisher.mpp"
20 ///////////////////////////////cc.p////////////////////////////////////////
22 ///////////////////////////////////////////////////////////////////////////
23 // pykit::detail::InternalServerReply
28 class InternalServerReply
29 : public QNetworkReply
33 InternalServerReply(QNetworkAccessManager::Operation operation,
34 QNetworkRequest const & networkRequest,
35 Publisher * publisher);
37 // Forwarded to buffer
38 virtual bool atEnd() const;
39 virtual qint64 bytesAvailable() const;
40 virtual qint64 bytesToWrite() const;
41 virtual bool canReadLine() const;
42 virtual bool isSequential() const;
43 virtual qint64 pos() const;
45 virtual bool seek(qint64 pos);
46 virtual qint64 size() const;
47 virtual bool waitForBytesWritten(int msecs);
48 virtual bool waitForReadyRead(int msecs);
52 using QNetworkReply::setHeader;
57 virtual qint64 readData(char * data, qint64 maxSize);
58 virtual qint64 writeData(char const * data, qint64 maxSize);
72 prefix_ pykit::detail::InternalServerReply::
73 InternalServerReply(QNetworkAccessManager::Operation operation,
74 QNetworkRequest const & networkRequest, Publisher * publisher)
76 setRequest(networkRequest);
77 setOperation(operation);
78 setUrl(networkRequest.url());
79 open(ReadWrite | Unbuffered);
80 buffer_.open(ReadWrite | Unbuffered);
82 Request request (*this);
83 publisher->publish(request);
86 setHeader(QNetworkRequest::ContentLengthHeader, QVariant(size()));
87 setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/html; charset=UTF-8"));
89 // The following rigamole is needed to delay emitting readyRead() / finished() after until the
90 // connections to those signals have been set up.
92 // We use a queued signal here. This will call initSlot after processing has returned to the
94 connect(this, SIGNAL(initSignal()), this, SLOT(initSlot()), Qt::QueuedConnection);
98 prefix_ void pykit::detail::InternalServerReply::initSlot()
104 prefix_ bool pykit::detail::InternalServerReply::atEnd()
106 { return buffer_.atEnd(); }
108 prefix_ qint64 pykit::detail::InternalServerReply::bytesAvailable()
110 { return buffer_.bytesAvailable(); }
112 prefix_ qint64 pykit::detail::InternalServerReply::bytesToWrite()
114 { return buffer_.bytesToWrite(); }
116 prefix_ bool pykit::detail::InternalServerReply::canReadLine()
118 { return buffer_.canReadLine(); }
120 prefix_ bool pykit::detail::InternalServerReply::isSequential()
122 { return buffer_.isSequential(); }
124 prefix_ qint64 pykit::detail::InternalServerReply::pos()
126 { return buffer_.pos(); }
128 prefix_ bool pykit::detail::InternalServerReply::reset()
129 { return buffer_.reset(); }
131 prefix_ bool pykit::detail::InternalServerReply::seek(qint64 pos)
132 { return buffer_.seek(pos); }
134 prefix_ qint64 pykit::detail::InternalServerReply::size()
136 { return buffer_.size(); }
138 prefix_ bool pykit::detail::InternalServerReply::waitForBytesWritten(int msecs)
139 { return buffer_.waitForBytesWritten(msecs); }
141 prefix_ bool pykit::detail::InternalServerReply::waitForReadyRead(int msecs)
142 { return buffer_.waitForReadyRead(msecs); }
144 prefix_ qint64 pykit::detail::InternalServerReply::readData(char * data, qint64 maxSize)
145 { return buffer_.read(data,maxSize); }
147 prefix_ qint64 pykit::detail::InternalServerReply::writeData(char const * data, qint64 maxSize)
148 { return buffer_.write(data,maxSize); }
150 prefix_ void pykit::detail::InternalServerReply::abort()
153 prefix_ void pykit::detail::InternalServerReply::clearResponse()
155 buffer_.buffer().clear();
158 ///////////////////////////////////////////////////////////////////////////
161 prefix_ void pykit::Request::write(std::string const & data)
163 reply_.write(QByteArray(data.data(),data.size()));
166 prefix_ void pykit::Request::reset()
168 reply_.clearResponse();
171 prefix_ void pykit::Request::setContentType(std::string const & contentType)
173 reply_.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType.c_str()));
176 prefix_ void pykit::Request::setLocation(std::string const & location)
178 reply_.setHeader(QNetworkRequest::LocationHeader, QVariant(location.c_str()));
181 prefix_ QUrl pykit::Request::url()
187 prefix_ pykit::Request::Request(detail::InternalServerReply & reply)
191 ///////////////////////////////////////////////////////////////////////////
192 // pykit::InternalNetworkAccessManager
194 prefix_ pykit::InternalNetworkAccessManager::
195 InternalNetworkAccessManager(QNetworkAccessManager * manager, QObject * parent,
196 Publisher * publisher)
197 : QNetworkAccessManager(parent), publisher_ (publisher)
199 setCache(manager->cache());
200 setCookieJar(manager->cookieJar());
201 setProxy(manager->proxy());
202 setProxyFactory(manager->proxyFactory());
205 prefix_ QNetworkReply *
206 pykit::InternalNetworkAccessManager::createRequest(Operation operation,
207 QNetworkRequest const & request,
210 if (request.url().scheme() != "srv")
211 return QNetworkAccessManager::createRequest(operation, request, device);
213 return new detail::InternalServerReply(operation, request, publisher_);
216 #include "Publisher.moc"
218 ///////////////////////////////cc.e////////////////////////////////////////
220 //#include "Publisher.mpp"
226 // comment-column: 40
227 // c-file-style: "j32"
228 // indent-tabs-mode: nil
229 // ispell-local-dictionary: "american"
230 // compile-command: "scons -U"