Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Panozzo <giovanni@panozzo.it>2019-07-15 23:16:23 +0300
committerGiovanni Panozzo <giovanni@panozzo.it>2019-07-15 23:16:23 +0300
commit3fd6acde24934680a873ee03a1f2171fb1da9837 (patch)
tree163f08a6b2deaedd2f9836e0b9058952103c62e9 /src/remmina_plugin_manager.c
parentaf66db6da42b981d8082ea10c26131cf333329b0 (diff)
Priority for secret plugins init. Breaks secret plugins API
Diffstat (limited to 'src/remmina_plugin_manager.c')
-rw-r--r--src/remmina_plugin_manager.c62
1 files changed, 56 insertions, 6 deletions
diff --git a/src/remmina_plugin_manager.c b/src/remmina_plugin_manager.c
index e862fcb15..a1e47079d 100644
--- a/src/remmina_plugin_manager.c
+++ b/src/remmina_plugin_manager.c
@@ -129,12 +129,10 @@ static gboolean remmina_plugin_manager_register_plugin(RemminaPlugin *plugin)
{
TRACE_CALL(__func__);
if (plugin->type == REMMINA_PLUGIN_TYPE_SECRET) {
- if (remmina_secret_plugin) {
- g_print("Remmina plugin %s (type=%s) bypassed.\n", plugin->name,
- _(remmina_plugin_type_name[plugin->type]));
- return FALSE;
- }
- remmina_secret_plugin = (RemminaSecretPlugin*)plugin;
+ g_print("Remmina plugin %s (type=%s) has registered but not yet initialized/activated. "
+ "Initialization order is %d.\n", plugin->name,
+ _(remmina_plugin_type_name[plugin->type]),
+ ((RemminaSecretPlugin*)plugin)->init_order);
}
init_settings_cache(plugin);
@@ -269,12 +267,31 @@ static void remmina_plugin_manager_load_plugin(const gchar *name)
/* We don’t close the module because we will need it throughout the process lifetime */
}
+static gint compare_secret_plugin_init_order(gconstpointer a, gconstpointer b)
+{
+ RemminaSecretPlugin *sa, *sb;
+
+ sa = (RemminaSecretPlugin*)a;
+ sb = (RemminaSecretPlugin*)b;
+
+ if (sa->init_order > sb->init_order)
+ return 1;
+ else if (sa->init_order < sb->init_order)
+ return -1;
+ return 0;
+}
+
void remmina_plugin_manager_init(void)
{
TRACE_CALL(__func__);
GDir *dir;
const gchar *name, *ptr;
gchar *fullpath;
+ RemminaPlugin *plugin;
+ RemminaSecretPlugin *sp;
+ int i;
+ GSList *secret_plugins;
+ GSList *sple;
remmina_plugin_table = g_ptr_array_new();
@@ -297,6 +314,39 @@ void remmina_plugin_manager_init(void)
g_free(fullpath);
}
g_dir_close(dir);
+
+ /* Now all secret plugins needs to initialize, following their init_order.
+ * The 1st plugin which will initialize correctly will be
+ * the default remmina_secret_plugin */
+
+ if (remmina_secret_plugin)
+ g_print("Internal ERROR: remmina_secret_plugin must be null here\n");
+
+ secret_plugins = NULL;
+ for (i = 0; i < remmina_plugin_table->len; i++) {
+ plugin = (RemminaPlugin*)g_ptr_array_index(remmina_plugin_table, i);
+ if (plugin->type == REMMINA_PLUGIN_TYPE_SECRET) {
+ secret_plugins = g_slist_insert_sorted(secret_plugins, (gpointer)plugin, compare_secret_plugin_init_order);
+ }
+ }
+
+ sple = secret_plugins;
+ while(sple != NULL) {
+ sp = (RemminaSecretPlugin*)sple->data;
+ if (sp->init()) {
+ g_print("Secret plugin %s has been successfully initialized and will be your default secret plugin\n",
+ sp->name);
+ remmina_secret_plugin = sp;
+ break;
+ }
+ sple = sple->next;
+ }
+
+ g_slist_free(secret_plugins);
+
+
+
+
}
RemminaPlugin* remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name)