1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <glib/gstdio.h>
#include <stdlib.h>
#include "remmina/types.h"
#include "remmina_public.h"
#include "remmina_external_tools.h"
typedef struct _RemminaExternalTools
{
gchar remminafilename[MAX_PATH_LEN];
gchar scriptfilename[MAX_PATH_LEN];
} RemminaExternalTools;
void view_popup_menu_onDoSomething (GtkWidget *menuitem, gpointer userdata)
{
/* we passed the view as userdata when we connected the signal */
RemminaExternalTools *ret = (RemminaExternalTools *)userdata;
//gchar* filename_remmina = ret->remminafilename;
//gchar* filename_script = ret->scriptfilename;
remmina_external_tools_launcher(ret->remminafilename,ret->scriptfilename);
}
gboolean remmina_external_tools_from_filename(RemminaMain *remminamain,gchar* remminafilename)
{
GtkWidget *menu, *menuitem;
menu = gtk_menu_new();
gchar dirname[MAX_PATH_LEN];
gchar filename[MAX_PATH_LEN];
GDir* dir;
const gchar* name;
size_t noprefixlen;
gchar* unprefixed;
GNode* root;
root = g_node_new(NULL);
g_snprintf(dirname, MAX_PATH_LEN, "%s/.remmina/external_tools", g_get_home_dir());
dir = g_dir_open(dirname, 0, NULL);
if (dir == NULL)
return FALSE;
while ((name = g_dir_read_name(dir)) != NULL)
{
if (!g_str_has_prefix(name, "remmina_"))
continue;
g_snprintf(filename, MAX_PATH_LEN, "%s/%s", dirname, name);
RemminaExternalTools *ret;
ret = (RemminaExternalTools *)malloc(sizeof(RemminaExternalTools));
strcpy(ret->remminafilename,remminafilename);
strcpy(ret->scriptfilename,filename);
noprefixlen = strlen(name) - 8;
unprefixed = malloc(noprefixlen + 1);
strncpy(unprefixed, name + 8, noprefixlen);
menuitem = gtk_menu_item_new_with_label(unprefixed);
g_signal_connect(menuitem, "activate", (GCallback) view_popup_menu_onDoSomething, ret);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
}
g_dir_close(dir);
gtk_widget_show_all(menu);
/* Note: event can be NULL here when called from view_onPopupMenu;
* gdk_event_get_time() accepts a NULL argument
*/
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,0,0);
return TRUE;
}
gboolean remmina_external_tools_launcher(const gchar* filename,const gchar* scriptname)
{
RemminaFile *remminafile;
gchar launcher[MAX_PATH_LEN];
g_snprintf(launcher, MAX_PATH_LEN, "%s/.remmina/external_tools/launcher.sh", g_get_home_dir());
remminafile = remmina_file_load(filename);
GHashTableIter iter;
const gchar *key, *value;
g_hash_table_iter_init(&iter, remminafile->settings);
while (g_hash_table_iter_next(&iter, (gpointer*) &key, (gpointer*) &value))
{
const char *env_format = "%s=%s";
const size_t len = strlen(key) +strlen(value) + strlen(env_format);
char *env = (char *) malloc(len);
if (env == NULL)
{
return -1;
}
int retval = snprintf(env, len, env_format, key,value);
if (retval < 0 || (size_t) retval >= len)
{
/* Handle error */
}
if (putenv(env) != 0)
{
free(env);
}
}
const size_t cmdlen = strlen(launcher) +strlen(scriptname) + 2;
gchar *cmd = (gchar *)malloc(cmdlen);
g_snprintf(cmd, cmdlen, "%s %s", launcher, scriptname);
system(cmd);
free(cmd);
return TRUE;
}
|