47 [[nodiscard]]
static PluginManager&
instance()
noexcept;
49 [[nodiscard]]
bool init();
53 [[nodiscard]] std::optional<PluginManifest>
getManifest(
const std::string&
id)
const;
92 [[nodiscard]] uint8_t
pluginBaseDepth() const noexcept {
return plugin_base_depth_; }
94 [[nodiscard]]
bool isLoaded(
const std::string&
id)
const;
110 void dispatchAction(uint32_t action_id, uint32_t idx, uint32_t user_data);
120 bool dispatchCmd(const std::
string&
id, const
char* cmd,
size_t len);
159 PluginManager(
const PluginManager&) =
delete;
160 PluginManager& operator=(
const PluginManager&) =
delete;
162 void startTickTask();
164 static void tickTaskTrampoline(
void* arg);
173 void teardownPlugin(
Plugin& p,
bool runWasmDeinit);
179 void handleTrap(
Plugin& p,
const char* fn);
184 bool loadIntoBackground(
const std::string&
id,
const PluginManifest& mf);
189 void loadAutoloadPlugins();
192 void rebuildMessageIndex();
194 void maybeRefreshMessageIndex();
196 std::unique_ptr<Plugin> active_;
197 std::vector<std::unique_ptr<Plugin>> background_;
198 std::string pending_cmd_;
199 void* tick_task_ =
nullptr;
200 void* call_mutex_ =
nullptr;
201 volatile bool tick_stop_ =
false;
202 std::atomic<bool> pending_stop_{
false};
203 bool initialised_ =
false;
204 uint8_t plugin_base_depth_ = 0;
208 void* msg_index_mutex_ =
nullptr;
209 std::vector<std::string> msg_index_mime_;
210 std::vector<std::string> msg_index_id_;
211 std::string installed_sig_;
212 uint32_t last_index_refresh_ms_ = 0;
In-memory representation of a plugin's meta.json.
Mounts the FAT-FS partition that holds plugin .wasm + .meta files.
Owned WAMR module instance + per-plugin state.
bool dispatchCmd(const std::string &id, const char *cmd, size_t len)
bool activateForMessageType(const char *mime)
Load + start (headless) the installed plugin that declares this MIME type, so its message handler bec...
bool activePluginPreventsSleep() const
uint8_t getLockscreenItems(LockscreenItem *out, uint8_t max) const
Snapshot of all plugin lockscreen items. Returns the number written.
std::string activePluginId() const
void dispatchAction(uint32_t action_id, uint32_t idx, uint32_t user_data)
int consumeCmd(char *out, size_t out_size)
void requestStopActivePlugin()
bool hasBackgroundPlugin() const noexcept
True if at least one plugin is currently resident in the background slot.
bool isLoaded(const std::string &id) const
True if a plugin with id is loaded in RAM (foreground or background).
void dispatchButton(uint32_t button_code)
bool hasActivePlugin() const noexcept
bool isRunningInBackground(const std::string &id) const
True if a plugin with id is currently resident in the background slot.
void forEachPlugin(const std::function< bool(Plugin &)> &visitor)
Iterate foreground + background plugins. Visitor returns false to stop.
std::vector< std::string > listInstalledIds() const
static PluginManager & instance() noexcept
uint8_t pluginBaseDepth() const noexcept
bool unloadFromRam(const std::string &id)
void dispatchActionTo(Plugin *plugin, uint32_t action_id, uint32_t idx, uint32_t user_data)
bool setPluginDisabled(const std::string &id, bool disabled)
bool activePluginIsBackground() const
void dispatchTick(uint64_t uptime_ms)
void triggerLockscreenItem(const LockscreenItem &item)
Fire plugin_on_action(item.action_id, 0, 0) on the owning plugin.
bool reloadBackgroundPlugin(const std::string &id)
bool messageTypeInstalled(const char *mime) const
True if any installed plugin's manifest declares this MIME type for message transfer....
bool isPluginDisabled(const std::string &id) const
void reloadActiveLangOverlay()
std::optional< PluginManifest > getManifest(const std::string &id) const
void dispatchEventAll(uint32_t event_type, uint32_t value)
StartResult startPlugin(const std::string &id)