summaryrefslogtreecommitdiff
path: root/daemon/jskitobjects.h
blob: 1477fc6a1dcd3acbeb7ba31ea8e50dc352620adb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#ifndef JSKITMANAGER_P_H
#define JSKITMANAGER_P_H

#include <QElapsedTimer>
#include <QSettings>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QGeoPositionInfoSource>
#include "jskitmanager.h"

class JSKitPebble : public QObject
{
    Q_OBJECT
    QLoggingCategory l;

public:
    explicit JSKitPebble(const AppInfo &appInfo, JSKitManager *mgr);

    Q_INVOKABLE void addEventListener(const QString &type, QJSValue function);
    Q_INVOKABLE void removeEventListener(const QString &type, QJSValue function);

    Q_INVOKABLE uint sendAppMessage(QJSValue message, QJSValue callbackForAck = QJSValue(), QJSValue callbackForNack = QJSValue());

    Q_INVOKABLE void showSimpleNotificationOnPebble(const QString &title, const QString &body);

    Q_INVOKABLE void openURL(const QUrl &url);

    Q_INVOKABLE QString getAccountToken() const;
    Q_INVOKABLE QString getWatchToken() const;

    Q_INVOKABLE QJSValue createXMLHttpRequest();

    void invokeCallbacks(const QString &type, const QJSValueList &args = QJSValueList());

private:
    QJSValue buildAckEventObject(uint transaction, const QString &message = QString()) const;

private:
    AppInfo _appInfo;
    JSKitManager *_mgr;
    QHash<QString, QList<QJSValue>> _callbacks;
};

class JSKitConsole : public QObject
{
    Q_OBJECT
    QLoggingCategory l;

public:
    explicit JSKitConsole(JSKitManager *mgr);

    Q_INVOKABLE void log(const QString &msg);
};

class JSKitLocalStorage : public QObject
{
    Q_OBJECT

    Q_PROPERTY(int length READ length NOTIFY lengthChanged)

public:
    explicit JSKitLocalStorage(const QUuid &uuid, JSKitManager *mgr);

    int length() const;

    Q_INVOKABLE QJSValue getItem(const QString &key) const;
    Q_INVOKABLE void setItem(const QString &key, const QString &value);
    Q_INVOKABLE void removeItem(const QString &key);

    Q_INVOKABLE void clear();

signals:
    void lengthChanged();

private:
    void checkLengthChanged();
    static QString getStorageFileFor(const QUuid &uuid);

private:
    QSettings *_storage;
    int _len;
};

class JSKitXMLHttpRequest : public QObject
{
    Q_OBJECT
    QLoggingCategory l;
    Q_ENUMS(ReadyStates)

    Q_PROPERTY(QJSValue onload READ onload WRITE setOnload)
    Q_PROPERTY(QJSValue ontimeout READ ontimeout WRITE setOntimeout)
    Q_PROPERTY(QJSValue onerror READ onerror WRITE setOnerror)
    Q_PROPERTY(uint readyState READ readyState NOTIFY readyStateChanged)
    Q_PROPERTY(uint timeout READ timeout WRITE setTimeout)
    Q_PROPERTY(uint status READ status NOTIFY statusChanged)
    Q_PROPERTY(QString statusText READ statusText NOTIFY statusTextChanged)
    Q_PROPERTY(QString responseType READ responseType WRITE setResponseType)
    Q_PROPERTY(QJSValue response READ response NOTIFY responseChanged)
    Q_PROPERTY(QString responseText READ responseText NOTIFY responseTextChanged)

public:
    explicit JSKitXMLHttpRequest(JSKitManager *mgr, QObject *parent = 0);
    ~JSKitXMLHttpRequest();

    enum ReadyStates {
        UNSENT = 0,
        OPENED = 1,
        HEADERS_RECEIVED = 2,
        LOADING = 3,
        DONE = 4
    };

    Q_INVOKABLE void open(const QString &method, const QString &url, bool async = false, const QString &username = QString(), const QString &password = QString());
    Q_INVOKABLE void setRequestHeader(const QString &header, const QString &value);
    Q_INVOKABLE void send(const QJSValue &data = QJSValue(QJSValue::NullValue));
    Q_INVOKABLE void abort();

    QJSValue onload() const;
    void setOnload(const QJSValue &value);
    QJSValue ontimeout() const;
    void setOntimeout(const QJSValue &value);
    QJSValue onerror() const;
    void setOnerror(const QJSValue &value);

    uint readyState() const;

    uint timeout() const;
    void setTimeout(uint value);

    uint status() const;
    QString statusText() const;

    QString responseType() const;
    void setResponseType(const QString& type);

    QJSValue response() const;
    QString responseText() const;

signals:
    void readyStateChanged();
    void statusChanged();
    void statusTextChanged();
    void responseChanged();
    void responseTextChanged();

private slots:
    void handleReplyFinished();
    void handleReplyError(QNetworkReply::NetworkError code);
    void handleAuthenticationRequired(QNetworkReply *reply, QAuthenticator *auth);

private:
    JSKitManager *_mgr;
    QNetworkAccessManager *_net;
    QString _verb;
    uint _timeout;
    QString _username;
    QString _password;
    QNetworkRequest _request;
    QNetworkReply *_reply;
    QString _responseType;
    QByteArray _response;
    QJSValue _onload;
    QJSValue _ontimeout;
    QJSValue _onerror;
};

class JSKitGeolocation : public QObject
{
    Q_OBJECT
    Q_ENUMS(PositionError)
    QLoggingCategory l;

    struct Watcher;

public:
    explicit JSKitGeolocation(JSKitManager *mgr);

    enum PositionError {
        PERMISSION_DENIED = 1,
        POSITION_UNAVAILABLE = 2,
        TIMEOUT = 3
    };

    Q_INVOKABLE void getCurrentPosition(const QJSValue &successCallback, const QJSValue &errorCallback = QJSValue(), const QVariantMap &options = QVariantMap());
    Q_INVOKABLE int watchPosition(const QJSValue &successCallback, const QJSValue &errorCallback = QJSValue(), const QVariantMap &options = QVariantMap());
    Q_INVOKABLE void clearWatch(int watchId);

private slots:
    void handleError(const QGeoPositionInfoSource::Error error);
    void handlePosition(const QGeoPositionInfo &pos);
    void handleTimeout();
    void updateTimeouts();

private:
    int setupWatcher(const QJSValue &successCallback, const QJSValue &errorCallback, const QVariantMap &options, bool once);
    void removeWatcher(int watchId);

    QJSValue buildPositionObject(const QGeoPositionInfo &pos);
    QJSValue buildPositionErrorObject(PositionError error, const QString &message = QString());
    QJSValue buildPositionErrorObject(const QGeoPositionInfoSource::Error error);
    void invokeCallback(QJSValue callback, QJSValue event);

private:
    JSKitManager *_mgr;
    QGeoPositionInfoSource *_source;

    struct Watcher {
        QJSValue successCallback;
        QJSValue errorCallback;
        int watchId;
        bool once;
        bool highAccuracy;
        int timeout;
        QElapsedTimer timer;
    };

    QList<Watcher> _watches;
    int _lastWatchId;
};

#endif // JSKITMANAGER_P_H