OpenCPN Partial API docs
Loading...
Searching...
No Matches
plugin_loader.h
1/***************************************************************************
2 *
3 *
4 * Project: OpenCPN
5 * Purpose: PlugIn Manager Object
6 * Author: David Register
7 *
8 ***************************************************************************
9 * Copyright (C) 2010-2023 by David S. Register *
10 * Copyright (C) 2023 Alec Leamas
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 * This program is distributed in the hope that it will be useful, *
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
20 * GNU General Public License for more details. *
21 * *
22 * You should have received a copy of the GNU General Public License *
23 * along with this program; if not, write to the *
24 * Free Software Foundation, Inc., *
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
26 **************************************************************************/
27
28#ifndef PLUGIN_LOADER_H_GUARD
29#define PLUGIN_LOADER_H_GUARD
30
31#include <functional>
32
33#include <wx/wx.h>
34#include <wx/bitmap.h>
35#include <wx/dynarray.h>
36#include <wx/dynlib.h>
37
38#include "config.h"
39
41#include "model/plugin_blacklist.h"
42#include "model/semantic_vers.h"
43#include "observable_evtvar.h"
44#include "ocpn_plugin.h"
45
46enum class PluginStatus {
47 System,
48 Managed,
49 Unmanaged,
50 Ghost,
51 Unknown,
52 LegacyUpdateAvailable,
53 ManagedInstallAvailable,
54 ManagedInstalledUpdateAvailable,
55 ManagedInstalledCurrentVersion,
56 ManagedInstalledDowngradeAvailable,
57 Imported,
58 PendingListRemoval
59};
60
61class PlugInContainer; // forward
62class PlugInData; // forward
63
66public:
68 explicit PlugInData(const PluginMetadata& md);
69
70 PlugInData();
71
73 bool m_enabled;
74 bool m_init_state;
75 bool m_toolbox_panel;
77 wxString m_plugin_file;
80 wxString m_common_name;
81 wxString m_short_description;
82 wxString m_long_description;
83 int m_api_version;
84 int m_version_major;
85 int m_version_minor;
86 PluginStatus m_status;
87 PluginMetadata m_managed_metadata;
88 wxBitmap m_bitmap;
89 wxString m_version_str;
90 std::string m_manifest_version;
91
93 std::string Key() const;
94};
95
101public:
103
104 ~PlugInContainer() = default;
105
106 opencpn_plugin* m_pplugin;
107 wxDynamicLibrary m_library;
108 destroy_t* m_destroy_fn;
109};
110
112public:
113 enum class Type {
114 Unloadable, //<! wrong magic, wrong type of binary...
115 Unreadable,
116 Incompatible,
117 NoCreate, //<! Missing linkage (is this a plugin?)
118 NoDestroy, //<! Missing linkage (is this a plugin?)
119 Blacklisted
120 } type;
121 const std::string lib_path; //<! Complete path to failing library
122 //<! As determined from plugin API
123 const SemanticVersion plugin_version; //<! As determined from plugin API
124
125 LoadError(Type t, const std::string& l, SemanticVersion pv)
126 : type(t), lib_path(l), plugin_version(pv) {}
127
128 LoadError(Type t, std::string l)
129 : type(t), lib_path(std::move(l)), plugin_version(SemanticVersion()) {}
130};
131
132// Declare an array of PlugIn Containers
133WX_DEFINE_ARRAY_PTR(PlugInContainer*, ArrayOfPlugIns);
134
156public:
157 static PluginLoader* getInstance();
158 virtual ~PluginLoader() = default;
162 static void UpdatePlugin(PlugInContainer* plugin, const PluginMetadata& md);
163
165 static std::string GetPluginVersion(
166 const PlugInData pd,
167 std::function<const PluginMetadata(const std::string&)> get_metadata);
168
170 static PluginMetadata MetadataByName(const std::string& name);
171
172 EventVar evt_blacklisted_plugin;
173
174 EventVar evt_load_directory;
175 EventVar evt_load_plugin;
176 EventVar evt_plugin_unload;
177 EventVar evt_pluglist_change;
178 EventVar evt_unreadable_plugin;
179
184
185 EventVar evt_update_chart_types;
186
192
193 EventVar evt_version_incompatible_plugin;
194
203 bool LoadAllPlugIns(bool enabled_plugins, bool keep_orphans = false);
204
205 const wxBitmap* GetPluginDefaultIcon();
206 void SetPluginDefaultIcon(const wxBitmap* bitmap);
207
209 void SetOnDeactivateCb(std::function<void(const PlugInContainer*)> cb) {
210 m_on_deactivate_cb = cb;
211 }
213 void ShowPreferencesDialog(const PlugInData& pd, wxWindow* parent);
214
215 void NotifySetupOptionsPlugin(const PlugInData* pic);
216
218 void RemovePlugin(const PlugInData& pd);
219
221 void SortPlugins(int (*cmp_func)(PlugInContainer**, PlugInContainer**));
222
224 bool UnLoadPlugIn(size_t ix);
225
226 bool UnLoadAllPlugIns();
227 bool DeactivateAllPlugIns();
228 bool DeactivatePlugIn(PlugInContainer* pic);
229 bool DeactivatePlugIn(const PlugInData& pic);
230 bool UpdatePlugIns();
231 void UpdateManagedPlugins(bool keep_orphans);
232 PlugInContainer* LoadPlugIn(const wxString& plugin_file);
233 PlugInContainer* LoadPlugIn(const wxString& plugin_file,
234 PlugInContainer* pic);
235
236 const ArrayOfPlugIns* GetPlugInArray() { return &plugin_array; }
237 bool IsPlugInAvailable(const wxString& commonName);
238 bool CheckPluginCompatibility(const wxString& plugin_file);
239
241 void SetEnabled(const wxString& common_name, bool enabled);
242
244 void SetToolboxPanel(const wxString& common_name, bool value);
245
247 void SetSetupOptions(const wxString& common_name, bool value);
248
249private:
250 PluginLoader();
251 bool LoadPlugInDirectory(const wxString& plugin_dir, bool load_enabled);
252 bool LoadPluginCandidate(const wxString& file_name, bool load_enabled);
253 std::unique_ptr<AbstractBlacklist> m_blacklist;
254 ArrayOfPlugIns plugin_array;
255 wxString m_last_error_string;
256 wxString m_plugin_location;
257
258#ifdef __WXMSW__
259 wxString m_module_name;
260 bool m_found_wxwidgets;
261#endif
262
263 const wxBitmap* m_default_plugin_icon;
264 std::function<void(const PlugInContainer*)> m_on_deactivate_cb;
265
266 std::vector<LoadError> load_errors;
267};
268
269#endif // PLUGIN_LOADER_H_GUARD
Datatypes and methods to parse ocpn-plugins.xml XML data, either complete catalog or a single plugin.
Generic event handling between MVC Model and Controller based on a shared EventVar variable.
Data for a loaded plugin, including dl-loaded library.
Basic data for a loaded plugin, trivially copyable.
wxString m_plugin_filename
The short file path.
wxString m_plugin_file
The full file path.
int m_cap_flag
PlugIn Capabilities descriptor.
wxString m_common_name
A common name string for the plugin.
bool m_has_setup_options
Has run NotifySetupOptionsPlugin()
std::string Key() const
sort key.
std::string m_manifest_version
As detected from manifest.
wxDateTime m_plugin_modification
used to detect upgraded plugins
wxString m_version_str
Complete version as of semantic_vers.
PluginLoader is a backend module without any direct GUI functionality.
void SetOnDeactivateCb(std::function< void(const PlugInContainer *)> cb)
Callback invoked in late stage on deactivating a plugin.
bool LoadAllPlugIns(bool enabled_plugins, bool keep_orphans=false)
Update catalog with imported metadata and load all plugin library files.
EventVar evt_plugin_loadall_finalize
Emitted after all plugins are loaded.
static std::string GetPluginVersion(const PlugInData pd, std::function< const PluginMetadata(const std::string &)> get_metadata)
Return version string for a plugin, possibly with an "Imported" suffix.
bool UnLoadPlugIn(size_t ix)
Unload, delete and remove item ix in GetPlugInArray().
void SortPlugins(int(*cmp_func)(PlugInContainer **, PlugInContainer **))
Sort GetPluginArray().
static void UpdatePlugin(PlugInContainer *plugin, const PluginMetadata &md)
Update PlugInContainer status using data from PluginMetadata and manifest.
void SetSetupOptions(const wxString &common_name, bool value)
Update m_has_setup_options state for plugin with given name.
void SetEnabled(const wxString &common_name, bool enabled)
Update enabled/disabled state for plugin with given name.
void SetToolboxPanel(const wxString &common_name, bool value)
Update m_toolbox_panel state for plugin with given name.
static PluginMetadata MetadataByName(const std::string &name)
Find metadata for given plugin.
void RemovePlugin(const PlugInData &pd)
Remove a plugin from *GetPluginArray().
void ShowPreferencesDialog(const PlugInData &pd, wxWindow *parent)
Display the preferences dialog for a plugin.
EventVar evt_deactivate_plugin
Carries a malloc'ed read-only copy of a PlugInContainer owned by listener.
PlugIn Object Definition/API.
Plugin metadata, reflects the xml format directly.
Versions uses a modified semantic versioning scheme: major.minor.revision.post-tag+build.