From 943d6d8dff76b83311a9e266240a9c7e21440712 Mon Sep 17 00:00:00 2001 From: Giovanni Panozzo Date: Thu, 16 Oct 2014 00:03:55 +0200 Subject: Added printer redirection, code cleanup --- remmina-plugins/rdp/rdp_plugin.c | 48 +++++++++------------------------------- 1 file changed, 11 insertions(+), 37 deletions(-) diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c index 2318dcd36..259b748f2 100644 --- a/remmina-plugins/rdp/rdp_plugin.c +++ b/remmina-plugins/rdp/rdp_plugin.c @@ -561,27 +561,6 @@ static void remmina_rdp_main_loop(RemminaProtocolWidget* gp) } } -gboolean remmina_rdp_load_plugin(rdpChannels* channels, rdpSettings* settings, const char* name, rdpSettings* plugin_data) -{ - void* entry = NULL; - - entry = freerdp_channels_client_find_static_entry("VirtualChannelEntry", name); - - if (entry) - { - if (freerdp_channels_client_load(channels, settings, entry, plugin_data) == 0) - { - g_printf("loading channel %s (static)\n", name); - return TRUE; - } - } - - g_printf("loading channel %s (plugin)\n", name); - freerdp_channels_load_plugin(channels, settings, name, plugin_data); - - return TRUE; -} - int remmina_rdp_load_static_channel_addin(rdpChannels* channels, rdpSettings* settings, char* name, void* data) { void* entry; @@ -630,7 +609,6 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) gint port; gchar* host; gchar* value; - gint rdpdr_num; gint drdynvc_num; gint rdpsnd_rate; gint rdpsnd_channel; @@ -829,7 +807,6 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) rfi->settings->RedirectClipboard = ( remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE) ? FALSE: TRUE ); - rdpdr_num = 0; cs = remmina_plugin_service->file_get_string(remminafile, "sharefolder"); if (cs && cs[0] == '/') @@ -854,28 +831,25 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) freerdp_device_collection_add(rfi->settings, (RDPDR_DEVICE*) drive); rfi->settings->DeviceRedirection = TRUE; - rdpdr_num++; } if (remmina_plugin_service->file_get_int(remminafile, "shareprinter", FALSE)) { -// rfi->rdpdr_data[rdpdr_num].size = sizeof(RDP_PLUGIN_DATA); -// rfi->rdpdr_data[rdpdr_num].data[0] = "printer"; - rdpdr_num++; - } + RDPDR_PRINTER* printer; + printer = (RDPDR_PRINTER*) malloc(sizeof(RDPDR_DEVICE)); + ZeroMemory(printer, sizeof(RDPDR_PRINTER)); + + printer->Type = RDPDR_DTYP_PRINT; + + freerdp_device_collection_add(rfi->settings, (RDPDR_DEVICE*) printer); + rfi->settings->DeviceRedirection = TRUE; - if (remmina_plugin_service->file_get_int(remminafile, "sharesmartcard", FALSE)) - { - //rfi->rdpdr_data[rdpdr_num].size = sizeof(RDP_PLUGIN_DATA); - //rfi->rdpdr_data[rdpdr_num].data[0] = "scard"; - //rfi->rdpdr_data[rdpdr_num].data[1] = "scard"; - rdpdr_num++; } - if (rdpdr_num) + if (remmina_plugin_service->file_get_int(remminafile, "sharesmartcard", FALSE)) { - //remmina_rdp_load_plugin(rfi->channels, rfi->settings, "rdpdr", rfi->rdpdr_data); - remmina_rdp_load_plugin(rfi->instance->context->channels, rfi->settings, "rdpdr", rfi->settings); + // Not implemented yet + // see FreeRDP client/common/cmdline.c for an example } -- cgit v1.2.3 From 9090480a62920060a0b2f36ec97063c61ae9fa0a Mon Sep 17 00:00:00 2001 From: Giovanni Panozzo Date: Thu, 16 Oct 2014 18:04:19 +0200 Subject: Printer sharing fixes --- remmina-plugins/rdp/rdp_plugin.c | 41 +++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c index 259b748f2..39c8faa12 100644 --- a/remmina-plugins/rdp/rdp_plugin.c +++ b/remmina-plugins/rdp/rdp_plugin.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, + * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * In addition, as a special exception, the copyright holders give @@ -375,7 +375,7 @@ static BOOL remmina_rdp_authenticate(freerdp* instance, char** username, char** s_domain = remmina_plugin_service->protocol_plugin_init_get_domain(gp); if (s_domain) rfi->settings->Domain = strdup(s_domain); - + save = remmina_plugin_service->protocol_plugin_init_get_savepassword(gp); if (save) { @@ -383,13 +383,13 @@ static BOOL remmina_rdp_authenticate(freerdp* instance, char** username, char** // into remminafile->settings. They will be saved later, when disconnecting, by // remmina_connection_object_on_disconnect of remmina_connection_window.c // (this operation should be called "save credentials" and not "save password") - + remmina_plugin_service->file_set_string( remminafile, "username", s_username ); remmina_plugin_service->file_set_string( remminafile, "password", s_password ); remmina_plugin_service->file_set_string( remminafile, "domain", s_domain ); - + } - + if ( s_username ) g_free( s_username ); if ( s_password ) g_free( s_password ); if ( s_domain ) g_free( s_domain ); @@ -470,9 +470,9 @@ static void remmina_rdp_main_loop(RemminaProtocolWidget* gp) fd_set wfds_set; rfContext* rfi; wMessage* event; - + rdpChannels *channels; - + memset(rfds, 0, sizeof(rfds)); memset(wfds, 0, sizeof(wfds)); @@ -566,13 +566,13 @@ int remmina_rdp_load_static_channel_addin(rdpChannels* channels, rdpSettings* se void* entry; entry = freerdp_load_channel_addin_entry(name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC); - - - + + + if (entry) { - + if (freerdp_channels_client_load(channels, settings, entry, data) == 0) { fprintf(stderr, "loading channel %s\n", name); @@ -836,7 +836,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) if (remmina_plugin_service->file_get_int(remminafile, "shareprinter", FALSE)) { RDPDR_PRINTER* printer; - printer = (RDPDR_PRINTER*) malloc(sizeof(RDPDR_DEVICE)); + printer = (RDPDR_PRINTER*) malloc(sizeof(RDPDR_PRINTER)); ZeroMemory(printer, sizeof(RDPDR_PRINTER)); printer->Type = RDPDR_DTYP_PRINT; @@ -848,8 +848,15 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) if (remmina_plugin_service->file_get_int(remminafile, "sharesmartcard", FALSE)) { - // Not implemented yet - // see FreeRDP client/common/cmdline.c for an example + RDPDR_SMARTCARD* smartcard; + smartcard = (RDPDR_SMARTCARD*) malloc(sizeof(RDPDR_SMARTCARD)); + ZeroMemory(smartcard, sizeof(RDPDR_SMARTCARD)); + + smartcard->Type = RDPDR_DTYP_SMARTCARD; + smartcard->Name = _strdup("scard"); + + freerdp_device_collection_add(rfi->settings, (RDPDR_DEVICE*) smartcard); + rfi->settings->DeviceRedirection = TRUE; } @@ -863,7 +870,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) return FALSE; } - + remmina_rdp_main_loop(gp); @@ -891,7 +898,7 @@ static void remmina_rdp_init(RemminaProtocolWidget* gp) { freerdp* instance; rfContext* rfi; - + freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); instance = freerdp_new(); @@ -946,7 +953,7 @@ static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp) { rfContext* rfi; freerdp* instance; - + rfi = GET_DATA(gp); instance = rfi->instance; -- cgit v1.2.3 From 210e8a92130b5638ff77deaa9d7344c566861aa2 Mon Sep 17 00:00:00 2001 From: Giovanni Panozzo Date: Sat, 18 Oct 2014 00:04:13 +0200 Subject: Fix freerdp connection closing --- remmina-plugins/rdp/rdp_plugin.c | 38 +++++++++++++++++++++++++++----------- remmina-plugins/rdp/rdp_plugin.h | 6 ++++-- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c index 39c8faa12..fadacffab 100644 --- a/remmina-plugins/rdp/rdp_plugin.c +++ b/remmina-plugins/rdp/rdp_plugin.c @@ -338,6 +338,7 @@ static BOOL remmina_rdp_post_connect(freerdp* instance) instance->update->DesktopResize = rf_desktop_resize; freerdp_channels_post_connect(instance->context->channels, instance); + rfi->connected = True; remmina_plugin_service->protocol_plugin_emit_signal(gp, "connect"); @@ -642,7 +643,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) dest_server = remmina_plugin_service->file_get_string(remminafile, "server"); if ( dest_server ) { remmina_plugin_service->get_server_port(dest_server, 0, &dest_host, &dest_port); - rfi->settings->CertificateName = _strdup( dest_host ); + rfi->settings->CertificateName = strdup( dest_host ); g_free(dest_host); } } @@ -679,12 +680,17 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) if (remmina_plugin_service->file_get_string(remminafile, "clientname")) { - strncpy(rfi->settings->ClientHostname, remmina_plugin_service->file_get_string(remminafile, "clientname"), - sizeof(rfi->settings->ClientHostname) - 1); + s = remmina_plugin_service->file_get_string(remminafile, "clientname"); + if ( s ) { + free( rfi->settings->ClientHostname ); + rfi->settings->ClientHostname = strdup(s); + g_free(s); + } } else { - strncpy(rfi->settings->ClientHostname, g_get_host_name(), sizeof(rfi->settings->ClientHostname) - 1); + free( rfi->settings->ClientHostname ); + rfi->settings->ClientHostname = strdup( g_get_host_name() ); } if (remmina_plugin_service->file_get_string(remminafile, "exec")) @@ -919,6 +925,7 @@ static void remmina_rdp_init(RemminaProtocolWidget* gp) rfi->instance = instance; rfi->settings = instance->settings; rfi->instance->context->channels = freerdp_channels_new(); + rfi->connected = False; pthread_mutex_init(&rfi->mutex, NULL); @@ -976,13 +983,11 @@ static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp) if (instance) { - if (instance->context->channels) - { - //freerdp_channels_close(rfi->channels, instance); - freerdp_channels_free(instance->context->channels); - instance->context->channels = NULL; + if ( rfi->connected ) { + if (instance->context->channels) + freerdp_channels_close(instance->context->channels, instance); + freerdp_disconnect(instance); } - freerdp_disconnect(instance); } if (rfi->rfx_context) @@ -993,8 +998,19 @@ static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp) if (instance) { - //freerdp_context_free(instance); /* context is rfContext* rfi */ + /* Remove instance->context from gp object data to avoid double free */ + g_object_steal_data(G_OBJECT(gp), "plugin-data"); + + + + if (instance->context->channels) { + freerdp_channels_free(instance->context->channels); + instance->context->channels = NULL; + } + + freerdp_context_free(instance); /* context is rfContext* rfi */ freerdp_free(instance); + rfi->instance = NULL; } return FALSE; diff --git a/remmina-plugins/rdp/rdp_plugin.h b/remmina-plugins/rdp/rdp_plugin.h index ef00f5347..35395c5d5 100644 --- a/remmina-plugins/rdp/rdp_plugin.h +++ b/remmina-plugins/rdp/rdp_plugin.h @@ -1,6 +1,6 @@ /* * Remmina - The GTK+ Remote Desktop Client - * Copyright (C) 2010-2011 Vic Lee + * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, + * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * In addition, as a special exception, the copyright holders give @@ -106,6 +106,8 @@ struct rf_context RFX_CONTEXT* rfx_context; + gboolean connected; + gboolean sw_gdi; GtkWidget* drawing_area; gint scale_width; -- cgit v1.2.3 From 9274ce58b75776e9c1019264aea7383bac52f1b6 Mon Sep 17 00:00:00 2001 From: Giovanni Panozzo Date: Sat, 18 Oct 2014 01:01:46 +0200 Subject: Update rdp_plugin.c --- remmina-plugins/rdp/rdp_plugin.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c index fadacffab..709f9b2e5 100644 --- a/remmina-plugins/rdp/rdp_plugin.c +++ b/remmina-plugins/rdp/rdp_plugin.c @@ -987,6 +987,7 @@ static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp) if (instance->context->channels) freerdp_channels_close(instance->context->channels, instance); freerdp_disconnect(instance); + rfi->connected = False; } } @@ -1001,8 +1002,6 @@ static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp) /* Remove instance->context from gp object data to avoid double free */ g_object_steal_data(G_OBJECT(gp), "plugin-data"); - - if (instance->context->channels) { freerdp_channels_free(instance->context->channels); instance->context->channels = NULL; -- cgit v1.2.3