File: remmina_external_tools.c

package info (click to toggle)
remmina 1.1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 4,612 kB
  • ctags: 2,587
  • sloc: ansic: 23,597; sh: 22; makefile: 12
file content (109 lines) | stat: -rw-r--r-- 3,126 bytes parent folder | download
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
#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;
	GNode* root;
	root = g_node_new(NULL);

	g_snprintf(dirname, MAX_PATH_LEN, "/usr/share/remmina/external_tools");
	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);
		menuitem = gtk_menu_item_new_with_label(strndup(name + 8, strlen(name) -8));
		g_signal_connect(menuitem, "activate", (GCallback) view_popup_menu_onDoSomething, ret);

		//g_signal_connect(menuitem, "activate",
		//                  (GCallback) view_popup_menu_onDoSomething, treeview);

		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, "/usr/share/remmina/external_tools/launcher.sh");

	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;
}