⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connections.c

📁 Remote Connection Manager是一个Gnome2 应用程序
💻 C
字号:
#ifdef HAVE_CONFIG_H#  include <config.h>#endif#include <gnome.h>#include <gconf/gconf-client.h>#include "interface.h"#include "support.h"#include "main.h"#include "callbacks.h"voidrcm_clear_connections_window (void){	GtkWidget *widget = NULL;	widget = lookup_widget (ConnectionsWindow, "ConnectionNameEntry");	gtk_entry_set_text (GTK_ENTRY (widget), "");	widget = lookup_widget (ConnectionsWindow, "ConnectionTypeCombo");	gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (widget)->entry), "");	widget = lookup_widget (ConnectionsWindow, "ConnectionHostnameEntry");	gtk_entry_set_text (GTK_ENTRY (widget), "");	widget = lookup_widget (ConnectionsWindow, "ConnectionUsernameEntry");	gtk_entry_set_text (GTK_ENTRY (widget), "");	widget = lookup_widget (ConnectionsWindow,				"ConnectionArgumentsEntry");	gtk_entry_set_text (GTK_ENTRY (widget), "");}voidrcm_update_connections_window_list (void){	gint i = 0;	Connection *connection = NULL;	GtkTreeIter iter;	GtkListStore *store = NULL;	GtkWidget *list;	GtkWidget *combo;	gchar *type_name;	ConnectionType *type;	GList *items = NULL;	gint len = g_slist_length (ConnectionsSList);	gchar *tmp;	list = lookup_widget (ConnectionsWindow, "ConnectionsList");	g_return_if_fail (list != NULL);	store = GTK_LIST_STORE (gtk_tree_view_get_model				(GTK_TREE_VIEW (list)));	g_return_if_fail (store != NULL);	gtk_list_store_clear (GTK_LIST_STORE (store));	for (i = 0; i < len; i++)	{		connection = g_slist_nth_data (ConnectionsSList, i);		type = g_slist_nth_data (ConnectionTypesSList,					 connection->Type);		gtk_list_store_append (store, &iter);		gtk_list_store_set (store, &iter,				    CONNECTION_NAME_COLUMN, connection->Name,				    CONNECTION_HOSTNAME_COLUMN,				    connection->Hostname,				    CONNECTION_TYPE_COLUMN, type, -1);	}	len = g_slist_length (ConnectionTypesSList);	for (i = 0; i < len; i++)	{		type = g_slist_nth_data (ConnectionTypesSList, i);		items = g_list_append (items, strdup (type->Name));	}	combo = lookup_widget (ConnectionsWindow, "ConnectionTypeCombo");	g_return_if_fail (combo != NULL);	if (g_list_length (items) > 0)		gtk_combo_set_popdown_strings (GTK_COMBO (combo), items);	for (i = 0; i < len; i++)	{		tmp = g_list_nth_data (items, i);		g_free (tmp);	}	g_list_free (items);}gbooleanrcm_save_connection (const Connection connection){	Connection *newconnection = NULL;	ConnectionsSListIsDirty = TRUE;	if ((newconnection =	     rcm_find_connection_by_name_in_list (connection.Name,						  ConnectionsSList)) != NULL)	{		memcpy (newconnection, &connection,			sizeof (struct Connection));	}	else	{		newconnection =			(Connection *) malloc (sizeof (struct Connection));		g_return_val_if_fail (newconnection != NULL, FALSE);		memcpy (newconnection, &connection,			sizeof (struct Connection));		ConnectionsSList =			g_slist_append (ConnectionsSList, newconnection);	}	if (SortOption == SORT_ASCENDING)		rcm_ascending_sort ();	else if (SortOption == SORT_DESCENDING)		rcm_descending_sort ();	else if (SortOption == SORT_TYPE)		rcm_type_sort ();	ConnectionsSListIsDirty = TRUE;	return TRUE;}Connection *rcm_remove_connection_from_list_by_name (const gchar * name, GSList * list){	gint i = 0;	Connection *connection = NULL;	gint len = g_slist_length (list);	for (i = 0; i < len; i++)	{		connection = g_slist_nth_data (list, i);		if (strncmp (name, connection->Name, NAMELEN) == 0)		{			ConnectionsSList =				g_slist_remove (ConnectionsSList, connection);			return connection;		}	}	return NULL;}Connection *rcm_find_connection_by_name_in_list (const gchar * name, GSList * list){	gint i = 0;	Connection *connection = NULL;	gint len = g_slist_length (list);	for (i = 0; i < len; i++)	{		connection = g_slist_nth_data (list, i);		if (strncmp (name, connection->Name, NAMELEN) == 0)			return connection;	}	return NULL;}gbooleanrcm_save_connections_to_disk (){	GConfClient *gconf_client = NULL;	gint i, len;	Connection *connection;	gchar key[MAX_BUFFER_LENGTH];	rcm_remove_all_connections_from_disk ();	len = g_slist_length (ConnectionsSList);	if (len == 0)		return TRUE;	gconf_client = gconf_client_get_default ();	for (i = 0; i < len; i++)	{		connection = g_slist_nth_data (ConnectionsSList, i);		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Name",			  GCONF_CONNECTIONS_DIR, i);		gconf_client_set_string (gconf_client, key, connection->Name,					 NULL);		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Type",			  GCONF_CONNECTIONS_DIR, i);		gconf_client_set_int (gconf_client, key, connection->Type,				      NULL);		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Hostname",			  GCONF_CONNECTIONS_DIR, i);		gconf_client_set_string (gconf_client, key,					 connection->Hostname, NULL);		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Username",			  GCONF_CONNECTIONS_DIR, i);		gconf_client_set_string (gconf_client, key,					 connection->Username, NULL);		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Arguments",			  GCONF_CONNECTIONS_DIR, i);		gconf_client_set_string (gconf_client, key,					 connection->Arguments, NULL);	}	ConnectionsSListIsDirty = FALSE;	gconf_client_suggest_sync (gconf_client, NULL);	g_object_unref (gconf_client);	return TRUE;}gbooleanrcm_load_connections_from_disk (){	GConfClient *gconf_client = NULL;	gint i = 0;	gchar key[MAX_BUFFER_LENGTH];	gchar *tmp;	Connection *connection;	gconf_client = gconf_client_get_default ();	g_slist_free (ConnectionsSList);	ConnectionsSList = NULL;	if (!gconf_client_dir_exists	    (gconf_client, GCONF_CONNECTIONS_DIR, NULL))	{		g_object_unref (gconf_client);		ConnectionsSListIsDirty = FALSE;		return TRUE;	}	if (rcm_gconf_client_all_connections_dirs (NULL) == 0)	{		g_object_unref (gconf_client);		ConnectionsSListIsDirty = FALSE;		return TRUE;	}	do	{		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d",			  GCONF_CONNECTIONS_DIR, i);		if (!gconf_client_dir_exists (gconf_client, key, NULL))		{			g_object_unref (gconf_client);			ConnectionsSListIsDirty = FALSE;			return TRUE;		}		connection = (Connection *)			malloc (sizeof (struct Connection));		if (!connection)		{			g_object_unref (gconf_client);			ConnectionsSListIsDirty = TRUE;			return FALSE;		}		memset (connection, 0, sizeof (struct Connection));		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Name",			  GCONF_CONNECTIONS_DIR, i);		tmp = gconf_client_get_string (gconf_client, key, NULL);		if (!tmp)		{			//rcm_error (_			//         ("There was an error loading your connections, some or all may not be available."),			//         MainWindow);			free (connection);			g_object_unref (gconf_client);			ConnectionsSListIsDirty = FALSE;			return TRUE;		}		strncat (connection->Name, tmp, MAX_BUFFER_LENGTH);		tmp = NULL;		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Type",			  GCONF_CONNECTIONS_DIR, i);		connection->Type =			gconf_client_get_int (gconf_client, key, NULL);		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Hostname",			  GCONF_CONNECTIONS_DIR, i);		tmp = gconf_client_get_string (gconf_client, key, NULL);		if (!tmp)		{			rcm_error (_				   ("There was an error loading your connections, some or all may not be available."),				   MainWindow);			free (connection);			g_object_unref (gconf_client);			ConnectionsSListIsDirty = FALSE;			return FALSE;		}		strncat (connection->Hostname, tmp, MAX_BUFFER_LENGTH);		tmp = NULL;		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Username",			  GCONF_CONNECTIONS_DIR, i);		tmp = gconf_client_get_string (gconf_client, key, NULL);		if (!tmp)		{			rcm_error (_				   ("There was an error loading your connections, some or all may not be available."),				   MainWindow);			free (connection);			g_object_unref (gconf_client);			ConnectionsSListIsDirty = FALSE;			return FALSE;		}		strncat (connection->Username, tmp, MAX_BUFFER_LENGTH);		tmp = NULL;		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Arguments",			  GCONF_CONNECTIONS_DIR, i);		tmp = gconf_client_get_string (gconf_client, key, NULL);		if (!tmp)		{			rcm_error (_				   ("There was an error loading your connections, some or all may not be available."),				   MainWindow);			free (connection);			g_object_unref (gconf_client);			ConnectionsSListIsDirty = FALSE;			return FALSE;		}		strncat (connection->Arguments, tmp, MAX_BUFFER_LENGTH);		tmp = NULL;		ConnectionsSList =			g_slist_append (ConnectionsSList, connection);		i++;	}	while (TRUE);	g_object_unref (gconf_client);	ConnectionsSListIsDirty = FALSE;	return TRUE;}voidrcm_remove_all_connections_from_disk (void){	GConfClient *gconf_client = NULL;	gint i, len;	gchar key[MAX_BUFFER_LENGTH];	gboolean ret;	gconf_client = gconf_client_get_default ();	len = rcm_gconf_client_all_connections_dirs (NULL);	for (i = 0; i < len; i++)	{		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Name",			  GCONF_CONNECTIONS_DIR, i);		ret = gconf_client_unset (gconf_client, key, NULL);		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Type",			  GCONF_CONNECTIONS_DIR, i);		ret = gconf_client_unset (gconf_client, key, NULL);		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d/Hostname",			  GCONF_CONNECTIONS_DIR, i);		ret = gconf_client_unset (gconf_client, key, NULL);	}	ConnectionsSListIsDirty = FALSE;	gconf_client_suggest_sync (gconf_client, NULL);	g_object_unref (gconf_client);	return;}gintrcm_gconf_client_all_connections_dirs (GError ** err){	GConfClient *gconf_client;	gint i = 0;	gchar key[MAX_BUFFER_LENGTH];	GSList *list = NULL;	gconf_client = gconf_client_get_default ();	snprintf (key, MAX_BUFFER_LENGTH, "%s/0", GCONF_CONNECTIONS_DIR);	for (i = 0; i < INT_MAX; i++)	{		snprintf (key, MAX_BUFFER_LENGTH, "%s/%d",			  GCONF_CONNECTIONS_DIR, i);		if (!gconf_client_dir_exists (gconf_client, key, err))			break;	}	g_object_unref (gconf_client);	return i;}voidrcm_select_connection_by_index (gint num){	GtkTreeIter iter;	GtkListStore *store = NULL;	GtkWidget *list;	GValue *value;	const gchar *name1;	GtkTreeSelection *select;	gchar path[10];	gint i = 0;	list = lookup_widget (ConnectionsWindow, "ConnectionsList");	g_return_if_fail (list != NULL);	store = GTK_LIST_STORE (gtk_tree_view_get_model				(GTK_TREE_VIEW (list)));	g_return_if_fail (store != NULL);	snprintf (path, 10, "%d", num);	gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter,					     path);	select = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));	g_return_if_fail (select != NULL);	gtk_tree_selection_select_iter (select, &iter);	return;}voidrcm_select_connection_by_name (gchar * name){	GtkTreeIter iter;	GtkListStore *store = NULL;	GtkWidget *list;	GValue *value;	const gchar *name1;	GtkTreeSelection *select;	gchar path[10];	gint i = 0;	list = lookup_widget (ConnectionsWindow, "ConnectionsList");	g_return_if_fail (list != NULL);	store = GTK_LIST_STORE (gtk_tree_view_get_model				(GTK_TREE_VIEW (list)));	g_return_if_fail (store != NULL);	snprintf (path, 10, "%d", i);	while (gtk_tree_model_get_iter_from_string	       (GTK_TREE_MODEL (store), &iter, path))	{		gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,				    CONNECTION_TYPE_NAME_COLUMN, &name1, -1);		if (strcmp (name, name1) == 0)		{			select = gtk_tree_view_get_selection (GTK_TREE_VIEW							      (list));			g_return_if_fail (select != NULL);			gtk_tree_selection_select_iter (select, &iter);			return;		}		i++;		snprintf (path, 10, "%d", i);	}}gbooleanrcm_launch_connection_by_name (gchar * name){	gchar buff[MAX_BUFFER_LENGTH];	gchar msg[MAX_BUFFER_LENGTH];	Connection *connection;	ConnectionType *type;	connection =		rcm_find_connection_by_name_in_list (name, ConnectionsSList);	g_return_if_fail (connection != NULL);	type = g_slist_nth_data (ConnectionTypesSList, connection->Type);	g_return_if_fail (type != NULL);	memset (buff, 0, MAX_BUFFER_LENGTH);	if (type->Terminal)	{		if(strnlen(TerminalProgram,1024) == 0)		{			rcm_warn(_("You haven't set the terminal program.\nOpen the Preferences dialog and set the terminal program to use."),NULL);			return FALSE;		}		strncat (buff, TerminalProgram, MAX_BUFFER_LENGTH);		strncat (buff, " ", MAX_BUFFER_LENGTH);		strncat (buff, TerminalProgramOptions, MAX_BUFFER_LENGTH);		strncat (buff, " ", MAX_BUFFER_LENGTH);	}	strncat (buff, type->Command, MAX_BUFFER_LENGTH);	strncat (buff, " ", MAX_BUFFER_LENGTH);	strncat (buff, connection->Arguments, MAX_BUFFER_LENGTH);	strncat (buff, " ", MAX_BUFFER_LENGTH);	rcm_translate_arg (buff, connection->Hostname, "%h",			   MAX_BUFFER_LENGTH);	rcm_translate_arg (buff, connection->Username, "%u",			   MAX_BUFFER_LENGTH);	if (gnome_execute_shell_fds (NULL, buff, TRUE) == -1)	{		snprintf (msg, MAX_BUFFER_LENGTH, "%s%s",			  _			  ("There was a problem launching the connection. I suggest you try and run it from the command line:\n"),			  buff);		rcm_error (msg, MainWindow);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -