yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
wasm_file_dialog.h
Go to the documentation of this file.
1#ifndef YAZE_APP_PLATFORM_WASM_WASM_FILE_DIALOG_H_
2#define YAZE_APP_PLATFORM_WASM_WASM_FILE_DIALOG_H_
3
4#ifdef __EMSCRIPTEN__
5
6#include <functional>
7#include <memory>
8#include <mutex>
9#include <string>
10#include <unordered_map>
11#include <vector>
12
13#include "absl/status/status.h"
14#include "absl/status/statusor.h"
15
16namespace yaze {
17namespace platform {
18
26class WasmFileDialog {
27 public:
33 using FileLoadCallback = std::function<void(
34 const std::string& filename, const std::vector<uint8_t>& data)>;
35
40 using ErrorCallback = std::function<void(const std::string& error_message)>;
41
48 static void OpenFileDialog(const std::string& accept,
49 FileLoadCallback on_load,
50 ErrorCallback on_error = nullptr);
51
58 static void OpenTextFileDialog(const std::string& accept,
59 std::function<void(const std::string& filename,
60 const std::string& content)>
61 on_load,
62 ErrorCallback on_error = nullptr);
63
70 static absl::Status DownloadFile(const std::string& filename,
71 const std::vector<uint8_t>& data);
72
80 static absl::Status DownloadTextFile(
81 const std::string& filename, const std::string& content,
82 const std::string& mime_type = "text/plain");
83
88 static bool IsSupported();
89
93 struct PendingOperation {
94 int id;
95 FileLoadCallback binary_callback;
96 std::function<void(const std::string&, const std::string&)> text_callback;
97 ErrorCallback error_callback;
98 bool is_text;
99 };
100
101 private:
102 // Callback management (thread-safe)
103 static int next_callback_id_;
104 static std::unordered_map<int, PendingOperation> pending_operations_;
105 static std::mutex operations_mutex_;
106
112 static int RegisterCallback(PendingOperation operation);
113
119 static std::unique_ptr<PendingOperation> GetPendingOperation(int callback_id);
120
121 public:
122 // These must be public to be called from extern "C" functions
130 static void HandleFileLoaded(int callback_id, const char* filename,
131 const uint8_t* data, size_t size);
132
139 static void HandleTextFileLoaded(int callback_id, const char* filename,
140 const char* content);
141
147 static void HandleFileError(int callback_id, const char* error_message);
148};
149
150} // namespace platform
151} // namespace yaze
152
153// C-style callbacks for JavaScript interop
154extern "C" {
155void yazeHandleFileLoaded(int callback_id, const char* filename,
156 const uint8_t* data, size_t size);
157void yazeHandleTextFileLoaded(int callback_id, const char* filename,
158 const char* content);
159void yazeHandleFileError(int callback_id, const char* error_message);
160}
161
162#endif // __EMSCRIPTEN__
163
164#endif // YAZE_APP_PLATFORM_WASM_WASM_FILE_DIALOG_H_