summaryrefslogtreecommitdiff
path: root/daemon/jskitobjects.cpp
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2014-12-01 03:12:00 +0100
committerJavier <dev.git@javispedro.com>2014-12-01 03:14:10 +0100
commitbe139d8ff95160782b424134a025b30c82083e28 (patch)
tree70cda209c44a657db3dd436afacaabe53b192838 /daemon/jskitobjects.cpp
parent1e3794c476caf5c41360c36cc13c8425ec0dd26c (diff)
add stub xmlhttprequest and allow showConfig event
Diffstat (limited to 'daemon/jskitobjects.cpp')
-rw-r--r--daemon/jskitobjects.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/daemon/jskitobjects.cpp b/daemon/jskitobjects.cpp
index aecc55d..f745233 100644
--- a/daemon/jskitobjects.cpp
+++ b/daemon/jskitobjects.cpp
@@ -1,6 +1,7 @@
#include <QStandardPaths>
#include <QDesktopServices>
#include <QUrl>
+#include <QBuffer>
#include <QDir>
#include "jskitobjects.h"
@@ -61,6 +62,13 @@ void JSKitPebble::openUrl(const QUrl &url)
}
}
+QJSValue JSKitPebble::createXMLHttpRequest()
+{
+ JSKitXMLHttpRequest *xhr = new JSKitXMLHttpRequest(_mgr, 0);
+ // Should be deleted by JS engine.
+ return _mgr->engine()->newQObject(xhr);
+}
+
void JSKitPebble::invokeCallbacks(const QString &type, const QJSValueList &args)
{
if (!_callbacks.contains(type)) return;
@@ -144,3 +152,109 @@ QString JSKitLocalStorage::getStorageFileFor(const QUuid &uuid)
fileName.remove('}');
return dataDir.absoluteFilePath("js-storage/" + fileName + ".ini");
}
+
+JSKitXMLHttpRequest::JSKitXMLHttpRequest(JSKitManager *mgr, QObject *parent)
+ : QObject(parent), _mgr(mgr),
+ _net(new QNetworkAccessManager(this)), _reply(0)
+{
+ logger()->debug() << "constructed";
+}
+
+JSKitXMLHttpRequest::~JSKitXMLHttpRequest()
+{
+ logger()->debug() << "destructed";
+}
+
+void JSKitXMLHttpRequest::open(const QString &method, const QString &url, bool async)
+{
+ if (_reply) {
+ _reply->deleteLater();
+ _reply = 0;
+ }
+
+ _request = QNetworkRequest(QUrl(url));
+ _verb = method;
+ Q_UNUSED(async);
+}
+
+void JSKitXMLHttpRequest::setRequestHeader(const QString &header, const QString &value)
+{
+ logger()->debug() << "setRequestHeader" << header << value;
+ _request.setRawHeader(header.toLatin1(), value.toLatin1());
+}
+
+void JSKitXMLHttpRequest::send(const QString &body)
+{
+ QBuffer *buffer = new QBuffer;
+ buffer->setData(body.toUtf8());
+ logger()->debug() << "sending" << _verb << "to" << _request.url() << "with" << body;
+ _reply = _net->sendCustomRequest(_request, _verb.toLatin1(), buffer);
+ connect(_reply, &QNetworkReply::finished, this, &JSKitXMLHttpRequest::handleReplyFinished);
+ buffer->setParent(_reply); // So that it gets deleted alongside the reply object.
+}
+
+void JSKitXMLHttpRequest::abort()
+{
+ if (_reply) {
+ _reply->deleteLater();
+ _reply = 0;
+ }
+}
+
+QJSValue JSKitXMLHttpRequest::onload() const
+{
+ return _onload;
+}
+
+void JSKitXMLHttpRequest::setOnload(const QJSValue &value)
+{
+ _onload = value;
+}
+
+unsigned short JSKitXMLHttpRequest::readyState() const
+{
+ if (!_reply) {
+ return UNSENT;
+ } else if (_reply->isFinished()) {
+ return DONE;
+ } else {
+ return LOADING;
+ }
+}
+
+unsigned short JSKitXMLHttpRequest::status() const
+{
+ if (!_reply || !_reply->isFinished()) {
+ return 0;
+ } else {
+ return _reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt();
+ }
+}
+
+QString JSKitXMLHttpRequest::responseText() const
+{
+ return QString::fromUtf8(_response);
+}
+
+void JSKitXMLHttpRequest::handleReplyFinished()
+{
+ if (!_reply) {
+ logger()->info() << "reply finished too late";
+ return;
+ }
+
+ _response = _reply->readAll();
+ logger()->debug() << "reply finished, reply text:" << QString::fromUtf8(_response);
+
+ emit readyStateChanged();
+ emit statusChanged();
+ emit responseTextChanged();
+
+
+ if (_onload.isCallable()) {
+ logger()->debug() << "going to call onload handler:" << _onload.toString();
+ _onload.callWithInstance(_mgr->engine()->toScriptValue(this));
+ } else {
+ logger()->debug() << "No onload set";
+ }
+}