Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qstdweb_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QSTDWEB_P_H
5#define QSTDWEB_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <private/qglobal_p.h>
19#include <QtCore/qglobal.h>
20#include "QtCore/qhash.h"
21#include "QtCore/qiodevice.h"
22
23#include <emscripten/val.h>
24
25#include <cstdint>
26#include <functional>
27#include <initializer_list>
28#include <memory>
29#include <string>
30#include <utility>
31
32#if QT_CONFIG(thread)
33#include <emscripten/proxying.h>
34#include <emscripten/threading.h>
35#endif // #if QT_CONFIG(thread)
36
38
39class QMimeData;
40
41namespace qstdweb {
42 extern const char makeContextfulPromiseFunctionName[];
43
44 // DOM API in C++, implemented using emscripten val.h and bind.h.
45 // This is private API and can be extended and changed as needed.
46 // The API mirrors that of the native API, with some extensions
47 // to ease usage from C++ code.
48
49 class ArrayBuffer;
50 class Blob;
51 class File;
52 class FileList;
53 class FileReader;
54 class Uint8Array;
55 class EventCallback;
56
57 class Q_CORE_EXPORT ArrayBuffer {
58 public:
59 explicit ArrayBuffer(uint32_t size);
60 explicit ArrayBuffer(const emscripten::val &arrayBuffer);
61 uint32_t byteLength() const;
62 ArrayBuffer slice(uint32_t begin, uint32_t end) const;
63 emscripten::val val() const;
64
65 private:
66 friend class Uint8Array;
67 emscripten::val m_arrayBuffer = emscripten::val::undefined();
68 };
69
70 class Q_CORE_EXPORT Blob {
71 public:
72 explicit Blob(const emscripten::val &blob);
73 static Blob fromArrayBuffer(const ArrayBuffer &arrayBuffer);
74 uint32_t size() const;
75 static Blob copyFrom(const char *buffer, uint32_t size, std::string mimeType);
76 static Blob copyFrom(const char *buffer, uint32_t size);
77 Blob slice(uint32_t begin, uint32_t end) const;
78 ArrayBuffer arrayBuffer_sync() const;
79 emscripten::val val() const;
80 std::string type() const;
81
82 private:
83 friend class FileReader;
84 emscripten::val m_blob = emscripten::val::undefined();
85 };
86
87 class Q_CORE_EXPORT File {
88 public:
89 File() = default;
90 explicit File(const emscripten::val &file);
92
93 File(const File &other);
97
98 Blob slice(uint64_t begin, uint64_t end) const;
99 std::string name() const;
100 uint64_t size() const;
101 std::string type() const;
102 void stream(uint32_t offset, uint32_t length, char *buffer,
103 std::function<void()> completed) const;
104 void stream(char *buffer, std::function<void()> completed) const;
105 emscripten::val val() const;
107 const QString &fileUrlPath() const { return m_urlPath; }
108 emscripten::val file() const { return m_file; }
109
110 private:
111 emscripten::val m_file = emscripten::val::undefined();
112 QString m_urlPath;
113 };
114
115 class Q_CORE_EXPORT FileUrlRegistration
116 {
117 public:
118 explicit FileUrlRegistration(File file);
120
125
126 const QString &path() const { return m_path; }
127
128 private:
129 QString m_path;
130 };
131
132 using FileUrlRegistrations = std::vector<std::unique_ptr<FileUrlRegistration>>;
133
134 class Q_CORE_EXPORT FileList {
135 public:
136 FileList() = default;
137 explicit FileList(const emscripten::val &fileList);
138
139 int length() const;
140 File item(int index) const;
141 File operator[](int index) const;
142 emscripten::val val() const;
143
144 private:
145 emscripten::val m_fileList = emscripten::val::undefined();
146 };
147
148 class Q_CORE_EXPORT FileReader {
149 public:
150 ArrayBuffer result() const;
151 void readAsArrayBuffer(const Blob &blob) const;
152
153 void onLoad(const std::function<void(emscripten::val)> &onLoad);
154 void onError(const std::function<void(emscripten::val)> &onError);
155 void onAbort(const std::function<void(emscripten::val)> &onAbort);
156 emscripten::val val() const;
157
158 private:
159 emscripten::val m_fileReader = emscripten::val::global("FileReader").new_();
160 std::unique_ptr<EventCallback> m_onLoad;
161 std::unique_ptr<EventCallback> m_onError;
162 std::unique_ptr<EventCallback> m_onAbort;
163 };
164
165 class Q_CORE_EXPORT Uint8Array {
166 public:
167 static Uint8Array heap();
168 explicit Uint8Array(const emscripten::val &uint8Array);
169 explicit Uint8Array(const ArrayBuffer &buffer);
170 explicit Uint8Array(uint32_t size);
171 Uint8Array(const ArrayBuffer &buffer, uint32_t offset, uint32_t length);
172 Uint8Array(const char *buffer, uint32_t size);
173
174 ArrayBuffer buffer() const;
175 uint32_t length() const;
176 void set(const Uint8Array &source);
177 Uint8Array subarray(uint32_t begin, uint32_t end);
178
179 void copyTo(char *destination) const;
180 QByteArray copyToQByteArray() const;
181
182 static void copy(char *destination, const Uint8Array &source);
183 static Uint8Array copyFrom(const char *buffer, uint32_t size);
184 static Uint8Array copyFrom(const QByteArray &buffer);
185 emscripten::val val() const;
186
187 private:
188 static emscripten::val heap_();
189 static emscripten::val constructor_();
190 emscripten::val m_uint8Array = emscripten::val::undefined();
191 };
192
193 class Q_CORE_EXPORT EventCallback
194 {
195 public:
196 EventCallback() = default;
198 EventCallback(EventCallback const&) = delete;
200 EventCallback(emscripten::val element, const std::string &name,
201 const std::function<void(emscripten::val)> &fn);
202
203 private:
204 emscripten::val m_element = emscripten::val::undefined();
205 std::string m_eventName;
206 std::unique_ptr<std::function<void(emscripten::val)>> m_handler;
207 emscripten::val m_eventListener = emscripten::val::undefined();
208 };
209
211 {
212 std::function<void(emscripten::val)> thenFunc;
213 std::function<void(emscripten::val)> catchFunc;
214 std::function<void()> finallyFunc;
215 };
216
217 namespace Promise {
218 void Q_CORE_EXPORT adoptPromise(emscripten::val promise, PromiseCallbacks callbacks);
219
220 template<typename... Args>
221 void make(emscripten::val target,
224 Args... args)
225 {
226 emscripten::val promiseObject = target.call<emscripten::val>(
227 methodName.toStdString().c_str(), std::forward<Args>(args)...);
228 if (promiseObject.isUndefined() || promiseObject["constructor"]["name"].as<std::string>() != "Promise") {
229 qFatal("This function did not return a promise");
230 }
231
232 adoptPromise(std::move(promiseObject), std::move(callbacks));
233 }
234
235 void Q_CORE_EXPORT all(std::vector<emscripten::val> promises, PromiseCallbacks callbacks);
236 };
237
238 template<class F>
239 decltype(auto) bindForever(F wrappedCallback)
240 {
241 return wrappedCallback;
242 }
243
244 class Q_CORE_EXPORT BlobIODevice: public QIODevice
245 {
246 public:
247 BlobIODevice(Blob blob);
248 bool open(QIODeviceBase::OpenMode mode) override;
249 bool isSequential() const override;
250 qint64 size() const override;
251 bool seek(qint64 pos) override;
252
253 protected:
254 qint64 readData(char *data, qint64 maxSize) override;
255 qint64 writeData(const char *, qint64) override;
256
257 private:
258 Blob m_blob;
259 };
260
262 {
263 public:
265 bool open(QIODevice::OpenMode mode) override;
266 bool isSequential() const override;
267 qint64 size() const override;
268 bool seek(qint64 pos) override;
269
270 protected:
271 qint64 readData(char *data, qint64 maxSize) override;
272 qint64 writeData(const char *data, qint64 size) override;
273
274 private:
275 Uint8Array m_array;
276 };
277
278 inline emscripten::val window()
279 {
280 static emscripten::val savedWindow = emscripten::val::global("window");
281 return savedWindow;
282 }
283
284 bool haveAsyncify();
285 bool Q_CORE_EXPORT haveJspi();
287
289 {
290 };
291
292#if QT_CONFIG(thread)
293 template<class T>
294 T proxyCall(std::function<T()> task, emscripten::ProxyingQueue *queue)
295 {
296 T result;
297 queue->proxySync(emscripten_main_runtime_thread_id(),
298 [task, result = &result]() { *result = task(); });
299 return result;
300 }
301
302 template<>
303 inline void proxyCall<void>(std::function<void()> task, emscripten::ProxyingQueue *queue)
304 {
305 queue->proxySync(emscripten_main_runtime_thread_id(), task);
306 }
307
308 template<class T>
309 T runTaskOnMainThread(std::function<T()> task, emscripten::ProxyingQueue *queue)
310 {
311 return emscripten_is_main_runtime_thread() ? task() : proxyCall<T>(std::move(task), queue);
312 }
313
314 template<class T>
315 T runTaskOnMainThread(std::function<T()> task)
316 {
317 emscripten::ProxyingQueue singleUseQueue;
318 return runTaskOnMainThread<T>(task, &singleUseQueue);
319 }
320
321#else
322 template<class T>
323 T runTaskOnMainThread(std::function<T()> task)
324 {
325 return task();
326 }
327#endif // QT_CONFIG(thread)
328
329}
330
332
333#endif
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore \reentrant
Definition qiodevice.h:34
virtual qint64 pos() const
For random-access devices, this function returns the position that data is written to or read from.
\inmodule QtCore
Definition qmimedata.h:16
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
EventCallback(EventCallback const &)=delete
EventCallback & operator=(EventCallback const &)=delete
FileList()=default
FileUrlRegistration(const FileUrlRegistration &other)=delete
FileUrlRegistration(FileUrlRegistration &&other)
FileUrlRegistration & operator=(FileUrlRegistration &&other)
const QString & path() const
Definition qstdweb_p.h:126
FileUrlRegistration & operator=(const FileUrlRegistration &other)=delete
void fileUrlRegistration() const
File & operator=(const File &other)
File(const File &other)
emscripten::val file() const
Definition qstdweb_p.h:108
File()=default
const QString & fileUrlPath() const
Definition qstdweb_p.h:107
File & operator=(File &&other)
File(File &&other)
qint64 size() const override
For open random-access devices, this function returns the size of the device.
Definition qstdweb.cpp:903
bool seek(qint64 pos) override
For random-access devices, this function sets the current position to pos, returning true on success,...
Definition qstdweb.cpp:908
Uint8ArrayIODevice(Uint8Array array)
Definition qstdweb.cpp:887
bool isSequential() const override
Returns true if this device is sequential; otherwise returns false.
Definition qstdweb.cpp:898
qint64 writeData(const char *data, qint64 size) override
Writes up to maxSize bytes from data to the device.
Definition qstdweb.cpp:925
bool open(QIODevice::OpenMode mode) override
Definition qstdweb.cpp:893
Combined button and popup list for selecting options.
void make(emscripten::val target, QString methodName, PromiseCallbacks callbacks, Args... args)
Definition qstdweb_p.h:221
void adoptPromise(emscripten::val promiseObject, PromiseCallbacks callbacks)
Definition qstdweb.cpp:760
void all(std::vector< emscripten::val > promises, PromiseCallbacks callbacks)
Definition qstdweb.cpp:767
bool canBlockCallingThread()
Definition qstdweb.cpp:835
std::vector< std::unique_ptr< FileUrlRegistration > > FileUrlRegistrations
Definition qstdweb_p.h:132
T runTaskOnMainThread(std::function< T()> task)
Definition qstdweb_p.h:323
emscripten::val window()
Definition qstdweb_p.h:278
bool haveJspi()
Definition qstdweb.cpp:823
bool haveAsyncify()
Definition qstdweb.cpp:829
const char makeContextfulPromiseFunctionName[]
decltype(auto) bindForever(F wrappedCallback)
Definition qstdweb_p.h:239
static jboolean copy(JNIEnv *, jobject)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char * destination
static QString methodName(const QDBusIntrospection::Method &method)
EGLStreamKHR stream
const char * mimeType
#define qFatal
Definition qlogging.h:168
GLenum mode
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint index
[2]
GLuint GLuint end
GLenum GLuint GLenum GLsizei length
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint buffer
GLenum type
GLenum target
GLenum GLuint GLintptr offset
GLuint name
GLsizei GLsizei GLchar * source
GLuint GLfloat * val
GLenum array
GLuint64EXT * result
[6]
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
PromiseCallbacks callbacks
Definition qstdweb.cpp:275
decltype(openFileForWriting({})) File
Definition main.cpp:76
long long qint64
Definition qtypes.h:60
QFuture< QSet< QChar > > set
[10]
QFile file
[0]
file open(QIODevice::ReadOnly)
void writeData(const QByteArray &data)
QByteArray readData()
QQueue< int > queue
[0]
QSharedPointer< T > other(t)
[5]
QGraphicsItem * item
QJSValueList args
std::function< void(emscripten::val)> thenFunc
Definition qstdweb_p.h:212
std::function< void()> finallyFunc
Definition qstdweb_p.h:214
std::function< void(emscripten::val)> catchFunc
Definition qstdweb_p.h:213