Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntenore Gatta <antenore@simbiosi.org>2014-08-18 11:47:30 +0400
committerAntenore Gatta <antenore@simbiosi.org>2014-08-18 11:47:30 +0400
commita5ddd1919cea30b9e3085b08af89ac89da7ea6ac (patch)
tree046ce5446a3a8ef2d8662a3d2d1774bd11bf161d /remmina-plugins/rdp
parent73ed106098d8f50594b8e7b164b2776a8d0d8bc5 (diff)
parentecbedf5280719683a0685e50e419f29f3a6038ad (diff)
Merge branch 'gtk3' of github.com:giox069/Remmina into giox069-gtk3
Diffstat (limited to 'remmina-plugins/rdp')
-rw-r--r--remmina-plugins/rdp/rdp_cliprdr.c22
-rw-r--r--remmina-plugins/rdp/rdp_plugin.c169
-rw-r--r--remmina-plugins/rdp/rdp_plugin.h2
3 files changed, 147 insertions, 46 deletions
diff --git a/remmina-plugins/rdp/rdp_cliprdr.c b/remmina-plugins/rdp/rdp_cliprdr.c
index 07c575807..84f938a24 100644
--- a/remmina-plugins/rdp/rdp_cliprdr.c
+++ b/remmina-plugins/rdp/rdp_cliprdr.c
@@ -266,12 +266,12 @@ void remmina_rdp_cliprdr_process_data_response(RemminaProtocolWidget* gp, RDP_CB
data = Stream_Buffer(s);
size = Stream_Length(s);
- Stream_Free(s, TRUE);
+
pixbuf = gdk_pixbuf_loader_new();
gdk_pixbuf_loader_write(pixbuf, data, size, NULL);
+ gdk_pixbuf_loader_close(pixbuf, NULL);
Stream_Free(s, TRUE);
output = g_object_ref(gdk_pixbuf_loader_get_pixbuf(pixbuf));
- gdk_pixbuf_loader_close(pixbuf, NULL);
g_object_unref(pixbuf);
break;
}
@@ -328,7 +328,7 @@ void remmina_rdp_cliprdr_request_data(GtkClipboard *clipboard, GtkSelectionData
event = (RDP_CB_DATA_REQUEST_EVENT*)
freerdp_event_new(CliprdrChannel_Class, CliprdrChannel_DataRequest, NULL, NULL);
event->format = rfi->format;
- freerdp_channels_send_event(rfi->channels, (wMessage*) event);
+ freerdp_channels_send_event(rfi->instance->context->channels, (wMessage*) event);
data = g_async_queue_timeout_pop(rfi->clipboard_queue, 1000000);
if (data != NULL)
@@ -373,16 +373,20 @@ int remmina_rdp_cliprdr_send_format_list(RemminaProtocolWidget* gp, RemminaPlugi
result = gtk_clipboard_wait_for_targets(clipboard, &targets, &count);
}
- if (!result)
- return 0;
event = (RDP_CB_FORMAT_LIST_EVENT*)
freerdp_event_new(CliprdrChannel_Class, CliprdrChannel_FormatList, NULL, NULL);
- remmina_rdp_cliprdr_get_target_types(&event->formats, &event->num_formats, targets, count);
- g_free(targets);
+ if (result)
+ {
+ remmina_rdp_cliprdr_get_target_types(&event->formats, &event->num_formats, targets, count);
+ g_free(targets);
+ }
+ else
+ event->num_formats = 0;
+
- return freerdp_channels_send_event(rfi->channels, (wMessage*) event);
+ return freerdp_channels_send_event(rfi->instance->context->channels, (wMessage*) event);
}
void remmina_rdp_cliprdr_get_clipboard_data(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui)
@@ -478,7 +482,7 @@ void remmina_rdp_cliprdr_get_clipboard_data(RemminaProtocolWidget* gp, RemminaPl
freerdp_event_new(CliprdrChannel_Class, CliprdrChannel_DataResponse, NULL, NULL);
event->data = outbuf;
event->size = size;
- freerdp_channels_send_event(rfi->channels, (wMessage*) event);
+ freerdp_channels_send_event(rfi->instance->context->channels, (wMessage*) event);
}
void remmina_rdp_cliprdr_set_clipboard_data(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui)
diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c
index b3418f4aa..bf854b204 100644
--- a/remmina-plugins/rdp/rdp_plugin.c
+++ b/remmina-plugins/rdp/rdp_plugin.c
@@ -47,6 +47,7 @@
#include <freerdp/constants.h>
#include <freerdp/client/cliprdr.h>
#include <freerdp/client/channels.h>
+#include <freerdp/error.h>
#include <winpr/memory.h>
#define REMMINA_RDP_FEATURE_TOOL_REFRESH 1
@@ -212,10 +213,12 @@ static BOOL remmina_rdp_pre_connect(freerdp* instance)
rfContext* rfi;
ALIGN64 rdpSettings* settings;
RemminaProtocolWidget* gp;
+ rdpChannels *channels;
rfi = (rfContext*) instance->context;
settings = instance->settings;
gp = rfi->protocol_widget;
+ channels = instance->context->channels;
settings->BitmapCacheEnabled = True;
settings->OffscreenSupportLevel = True;
@@ -254,8 +257,8 @@ static BOOL remmina_rdp_pre_connect(freerdp* instance)
rfi->rfx_context = rfx_context_new(FALSE);
}
- freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
- freerdp_channels_pre_connect(rfi->channels, instance);
+
+ freerdp_channels_pre_connect(instance->context->channels, instance);
rfi->clrconv = freerdp_clrconv_new(CLRCONV_ALPHA);
@@ -336,7 +339,7 @@ static BOOL remmina_rdp_post_connect(freerdp* instance)
instance->update->EndPaint = rf_end_paint;
instance->update->DesktopResize = rf_desktop_resize;
- freerdp_channels_post_connect(rfi->channels, instance);
+ freerdp_channels_post_connect(instance->context->channels, instance);
remmina_plugin_service->protocol_plugin_emit_signal(gp, "connect");
@@ -349,13 +352,16 @@ static BOOL remmina_rdp_post_connect(freerdp* instance)
static BOOL remmina_rdp_authenticate(freerdp* instance, char** username, char** password, char** domain)
{
- gchar* s;
+ gchar *s_username, *s_password, *s_domain;
gint ret;
rfContext* rfi;
RemminaProtocolWidget* gp;
+ gboolean save;
+ RemminaFile* remminafile;
rfi = (rfContext*) instance->context;
gp = rfi->protocol_widget;
+ remminafile = remmina_plugin_service->protocol_plugin_get_file(gp);
THREADS_ENTER
ret = remmina_plugin_service->protocol_plugin_init_authuserpwd(gp, TRUE);
@@ -363,29 +369,32 @@ static BOOL remmina_rdp_authenticate(freerdp* instance, char** username, char**
if (ret == GTK_RESPONSE_OK)
{
- s = remmina_plugin_service->protocol_plugin_init_get_username(gp);
-
- if (s)
- {
- rfi->settings->Username = strdup(s);
- g_free(s);
- }
-
- s = remmina_plugin_service->protocol_plugin_init_get_password(gp);
-
- if (s)
- {
- rfi->settings->Password = strdup(s);
- g_free(s);
- }
+ s_username = remmina_plugin_service->protocol_plugin_init_get_username(gp);
+ if (s_username) rfi->settings->Username = strdup(s_username);
- s = remmina_plugin_service->protocol_plugin_init_get_domain(gp);
+ s_password = remmina_plugin_service->protocol_plugin_init_get_password(gp);
+ if (s_password) rfi->settings->Password = strdup(s_password);
- if (s)
+ 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)
{
- rfi->settings->Domain = strdup(s);
- g_free(s);
+ // User has requested to save password. We put all the new cretentials
+ // 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 );
return True;
}
@@ -463,11 +472,15 @@ 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));
rfi = GET_DATA(gp);
+ channels = rfi->instance->context->channels;
while (1)
{
@@ -478,7 +491,7 @@ static void remmina_rdp_main_loop(RemminaProtocolWidget* gp)
{
break;
}
- if (!freerdp_channels_get_fds(rfi->channels, rfi->instance, rfds, &rcount, wfds, &wcount))
+ if (!freerdp_channels_get_fds(channels, rfi->instance, rfds, &rcount, wfds, &wcount))
{
break;
}
@@ -532,13 +545,13 @@ static void remmina_rdp_main_loop(RemminaProtocolWidget* gp)
break;
}
/* check channel fds */
- if (!freerdp_channels_check_fds(rfi->channels, rfi->instance))
+ if (!freerdp_channels_check_fds(channels, rfi->instance))
{
break;
}
else
{
- event = freerdp_channels_pop_event(rfi->channels);
+ event = freerdp_channels_pop_event(channels);
if (event)
remmina_rdp_channels_process_event(gp, event);
}
@@ -571,6 +584,48 @@ gboolean remmina_rdp_load_plugin(rdpChannels* channels, rdpSettings* settings, c
return TRUE;
}
+int remmina_rdp_load_static_channel_addin(rdpChannels* channels, rdpSettings* settings, char* name, void* data)
+{
+ 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);
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+
+int remmina_rdp_add_static_channel(rdpSettings* settings, int count, char** params)
+{
+ int index;
+ ADDIN_ARGV* args;
+
+ args = (ADDIN_ARGV*) malloc(sizeof(ADDIN_ARGV));
+
+ args->argc = count;
+ args->argv = (char**) malloc(sizeof(char*) * args->argc);
+
+ for (index = 0; index < args->argc; index++)
+ args->argv[index] = _strdup(params[index]);
+
+ freerdp_static_channel_collection_add(settings, args);
+
+ return 0;
+}
+
+
static gboolean remmina_rdp_main(RemminaProtocolWidget* gp)
{
gchar* s;
@@ -583,6 +638,8 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp)
const gchar* cs;
RemminaFile* remminafile;
rfContext* rfi;
+ ADDIN_ARGV* args;
+ gint index;
rfi = GET_DATA(gp);
remminafile = remmina_plugin_service->protocol_plugin_get_file(gp);
@@ -749,7 +806,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp)
*/
/* remmina_rdp_load_plugin(rfi->channels, rfi->settings, "rdpsnd", rfi->rdpsnd_data); */
- remmina_rdp_load_plugin(rfi->channels, rfi->settings, "rdpsnd", rfi->settings);
+ remmina_rdp_load_plugin(rfi->instance->context->channels, rfi->settings, "rdpsnd", rfi->settings);
/* TODO: Fix/Check this - Removed because of issue #280
rfi->drdynvc_data[drdynvc_num].size = sizeof(RDP_PLUGIN_DATA);
rfi->drdynvc_data[drdynvc_num].data[0] = "audin";
@@ -759,12 +816,21 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp)
if (drdynvc_num)
{
- remmina_rdp_load_plugin(rfi->channels, rfi->settings, "drdynvc", rfi->drdynvc_data);
+ remmina_rdp_load_plugin(rfi->instance->context->channels, rfi->settings, "drdynvc", rfi->drdynvc_data);
}
if (!remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE))
{
- remmina_rdp_load_plugin(rfi->channels, rfi->settings, "cliprdr", NULL);
+
+ if (!freerdp_static_channel_collection_find(rfi->settings, "cliprdr"))
+ {
+ char* params[1];
+ params[0] = "cliprdr";
+ remmina_rdp_add_static_channel(rfi->settings, 1, (char**) params);
+ }
+
+ // Old version: remmina_rdp_load_plugin(rfi->instance->context->channels, rfi->settings, "cliprdr", NULL);
+
}
rdpdr_num = 0;
@@ -803,19 +869,47 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp)
if (rdpdr_num)
{
//remmina_rdp_load_plugin(rfi->channels, rfi->settings, "rdpdr", rfi->rdpdr_data);
- remmina_rdp_load_plugin(rfi->channels, rfi->settings, "rdpdr", rfi->settings);
+ remmina_rdp_load_plugin(rfi->instance->context->channels, rfi->settings, "rdpdr", rfi->settings);
+ }
+
+
+ for (index = 0; index < rfi->settings->StaticChannelCount; index++)
+ {
+ args = rfi->settings->StaticChannelArray[index];
+ remmina_rdp_load_static_channel_addin(rfi->instance->context->channels, rfi->settings, args->argv[0], args);
+
}
+
+
if (!freerdp_connect(rfi->instance))
{
if (!rfi->user_cancelled)
{
- remmina_plugin_service->protocol_plugin_set_error(gp, _("Unable to connect to RDP server %s"),
- rfi->settings->ServerHostname);
+ UINT32 e;
+
+ e = freerdp_get_last_error(rfi->instance->context);
+ switch(e) {
+ case FREERDP_ERROR_AUTHENTICATION_FAILED:
+ remmina_plugin_service->protocol_plugin_set_error(gp, _("Authentication to RDP server %s failed.\nCheck username, password and domain."),
+ rfi->settings->ServerHostname );
+ // Invalidate the saved password, so the user will be re-asked at next logon
+ remmina_plugin_service->file_unsave_password(remminafile);
+ break;
+ case FREERDP_ERROR_CONNECT_FAILED:
+ remmina_plugin_service->protocol_plugin_set_error(gp, _("Connection to RDP server %s failed."), rfi->settings->ServerHostname );
+ break;
+ default:
+ remmina_plugin_service->protocol_plugin_set_error(gp, _("Unable to connect to RDP server %s"), rfi->settings->ServerHostname);
+ break;
+ }
+
}
return FALSE;
}
+
+
remmina_rdp_main_loop(gp);
@@ -842,6 +936,8 @@ 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();
instance->PreConnect = remmina_rdp_pre_connect;
@@ -860,7 +956,7 @@ static void remmina_rdp_init(RemminaProtocolWidget* gp)
rfi->protocol_widget = gp;
rfi->instance = instance;
rfi->settings = instance->settings;
- rfi->channels = freerdp_channels_new();
+ rfi->instance->context->channels = freerdp_channels_new();
pthread_mutex_init(&rfi->mutex, NULL);
@@ -895,6 +991,7 @@ static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp)
{
rfContext* rfi;
freerdp* instance;
+
rfi = GET_DATA(gp);
instance = rfi->instance;
@@ -917,11 +1014,11 @@ static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp)
if (instance)
{
- if (rfi->channels)
+ if (instance->context->channels)
{
//freerdp_channels_close(rfi->channels, instance);
- freerdp_channels_free(rfi->channels);
- rfi->channels = NULL;
+ freerdp_channels_free(instance->context->channels);
+ instance->context->channels = NULL;
}
freerdp_disconnect(instance);
}
diff --git a/remmina-plugins/rdp/rdp_plugin.h b/remmina-plugins/rdp/rdp_plugin.h
index 6a5949f6b..a6487d813 100644
--- a/remmina-plugins/rdp/rdp_plugin.h
+++ b/remmina-plugins/rdp/rdp_plugin.h
@@ -90,7 +90,7 @@ struct rf_context
/* main */
rdpSettings* settings;
freerdp* instance;
- rdpChannels* channels;
+ // rdpChannels* channels;
pthread_t thread;
pthread_mutex_t mutex;