41 #include <glib/gi18n.h> 45 #ifdef GDK_WINDOWING_X11 47 #elif defined(GDK_WINDOWING_WAYLAND) 48 #include <gdk/gdkwayland.h> 74 {
N_(
"Protocol"),
N_(
"Entry"),
N_(
"File"),
N_(
"Tool"),
N_(
"Preference"),
N_(
"Secret"),
N_(
"Language Wrapper"), NULL };
79 return g_strcmp0((*a)->name, (*b)->name);
84 g_hash_table_unref(ht);
104 pht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
111 g_hash_table_insert(pht, g_strdup(
"ssh_tunnel_password"), (gpointer)TRUE);
112 g_hash_table_insert(pht, g_strdup(
"ssh_tunnel_passphrase"), (gpointer)TRUE);
116 g_hash_table_insert(pht, g_strdup(
"ssh_password"), (gpointer)TRUE);
141 TRACE_CALL(__func__);
143 g_print(
"Remmina plugin %s (type=%s) has been registered, but is not yet initialized/activated. " 144 "The initialization order is %d.\n", plugin->
name,
157 GdkDisplayManager* dm;
161 dm = gdk_display_manager_get();
162 d = gdk_display_manager_get_default_display(dm);
165 #ifdef GDK_WINDOWING_X11 166 if (GDK_IS_X11_DISPLAY(d)) {
314 const char* last = strrchr(filename,
'/');
315 const char *dot = strrchr(last,
'.');
316 if(!dot || dot == filename)
return "";
336 TRACE_CALL(__func__);
338 const gchar *name, *ptr;
343 GSList *secret_plugins;
345 GPtrArray *alternative_language_plugins;
348 alternative_language_plugins = g_ptr_array_new();
350 if (!g_module_supported()) {
351 g_print(
"Dynamic loading of plugins is not supported on this platform!\n");
355 g_print(
"Load modules from %s\n", REMMINA_RUNTIME_PLUGINDIR);
356 dir = g_dir_open(REMMINA_RUNTIME_PLUGINDIR, 0, NULL);
360 while ((name = g_dir_read_name(dir)) != NULL) {
361 if ((ptr = strrchr(name,
'.')) == NULL)
364 fullpath = g_strdup_printf(REMMINA_RUNTIME_PLUGINDIR
"/%s", name);
366 g_ptr_array_add(alternative_language_plugins, g_strdup_printf(REMMINA_RUNTIME_PLUGINDIR
"/%s", name));
375 while (alternative_language_plugins->len > 0) {
376 gboolean has_loaded = FALSE;
377 gchar* name = (gchar*)g_ptr_array_remove_index(alternative_language_plugins, 0);
385 while (*supported_extention) {
386 if (g_str_equal(*supported_extention, ext)) {
387 has_loaded = wrapper_plugin->
load(wrapper_plugin, name);
392 supported_extention++;
394 if (has_loaded)
break;
399 g_print(
"%s: Skip unsupported file type '%s'\n", name, ext);
409 if (remmina_secret_plugin)
410 g_print(
"Internal ERROR: remmina_secret_plugin must be null here\n");
412 secret_plugins = NULL;
420 sple = secret_plugins;
421 while(sple != NULL) {
424 g_print(
"The %s secret plugin has been initialized and it will be your default secret plugin\n",
426 remmina_secret_plugin = sp;
432 g_slist_free(secret_plugins);
433 g_ptr_array_free(alternative_language_plugins, TRUE);
437 TRACE_CALL(__func__);
438 return g_str_equal(G_MODULE_SUFFIX, filetype);
443 TRACE_CALL(__func__);
449 if (plugin->
type == type && g_strcmp0(plugin->
name, name) == 0) {
458 if (setting->
name == NULL) {
466 return "assistance_mode";
467 return "missing_setting_name_into_plugin_RemminaProtocolSetting";
469 return setting->
name;
474 TRACE_CALL(__func__);
480 if (plugin->
type == type) {
481 func((gchar*)plugin->
name, plugin, data);
494 TRACE_CALL(__func__);
496 g_print(
"%-20s%-16s%-64s%-10s\n", plugin->
name,
505 TRACE_CALL(__func__);
506 g_print(
"%-20s%-16s%-64s%-10s\n",
"NAME",
"TYPE",
"DESCRIPTION",
"PLUGIN AND LIBRARY VERSION");
512 TRACE_CALL(__func__);
515 gtk_list_store_append(store, &iter);
523 TRACE_CALL(__func__);
525 GtkWidget *scrolledwindow;
527 GtkCellRenderer *renderer;
528 GtkTreeViewColumn *column;
531 dialog = gtk_dialog_new_with_buttons(_(
"Plugins"), parent, GTK_DIALOG_MODAL, _(
"_OK"), GTK_RESPONSE_ACCEPT, NULL);
532 g_signal_connect(G_OBJECT(dialog),
"response", G_CALLBACK(gtk_widget_destroy), dialog);
533 gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 350);
535 scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
536 gtk_widget_show(scrolledwindow);
537 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
538 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scrolledwindow, TRUE, TRUE, 0);
540 tree = gtk_tree_view_new();
541 gtk_container_add(GTK_CONTAINER(scrolledwindow), tree);
542 gtk_widget_show(tree);
544 store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
546 gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store));
548 renderer = gtk_cell_renderer_text_new();
549 column = gtk_tree_view_column_new_with_attributes(_(
"Name"), renderer,
"text", 0, NULL);
550 gtk_tree_view_column_set_resizable(column, TRUE);
551 gtk_tree_view_column_set_sort_column_id(column, 0);
552 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
554 renderer = gtk_cell_renderer_text_new();
555 column = gtk_tree_view_column_new_with_attributes(_(
"Type"), renderer,
"text", 1, NULL);
556 gtk_tree_view_column_set_resizable(column, TRUE);
557 gtk_tree_view_column_set_sort_column_id(column, 1);
558 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
560 renderer = gtk_cell_renderer_text_new();
561 column = gtk_tree_view_column_new_with_attributes(_(
"Description"), renderer,
"text", 2, NULL);
562 gtk_tree_view_column_set_resizable(column, TRUE);
563 gtk_tree_view_column_set_sort_column_id(column, 2);
564 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
566 renderer = gtk_cell_renderer_text_new();
567 column = gtk_tree_view_column_new_with_attributes(_(
"Version"), renderer,
"text", 3, NULL);
568 gtk_tree_view_column_set_resizable(column, TRUE);
569 gtk_tree_view_column_set_sort_column_id(column, 3);
570 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
572 gtk_widget_show(dialog);
577 TRACE_CALL(__func__);
596 TRACE_CALL(__func__);
613 TRACE_CALL(__func__);
619 TRACE_CALL(__func__);
625 if (plugin == NULL) {
629 for (feature = plugin->
features; feature && feature->
type; feature++) {
630 if (feature->
type == ftype)
638 TRACE_CALL(__func__);
647 if (!g_hash_table_lookup(pht, setting))
static RemminaSecretPlugin * remmina_secret_plugin
const gchar * remmina_plugin_manager_get_canonical_setting_name(const RemminaProtocolSetting *setting)
gboolean remmina_plugin_manager_is_encrypted_setting(RemminaProtocolPlugin *pp, const char *setting)
gint remmina_pref_get_scale_quality(void)
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
static void htdestroy(gpointer ht)
GtkWindow * remmina_main_get_window()
gboolean remmina_plugin_native_load(RemminaPluginService *service, const char *name)
gboolean remmina_plugin_manager_loader_supported(const char *filetype)
gint remmina_pref_get_sshtunnel_port(void)
const gchar * remmina_file_get_filename(RemminaFile *remminafile)
static gint compare_secret_plugin_init_order(gconstpointer a, gconstpointer b)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
gboolean(* init)(struct _RemminaSecretPlugin *instance)
G_BEGIN_DECLS typedef gboolean(* RemminaPluginFunc)(gchar *name, RemminaPlugin *plugin, gpointer data)
void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data)
GtkWidget * rcw_open_from_file_full(RemminaFile *remminafile, GCallback disconnect_cb, gpointer data, guint *handler)
void _remmina_critical(const gchar *fun, const gchar *fmt,...)
gchar * remmina_file_get_secret(RemminaFile *remminafile, const gchar *setting)
gint remmina_pref_get_ssh_loglevel(void)
const RemminaProtocolFeature * features
RemminaFilePlugin * remmina_plugin_manager_get_export_file_handler(RemminaFile *remminafile)
void _remmina_warning(const gchar *fun, const gchar *fmt,...)
RemminaFilePlugin * remmina_plugin_manager_get_import_file_handler(const gchar *file)
RemminaSecretPlugin * remmina_plugin_manager_get_secret_plugin(void)
void _remmina_audit(const gchar *fun, const gchar *fmt,...)
gdouble remmina_file_get_double(RemminaFile *remminafile, const gchar *setting, gdouble default_value)
void remmina_pref_set_value(const gchar *key, const gchar *value)
const gchar * description
gboolean(* load)(struct _RemminaLanguageWrapperPlugin *instance, const gchar *plugin_file)
void _remmina_debug(const gchar *fun, const gchar *fmt,...)
Print a string in the Remmina Debug Windows and in the terminal.
static gboolean remmina_plugin_manager_show_for_each(RemminaPlugin *plugin, GtkListStore *store)
gchar * remmina_pref_get_value(const gchar *key)
gboolean remmina_pref_get_ssh_parseconfig(void)
const char * get_filename_ext(const char *filename)
void remmina_plugin_manager_show(GtkWindow *parent)
gboolean remmina_masterthread_exec_is_main_thread()
guint * remmina_pref_keymap_get_table(const gchar *keymap)
RemminaPluginService remmina_plugin_manager_service
static const gchar * remmina_plugin_type_name[]
void remmina_main_show_dialog(GtkMessageType msg, GtkButtonsType buttons, const gchar *message)
RemminaProtocolFeatureType type
gboolean(* export_test_func)(struct _RemminaFilePlugin *instance, RemminaFile *file)
gboolean remmina_plugin_manager_query_feature_by_type(RemminaPluginType ptype, const gchar *name, RemminaProtocolFeatureType ftype)
void remmina_file_set_int(RemminaFile *remminafile, const gchar *setting, gint value)
gboolean remmina_gtksocket_available()
const gchar ** supported_extentions
const RemminaProtocolSetting * basic_settings
void remmina_plugin_manager_init()
gchar * remmina_file_get_datadir(void)
Return datadir_path from pref or first found data dir as per XDG specs.
void _remmina_info(const gchar *fmt,...)
RemminaProtocolFeatureType
RemminaProtocolSettingType type
RemminaFile * remmina_file_new(void)
guint remmina_pref_keymap_get_keyval(const gchar *keymap, guint keyval)
gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value)
gboolean(* import_test_func)(struct _RemminaFilePlugin *instance, const gchar *from_file)
RemminaPlugin * remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name)
static GPtrArray * remmina_plugin_table
static gint remmina_plugin_manager_compare_func(RemminaPlugin **a, RemminaPlugin **b)
const RemminaProtocolSetting * advanced_settings
static GHashTable * encrypted_settings_cache
void remmina_log_printf(const gchar *fmt,...)
static gboolean remmina_plugin_manager_show_for_each_stdout(RemminaPlugin *plugin)
void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value)
void remmina_log_print(const gchar *text)
void _remmina_message(const gchar *fmt,...)
void remmina_file_unsave_passwords(RemminaFile *remminafile)
void remmina_public_get_server_port(const gchar *server, gint defaultport, gchar **host, gint *port)
static gboolean remmina_plugin_manager_register_plugin(RemminaPlugin *plugin)
void remmina_plugin_manager_show_stdout()
static void init_settings_cache(RemminaPlugin *plugin)
N_("Unable to connect to VNC server")
gint remmina_public_open_unix_sock(const char *unixsock)
Return a file descriptor handle for a unix socket.
void _remmina_error(const gchar *fun, const gchar *fmt,...)