6#include <private/qstdweb_p.h>
8#include <emscripten/bind.h>
9#include <emscripten/html5.h>
10#include <emscripten/val.h>
12#include <QtCore/qregularexpression.h>
19bool hasLocalFilesApi()
30 emscripten::val document = emscripten::val::global(
"document");
31 emscripten::val
input = document.call<emscripten::val>(
"createElement", std::string(
"input"));
32 input.set(
"type",
"file");
33 input.set(
"style",
"display:none");
39 static std::unique_ptr<qstdweb::EventCallback> changeEvent;
40 auto callback = [=](emscripten::val) { onFilesSelected.thenFunc(
input[
"files"]); };
41 changeEvent = std::make_unique<qstdweb::EventCallback>(
input,
"change", callback);
44 emscripten::val body = document[
"body"];
45 body.call<
void>(
"appendChild",
input);
46 input.call<
void>(
"click");
47 body.call<
void>(
"removeChild",
input);
60 .thenFunc = [=](emscripten::val fileHandles)
mutable {
61 std::vector<emscripten::val> filePromises;
62 filePromises.reserve(fileHandles[
"length"].as<int>());
63 for (
int i = 0;
i < fileHandles[
"length"].as<
int>(); ++
i)
64 filePromises.push_back(fileHandles[
i].call<emscripten::val>(
"getFile"));
65 Promise::all(std::move(filePromises),
callbacks);
69 }, std::move(options));
81 std::move(
callbacks), std::move(options));
89 showOpenViaLocalFileApi(accept, fileSelectMode, std::move(
callbacks)) :
90 showOpenViaHTMLPolyfill(accept, fileSelectMode, std::move(
callbacks));
95 return hasLocalFilesApi();
101 showSaveViaLocalFileApi(fileNameHint, std::move(
callbacks));
107 const std::function<
char *(uint64_t
size,
const std::string
name)> &acceptFile,
108 const std::function<
void ()> &fileDataReady)
110 auto readFile = std::make_shared<std::function<
void(
int)>>();
112 *readFile = [=](
int fileIndex)
mutable {
114 if (fileIndex >= fileList.
length()) {
124 (*readFile)(fileIndex + 1);
129 file.stream(
buffer, [readFile = readFile.get(), fileIndex, fileDataReady]() {
131 (*readFile)(fileIndex + 1);
138QStringList makeFilterList(
const std::string &qtAcceptList)
159 emscripten::val document = emscripten::val::global(
"document");
161 emscripten::val contentUrl =
window[
"URL"].call<emscripten::val>(
"createObjectURL", contentBlob.val());
162 emscripten::val contentLink = document.call<emscripten::val>(
"createElement", std::string(
"a"));
163 contentLink.set(
"href", contentUrl);
164 contentLink.set(
"download", fileNameHint);
165 contentLink.set(
"style",
"display:none");
167 emscripten::val body = document[
"body"];
168 body.call<
void>(
"appendChild", contentLink);
169 contentLink.call<
void>(
"click");
170 body.call<
void>(
"removeChild", contentLink);
172 window[
"URL"].call<emscripten::val>(
"revokeObjectURL", contentUrl);
176 const std::function<
void (
int fileCount)> &fileDialogClosed,
177 const std::function<
char *(uint64_t
size,
const std::string&
name)> &acceptFile,
178 const std::function<
void()> &fileDataReady)
181 .thenFunc = [=](emscripten::val
result) {
183 fileDialogClosed(
files.length());
184 readFiles(
files, acceptFile, fileDataReady);
186 .catchFunc = [=](emscripten::val) {
193 const std::function<
void (
bool fileSelected)> &fileDialogClosed,
194 const std::function<
char *(uint64_t
size,
const std::string&
name)> &acceptFile,
195 const std::function<
void()> &fileDataReady)
197 auto fileDialogClosedWithInt = [=](
int fileCount) { fileDialogClosed(fileCount != 0); };
207 .thenFunc = [=](
val writable) {
213 static constexpr size_t desiredChunkSize = 1024u;
214#if defined(__EMSCRIPTEN_SHARED_MEMORY__)
218 auto state = std::make_shared<State>();
220 state->continuation = [=](
val)
mutable {
221 const size_t remaining =
data.size() -
state->written;
222 if (remaining == 0) {
228 const auto currentChunkSize = std::min(remaining, desiredChunkSize);
230#if defined(__EMSCRIPTEN_SHARED_MEMORY__)
238 .thenFunc =
state->continuation,
240 chunkArray.copyFrom(
data.constData() +
state->written, currentChunkSize)
242 .call<emscripten::val>(
"subarray", emscripten::val(0),
243 emscripten::val(currentChunkSize)));
247 .thenFunc =
state->continuation,
249 val(typed_memory_view(currentChunkSize,
data.constData() +
state->written)));
251 state->written += currentChunkSize;
254 state->continuation(val::undefined());
267 .thenFunc = [=](emscripten::val
result) {
273void saveFile(
const char *content,
size_t size,
const std::string &fileNameHint)
281 .thenFunc = [=](emscripten::val
result) {
qint64 size() const override
\reimp
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromStdString(const std::string &s)
static Blob copyFrom(const char *buffer, uint32_t size, std::string mimeType)
std::string makeFileInputAccept(const QStringList &filterList)
emscripten::val makeOpenFileOptions(const QStringList &filterList, bool acceptMultiple)
emscripten::val makeSaveFileOptions(const QStringList &filterList, const std::string &suggestedName)
Combined button and popup list for selecting options.
void showSave(const std::string &fileNameHint, qstdweb::PromiseCallbacks callbacks)
void showOpen(const QStringList &accept, FileSelectMode fileSelectMode, qstdweb::PromiseCallbacks callbacks)
void saveFile(const QByteArray &data, const std::string &fileNameHint)
void saveDataToFileInChunks(emscripten::val fileHandle, const QByteArray &data)
void openFile(const std::string &accept, const std::function< void(bool fileSelected)> &fileDialogClosed, const std::function< char *(uint64_t size, const std::string &name)> &acceptFile, const std::function< void()> &fileDataReady)
void downloadDataAsFile(const char *content, size_t size, const std::string &fileNameHint)
void openFiles(const std::string &accept, FileSelectMode fileSelectMode, const std::function< void(int fileCount)> &fileDialogClosed, const std::function< char *(uint64_t size, const std::string &name)> &acceptFile, const std::function< void()> &fileDataReady)
QList< QString > QStringList
Constructs a string list that contains the given string, str.
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
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLenum GLenum GLenum input
static constexpr QChar sep
PromiseCallbacks callbacks
#define QStringLiteral(str)