2
* Remmina - The GTK+ Remote Desktop Client
3
* Copyright (C) 2009-2010 Vic Lee
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330,
18
* Boston, MA 02111-1307, USA.
22
#include <glib/gi18n.h>
25
#include "remminapublic.h"
26
#include "remminapref.h"
27
#include "remminassh.h"
28
#include "remminachatwindow.h"
29
#include "remminapluginmanager.h"
30
#include "remminaconnectionwindow.h"
31
#include "remminaprotocolwidget.h"
33
struct _RemminaProtocolWidgetPriv
35
GtkWidget *init_dialog;
37
RemminaFile *remmina_file;
38
RemminaProtocolPlugin *plugin;
47
RemminaSSHTunnel *ssh_tunnel;
48
RemminaTunnelInitFunc init_func;
50
GtkWidget *chat_window;
54
RemminaHostkeyFunc hostkey_func;
55
gpointer hostkey_func_data;
58
G_DEFINE_TYPE (RemminaProtocolWidget, remmina_protocol_widget, GTK_TYPE_EVENT_BOX)
63
DESKTOP_RESIZE_SIGNAL,
67
typedef struct _RemminaProtocolWidgetSignalData
69
RemminaProtocolWidget *gp;
70
const gchar *signal_name;
71
} RemminaProtocolWidgetSignalData;
73
static guint remmina_protocol_widget_signals[LAST_SIGNAL] = { 0 };
76
remmina_protocol_widget_class_init (RemminaProtocolWidgetClass *klass)
78
remmina_protocol_widget_signals[CONNECT_SIGNAL] =
79
g_signal_new ("connect",
80
G_TYPE_FROM_CLASS (klass),
81
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
82
G_STRUCT_OFFSET (RemminaProtocolWidgetClass, connect),
84
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
85
remmina_protocol_widget_signals[DISCONNECT_SIGNAL] =
86
g_signal_new ("disconnect",
87
G_TYPE_FROM_CLASS (klass),
88
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
89
G_STRUCT_OFFSET (RemminaProtocolWidgetClass, disconnect),
91
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
92
remmina_protocol_widget_signals[DESKTOP_RESIZE_SIGNAL] =
93
g_signal_new ("desktop-resize",
94
G_TYPE_FROM_CLASS (klass),
95
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
96
G_STRUCT_OFFSET (RemminaProtocolWidgetClass, desktop_resize),
98
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
102
remmina_protocol_widget_init_cancel (RemminaInitDialog *dialog, gint response_id, RemminaProtocolWidget *gp)
104
if ((response_id == GTK_RESPONSE_CANCEL || response_id == GTK_RESPONSE_DELETE_EVENT)
105
&& dialog->mode == REMMINA_INIT_MODE_CONNECTING)
107
remmina_protocol_widget_close_connection (gp);
112
remmina_protocol_widget_show_init_dialog (RemminaProtocolWidget *gp, const gchar *name)
114
if (gp->priv->init_dialog)
116
gtk_widget_destroy (gp->priv->init_dialog);
118
gp->priv->init_dialog = remmina_init_dialog_new (_("Connecting to '%s'..."), (name ? name : "*"));
119
g_signal_connect (G_OBJECT (gp->priv->init_dialog), "response", G_CALLBACK (remmina_protocol_widget_init_cancel), gp);
120
gtk_widget_show (gp->priv->init_dialog);
124
remmina_protocol_widget_hide_init_dialog (RemminaProtocolWidget *gp)
126
if (gp->priv->init_dialog && GTK_IS_WIDGET (gp->priv->init_dialog))
128
gtk_widget_destroy (gp->priv->init_dialog);
130
gp->priv->init_dialog = NULL;
134
remmina_protocol_widget_destroy (RemminaProtocolWidget *gp, gpointer data)
136
remmina_protocol_widget_hide_init_dialog (gp);
137
g_free (gp->priv->error_message);
142
remmina_protocol_widget_connect (RemminaProtocolWidget *gp, gpointer data)
144
remmina_protocol_widget_hide_init_dialog (gp);
148
remmina_protocol_widget_disconnect (RemminaProtocolWidget *gp, gpointer data)
150
remmina_protocol_widget_hide_init_dialog (gp);
154
remmina_protocol_widget_grab_focus (RemminaProtocolWidget *gp)
158
child = gtk_bin_get_child (GTK_BIN (gp));
161
GTK_WIDGET_SET_FLAGS (child, GTK_CAN_FOCUS);
162
gtk_widget_grab_focus (child);
167
remmina_protocol_widget_init (RemminaProtocolWidget *gp)
169
RemminaProtocolWidgetPriv *priv;
171
priv = g_new0 (RemminaProtocolWidgetPriv, 1);
174
g_signal_connect (G_OBJECT (gp), "destroy", G_CALLBACK (remmina_protocol_widget_destroy), NULL);
175
g_signal_connect (G_OBJECT (gp), "connect", G_CALLBACK (remmina_protocol_widget_connect), NULL);
176
g_signal_connect (G_OBJECT (gp), "disconnect", G_CALLBACK (remmina_protocol_widget_disconnect), NULL);
180
remmina_protocol_widget_open_connection_real (gpointer data)
182
RemminaProtocolWidget *gp = REMMINA_PROTOCOL_WIDGET (data);
183
RemminaProtocolPlugin *plugin;
184
RemminaFile *remminafile = gp->priv->remmina_file;
186
/* Locate the protocol plugin */
187
plugin = (RemminaProtocolPlugin *) remmina_plugin_manager_get_plugin (REMMINA_PLUGIN_TYPE_PROTOCOL, remminafile->protocol);
188
if (!plugin || !plugin->init || !plugin->open_connection)
190
remmina_protocol_widget_set_error (gp, _("Protocol %s is not supported."), remminafile->protocol);
191
remmina_protocol_widget_close_connection (gp);
197
gp->priv->plugin = plugin;
199
if (! plugin->open_connection (gp))
201
remmina_protocol_widget_close_connection (gp);
206
remmina_protocol_widget_open_connection (RemminaProtocolWidget *gp, RemminaFile *remminafile)
208
gp->priv->remmina_file = remminafile;
209
gp->priv->scale = remminafile->scale;
211
remmina_protocol_widget_show_init_dialog (gp, remminafile->name);
213
remmina_protocol_widget_open_connection_real (gp);
217
remmina_protocol_widget_close_connection (RemminaProtocolWidget *gp)
219
if (!GTK_IS_WIDGET (gp) || gp->priv->closed) return FALSE;
220
gp->priv->closed = TRUE;
221
gdk_keyboard_ungrab (GDK_CURRENT_TIME);
223
if (gp->priv->chat_window)
225
gtk_widget_destroy (gp->priv->chat_window);
226
gp->priv->chat_window = NULL;
230
if (gp->priv->ssh_tunnel)
232
remmina_ssh_tunnel_free (gp->priv->ssh_tunnel);
233
gp->priv->ssh_tunnel = NULL;
237
if (!gp->priv->plugin->close_connection)
239
remmina_protocol_widget_emit_signal (gp, "disconnect");
243
return gp->priv->plugin->close_connection (gp);
247
remmina_protocol_widget_emit_signal_timeout (gpointer user_data)
249
RemminaProtocolWidgetSignalData *data = (RemminaProtocolWidgetSignalData*) user_data;
250
g_signal_emit_by_name (G_OBJECT (data->gp), data->signal_name);
256
remmina_protocol_widget_emit_signal (RemminaProtocolWidget *gp, const gchar *signal_name)
258
RemminaProtocolWidgetSignalData *data;
260
data = g_new (RemminaProtocolWidgetSignalData, 1);
262
data->signal_name = signal_name;
263
TIMEOUT_ADD (0, remmina_protocol_widget_emit_signal_timeout, data);
267
remmina_protocol_widget_query_feature (RemminaProtocolWidget *gp, RemminaProtocolFeature feature)
271
case REMMINA_PROTOCOL_FEATURE_TOOL:
272
return GINT_TO_POINTER (1);
274
case REMMINA_PROTOCOL_FEATURE_TOOL_SFTP:
275
case REMMINA_PROTOCOL_FEATURE_TOOL_SSHTERM:
276
return (gp->priv->ssh_tunnel ? GINT_TO_POINTER (1) : NULL);
279
return gp->priv->plugin->query_feature (gp, feature);
284
remmina_protocol_widget_call_feature (RemminaProtocolWidget *gp, RemminaProtocolFeature feature, const gpointer data)
289
case REMMINA_PROTOCOL_FEATURE_TOOL_SFTP:
290
if (!gp->priv->ssh_tunnel) return;
291
remmina_connection_window_open_from_file_full (
292
remmina_file_dup_temp_protocol (gp->priv->remmina_file, "SFTP"), NULL, gp->priv->ssh_tunnel, NULL);
295
case REMMINA_PROTOCOL_FEATURE_TOOL_SSHTERM:
296
if (!gp->priv->ssh_tunnel) return;
297
remmina_connection_window_open_from_file_full (
298
remmina_file_dup_temp_protocol (gp->priv->remmina_file, "SSH"), NULL, gp->priv->ssh_tunnel, NULL);
301
case REMMINA_PROTOCOL_FEATURE_UNFOCUS:
306
gp->priv->plugin->call_feature (gp, feature, data);
310
remmina_protocol_widget_on_key_press (GtkWidget *widget, GdkEventKey *event, RemminaProtocolWidget *gp)
312
if (gp->priv->hostkey_func)
314
return gp->priv->hostkey_func (gp, event->keyval, FALSE, gp->priv->hostkey_func_data);
320
remmina_protocol_widget_on_key_release (GtkWidget *widget, GdkEventKey *event, RemminaProtocolWidget *gp)
322
if (gp->priv->hostkey_func)
324
return gp->priv->hostkey_func (gp, event->keyval, TRUE, gp->priv->hostkey_func_data);
330
remmina_protocol_widget_register_hostkey (RemminaProtocolWidget *gp, GtkWidget *widget)
332
g_signal_connect (G_OBJECT (widget), "key-press-event", G_CALLBACK (remmina_protocol_widget_on_key_press), gp);
333
g_signal_connect (G_OBJECT (widget), "key-release-event", G_CALLBACK (remmina_protocol_widget_on_key_release), gp);
337
remmina_protocol_widget_set_hostkey_func (RemminaProtocolWidget *gp, RemminaHostkeyFunc func, gpointer data)
339
gp->priv->hostkey_func = func;
340
gp->priv->hostkey_func_data = data;
345
remmina_protocol_widget_init_tunnel (RemminaProtocolWidget *gp)
347
RemminaSSHTunnel *tunnel;
350
/* Reuse existing SSH connection if it's reconnecting to destination */
351
if (gp->priv->ssh_tunnel == NULL)
353
tunnel = remmina_ssh_tunnel_new_from_file (gp->priv->remmina_file);
356
remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog),
357
_("Connecting to SSH server %s..."), REMMINA_SSH (tunnel)->server);
360
if (!remmina_ssh_init_session (REMMINA_SSH (tunnel)))
362
remmina_protocol_widget_set_error (gp, REMMINA_SSH (tunnel)->error);
363
remmina_ssh_tunnel_free (tunnel);
367
ret = remmina_ssh_auth_gui (REMMINA_SSH (tunnel), REMMINA_INIT_DIALOG (gp->priv->init_dialog), TRUE);
372
remmina_protocol_widget_set_error (gp, REMMINA_SSH (tunnel)->error);
374
remmina_ssh_tunnel_free (tunnel);
378
gp->priv->ssh_tunnel = tunnel;
386
remmina_protocol_widget_start_direct_tunnel (RemminaProtocolWidget *gp, gint default_port, gboolean port_plus)
391
if (!gp->priv->remmina_file->server || gp->priv->remmina_file->server[0] == '\0')
396
remmina_public_get_server_port (gp->priv->remmina_file->server, default_port, &host, &port);
398
if (port_plus && port < 100)
400
/* Protocols like VNC supports using instance number :0, :1, etc as port number. */
401
port += default_port;
405
if (!gp->priv->remmina_file->ssh_enabled)
407
dest = g_strdup_printf ("[%s]:%i", host, port);
412
if (!remmina_protocol_widget_init_tunnel (gp))
419
remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog),
420
_("Connecting to %s through SSH tunnel..."), gp->priv->remmina_file->server);
423
if (gp->priv->remmina_file->ssh_loopback)
426
host = g_strdup ("127.0.0.1");
429
if (!remmina_ssh_tunnel_open (gp->priv->ssh_tunnel, host, port, remmina_pref.sshtunnel_port))
432
remmina_protocol_widget_set_error (gp, REMMINA_SSH (gp->priv->ssh_tunnel)->error);
437
return g_strdup_printf ("127.0.0.1:%i", remmina_pref.sshtunnel_port);
441
dest = g_strdup_printf ("[%s]:%i", host, port);
449
remmina_protocol_widget_start_reverse_tunnel (RemminaProtocolWidget *gp, gint local_port)
452
if (!gp->priv->remmina_file->ssh_enabled)
457
if (!remmina_protocol_widget_init_tunnel (gp))
463
remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog),
464
_("Waiting for an incoming SSH tunnel at port %i..."), gp->priv->remmina_file->listenport);
467
if (!remmina_ssh_tunnel_reverse (gp->priv->ssh_tunnel, gp->priv->remmina_file->listenport, local_port))
469
remmina_protocol_widget_set_error (gp, REMMINA_SSH (gp->priv->ssh_tunnel)->error);
478
remmina_protocol_widget_ssh_exec (RemminaProtocolWidget *gp, gboolean wait, const gchar *fmt, ...)
481
RemminaSSHTunnel *tunnel = gp->priv->ssh_tunnel;
484
gboolean ret = FALSE;
488
if ((channel = channel_new (REMMINA_SSH (tunnel)->session)) == NULL)
493
va_start (args, fmt);
494
cmd = g_strdup_vprintf (fmt, args);
497
if (channel_open_session (channel) == SSH_OK &&
498
channel_request_exec (channel, cmd) == SSH_OK)
502
channel_send_eof (channel);
503
status = channel_get_exit_status (channel);
504
ptr = strchr (cmd, ' ');
505
if (ptr) *ptr = '\0';
512
remmina_ssh_set_application_error (REMMINA_SSH (tunnel),
513
_("Command %s not found on SSH server"), cmd);
516
remmina_ssh_set_application_error (REMMINA_SSH (tunnel),
517
_("Command %s failed on SSH server (status = %i)."), cmd, status);
528
remmina_ssh_set_error (REMMINA_SSH (tunnel), _("Failed to execute command: %s"));
531
if (wait) channel_close (channel);
532
channel_free (channel);
544
remmina_protocol_widget_tunnel_init_callback (RemminaSSHTunnel *tunnel, gpointer data)
546
RemminaProtocolWidget *gp = REMMINA_PROTOCOL_WIDGET (data);
551
remmina_public_get_server_port (gp->priv->remmina_file->server, 177, &server, &port);
552
ret = ((RemminaXPortTunnelInitFunc) gp->priv->init_func) (gp,
553
tunnel->remotedisplay, (tunnel->bindlocalhost ? "localhost" : server), port);
560
remmina_protocol_widget_tunnel_connect_callback (RemminaSSHTunnel *tunnel, gpointer data)
566
remmina_protocol_widget_tunnel_disconnect_callback (RemminaSSHTunnel *tunnel, gpointer data)
568
RemminaProtocolWidget *gp = REMMINA_PROTOCOL_WIDGET (data);
570
if (REMMINA_SSH (tunnel)->error)
572
remmina_protocol_widget_set_error (gp, "%s", REMMINA_SSH (tunnel)->error);
574
IDLE_ADD ((GSourceFunc) remmina_protocol_widget_close_connection, gp);
580
remmina_protocol_widget_start_xport_tunnel (RemminaProtocolWidget *gp, RemminaXPortTunnelInitFunc init_func)
583
gboolean bindlocalhost;
586
if (!remmina_protocol_widget_init_tunnel (gp)) return FALSE;
589
remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog),
590
_("Connecting to %s through SSH tunnel..."), gp->priv->remmina_file->server);
593
gp->priv->init_func = init_func;
594
gp->priv->ssh_tunnel->init_func = remmina_protocol_widget_tunnel_init_callback;
595
gp->priv->ssh_tunnel->connect_func = remmina_protocol_widget_tunnel_connect_callback;
596
gp->priv->ssh_tunnel->disconnect_func = remmina_protocol_widget_tunnel_disconnect_callback;
597
gp->priv->ssh_tunnel->callback_data = gp;
599
remmina_public_get_server_port (gp->priv->remmina_file->server, 0, &server, NULL);
600
bindlocalhost = (g_strcmp0 (REMMINA_SSH (gp->priv->ssh_tunnel)->server, server) == 0);
603
if (!remmina_ssh_tunnel_xport (gp->priv->ssh_tunnel, bindlocalhost))
605
remmina_protocol_widget_set_error (gp, "Failed to open channel : %s",
606
ssh_get_error (REMMINA_SSH (gp->priv->ssh_tunnel)->session));
618
remmina_protocol_widget_set_display (RemminaProtocolWidget *gp, gint display)
621
if (gp->priv->ssh_tunnel->localdisplay) g_free (gp->priv->ssh_tunnel->localdisplay);
622
gp->priv->ssh_tunnel->localdisplay = g_strdup_printf ("unix:%i", display);
627
remmina_protocol_widget_get_init_dialog (RemminaProtocolWidget *gp)
629
return gp->priv->init_dialog;
633
remmina_protocol_widget_get_width (RemminaProtocolWidget *gp)
635
return gp->priv->width;
639
remmina_protocol_widget_set_width (RemminaProtocolWidget *gp, gint width)
641
gp->priv->width = width;
645
remmina_protocol_widget_get_height (RemminaProtocolWidget *gp)
647
return gp->priv->height;
651
remmina_protocol_widget_set_height (RemminaProtocolWidget *gp, gint height)
653
gp->priv->height = height;
657
remmina_protocol_widget_get_scale (RemminaProtocolWidget *gp)
659
return gp->priv->scale;
663
remmina_protocol_widget_set_scale (RemminaProtocolWidget *gp, gboolean scale)
665
gp->priv->scale = scale;
669
remmina_protocol_widget_get_expand (RemminaProtocolWidget *gp)
671
return gp->priv->expand;
675
remmina_protocol_widget_set_expand (RemminaProtocolWidget *gp, gboolean expand)
677
gp->priv->expand = expand;
681
remmina_protocol_widget_has_error (RemminaProtocolWidget *gp)
683
return gp->priv->has_error;
687
remmina_protocol_widget_get_error_message (RemminaProtocolWidget *gp)
689
return gp->priv->error_message;
693
remmina_protocol_widget_set_error (RemminaProtocolWidget *gp, const gchar *fmt, ...)
697
if (gp->priv->error_message) g_free (gp->priv->error_message);
699
va_start (args, fmt);
700
gp->priv->error_message = g_strdup_vprintf (fmt, args);
703
gp->priv->has_error = TRUE;
707
remmina_protocol_widget_is_closed (RemminaProtocolWidget *gp)
709
return gp->priv->closed;
713
remmina_protocol_widget_get_file (RemminaProtocolWidget *gp)
715
return gp->priv->remmina_file;
719
remmina_protocol_widget_init_authpwd (RemminaProtocolWidget *gp, RemminaAuthpwdType authpwd_type)
721
RemminaFile *remminafile = gp->priv->remmina_file;
725
switch (authpwd_type)
727
case REMMINA_AUTHPWD_TYPE_PROTOCOL:
728
s = g_strdup_printf (_("%s Password"), remminafile->protocol);
730
case REMMINA_AUTHPWD_TYPE_SSH_PWD:
731
s = g_strdup (_("SSH Password"));
733
case REMMINA_AUTHPWD_TYPE_SSH_PRIVKEY:
734
s = g_strdup (_("SSH Private Key Passphrase"));
737
s = g_strdup (_("Password"));
740
ret = remmina_init_dialog_authpwd (REMMINA_INIT_DIALOG (gp->priv->init_dialog), s,
741
remminafile->filename != NULL &&
742
authpwd_type != REMMINA_AUTHPWD_TYPE_SSH_PWD &&
743
authpwd_type != REMMINA_AUTHPWD_TYPE_SSH_PRIVKEY);
750
remmina_protocol_widget_init_authuserpwd (RemminaProtocolWidget *gp)
752
RemminaFile *remminafile = gp->priv->remmina_file;
754
return remmina_init_dialog_authuserpwd (REMMINA_INIT_DIALOG (gp->priv->init_dialog),
755
remminafile->username, (remminafile->filename != NULL));
759
remmina_protocol_widget_init_get_username (RemminaProtocolWidget *gp)
761
return g_strdup (REMMINA_INIT_DIALOG (gp->priv->init_dialog)->username);
765
remmina_protocol_widget_init_get_password (RemminaProtocolWidget *gp)
767
return g_strdup (REMMINA_INIT_DIALOG (gp->priv->init_dialog)->password);
771
remmina_protocol_widget_init_authx509 (RemminaProtocolWidget *gp)
773
RemminaFile *remminafile = gp->priv->remmina_file;
775
return remmina_init_dialog_authx509 (REMMINA_INIT_DIALOG (gp->priv->init_dialog),
776
remminafile->cacert, remminafile->cacrl, remminafile->clientcert, remminafile->clientkey);
780
remmina_protocol_widget_init_get_cacert (RemminaProtocolWidget *gp)
784
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->cacert;
785
return (s && s[0] ? g_strdup (s) : NULL);
789
remmina_protocol_widget_init_get_cacrl (RemminaProtocolWidget *gp)
793
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->cacrl;
794
return (s && s[0] ? g_strdup (s) : NULL);
798
remmina_protocol_widget_init_get_clientcert (RemminaProtocolWidget *gp)
802
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->clientcert;
803
return (s && s[0] ? g_strdup (s) : NULL);
807
remmina_protocol_widget_init_get_clientkey (RemminaProtocolWidget *gp)
811
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->clientkey;
812
return (s && s[0] ? g_strdup (s) : NULL);
816
remmina_protocol_widget_init_save_cred (RemminaProtocolWidget *gp)
818
RemminaFile *remminafile = gp->priv->remmina_file;
820
gboolean save = FALSE;
822
/* Save user name and certificates if any; save the password if it's requested to do so */
823
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->username;
826
if (remminafile->username) g_free (remminafile->username);
827
remminafile->username = g_strdup (s);
830
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->cacert;
833
if (remminafile->cacert) g_free (remminafile->cacert);
834
remminafile->cacert = g_strdup (s);
837
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->cacrl;
840
if (remminafile->cacrl) g_free (remminafile->cacrl);
841
remminafile->cacrl = g_strdup (s);
844
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->clientcert;
847
if (remminafile->clientcert) g_free (remminafile->clientcert);
848
remminafile->clientcert = g_strdup (s);
851
s = REMMINA_INIT_DIALOG (gp->priv->init_dialog)->clientkey;
854
if (remminafile->clientkey) g_free (remminafile->clientkey);
855
remminafile->clientkey = g_strdup (s);
858
if (REMMINA_INIT_DIALOG (gp->priv->init_dialog)->save_password)
860
if (remminafile->password) g_free (remminafile->password);
861
remminafile->password =
862
g_strdup (REMMINA_INIT_DIALOG (gp->priv->init_dialog)->password);
867
remmina_file_save_credential (remminafile);
872
remmina_protocol_widget_init_show_listen (RemminaProtocolWidget *gp, gint port)
874
remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog),
875
_("Listening on Port %i for an Incoming %s Connection..."),
876
port, gp->priv->remmina_file->protocol);
880
remmina_protocol_widget_init_show_retry (RemminaProtocolWidget *gp)
882
remmina_init_dialog_set_status_temp (REMMINA_INIT_DIALOG (gp->priv->init_dialog),
883
_("Authentication failed. Trying to reconnect..."));
887
remmina_protocol_widget_init_show (RemminaProtocolWidget *gp)
889
gtk_widget_show (gp->priv->init_dialog);
893
remmina_protocol_widget_init_hide (RemminaProtocolWidget *gp)
895
gtk_widget_hide (gp->priv->init_dialog);
899
remmina_protocol_widget_chat_on_destroy (RemminaProtocolWidget *gp)
901
gp->priv->chat_window = NULL;
905
remmina_protocol_widget_chat_open (RemminaProtocolWidget *gp, const gchar *name,
906
void(*on_send)(RemminaProtocolWidget *gp, const gchar *text),
907
void(*on_destroy)(RemminaProtocolWidget *gp))
909
if (gp->priv->chat_window)
911
gtk_window_present (GTK_WINDOW (gp->priv->chat_window));
915
gp->priv->chat_window = remmina_chat_window_new (
916
GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gp))),
918
g_signal_connect_swapped (G_OBJECT (gp->priv->chat_window), "send", G_CALLBACK (on_send), gp);
919
g_signal_connect_swapped (G_OBJECT (gp->priv->chat_window), "destroy", G_CALLBACK (remmina_protocol_widget_chat_on_destroy), gp);
920
g_signal_connect_swapped (G_OBJECT (gp->priv->chat_window), "destroy", G_CALLBACK (on_destroy), gp);
921
gtk_widget_show (gp->priv->chat_window);
926
remmina_protocol_widget_chat_close (RemminaProtocolWidget *gp)
928
if (gp->priv->chat_window)
930
gtk_widget_destroy (gp->priv->chat_window);
935
remmina_protocol_widget_chat_receive (RemminaProtocolWidget *gp, const gchar *text)
937
if (gp->priv->chat_window)
939
remmina_chat_window_receive (REMMINA_CHAT_WINDOW (gp->priv->chat_window), _("Server"), text);
940
gtk_window_present (GTK_WINDOW (gp->priv->chat_window));
945
remmina_protocol_widget_new (void)
947
return GTK_WIDGET (g_object_new (REMMINA_TYPE_PROTOCOL_WIDGET, NULL));