Hi! I would have a question about the FS.writeFile function.
I tried to use is in c++ similar like this: https://github.com/emscripten-core/emscripten/issues/17230 But didn't worked for me with this: void Test::read() { auto onFileReady = [=](const QString &fileName, const QByteArray &fileContents) { if (fileName.isEmpty()) { // Report error1 } else { emscripten::val fileContentView = emscripten::val(emscripten::typed_memory_view(fileContents.size(), fileContents.constData())); emscripten::val fileContentCopy = emscripten::val::global("ArrayBuffer").new_(fileContents.size()); emscripten::val fileContentCopyView = emscripten::val::global("Uint8Array").new_(fileContentCopy); fileContentCopyView.call<void>("set", fileContentView); //emscripten::val contentArray = emscripten::val::array(); //contentArray.call<void>("push", fileContentCopyView); std::string path = fileName.toStdString(); EM_ASM({ FS.writeFile(path, new Uint8Array([ 1, 2, 3, 4 ])); }); } }; QFileDialog::getOpenFileContent("*.*", onFileReady); } If I tried to use a variable like 'path' in the example, it didn't work. EM_ASM({ FS.writeFile(path, new Uint8Array([ 1, 2, 3, 4 ])); }); But If I used like this, it works: EM_ASM({ FS.writeFile("/write_file.txt", new Uint8Array([ 1, 2, 3, 4 ])); }); So my question is, how can I use a variable inside the EM_ASM({ }) ? Furthermore, how can I convert a char* to Uint8Array for the FS.writeFile() function? I tried a lot of ways (like in the example with emscripten::val) but it didn't work. Thanks for the help in advance. All the best, Balázs Balázs Varga <balazs.varga...@gmail.com> ezt írta (időpont: 2022. okt. 14., P, 12:23): > Thanks for getting back to me. :) Yes, the code is a c++ and not a JS > library, so MAIN_THREAD_EM_ASM can be useful. But I have no idea yet how to > make it work with that. > > Best, > Balázs > > 'Sam Clegg' via emscripten-discuss <emscripten-discuss@googlegroups.com> > ezt írta (időpont: 2022. okt. 13., Cs, 18:35): > >> It looks like that API only works on the main thread (since it uses the >> DOM). >> >> If you really need to call such APIs on a background thread there are >> various ways to proxy the work back to the main thread. See >> https://emscripten.org/docs/porting/pthreads.html#proxying. If the >> code in question is not a JS library (e.g. if its written in EM_JS or >> EM_ASM) you can use `MAIN_THREAD_EM_ASM` and/or >> `emscripten_sync_run_in_main_thread` helpers. >> >> cheers, >> sam >> >> >> On Thu, Oct 13, 2022 at 8:31 AM Balázs Varga <balazs.varga...@gmail.com> >> wrote: >> >>> Hi! >>> >>> I run into a problem with >>> QFileDialog::getOpenFileContent function, which are use to access to the >>> local filesystem with emscripten: >>> https://doc.qt.io/qt-5/qfiledialog.html#getOpenFileContent >>> >>> I tried to call it on a different thread then what on the wasm >>> application is running: >>> std::thread th1 (QFileDialog::getOpenFileContent, "*.*", onFileReady); >>> th1.join(); >>> >>> But in that case, it froze at the emscripten part in the openFileDialog >>> function and no file dialogue was opened. >>> emscripten::val document = emscripten::val::global("document"); >>> emscripten::val input = document.call<emscripten::val>("createElement", >>> std::string("input")); >>> >>> >>> *I got the error message at creating the input value.* >>> >>> *https://codereview.qt-project.org/c/qt/qtbase/+/250461/7/src/gui/platform/wasm/qwasmlocalfileaccess.cpp#129* >>> <https://codereview.qt-project.org/c/qt/qtbase/+/250461/7/src/gui/platform/wasm/qwasmlocalfileaccess.cpp#129> >>> >>> Running on the main thread there is no error and works fine. >>> Any idea what could be the problem/solution here? >>> I got this error message: >>> >>> worker.js onmessage() captured an uncaught exception: TypeError: Cannot >>> read properties of undefined (reading 'createElement') >>> self.onmessage @ soffice.worker.js:207 >>> soffice.worker.js:208 TypeError: Cannot read properties of undefined >>> (reading 'createElement') >>> at methodCaller_emscripten$$val_$std$$string$ (eval at new_ >>> (47933e67-c694-46fe-af70-91dc8b50859c:8694:27), <anonymous>:5:20) >>> at __emval_call_method (47933e67-c694-46fe-af70-91dc8b50859c:9267:14) >>> at emscripten::internal::MethodCaller<emscripten::val, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> > >::call(emscripten::internal::_EM_VAL*, char >>> const*, std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >>> emscripten::internal::MethodCaller<emscripten::val, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> > >::call(emscripten::internal::_EM_VAL*, char >>> const*, std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >&&) (val.h:278) >>> at emscripten::val emscripten::val::call<emscripten::val, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> > >(char const*, std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> >&&) emscripten::val >>> emscripten::val::call<emscripten::val, std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > >(char const*, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >&&) const (val.h:498) >>> at QWasmLocalFileAccess::openFileDialog(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void >>> (qstdweb::FileList const&)> >>> QWasmLocalFileAccess::openFileDialog(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void >>> (qstdweb::FileList const&)> const&) (qwasmlocalfileaccess.cpp:131) >>> at QWasmLocalFileAccess::openFiles(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void (int)> >>> const&, std::__2::function<char* (unsigned long long, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> >>> QWasmLocalFileAccess::openFiles(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void (int)> >>> const&, std::__2::function<char* (unsigned long long, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> const&) >>> (qwasmlocalfileaccess.cpp:156) >>> at QWasmLocalFileAccess::openFile(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> std::__2::function<void (bool)> const&, std::__2::function<char* (unsigned >>> long long, std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> >>> QWasmLocalFileAccess::openFile(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> std::__2::function<void (bool)> const&, std::__2::function<char* (unsigned >>> long long, std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> const&) >>> (qwasmlocalfileaccess.cpp:169) >>> at QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> QFileDialog::getOpenFileContent(QString const&, std::__2::function<void >>> (QString const&, QByteArray const&)> const&)::$_2::operator()() >>> (qfiledialog.cpp:2444) >>> at >>> decltype(std::__2::forward<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(fp)()) >>> std::__2::__invoke<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> decltype(std::__2::forward<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(fp)()) >>> std::__2::__invoke<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> const&)::$_2&) >>> (type_traits:3694) >>> at void std::__2::__invoke_void_return_wrapper<void, >>> true>::__call<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> void >>> std::__2::__invoke_void_return_wrapper<void, >>> true>::__call<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> const&)::$_2&) >>> (__functional_base:348)worker.js onmessage() captured an uncaught >>> exception: TypeError: Cannot read properties of undefined (reading >>> 'createElement') >>> self.onmessage @ soffice.worker.js:207 >>> soffice.worker.js:208 TypeError: Cannot read properties of undefined >>> (reading 'createElement') >>> at methodCaller_emscripten$$val_$std$$string$ (eval at new_ >>> (47933e67-c694-46fe-af70-91dc8b50859c:8694:27), <anonymous>:5:20) >>> at __emval_call_method (47933e67-c694-46fe-af70-91dc8b50859c:9267:14) >>> at emscripten::internal::MethodCaller<emscripten::val, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> > >::call(emscripten::internal::_EM_VAL*, char >>> const*, std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >>> emscripten::internal::MethodCaller<emscripten::val, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> > >::call(emscripten::internal::_EM_VAL*, char >>> const*, std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >&&) (val.h:278) >>> at emscripten::val emscripten::val::call<emscripten::val, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> > >(char const*, std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> >&&) emscripten::val >>> emscripten::val::call<emscripten::val, std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > >(char const*, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >&&) const (val.h:498) >>> at QWasmLocalFileAccess::openFileDialog(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void >>> (qstdweb::FileList const&)> >>> QWasmLocalFileAccess::openFileDialog(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void >>> (qstdweb::FileList const&)> const&) (qwasmlocalfileaccess.cpp:131) >>> at QWasmLocalFileAccess::openFiles(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void (int)> >>> const&, std::__2::function<char* (unsigned long long, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> >>> QWasmLocalFileAccess::openFiles(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> QWasmLocalFileAccess::FileSelectMode, std::__2::function<void (int)> >>> const&, std::__2::function<char* (unsigned long long, >>> std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> const&) >>> (qwasmlocalfileaccess.cpp:156) >>> at QWasmLocalFileAccess::openFile(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> std::__2::function<void (bool)> const&, std::__2::function<char* (unsigned >>> long long, std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> >>> QWasmLocalFileAccess::openFile(std::__2::basic_string<char, >>> std::__2::char_traits<char>, std::__2::allocator<char> > const&, >>> std::__2::function<void (bool)> const&, std::__2::function<char* (unsigned >>> long long, std::__2::basic_string<char, std::__2::char_traits<char>, >>> std::__2::allocator<char> >)> const&, std::__2::function<void ()> const&) >>> (qwasmlocalfileaccess.cpp:169) >>> at QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> QFileDialog::getOpenFileContent(QString const&, std::__2::function<void >>> (QString const&, QByteArray const&)> const&)::$_2::operator()() >>> (qfiledialog.cpp:2444) >>> at >>> decltype(std::__2::forward<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(fp)()) >>> std::__2::__invoke<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> decltype(std::__2::forward<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(fp)()) >>> std::__2::__invoke<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> const&)::$_2&) >>> (type_traits:3694) >>> at void std::__2::__invoke_void_return_wrapper<void, >>> true>::__call<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> void >>> std::__2::__invoke_void_return_wrapper<void, >>> true>::__call<QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> >>> const&)::$_2&>(QFileDialog::getOpenFileContent(QString const&, >>> std::__2::function<void (QString const&, QByteArray const&)> const&)::$_2&) >>> (__functional_base:348) >>> >>> Thanks in advance, >>> Balazs >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "emscripten-discuss" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to emscripten-discuss+unsubscr...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/emscripten-discuss/0b5c70fa-8cd2-4705-a64c-4816c1189dccn%40googlegroups.com >>> <https://groups.google.com/d/msgid/emscripten-discuss/0b5c70fa-8cd2-4705-a64c-4816c1189dccn%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "emscripten-discuss" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to emscripten-discuss+unsubscr...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/emscripten-discuss/CAL_va29QkPT_WVX_fsj1qe8keQ_serFRrgF72kmYtMshw7N2dA%40mail.gmail.com >> <https://groups.google.com/d/msgid/emscripten-discuss/CAL_va29QkPT_WVX_fsj1qe8keQ_serFRrgF72kmYtMshw7N2dA%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-discuss+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/CAHt2gK_uq72yV%3DkhdKjuoFec0pz62zPJ%2BchhBTyd7HepjfFn5g%40mail.gmail.com.