55 #ifdef GDK_WINDOWING_X11 56 #include <cairo/cairo-xlib.h> 58 #include <cairo/cairo.h> 60 #include <freerdp/addin.h> 61 #include <freerdp/assistance.h> 62 #include <freerdp/settings.h> 63 #include <freerdp/freerdp.h> 64 #include <freerdp/constants.h> 65 #include <freerdp/client/cliprdr.h> 66 #include <freerdp/client/channels.h> 67 #include <freerdp/client/cmdline.h> 68 #include <freerdp/error.h> 69 #include <freerdp/event.h> 70 #include <winpr/memory.h> 71 #include <winpr/cmdline.h> 75 #include <cups/cups.h> 81 #ifdef GDK_WINDOWING_X11 83 #include <X11/XKBlib.h> 85 #elif defined(GDK_WINDOWING_WAYLAND) 86 #include <gdk/gdkwayland.h> 89 #if defined(__FreeBSD__) 90 #include <pthread_np.h> 93 #include <freerdp/locale/keyboard.h> 95 #define REMMINA_RDP_FEATURE_TOOL_REFRESH 1 96 #define REMMINA_RDP_FEATURE_SCALE 2 97 #define REMMINA_RDP_FEATURE_UNFOCUS 3 98 #define REMMINA_RDP_FEATURE_TOOL_SENDCTRLALTDEL 4 99 #define REMMINA_RDP_FEATURE_DYNRESUPDATE 5 100 #define REMMINA_RDP_FEATURE_MULTIMON 6 101 #define REMMINA_RDP_FEATURE_VIEWONLY 7 103 #define REMMINA_CONNECTION_TYPE_NONE 0 106 #define CLPARAM const char 127 TRACE_CALL(__func__);
128 #if FREERDP_CHECK_VERSION(2, 0, 0) 129 return (CLPARAM **)CommandLineParseCommaSeparatedValuesEx(name, list, count);
147 size_t len = strlen(name);
148 p = (
char **)calloc(2UL + len,
sizeof(
char *));
151 char *dst = (
char *)&p[1];
153 sprintf_s(dst, len + 1,
"%s", name);
163 const char *it = list;
165 while ((it = strchr(it,
',')) != NULL) {
176 prefix = (nArgs + 1UL) *
sizeof(
char *);
178 p = (
char **)calloc(len + prefix + 1,
sizeof(
char *));
183 str = &((
char *)p)[prefix];
184 memcpy(str, list, len);
189 for (index = name ? 1 : 0; index < nArgs; index++) {
190 char *comma = strchr(str,
',');
206 TRACE_CALL(__func__);
215 TRACE_CALL(__func__);
220 DISPLAY_CONTROL_MONITOR_LAYOUT *dcml;
221 CLIPRDR_FORMAT_DATA_RESPONSE response = { 0 };
233 switch (event->
type) {
237 flags = KBD_FLAGS_EXTENDED1;
240 flags =
event->key_event.extended ? KBD_FLAGS_EXTENDED : 0;
242 flags |=
event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
243 input->KeyboardEvent(input, flags, event->
key_event.key_code);
250 flags =
event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
251 input->UnicodeKeyboardEvent(input, flags, event->
key_event.unicode_code);
256 input->ExtendedMouseEvent(input, event->
mouse_event.flags,
269 response.msgFlags = (
event->clipboard_formatdataresponse.data) ? CB_RESPONSE_OK : CB_RESPONSE_FAIL;
270 response.dataLen =
event->clipboard_formatdataresponse.size;
271 response.requestedFormatData =
event->clipboard_formatdataresponse.data;
276 REMMINA_PLUGIN_DEBUG(
"Sending client FormatDataRequest to server");
283 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
284 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
286 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
287 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
289 dcml = calloc(freerdp_settings_get_uint32(rfi->
settings, FreeRDP_MonitorCount),
sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT));
290 REMMINA_PLUGIN_DEBUG(
"REMMINA_RDP_EVENT_TYPE_SEND_MONITOR_LAYOUT:");
294 const rdpMonitor *base = freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorDefArray);
295 for (gint i = 0; i < freerdp_settings_get_uint32(rfi->
settings, FreeRDP_MonitorCount); ++i) {
296 const rdpMonitor *current = &base[i];
297 REMMINA_PLUGIN_DEBUG(
"Sending display layout for monitor n° %d", i);
298 dcml[i].Flags = (current->is_primary ? DISPLAY_CONTROL_MONITOR_PRIMARY : 0);
299 REMMINA_PLUGIN_DEBUG(
"Monitor %d is primary: %d", i, dcml[i].Flags);
300 dcml[i].Left = current->x;
301 REMMINA_PLUGIN_DEBUG(
"Monitor %d x: %d", i, dcml[i].Left);
302 dcml[i].Top = current->y;
303 REMMINA_PLUGIN_DEBUG(
"Monitor %d y: %d", i, dcml[i].Top);
304 dcml[i].Width = current->width;
305 REMMINA_PLUGIN_DEBUG(
"Monitor %d width: %d", i, dcml[i].Width);
306 dcml[i].Height = current->height;
307 REMMINA_PLUGIN_DEBUG(
"Monitor %d height: %d", i, dcml[i].Height);
308 dcml[i].PhysicalWidth = current->attributes.physicalWidth;
309 REMMINA_PLUGIN_DEBUG(
"Monitor %d physical width: %d", i, dcml[i].PhysicalWidth);
310 dcml[i].PhysicalHeight = current->attributes.physicalHeight;
311 REMMINA_PLUGIN_DEBUG(
"Monitor %d physical height: %d", i, dcml[i].PhysicalHeight);
312 if (current->attributes.orientation)
313 dcml[i].Orientation = current->attributes.orientation;
315 dcml[i].Orientation =
event->monitor_layout.desktopOrientation;
316 REMMINA_PLUGIN_DEBUG(
"Monitor %d orientation: %d", i, dcml[i].Orientation);
317 dcml[i].DesktopScaleFactor =
event->monitor_layout.desktopScaleFactor;
318 dcml[i].DeviceScaleFactor =
event->monitor_layout.deviceScaleFactor;
323 dcml = g_malloc0(
sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT));
325 dcml->Flags = DISPLAY_CONTROL_MONITOR_PRIMARY;
326 dcml->Width =
event->monitor_layout.width;
327 dcml->Height =
event->monitor_layout.height;
328 dcml->Orientation =
event->monitor_layout.desktopOrientation;
329 dcml->DesktopScaleFactor =
event->monitor_layout.desktopScaleFactor;
330 dcml->DeviceScaleFactor =
event->monitor_layout.deviceScaleFactor;
338 freerdp_abort_connect(rfi->
instance);
350 TRACE_CALL(__func__);
366 REMMINA_PLUGIN_DEBUG(
"Tunnel init");
368 if (hostport == NULL)
376 REMMINA_PLUGIN_DEBUG(
"protocol_plugin_start_direct_tunnel() returned %s", hostport);
385 freerdp_settings_set_string(rfi->
settings, FreeRDP_ServerHostname, host);
387 if (cert_port == 3389) {
388 freerdp_settings_set_string(rfi->
settings, FreeRDP_CertificateName, cert_host);
390 s = g_strdup_printf(
"%s:%d", cert_host, cert_port);
391 freerdp_settings_set_string(rfi->
settings, FreeRDP_CertificateName, s);
396 REMMINA_PLUGIN_DEBUG(
"Tunnel has been optionally initialized. Now connecting to %s:%d", host, port);
398 if (cert_host != host) g_free(cert_host);
402 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ServerPort, port);
409 TRACE_CALL(__func__);
410 rdpSettings *settings = rfi->
instance->settings;
423 maxattempts = freerdp_settings_get_uint32(settings, FreeRDP_AutoReconnectMaxRetries);
424 REMMINA_PLUGIN_DEBUG(
"maxattempts from default: %d", maxattempts);
426 if ((cval = remmina_plugin_service->
pref_get_value(
"rdp_reconnect_attempts")) != NULL)
427 maxattempts = atoi(cval);
428 REMMINA_PLUGIN_DEBUG(
"maxattempts from general preferences: %d", maxattempts);
430 maxattempts = remmina_plugin_service->
file_get_int(remminafile,
"rdp_reconnect_attempts", maxattempts);
431 REMMINA_PLUGIN_DEBUG(
"maxattempts from general plugin: %d", maxattempts);
433 if (maxattempts <= 0)
434 maxattempts = freerdp_settings_get_uint32(settings, FreeRDP_AutoReconnectMaxRetries);
435 freerdp_settings_set_uint32(settings, FreeRDP_AutoReconnectMaxRetries, maxattempts);
436 REMMINA_PLUGIN_DEBUG(
"maxattempts set to: %d", maxattempts);
442 switch (freerdp_error_info(rfi->
instance)) {
443 case ERRINFO_GRAPHICS_SUBSYSTEM_FAILED:
446 case ERRINFO_SUCCESS:
454 if (!freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled)) {
461 REMMINA_PLUGIN_DEBUG(
"[%s] network disconnection detected, initiating reconnection attempt",
462 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
478 REMMINA_PLUGIN_DEBUG(
"[%s] maximum number of reconnection attempts exceeded.",
479 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
484 REMMINA_PLUGIN_DEBUG(
"[%s] reconnect request loop interrupted by user.",
485 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
490 REMMINA_PLUGIN_DEBUG(
"[%s] reconnection, attempt #%d of %d",
497 treconn = time(NULL);
501 REMMINA_PLUGIN_DEBUG(
"[%s] unable to recreate tunnel with remmina_rdp_tunnel_init.",
502 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
504 if (freerdp_reconnect(rfi->
instance)) {
506 REMMINA_PLUGIN_DEBUG(
"[%s] reconnected.", freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
513 while (time(NULL) - treconn < 5) {
526 TRACE_CALL(__func__);
533 if (!gdi || !gdi->primary || !gdi->primary->hdc || !gdi->primary->hdc->hwnd)
541 TRACE_CALL(__func__);
552 if (gdi == NULL || gdi->primary == NULL || gdi->primary->hdc == NULL || gdi->primary->hdc->hwnd == NULL)
555 if (gdi->primary->hdc->hwnd->invalid->null)
558 if (gdi->primary->hdc->hwnd->ninvalid < 1)
561 ninvalid = gdi->primary->hdc->hwnd->ninvalid;
562 cinvalid = gdi->primary->hdc->hwnd->cinvalid;
564 for (i = 0; i < ninvalid; i++) {
565 reg[i].
x = cinvalid[i].x;
566 reg[i].
y = cinvalid[i].y;
567 reg[i].
w = cinvalid[i].w;
568 reg[i].
h = cinvalid[i].h;
573 ui->
reg.ninvalid = ninvalid;
579 gdi->primary->hdc->hwnd->invalid->null = TRUE;
580 gdi->primary->hdc->hwnd->ninvalid = 0;
588 TRACE_CALL(__func__);
597 w = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
598 h = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight);
609 gdi_resize(((rdpContext *)rfi)->gdi, w, h);
624 static BOOL
rf_play_sound(rdpContext *context,
const PLAY_SOUND_UPDATE *play_sound)
626 TRACE_CALL(__func__);
634 disp = gtk_widget_get_display(GTK_WIDGET(gp));
635 gdk_display_beep(disp);
642 TRACE_CALL(__func__);
649 disp = gtk_widget_get_display(GTK_WIDGET(gp));
651 #ifdef GDK_WINDOWING_X11 652 if (GDK_IS_X11_DISPLAY(disp)) {
654 Display *x11_display;
655 x11_display = gdk_x11_display_get_xdisplay(disp);
656 XkbLockModifiers(x11_display, XkbUseCoreKbd,
658 ((led_flags & KBD_SYNC_CAPS_LOCK) ? LockMask : 0) |
659 ((led_flags & KBD_SYNC_NUM_LOCK) ? Mod2Mask : 0)
672 TRACE_CALL(__func__);
683 TRACE_CALL(__func__);
684 rdpChannels *channels;
685 rdpSettings *settings;
686 rdpContext *context = instance->context;
688 settings = instance->settings;
689 channels = context->channels;
690 freerdp_settings_set_uint32(settings, FreeRDP_OsMajorType, OSMAJORTYPE_UNIX);
691 freerdp_settings_set_uint32(settings, FreeRDP_OsMinorType, OSMINORTYPE_UNSPECIFIED);
692 freerdp_settings_set_bool(settings, FreeRDP_BitmapCacheEnabled, TRUE);
693 freerdp_settings_set_uint32(settings, FreeRDP_OffscreenSupportLevel, 1);
695 PubSub_SubscribeChannelConnected(instance->context->pubSub,
697 PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
700 if (!freerdp_client_load_addins(channels, settings))
708 TRACE_CALL(__func__);
712 UINT32 freerdp_local_color_format;
720 rfi->
srcBpp = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth);
722 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_RemoteFxCodec) == FALSE)
727 REMMINA_PLUGIN_DEBUG(
"bpp: %d", rfi->
bpp);
730 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB24");
731 freerdp_local_color_format = PIXEL_FORMAT_BGRX32;
739 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB24");
740 freerdp_local_color_format = PIXEL_FORMAT_BGRA32;
744 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB16_565");
745 freerdp_local_color_format = PIXEL_FORMAT_RGB16;
750 if (!gdi_init(instance, freerdp_local_color_format)) {
755 if (instance->context->codecs->h264 == NULL && freerdp_settings_get_bool(rfi->
settings, FreeRDP_GfxH264)) {
783 TRACE_CALL(__func__);
784 gchar *s_username, *s_password, *s_domain;
789 gboolean disablepasswordstoring;
795 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
799 _(
"Enter RDP authentication credentials"),
804 if (ret == GTK_RESPONSE_OK) {
806 if (s_username) freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, s_username);
809 if (s_password) freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, s_password);
812 if (s_domain) freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, s_domain);
814 remmina_plugin_service->
file_set_string(remminafile,
"username", s_username);
815 remmina_plugin_service->
file_set_string(remminafile,
"domain", s_domain);
822 remmina_plugin_service->
file_set_string(remminafile,
"password", s_password);
824 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
828 if (s_username) g_free(s_username);
829 if (s_password) g_free(s_password);
830 if (s_domain) g_free(s_domain);
842 TRACE_CALL(__func__);
843 gchar *s_username, *s_password, *s_domain;
848 gboolean disablepasswordstoring;
849 gboolean basecredforgw;
856 if (!remmina_plugin_service->
file_get_string(remminafile,
"gateway_server"))
858 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
859 basecredforgw = remmina_plugin_service->
file_get_int(remminafile,
"base-cred-for-gw", FALSE);
864 _(
"Enter RDP authentication credentials"),
872 _(
"Enter RDP gateway authentication credentials"),
873 remmina_plugin_service->
file_get_string(remminafile,
"gateway_username"),
874 remmina_plugin_service->
file_get_string(remminafile,
"gateway_password"),
875 remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain"),
880 if (ret == GTK_RESPONSE_OK) {
882 if (s_username) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, s_username);
885 if (s_password) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, s_password);
888 if (s_domain) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, s_domain);
893 remmina_plugin_service->
file_set_string(remminafile,
"username", s_username);
894 remmina_plugin_service->
file_set_string(remminafile,
"domain", s_domain);
896 remmina_plugin_service->
file_set_string(remminafile,
"password", s_password);
898 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
900 remmina_plugin_service->
file_set_string(remminafile,
"gateway_username", s_username);
901 remmina_plugin_service->
file_set_string(remminafile,
"gateway_domain", s_domain);
903 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", s_password);
905 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", NULL);
908 if (s_username) g_free(s_username);
909 if (s_password) g_free(s_password);
910 if (s_domain) g_free(s_domain);
921 const char *common_name,
const char *subject,
922 const char *issuer,
const char *fingerprint, DWORD flags)
924 TRACE_CALL(__func__);
934 if (status == GTK_RESPONSE_OK)
941 remmina_rdp_verify_certificate(freerdp *instance,
const char *common_name,
const char *subject,
const char *issuer,
const char *fingerprint, BOOL host_mismatch) __attribute__ ((unused));
944 const char *issuer,
const char *fingerprint, BOOL host_mismatch)
946 TRACE_CALL(__func__);
956 if (status == GTK_RESPONSE_OK)
963 const char *common_name,
const char *subject,
964 const char *issuer,
const char *fingerprint,
965 const char *old_subject,
const char *old_issuer,
966 const char *old_fingerprint, DWORD flags)
968 TRACE_CALL(__func__);
978 if (status == GTK_RESPONSE_OK)
986 TRACE_CALL(__func__);
988 if (!instance || !instance->context)
991 PubSub_UnsubscribeChannelConnected(instance->context->pubSub,
993 PubSub_UnsubscribeChannelDisconnected(instance->context->pubSub,
1001 TRACE_CALL(__func__);
1006 time_t cur_time, time_diff;
1008 int jitter_time = remmina_plugin_service->
file_get_int(remminafile,
"rdp_mouse_jitter", 0);
1010 while (!freerdp_shall_disconnect(rfi->
instance)) {
1014 if (jitter_time > 0 && time_diff > jitter_time){
1015 last_time = cur_time;
1019 HANDLE handles[64]={0};
1020 DWORD nCount = freerdp_get_event_handles(rfi->
instance->context, &handles[0], 64);
1024 handles[nCount++] = rfi->
instance->context->abortEvent;
1027 fprintf(stderr,
"freerdp_get_event_handles failed\n");
1031 status = WaitForMultipleObjects(nCount, handles, FALSE, 100);
1033 if (status == WAIT_FAILED) {
1034 fprintf(stderr,
"WaitForMultipleObjects failed with %lu\n", (
unsigned long)status);
1040 fprintf(stderr,
"Could not process local keyboard/mouse event queue\n");
1043 if (read(rfi->
event_pipe[0], buf,
sizeof(buf))) {
1048 if (WaitForSingleObject(rfi->
instance->context->abortEvent, 0) == WAIT_OBJECT_0)
1052 if (!freerdp_check_event_handles(rfi->
instance->context)) {
1058 if (freerdp_get_last_error(rfi->
instance->context) == FREERDP_ERROR_SUCCESS)
1059 fprintf(stderr,
"Could not check FreeRDP file descriptor\n");
1063 const gchar *host = freerdp_settings_get_string (rfi->
settings, FreeRDP_ServerHostname);
1065 REMMINA_PLUGIN_AUDIT(_(
"Disconnected from %s via RDP"), host);
1067 REMMINA_PLUGIN_DEBUG(
"RDP client disconnected");
1072 TRACE_CALL(__func__);
1073 PVIRTUALCHANNELENTRY entry = NULL;
1074 PVIRTUALCHANNELENTRYEX entryEx = NULL;
1076 entryEx = (PVIRTUALCHANNELENTRYEX)(
void *)freerdp_load_channel_addin_entry(
1077 name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC | FREERDP_ADDIN_CHANNEL_ENTRYEX);
1080 entry = freerdp_load_channel_addin_entry(name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC);
1083 if (freerdp_channels_client_load_ex(channels, settings, entryEx, data) == 0) {
1084 fprintf(stderr,
"loading channel %s\n", name);
1088 if (freerdp_channels_client_load(channels, settings, entry, data) == 0) {
1089 fprintf(stderr,
"loading channel %s\n", name);
1108 S_WAITSEMICOLON } state = S_WAITPR;
1111 while ((c = *smap++) != 0) {
1114 if (c !=
'\"')
return NULL;
1115 state = S_INPRINTER;
1120 if (matching && c == *p && *p != 0) {
1122 }
else if (c ==
'\"') {
1125 state = S_WAITCOLON;
1133 state = S_WAITDRIVER;
1146 state = S_WAITSEMICOLON;
1149 case S_WAITSEMICOLON:
1160 p = (
char *)malloc(sz);
1192 const gchar *s = remmina_plugin_service->
file_get_string(remminafile,
"printer_overrides");
1194 RDPDR_PRINTER *printer;
1195 printer = (RDPDR_PRINTER *)calloc(1,
sizeof(RDPDR_PRINTER));
1197 #ifdef WITH_FREERDP3 1199 pdev = &(printer->device);
1201 RDPDR_PRINTER *pdev;
1205 pdev->Type = RDPDR_DTYP_PRINT;
1206 REMMINA_PLUGIN_DEBUG(
"Printer Type: %d", pdev->Type);
1208 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectPrinters, TRUE);
1209 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
1211 REMMINA_PLUGIN_DEBUG(
"Destination: %s", dest->name);
1212 if (!(pdev->Name = _strdup(dest->name))) {
1217 REMMINA_PLUGIN_DEBUG(
"Printer Name: %s", pdev->Name);
1222 printer->DriverName = strdup(d);
1223 REMMINA_PLUGIN_DEBUG(
"Printer DriverName set to: %s", printer->DriverName);
1237 printer->DriverName = _strdup(
"MS Publisher Imagesetter");
1240 REMMINA_PLUGIN_DEBUG(
"Printer Driver: %s", printer->DriverName);
1241 if (!freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)printer)) {
1242 free(printer->DriverName);
1255 TRACE_CALL(__func__);
1256 guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_Delete };
1260 keys, G_N_ELEMENTS(keys), GDK_KEY_PRESS | GDK_KEY_RELEASE);
1265 freerdp_settings_set_uint32(settings, FreeRDP_ConnectionType, type);
1267 if (type == CONNECTION_TYPE_MODEM) {
1268 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1269 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1270 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, FALSE);
1271 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1272 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1273 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, TRUE);
1274 }
else if (type == CONNECTION_TYPE_BROADBAND_LOW) {
1275 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1276 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1277 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, FALSE);
1278 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1279 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1280 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1281 }
else if (type == CONNECTION_TYPE_SATELLITE) {
1282 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1283 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1284 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1285 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1286 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1287 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1288 }
else if (type == CONNECTION_TYPE_BROADBAND_HIGH) {
1289 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1290 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1291 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1292 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1293 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1294 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1295 }
else if (type == CONNECTION_TYPE_WAN) {
1296 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1297 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1298 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1299 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1300 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1301 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1302 }
else if (type == CONNECTION_TYPE_LAN) {
1303 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1304 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1305 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1306 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1307 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1308 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1309 }
else if (type == CONNECTION_TYPE_AUTODETECT) {
1310 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1311 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1312 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1313 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1314 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1315 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1316 freerdp_settings_set_bool(settings, FreeRDP_NetworkAutoDetect, TRUE);
1319 #ifdef WITH_GFX_H264 1323 freerdp_settings_set_bool(settings, FreeRDP_RemoteFxCodec, TRUE);
1324 freerdp_settings_set_bool(settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1325 }
else if (type == REMMINA_CONNECTION_TYPE_NONE) {
1334 #ifdef GDK_WINDOWING_X11 1335 #if FREERDP_CHECK_VERSION(2, 3, 0) 1338 TRACE_CALL(__func__);
1341 gchar *rdp_kbd_remap = NULL;
1347 return rdp_kbd_remap;
1348 rdp_kbd_remap = g_malloc0(512);
1349 display = XOpenDisplay(0);
1350 for (i = 0; table[i] > 0; i += 2) {
1351 g_snprintf(keys,
sizeof(keys),
"0x%02x=0x%02x", freerdp_keyboard_get_rdp_scancode_from_x11_keycode(XKeysymToKeycode(display, table[i])),
1352 freerdp_keyboard_get_rdp_scancode_from_x11_keycode(XKeysymToKeycode(display, table[i + 1])));
1354 g_strlcat(rdp_kbd_remap,
",", 512);
1355 g_strlcat(rdp_kbd_remap, keys, 512);
1357 XCloseDisplay(display);
1359 return rdp_kbd_remap;
1366 TRACE_CALL(__func__);
1373 rdpChannels *channels;
1374 gchar *gateway_host;
1376 gchar *datapath = NULL;
1377 gboolean status = TRUE;
1378 #ifdef GDK_WINDOWING_X11 1379 gchar *rdp_kbd_remap;
1383 gint desktopOrientation, desktopScaleFactor, deviceScaleFactor;
1385 channels = rfi->
instance->context->channels;
1389 datapath = g_build_path(
"/",
1393 REMMINA_PLUGIN_DEBUG(
"RDP data path is %s", datapath);
1395 if ((datapath != NULL) && (datapath[0] !=
'\0'))
1396 if (access(datapath, W_OK) == 0)
1397 freerdp_settings_set_string(rfi->
settings, FreeRDP_ConfigPath, datapath);
1400 if (remmina_plugin_service->
file_get_int(remminafile,
"assistance_mode", 0)){
1401 rdpAssistanceFile* file = freerdp_assistance_file_new();
1403 REMMINA_PLUGIN_DEBUG(
"Could not allocate assistance file structure");
1407 if (remmina_plugin_service->
file_get_string(remminafile,
"assistance_file") == NULL ||
1408 remmina_plugin_service->
file_get_string(remminafile,
"assistance_pass") == NULL ){
1410 REMMINA_PLUGIN_DEBUG(
"Assistance file and password are not set while assistance mode is on");
1414 status = freerdp_assistance_parse_file(file,
1415 remmina_plugin_service->
file_get_string(remminafile,
"assistance_file"),
1416 remmina_plugin_service->
file_get_string(remminafile,
"assistance_pass"));
1419 REMMINA_PLUGIN_DEBUG(
"Could not parse assistance file");
1424 if (!freerdp_assistance_populate_settings_from_assistance_file(file, rfi->
settings)){
1425 REMMINA_PLUGIN_DEBUG(
"Could not populate settings from assistance file");
1431 #if defined(PROXY_TYPE_IGNORE) 1432 if (!remmina_plugin_service->
file_get_int(remminafile,
"useproxyenv", FALSE) ? TRUE : FALSE) {
1433 REMMINA_PLUGIN_DEBUG(
"Not using system proxy settings");
1434 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE);
1441 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoReconnectionEnabled, (remmina_plugin_service->
file_get_int(remminafile,
"disableautoreconnect", FALSE) ? FALSE : TRUE));
1443 if (remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE))
1444 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoReconnectionEnabled, FALSE);
1446 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 99));
1448 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SoftwareGdi, TRUE);
1452 if (!
gfx_h264_available && (freerdp_settings_get_bool(rfi->
settings, FreeRDP_ColorDepth) == 65 || freerdp_settings_get_bool(rfi->
settings, FreeRDP_ColorDepth == 66)))
1453 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 64);
1455 if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 0) {
1457 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1458 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, FALSE);
1459 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1460 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 63) {
1462 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1463 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1464 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxH264, FALSE);
1465 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1466 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 64) {
1468 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1469 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1470 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1471 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxH264, FALSE);
1472 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1473 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 65) {
1475 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1476 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1478 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1479 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 66) {
1481 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1482 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1485 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 99) {
1487 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1488 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1489 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1494 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_RemoteFxCodec) ||
1495 freerdp_settings_get_bool(rfi->
settings, FreeRDP_NSCodec) ||
1496 freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline)) {
1497 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, TRUE);
1498 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FrameMarkerCommandEnabled, TRUE);
1499 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1508 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, w);
1509 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight, h);
1510 REMMINA_PLUGIN_DEBUG(
"Resolution set by the user: %dx%d", w, h);
1514 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline) &&
1515 freerdp_settings_get_bool(rfi->
settings, FreeRDP_GfxH264)) {
1516 if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth) <
1517 AVC_MIN_DESKTOP_WIDTH)
1518 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth,
1519 AVC_MIN_DESKTOP_WIDTH);
1520 if (freerdp_settings_get_uint32(rfi->
settings,
1521 FreeRDP_DesktopHeight) <
1522 AVC_MIN_DESKTOP_HEIGHT)
1523 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight,
1524 AVC_MIN_DESKTOP_HEIGHT);
1530 if ((freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth) & 1) != 0) {
1531 UINT32 tmp = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
1532 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, tmp - 1);
1538 w = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
1539 h = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight);
1540 REMMINA_PLUGIN_DEBUG(
"Resolution set after workarounds: %dx%d", w, h);
1544 freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, remmina_plugin_service->
file_get_string(remminafile,
"username"));
1547 freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, remmina_plugin_service->
file_get_string(remminafile,
"domain"));
1550 if (s) freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, s);
1552 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoLogonEnabled, TRUE);
1558 gchar *proxy_type = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_type"));
1559 gchar *proxy_username = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_username"));
1560 gchar *proxy_password = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_password"));
1561 gchar *proxy_hostname = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_hostname"));
1562 gint proxy_port = remmina_plugin_service->
file_get_int(remminafile,
"proxy_port", 80);
1563 REMMINA_PLUGIN_DEBUG(
"proxy_type: %s", proxy_type);
1564 REMMINA_PLUGIN_DEBUG(
"proxy_username: %s", proxy_username);
1565 REMMINA_PLUGIN_DEBUG(
"proxy_password: %s", proxy_password);
1566 REMMINA_PLUGIN_DEBUG(
"proxy_hostname: %s", proxy_hostname);
1567 REMMINA_PLUGIN_DEBUG(
"proxy_port: %d", proxy_port);
1568 if (proxy_type && proxy_hostname) {
1569 if (g_strcmp0(proxy_type,
"no_proxy") == 0)
1570 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE);
1571 else if (g_strcmp0(proxy_type,
"http") == 0)
1572 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_HTTP);
1573 else if (g_strcmp0(proxy_type,
"socks5") == 0)
1574 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_SOCKS);
1576 g_warning(
"Invalid proxy protocol, at the moment only no_proxy, HTTP and SOCKS5 are supported");
1577 REMMINA_PLUGIN_DEBUG(
"ProxyType set to: %" PRIu32, freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ProxyType));
1578 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyHostname, proxy_hostname);
1580 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyUsername, proxy_username);
1582 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyPassword, proxy_password);
1584 freerdp_settings_set_uint16(rfi->
settings, FreeRDP_ProxyPort, proxy_port);
1586 g_free(proxy_hostname);
1587 g_free(proxy_username);
1588 g_free(proxy_password);
1590 if (remmina_plugin_service->
file_get_int(remminafile,
"base-cred-for-gw", FALSE)) {
1592 remmina_plugin_service->
file_set_string(remminafile,
"gateway_username", NULL);
1593 remmina_plugin_service->
file_set_string(remminafile,
"gateway_domain", NULL);
1594 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", NULL);
1598 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayEnabled, FALSE);
1599 s = remmina_plugin_service->
file_get_string(remminafile,
"gateway_server");
1601 cs = remmina_plugin_service->
file_get_string(remminafile,
"gwtransp");
1602 #if FREERDP_CHECK_VERSION(2, 3, 1) 1603 if (remmina_plugin_service->
file_get_int(remminafile,
"websockets", FALSE))
1604 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpUseWebsockets, TRUE);
1606 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpUseWebsockets, FALSE);
1608 if (g_strcmp0(cs,
"http") == 0) {
1609 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, FALSE);
1610 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, TRUE);
1611 }
else if (g_strcmp0(cs,
"rpc") == 0) {
1612 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, TRUE);
1613 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, FALSE);
1614 }
else if (g_strcmp0(cs,
"auto") == 0) {
1615 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, TRUE);
1616 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, TRUE);
1618 remmina_plugin_service->
get_server_port(s, 443, &gateway_host, &gateway_port);
1619 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayHostname, gateway_host);
1620 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_GatewayPort, gateway_port);
1621 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayEnabled, TRUE);
1622 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, TRUE);
1625 if (remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain")) {
1626 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain"));
1627 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1630 if (remmina_plugin_service->
file_get_string(remminafile,
"gateway_username")) {
1631 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, remmina_plugin_service->
file_get_string(remminafile,
"gateway_username"));
1632 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1635 s = remmina_plugin_service->
file_get_string(remminafile,
"gateway_password");
1637 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, s);
1638 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1642 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayEnabled) && freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials)) {
1643 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, freerdp_settings_get_string(rfi->
settings, FreeRDP_Domain));
1644 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, freerdp_settings_get_string(rfi->
settings, FreeRDP_Username));
1645 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, freerdp_settings_get_string(rfi->
settings, FreeRDP_Password));
1648 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayEnabled))
1649 freerdp_set_gateway_usage_method(rfi->
settings,
1650 remmina_plugin_service->
file_get_int(remminafile,
"gateway_usage", FALSE) ? TSC_PROXY_MODE_DETECT : TSC_PROXY_MODE_DIRECT);
1652 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayAccessToken,
1653 remmina_plugin_service->
file_get_string(remminafile,
"gatewayaccesstoken"));
1655 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_AuthenticationLevel, remmina_plugin_service->
file_get_int(
1656 remminafile,
"authentication level", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_AuthenticationLevel)));
1659 freerdp_settings_set_bool(rfi->
settings, FreeRDP_IgnoreCertificate, remmina_plugin_service->
file_get_int(remminafile,
"cert_ignore", 0));
1660 freerdp_settings_set_bool(rfi->
settings, FreeRDP_OldLicenseBehaviour, remmina_plugin_service->
file_get_int(remminafile,
"old-license", 0));
1661 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AllowUnanouncedOrdersFromServer, remmina_plugin_service->
file_get_int(remminafile,
"relax-order-checks", 0));
1662 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_GlyphSupportLevel, (remmina_plugin_service->
file_get_int(remminafile,
"glyph-cache", 0) ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE));
1664 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"clientname")))
1665 freerdp_settings_set_string(rfi->
settings, FreeRDP_ClientHostname, cs);
1667 freerdp_settings_set_string(rfi->
settings, FreeRDP_ClientHostname, g_get_host_name());
1670 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"clientbuild"))) {
1672 UINT32 val = strtoul(cs, NULL, 0);
1673 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ClientBuild, val);
1678 if (remmina_plugin_service->
file_get_string(remminafile,
"loadbalanceinfo")) {
1679 char *tmp = strdup(remmina_plugin_service->
file_get_string(remminafile,
"loadbalanceinfo"));
1680 rfi->
settings->LoadBalanceInfo = (BYTE *)tmp;
1682 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_LoadBalanceInfoLength, strlen(tmp));
1686 freerdp_settings_set_string(rfi->
settings, FreeRDP_AlternateShell, remmina_plugin_service->
file_get_string(remminafile,
"exec"));
1689 freerdp_settings_set_string(rfi->
settings, FreeRDP_ShellWorkingDirectory, remmina_plugin_service->
file_get_string(remminafile,
"execpath"));
1691 sm = g_strdup_printf(
"rdp_quality_%i", remmina_plugin_service->
file_get_int(remminafile,
"quality", DEFAULT_QUALITY_0));
1695 if (value && value[0]) {
1696 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, strtoul(value, NULL, 16));
1698 switch (remmina_plugin_service->
file_get_int(remminafile,
"quality", DEFAULT_QUALITY_0)) {
1700 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_9);
1704 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_2);
1708 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_1);
1713 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_0);
1719 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"network"))) {
1722 if (g_strcmp0(cs,
"modem") == 0)
1723 type = CONNECTION_TYPE_MODEM;
1724 else if (g_strcmp0(cs,
"broadband") == 0)
1725 type = CONNECTION_TYPE_BROADBAND_HIGH;
1726 else if (g_strcmp0(cs,
"broadband-low") == 0)
1727 type = CONNECTION_TYPE_BROADBAND_LOW;
1728 else if (g_strcmp0(cs,
"broadband-high") == 0)
1729 type = CONNECTION_TYPE_BROADBAND_HIGH;
1730 else if (g_strcmp0(cs,
"wan") == 0)
1731 type = CONNECTION_TYPE_WAN;
1732 else if (g_strcmp0(cs,
"lan") == 0)
1733 type = CONNECTION_TYPE_LAN;
1734 else if ((g_strcmp0(cs,
"autodetect") == 0))
1735 type = CONNECTION_TYPE_AUTODETECT;
1736 else if ((g_strcmp0(cs,
"none") == 0))
1737 type = REMMINA_CONNECTION_TYPE_NONE;
1739 type = REMMINA_CONNECTION_TYPE_NONE;
1742 REMMINA_PLUGIN_DEBUG(
"Network settings not set");
1749 freerdp_performance_flags_split(rfi->
settings);
1751 #ifdef GDK_WINDOWING_X11 1752 #if FREERDP_CHECK_VERSION(2, 3, 0) 1754 if (rdp_kbd_remap != NULL) {
1755 freerdp_settings_set_string(rfi->
settings, FreeRDP_KeyboardRemappingList, rdp_kbd_remap);
1756 REMMINA_PLUGIN_DEBUG(
"rdp_keyboard_remapping_list: %s", rfi->
settings->KeyboardRemappingList);
1757 g_free(rdp_kbd_remap);
1760 freerdp_settings_set_string(rfi->
settings, FreeRDP_KeyboardRemappingList, remmina_plugin_service->
pref_get_value(
"rdp_kbd_remap"));
1761 REMMINA_PLUGIN_DEBUG(
"rdp_keyboard_remapping_list: %s", rfi->
settings->KeyboardRemappingList);
1768 if (remmina_plugin_service->
file_get_int(remminafile,
"console", FALSE))
1769 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1771 if (remmina_plugin_service->
file_get_int(remminafile,
"restricted-admin", FALSE)) {
1772 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1773 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RestrictedAdminModeRequired, TRUE);
1777 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1778 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RestrictedAdminModeRequired, TRUE);
1779 freerdp_settings_set_string(rfi->
settings, FreeRDP_PasswordHash, remmina_plugin_service->
file_get_string(remminafile,
"pth"));
1780 remmina_plugin_service->
file_set_int(remminafile,
"restricted-admin", TRUE);
1783 cs = remmina_plugin_service->
file_get_string(remminafile,
"security");
1784 if (g_strcmp0(cs,
"rdp") == 0) {
1785 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, TRUE);
1786 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1787 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1788 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1789 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseRdpSecurityLayer, TRUE);
1790 }
else if (g_strcmp0(cs,
"tls") == 0) {
1791 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1792 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, TRUE);
1793 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1794 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1795 }
else if (g_strcmp0(cs,
"nla") == 0) {
1796 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1797 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1798 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, TRUE);
1799 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1800 }
else if (g_strcmp0(cs,
"ext") == 0) {
1801 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1802 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1803 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1804 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, TRUE);
1807 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NegotiateSecurityLayer, TRUE);
1810 cs = remmina_plugin_service->
file_get_string(remminafile,
"tls-seclevel");
1811 if (cs && g_strcmp0(cs,
"")!=0) {
1813 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_TlsSecLevel, i);
1816 freerdp_settings_set_bool(rfi->
settings, FreeRDP_CompressionEnabled, TRUE);
1817 if (remmina_plugin_service->
file_get_int(remminafile,
"disable_fastpath", FALSE)) {
1818 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathInput, FALSE);
1819 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, FALSE);
1821 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathInput, TRUE);
1822 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, TRUE);
1828 freerdp_settings_set_uint16(rfi->
settings, FreeRDP_DesktopOrientation, desktopOrientation);
1829 if (desktopScaleFactor != 0 && deviceScaleFactor != 0) {
1830 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopScaleFactor, desktopScaleFactor);
1831 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DeviceScaleFactor, deviceScaleFactor);
1837 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportDisplayControl, TRUE);
1839 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportDisplayControl)) {
1845 freerdp_client_add_dynamic_channel(rfi->
settings, dcount, d);
1848 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline)) {
1855 freerdp_client_add_dynamic_channel(rfi->
settings, dcount, d);
1860 if (g_strcmp0(cs,
"remote") == 0) {
1861 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteConsoleAudio, TRUE);
1862 }
else if (g_str_has_prefix(cs,
"local")) {
1863 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioPlayback, TRUE);
1864 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioCapture, TRUE);
1867 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioPlayback, FALSE);
1868 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteConsoleAudio, FALSE);
1871 cs = remmina_plugin_service->
file_get_string(remminafile,
"microphone");
1872 if (cs != NULL && cs[0] !=
'\0') {
1873 if (g_strcmp0(cs,
"0") == 0) {
1874 REMMINA_PLUGIN_DEBUG(
"“microphone” was set to 0, setting to \"\"");
1875 remmina_plugin_service->
file_set_string(remminafile,
"microphone",
"");
1877 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioCapture, TRUE);
1878 REMMINA_PLUGIN_DEBUG(
"“microphone” set to “%s”", cs);
1884 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1889 cs = remmina_plugin_service->
file_get_string(remminafile,
"audio-output");
1890 if (cs != NULL && cs[0] !=
'\0') {
1891 REMMINA_PLUGIN_DEBUG(
"audio output set to %s", cs);
1896 status = freerdp_client_add_static_channel(rfi->
settings, count, p);
1898 status = freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1903 cs = remmina_plugin_service->
file_get_string(remminafile,
"freerdp_log_level");
1904 if (cs != NULL && cs[0] !=
'\0')
1905 REMMINA_PLUGIN_DEBUG(
"Log level set to to %s", cs);
1907 cs = g_strdup(
"INFO");
1908 wLog *root = WLog_GetRoot();
1909 WLog_SetStringLogLevel(root, cs);
1911 cs = remmina_plugin_service->
file_get_string(remminafile,
"freerdp_log_filters");
1912 if (cs != NULL && cs[0] !=
'\0') {
1913 REMMINA_PLUGIN_DEBUG(
"Log filters set to to %s", cs);
1914 WLog_AddStringLogFilters(cs);
1916 WLog_AddStringLogFilters(NULL);
1921 if (cs != NULL && cs[0] !=
'\0') {
1925 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1930 if (cs != NULL && cs[0] !=
'\0') {
1934 freerdp_client_add_static_channel(rfi->
settings, count, p);
1939 if (cs != NULL && cs[0] !=
'\0') {
1943 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1948 if (cs != NULL && cs[0] !=
'\0') {
1949 g_free(rfi->
settings->RDP2TCPArgs);
1950 rfi->
settings->RDP2TCPArgs = g_strdup(cs);
1951 REMMINA_PLUGIN_DEBUG(
"rdp2tcp set to %s", rfi->
settings->RDP2TCPArgs);
1955 int vermaj, vermin, verrev;
1956 freerdp_get_version(&vermaj, &vermin, &verrev);
1958 #if FREERDP_CHECK_VERSION(2, 1, 0) 1960 if (cs != NULL && cs[0] !=
'\0') {
1961 const gchar *endptr = NULL;
1962 guint64 val = g_ascii_strtoull(cs, (gchar **)&endptr, 10);
1963 if (val > 600000 || val <= 0)
1965 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_TcpAckTimeout, (UINT32)val);
1969 if (remmina_plugin_service->
file_get_int(remminafile,
"preferipv6", FALSE) ? TRUE : FALSE)
1970 freerdp_settings_set_bool(rfi->
settings, FreeRDP_PreferIPv6OverIPv4, TRUE);
1972 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectClipboard, remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE) ? FALSE : TRUE);
1974 cs = remmina_plugin_service->
file_get_string(remminafile,
"sharefolder");
1975 if (cs != NULL && cs[0] !=
'\0') {
1976 gchar *ccs = g_strdup(cs);
1977 REMMINA_PLUGIN_DEBUG(
"[Deprecated->migrating] - Old sharefolder %s to \"drive \"", ccs);
1979 remmina_plugin_service->
file_set_string(remminafile,
"drive", g_strdup(ccs));
1980 remmina_plugin_service->
file_set_string(remminafile,
"sharefolder", NULL);
1981 REMMINA_PLUGIN_DEBUG(
"[Deprecated->migrated] - drive set to %s", g_strdup(ccs));
1991 if (cs != NULL && cs[0] !=
'\0') {
1992 REMMINA_PLUGIN_DEBUG(
"Redirect directory set to %s", cs);
1996 gchar **folders = g_strsplit(cs,
";", -1);
1997 for (i = 0; folders[i] != NULL; i++) {
1998 REMMINA_PLUGIN_DEBUG(
"Parsing folder %s", folders[i]);
2000 status = freerdp_client_add_device_channel(rfi->
settings, count, p);
2003 g_strfreev(folders);
2006 if (remmina_plugin_service->
file_get_int(remminafile,
"shareprinter", FALSE)) {
2008 REMMINA_PLUGIN_DEBUG(
"Sharing printers");
2009 const gchar *po = remmina_plugin_service->
file_get_string(remminafile,
"printer_overrides");
2010 if (po && po[0] != 0) {
2013 REMMINA_PLUGIN_DEBUG(
"All printers have been shared");
2015 REMMINA_PLUGIN_DEBUG(
"Cannot share printers, are there any available?");
2022 freerdp_client_add_device_channel(rfi->
settings, dcount, d);
2027 if (remmina_plugin_service->
file_get_int(remminafile,
"span", FALSE)) {
2028 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SpanMonitors, TRUE);
2029 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2030 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2031 remmina_plugin_service->
file_set_int(remminafile,
"multimon", 1);
2034 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
2035 guint32 maxwidth = 0;
2036 guint32 maxheight = 0;
2039 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2041 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
2042 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2044 gchar *monitorids_string = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"monitorids"));
2049 if (monitorids_string != NULL && monitorids_string[0] !=
'\0') {
2050 if (g_strstr_len(monitorids_string, -1,
",") != NULL) {
2051 if (g_strstr_len(monitorids_string, -1,
":") != NULL) {
2052 rdpMonitor *base = (rdpMonitor *)freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorDefArray);
2056 temp_items = g_strsplit(monitorids_string,
",", -1);
2057 for (i = 0; i < g_strv_length(temp_items); i++) {
2058 rot_items = g_strsplit(temp_items[i],
":", -1);
2059 rdpMonitor *current = &base[atoi(rot_items[0])];
2061 monitorids = g_strdup(rot_items[0]);
2063 monitorids = g_strdup_printf(
"%s,%s", monitorids, rot_items[0]);
2064 current->attributes.orientation = atoi(rot_items[1]);
2065 REMMINA_PLUGIN_DEBUG(
"Monitor n %d orientation: %d", i, current->attributes.orientation);
2068 monitorids = g_strdup(monitorids_string);
2071 monitorids = g_strdup(monitorids_string);
2074 monitorids = g_strdup(monitorids_string);
2077 if (monitorids != NULL && monitorids[0] !=
'\0') {
2078 UINT32 *base = (UINT32 *)freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorIds);
2080 items = g_strsplit(monitorids,
",", -1);
2081 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_NumMonitorIds, g_strv_length(items));
2082 REMMINA_PLUGIN_DEBUG(
"NumMonitorIds: %d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_NumMonitorIds));
2083 for (i = 0; i < g_strv_length(items); i++) {
2084 UINT32 *current = &base[i];
2085 *current = atoi(items[i]);
2086 REMMINA_PLUGIN_DEBUG(
"Added monitor with ID %" PRIu32, *current);
2091 if (maxwidth && maxheight) {
2092 REMMINA_PLUGIN_DEBUG(
"Setting DesktopWidth and DesktopHeight to: %dx%d", maxwidth, maxheight);
2093 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, maxwidth);
2094 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight, maxheight);
2095 REMMINA_PLUGIN_DEBUG(
"DesktopWidth and DesktopHeight set to: %dx%d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth), freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight));
2097 REMMINA_PLUGIN_DEBUG(
"Cannot set Desktop Size, we are using the previously set values: %dx%d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth), freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight));
2103 const gchar *sn = remmina_plugin_service->
file_get_string(remminafile,
"smartcardname");
2104 if (remmina_plugin_service->
file_get_int(remminafile,
"sharesmartcard", FALSE) ||
2105 (sn != NULL && sn[0] !=
'\0')) {
2106 RDPDR_SMARTCARD *smartcard;
2107 smartcard = (RDPDR_SMARTCARD *)calloc(1,
sizeof(RDPDR_SMARTCARD));
2109 #ifdef WITH_FREERDP3 2111 sdev = &(smartcard->device);
2113 RDPDR_SMARTCARD *sdev;
2117 sdev->Type = RDPDR_DTYP_SMARTCARD;
2119 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2121 if (sn != NULL && sn[0] !=
'\0')
2122 sdev->Name = _strdup(sn);
2124 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectSmartCards, TRUE);
2126 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)smartcard);
2129 if (remmina_plugin_service->
file_get_int(remminafile,
"passwordispin", FALSE))
2132 freerdp_settings_set_bool(rfi->
settings, FreeRDP_PasswordIsSmartcardPin, TRUE);
2135 if (remmina_plugin_service->
file_get_int(remminafile,
"shareserial", FALSE)) {
2136 RDPDR_SERIAL *serial;
2137 serial = (RDPDR_SERIAL *)calloc(1,
sizeof(RDPDR_SERIAL));
2139 #ifdef WITH_FREERDP3 2141 sdev = &(serial->device);
2147 sdev->Type = RDPDR_DTYP_SERIAL;
2149 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2151 const gchar *sn = remmina_plugin_service->
file_get_string(remminafile,
"serialname");
2152 if (sn != NULL && sn[0] !=
'\0')
2153 sdev->Name = _strdup(sn);
2155 const gchar *sd = remmina_plugin_service->
file_get_string(remminafile,
"serialdriver");
2156 if (sd != NULL && sd[0] !=
'\0')
2157 serial->Driver = _strdup(sd);
2159 const gchar *sp = remmina_plugin_service->
file_get_string(remminafile,
"serialpath");
2160 if (sp != NULL && sp[0] !=
'\0')
2161 serial->Path = _strdup(sp);
2163 if (remmina_plugin_service->
file_get_int(remminafile,
"serialpermissive", FALSE))
2164 serial->Permissive = _strdup(
"permissive");
2166 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectSerialPorts, TRUE);
2168 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)serial);
2171 if (remmina_plugin_service->
file_get_int(remminafile,
"shareparallel", FALSE)) {
2172 RDPDR_PARALLEL *parallel;
2173 parallel = (RDPDR_PARALLEL *)calloc(1,
sizeof(RDPDR_PARALLEL));
2175 #ifdef WITH_FREERDP3 2177 pdev = &(parallel->device);
2179 RDPDR_PARALLEL *pdev;
2183 pdev->Type = RDPDR_DTYP_PARALLEL;
2185 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2187 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectParallelPorts, TRUE);
2189 const gchar *pn = remmina_plugin_service->
file_get_string(remminafile,
"parallelname");
2190 if (pn != NULL && pn[0] !=
'\0')
2191 pdev->Name = _strdup(pn);
2192 const gchar *dp = remmina_plugin_service->
file_get_string(remminafile,
"parallelpath");
2193 if (dp != NULL && dp[0] !=
'\0')
2194 parallel->Path = _strdup(dp);
2196 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)parallel);
2202 if (remmina_plugin_service->
file_get_int(remminafile,
"multitransport", FALSE)) {
2203 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2204 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportMultitransport, TRUE);
2205 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_MultitransportFlags,
2206 (TRANSPORT_TYPE_UDP_FECR | TRANSPORT_TYPE_UDP_FECL | TRANSPORT_TYPE_UDP_PREFERRED));
2208 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_MultitransportFlags, 0);
2215 freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, NULL);
2216 freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, NULL);
2217 freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, NULL);
2219 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, NULL);
2220 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, NULL);
2221 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, NULL);
2223 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
2228 if (!freerdp_connect(rfi->
instance)) {
2233 e = freerdp_get_last_error(rfi->
instance->context);
2236 case FREERDP_ERROR_AUTHENTICATION_FAILED:
2237 case STATUS_LOGON_FAILURE:
2238 #ifdef FREERDP_ERROR_CONNECT_LOGON_FAILURE 2239 case FREERDP_ERROR_CONNECT_LOGON_FAILURE:
2244 case STATUS_ACCOUNT_LOCKED_OUT:
2245 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT 2246 case FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT:
2249 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2251 case STATUS_ACCOUNT_EXPIRED:
2252 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED 2253 case FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED:
2256 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2258 case STATUS_PASSWORD_EXPIRED:
2259 #ifdef FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED 2260 case FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED:
2263 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2265 case STATUS_ACCOUNT_DISABLED:
2266 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED 2267 case FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED:
2270 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2272 #ifdef FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES 2274 case FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES:
2275 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server “%s”.\nInsufficient user privileges."),
2276 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2279 case STATUS_ACCOUNT_RESTRICTION:
2280 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION 2281 case FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION:
2284 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2287 case STATUS_PASSWORD_MUST_CHANGE:
2288 #ifdef FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE 2289 case FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE:
2291 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server “%s”.\nChange user password before connecting."),
2292 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2295 case FREERDP_ERROR_CONNECT_FAILED:
2296 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Lost connection to the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2298 case FREERDP_ERROR_DNS_NAME_NOT_FOUND:
2299 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not find the address for the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2301 case FREERDP_ERROR_TLS_CONNECT_FAILED:
2303 _(
"Could not connect to the RDP server “%s” via TLS. See the DEBUG traces from a terminal for more information."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2305 case FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED:
2307 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Unable to establish a connection to the RDP server “%s”. Check “Security protocol negotiation”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2309 #ifdef FREERDP_ERROR_POST_CONNECT_FAILED 2310 case FREERDP_ERROR_POST_CONNECT_FAILED:
2313 case REMMINA_POSTCONNECT_ERROR_OK:
2315 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Cannot connect to the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2317 case REMMINA_POSTCONNECT_ERROR_GDI_INIT:
2320 case REMMINA_POSTCONNECT_ERROR_NO_H264:
2321 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"You requested a H.264 GFX mode for the server “%s”, but your libfreerdp does not support H.264. Please use a non-AVC colour depth setting."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2326 #ifdef FREERDP_ERROR_SERVER_DENIED_CONNECTION 2327 case FREERDP_ERROR_SERVER_DENIED_CONNECTION:
2328 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"The “%s” server refused the connection."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2333 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"The Remote Desktop Gateway “%s” denied the user “%s\\%s” access due to policy."),
2334 freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayHostname), freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayDomain), freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayUsername));
2337 case FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS:
2342 g_printf(
"libfreerdp returned code is %08X\n", e);
2343 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Cannot connect to the “%s” RDP server."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2351 if (GET_PLUGIN_DATA(rfi->
protocol_widget) == NULL) orphaned =
true;
else orphaned =
false;
2352 if (!orphaned && freerdp_get_last_error(rfi->
instance->context) == FREERDP_ERROR_SUCCESS && !rfi->
user_cancelled)
2373 freerdp_abort_connect(instance);
2379 RDP_CLIENT_ENTRY_POINTS *pEntryPoints = instance->pClientEntryPoints;
2381 IFCALL(pEntryPoints->GlobalUninit);
2382 free(instance->pClientEntryPoints);
2383 freerdp_context_free(instance);
2384 freerdp_free(instance);
2390 TRACE_CALL(__func__);
2401 if (GET_PLUGIN_DATA(gp) == NULL) orphaned =
true;
else orphaned =
false;
2406 if (!orphaned) g_object_steal_data(G_OBJECT(gp),
"plugin-data");
2415 return G_SOURCE_REMOVE;
2420 TRACE_CALL(__func__);
2424 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
2429 rfi = GET_PLUGIN_DATA(gp);
2447 TRACE_CALL(__func__);
2451 instance = freerdp_new();
2462 instance->ContextSize =
sizeof(
rfContext);
2463 freerdp_context_new(instance);
2466 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", rfi, free);
2470 rfi->
settings = instance->settings;
2478 freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
2485 TRACE_CALL(__func__);
2488 const gchar *profile_name, *p;
2489 gchar thname[16], c;
2499 "Could not start pthread.");
2507 profile_name = remmina_plugin_service->
file_get_string(remminafile,
"name");
2509 strcpy(thname,
"RemmRDP:");
2511 nthname = strlen(thname);
2512 while ((c = *p) != 0 && nthname <
sizeof(thname) - 1) {
2514 thname[nthname++] = c;
2518 strcat(thname,
"<NONAM>");
2519 nthname = strlen(thname);
2521 thname[nthname] = 0;
2522 #if defined(__linux__) 2524 #elif defined(__FreeBSD__) 2533 TRACE_CALL(__func__);
2535 REMMINA_PLUGIN_DEBUG(
"Requesting to close the connection");
2540 g_warning(
"WARNING: %s called on a subthread, which may not work or crash Remmina.", __func__);
2548 g_object_steal_data(G_OBJECT(gp),
"plugin-data");
2555 REMMINA_PLUGIN_DEBUG(
"[RDP] requesting clipboard transfer to abort");
2575 TRACE_CALL(__func__);
2581 TRACE_CALL(__func__);
2584 switch (feature->
id) {
2585 case REMMINA_RDP_FEATURE_UNFOCUS:
2589 case REMMINA_RDP_FEATURE_SCALE:
2594 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_SCALE");
2598 case REMMINA_RDP_FEATURE_MULTIMON:
2601 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
2602 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2604 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
2605 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2609 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_MULTIMON");
2613 case REMMINA_RDP_FEATURE_DYNRESUPDATE:
2616 case REMMINA_RDP_FEATURE_TOOL_REFRESH:
2622 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_TOOL_REFRESH");
2625 case REMMINA_RDP_FEATURE_TOOL_SENDCTRLALTDEL:
2637 TRACE_CALL(__func__);
2641 keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE);
2651 UINT32 bytesPerPixel;
2652 UINT32 bitsPerPixel;
2657 gdi = ((rdpContext *)rfi)->gdi;
2659 bytesPerPixel = GetBytesPerPixel(gdi->hdc->format);
2660 bitsPerPixel = GetBitsPerPixel(gdi->hdc->format);
2665 szmem = gdi->width * gdi->height * bytesPerPixel;
2667 REMMINA_PLUGIN_DEBUG(
"allocating %zu bytes for a full screenshot", szmem);
2668 rpsd->
buffer = malloc(szmem);
2670 REMMINA_PLUGIN_DEBUG(
"could not set aside %zu bytes for a full screenshot", szmem);
2673 rpsd->
width = gdi->width;
2674 rpsd->
height = gdi->height;
2678 memcpy(rpsd->
buffer, gdi->primary_buffer, szmem);
2688 "99",
N_(
"Automatic (32 bpp) (Server chooses its best format)"),
2689 "66",
N_(
"GFX AVC444 (32 bpp)"),
2690 "65",
N_(
"GFX AVC420 (32 bpp)"),
2691 "64",
N_(
"GFX RFX (32 bpp)"),
2692 "63",
N_(
"GFX RFX Progressive (32 bpp)"),
2693 "0",
N_(
"RemoteFX (32 bpp)"),
2694 "32",
N_(
"True colour (32 bpp)"),
2695 "24",
N_(
"True colour (24 bpp)"),
2696 "16",
N_(
"High colour (16 bpp)"),
2697 "15",
N_(
"High colour (15 bpp)"),
2698 "8",
N_(
"256 colours (8 bpp)"),
2719 "0",
N_(
"Poor (fastest)"),
2722 "9",
N_(
"Best (slowest)"),
2730 "autodetect",
N_(
"Auto-detect"),
2731 "modem",
N_(
"Modem"),
2732 "broadband-low",
N_(
"Low performance broadband"),
2733 "satellite",
N_(
"Satellite"),
2734 "broadband-high",
N_(
"High performance broadband"),
2744 "local",
N_(
"Local"),
2745 "remote",
N_(
"Remote"),
2752 "",
N_(
"Automatic negotiation"),
2753 "nla",
N_(
"NLA protocol security"),
2754 "tls",
N_(
"TLS protocol security"),
2755 "rdp",
N_(
"RDP protocol security"),
2756 "ext",
N_(
"NLA extended protocol security"),
2764 "60",
N_(
"Every 1 min"),
2765 "180",
N_(
"Every 3 min"),
2766 "300",
N_(
"Every 5 min"),
2767 "600",
N_(
"Every 10 min"),
2782 "0",
N_(
"0 — Windows 7 compatible"),
2792 N_(
"2600 (Windows XP), 7601 (Windows Vista/7), 9600 (Windows 8 and newer)");
2795 N_(
"Used i.a. by terminal services in a smart card channel to distinguish client capabilities:\n" 2796 " • < 4034: Windows XP base smart card functions\n" 2797 " • 4034-7064: Windows Vista/7: SCardReadCache(),\n" 2798 " SCardWriteCache(), SCardGetTransmitCount()\n" 2799 " • >= 7065: Windows 8 and newer: SCardGetReaderIcon(),\n" 2800 " SCardGetDeviceTypeId()");
2803 N_(
"Options for redirection of audio input:\n" 2804 " • [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,]\n" 2805 " [channel:<channel>] Audio input (microphone)\n" 2808 " • sys:oss,dev:1,format:1\n" 2812 N_(
"Options for redirection of audio output:\n" 2813 " • [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,]\n" 2814 " [channel:<channel>] Audio output\n" 2817 " • sys:oss,dev:1,format:1\n" 2822 N_(
"Options for redirection of USB device:\n" 2823 " • [dbg,][id:<vid>:<pid>#…,][addr:<bus>:<addr>#…,][auto]\n" 2825 " • id:054c:0268#4669:6e6b,addr:04:0c");
2828 N_(
"Advanced setting for high latency links:\n" 2829 "Adjusts the connection timeout. Use if your connection times out.\n" 2830 "The highest possible value is 600000 ms (10 minutes).\n");
2833 N_(
"Performance optimisations based on the network connection type:\n" 2834 "Using auto-detection is advised.\n" 2835 "If “Auto-detect” fails, choose the most appropriate option in the list.\n");
2838 N_(
"Comma-separated list of monitor IDs and desktop orientations:\n" 2839 " • [<id>:<orientation-in-degrees>,]\n" 2842 "Orientations are specified in degrees, valid values are:\n" 2843 " • 0 (landscape)\n" 2844 " • 90 (portrait)\n" 2845 " • 180 (landscape flipped)\n" 2846 " • 270 (portrait flipped)\n" 2850 N_(
"Redirect directory <path> as named share <name>.\n" 2851 " • <name>,<fullpath>[;<name>,<fullpath>[;…]]\n" 2852 " • MyHome,/home/remminer\n" 2853 " • /home/remminer\n" 2854 " • MyHome,/home/remminer;SomePath,/path/to/somepath\n" 2855 "Hotplug support is enabled with:\n" 2928 {
REMMINA_PROTOCOL_SETTING_TYPE_TEXT,
"printer_overrides",
N_(
"Override printer drivers"), FALSE, NULL,
N_(
"\"Samsung_CLX-3300_Series\":\"Samsung CLX-3300 Series PS\";\"Canon MF410\":\"Canon MF410 Series UFR II\"") },
2939 {
REMMINA_PROTOCOL_SETTING_TYPE_TEXT,
"rdp_reconnect_attempts",
N_(
"Reconnect attempts number"), FALSE, NULL,
N_(
"The maximum number of reconnect attempts upon an RDP disconnect (default: 20)") },
2956 #if defined(PROXY_TYPE_IGNORE) 2964 #if FREERDP_CHECK_VERSION(2, 3, 1) 2994 N_(
"RDP - Remote Desktop Protocol"),
2997 "org.remmina.Remmina-rdp-symbolic",
2998 "org.remmina.Remmina-rdp-ssh-symbolic",
3019 N_(
"RDP - RDP File Handler"),
3034 N_(
"RDP - Preferences"),
3043 TRACE_CALL(__func__);
3047 p = strcasestr(bc, option);
3051 if (p > bc && *(p - 1) >
' ')
3054 n = p + strlen(option);
3063 int vermaj, vermin, verrev;
3065 TRACE_CALL(__func__);
3066 remmina_plugin_service = service;
3070 freerdp_get_version(&vermaj, &vermin, &verrev);
3071 if (vermaj < FREERDP_REQUIRED_MAJOR ||
3072 (vermaj == FREERDP_REQUIRED_MAJOR && (vermin < FREERDP_REQUIRED_MINOR ||
3073 (vermin == FREERDP_REQUIRED_MINOR && verrev < FREERDP_REQUIRED_REVISION)))) {
3074 g_printf(
"Upgrade your FreeRDP library version from %d.%d.%d to at least libfreerdp %d.%d.%d " 3075 "to run the RDP plugin.\n",
3076 vermaj, vermin, verrev,
3077 FREERDP_REQUIRED_MAJOR, FREERDP_REQUIRED_MINOR, FREERDP_REQUIRED_REVISION);
3081 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
3082 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
3087 remmina_rdpf.
export_hints = _(
"Export connection in Windows .rdp file format");
3102 gpointer *src, *dst;
3105 if (strcmp(*src,
"66") != 0 && strcmp(*src,
"65") != 0) {
3108 *(dst + 1) = *(src + 1);
3118 "RDP plugin: %s (Git %s), Compiled with libfreerdp %s (%s), Running with libfreerdp %s (rev %s), H.264 %s",
3119 VERSION, REMMINA_GIT_REVISION,
3120 #ifdef WITH_FREERDP3
3121 FREERDP_VERSION_FULL, FREERDP_GIT_REVISION,
3123 FREERDP_VERSION_FULL, GIT_REVISION,
3125 freerdp_get_version_string(),
3126 freerdp_get_build_revision(),
CliprdrClientContext * context
struct remmina_plugin_rdp_event::@42::@45 mouse_event
gboolean thread_cancelled
static gpointer tls_seclevel[]
static gchar network_tooltip[]
RemminaScaleMode(* remmina_protocol_widget_get_current_scale_mode)(RemminaProtocolWidget *gp)
static int remmina_rdp_load_static_channel_addin(rdpChannels *channels, rdpSettings *settings, char *name, void *data)
static gboolean remmina_rdp_open_connection(RemminaProtocolWidget *gp)
static gpointer quality_list[]
static void remmina_rdp_send_ctrlaltdel(RemminaProtocolWidget *gp)
gboolean attempt_interactive_authentication
void(* protocol_plugin_set_error)(RemminaProtocolWidget *gp, const gchar *fmt,...)
void(* file_set_int)(RemminaFile *remminafile, const gchar *setting, gint value)
static RemminaProtocolPlugin remmina_rdp
gboolean remmina_rdp_event_on_unmap(RemminaProtocolWidget *gp)
gboolean remmina_rdp_file_export_test(RemminaFilePlugin *plugin, RemminaFile *remminafile)
static gpointer log_level[]
gchar *(* file_get_user_datadir)(void)
static BOOL rf_auto_reconnect(rfContext *rfi)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
pthread_t remmina_plugin_thread
const gchar * export_hints
void remmina_rdp_cliprdr_detach_owner(RemminaProtocolWidget *gp)
struct remmina_plugin_rdp_ui_object::@50::@52 reg
void(* protocol_plugin_set_width)(RemminaProtocolWidget *gp, gint width)
static BOOL gfx_h264_available
void remmina_rdp_settings_get_orientation_scale_prefs(int *desktopOrientation, int *desktopScaleFactor, int *deviceScaleFactor)
static gboolean remmina_rdp_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
static DWORD remmina_rdp_verify_certificate_ex(freerdp *instance, const char *host, UINT16 port, const char *common_name, const char *subject, const char *issuer, const char *fingerprint, DWORD flags)
static gchar microphone_tooltip[]
gint(* protocol_plugin_init_certificate)(RemminaProtocolWidget *gp, const gchar *subject, const gchar *issuer, const gchar *fingerprint)
static BOOL rf_desktop_resize(rdpContext *context)
static CLPARAM ** remmina_rdp_CommandLineParseCommaSeparatedValues(const char *list, size_t *count)
void rf_register_graphics(rdpGraphics *graphics)
void remmina_rdp_settings_init(void)
static BOOL remmina_rdp_authenticate(freerdp *instance, char **username, char **password, char **domain)
static gboolean complete_cleanup_on_main_thread(gpointer data)
static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
void remmina_rdp_clipboard_init(rfContext *rfi)
static const RemminaProtocolSetting remmina_rdp_advanced_settings[]
RemminaProtocolWidget * protocol_widget
static gpointer network_list[]
void remmina_rdp_OnChannelConnectedEventHandler(void *context, ChannelConnectedEventArgs *e)
void(* protocol_plugin_send_keys_signals)(GtkWidget *widget, const guint *keyvals, int length, GdkEventType action)
void(* protocol_plugin_signal_connection_closed)(RemminaProtocolWidget *gp)
gint(* protocol_plugin_get_width)(RemminaProtocolWidget *gp)
static void remmina_rdp_init(RemminaProtocolWidget *gp)
static gchar * remmina_get_rdp_kbd_remap(const gchar *keymap)
void(* get_server_port)(const gchar *server, gint defaultport, gchar **host, gint *port)
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
static void remmina_rdp_post_disconnect(freerdp *instance)
static gpointer mouse_jitter_list[]
int reconnect_maxattempts
gint(* protocol_plugin_changed_certificate)(RemminaProtocolWidget *gp, const gchar *subject, const gchar *issuer, const gchar *new_fingerprint, const gchar *old_fingerprint)
static CLPARAM ** remmina_rdp_CommandLineParseCommaSeparatedValuesEx(const char *name, const char *list, size_t *count)
static gchar clientbuild_tooltip[]
RemminaPluginRdpEventType type
gboolean(* protocol_plugin_init_get_savepassword)(RemminaProtocolWidget *gp)
static void rfi_uninit(rfContext *rfi)
gboolean(* register_plugin)(RemminaPlugin *plugin)
enum rf_context::@59 postconnect_error
static int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t *dest)
Callback function used by cupsEnumDests.
static gpointer sound_list[]
cairo_format_t cairo_format
int remmina_rdp_event_queue_ui_sync_retint(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
void remmina_rdp_event_init(RemminaProtocolWidget *gp)
gboolean(* protocol_plugin_has_error)(RemminaProtocolWidget *gp)
gchar *(* pref_get_value)(const gchar *key)
static const RemminaProtocolFeature remmina_rdp_features[]
static RemminaFilePlugin remmina_rdpf
G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)
static gpointer security_list[]
static BOOL rf_process_event_queue(RemminaProtocolWidget *gp)
void remmina_rdp_event_queue_ui_async(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
static void remmina_rdp_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
gboolean stop_reconnecting_requested
struct remmina_plugin_rdp_event::@42::@44 key_event
gboolean remmina_rdp_file_import_test(RemminaFilePlugin *plugin, const gchar *from_file)
gboolean remmina_rdp_file_export(RemminaFilePlugin *plugin, RemminaFile *remminafile, const gchar *to_file)
static gpointer colordepth_list[]
struct remmina_plugin_rdp_event::@42::@46 clipboard_formatlist
static gchar audio_tooltip[]
gint(* protocol_plugin_get_height)(RemminaProtocolWidget *gp)
gint(* protocol_plugin_init_auth)(RemminaProtocolWidget *gp, RemminaMessagePanelFlags pflags, const gchar *title, const gchar *default_username, const gchar *default_password, const gchar *default_domain, const gchar *password_prompt)
static gchar monitorids_tooltip[]
void remmina_rdp_event_send_delayed_monitor_layout(RemminaProtocolWidget *gp)
GAsyncQueue * event_queue
static void remmina_rdp_main_loop(RemminaProtocolWidget *gp)
static BOOL rf_play_sound(rdpContext *context, const PLAY_SOUND_UPDATE *play_sound)
gint(* get_profile_remote_height)(RemminaProtocolWidget *gp)
void remmina_rdp_event_uninit(RemminaProtocolWidget *gp)
void remmina_rdp_mouse_jitter(RemminaProtocolWidget *gp)
RemminaFile *(* protocol_plugin_get_file)(RemminaProtocolWidget *gp)
static DWORD remmina_rdp_verify_changed_certificate_ex(freerdp *instance, const char *host, UINT16 port, const char *common_name, const char *subject, const char *issuer, const char *fingerprint, const char *old_subject, const char *old_issuer, const char *old_fingerprint, DWORD flags)
guint *(* pref_keymap_get_table)(const gchar *keymap)
void(* protocol_plugin_desktop_resize)(RemminaProtocolWidget *gp)
static BOOL remmina_rdp_post_connect(freerdp *instance)
static gchar usb_tooltip[]
struct remmina_plugin_rdp_event::@42::@48 clipboard_formatdatarequest
GtkWidget * remmina_rdp_settings_new(RemminaPrefPlugin *plugin)
static RemminaPrefPlugin remmina_rdps
gchar *(* protocol_plugin_init_get_username)(RemminaProtocolWidget *gp)
static gboolean remmina_rdp_close_connection(RemminaProtocolWidget *gp)
void remmina_rdp_clipboard_free(rfContext *rfi)
gint(* get_profile_remote_width)(RemminaProtocolWidget *gp)
gchar *(* protocol_plugin_init_get_password)(RemminaProtocolWidget *gp)
static BOOL rf_keyboard_set_ime_status(rdpContext *context, UINT16 imeId, UINT32 imeState, UINT32 imeConvMode)
void remmina_rdp_OnChannelDisconnectedEventHandler(void *context, ChannelDisconnectedEventArgs *e)
static char remmina_plugin_rdp_version[256]
static BOOL rf_keyboard_set_indicators(rdpContext *context, UINT16 led_flags)
static BOOL remmina_rdp_gw_authenticate(freerdp *instance, char **username, char **password, char **domain)
DispClientContext * dispcontext
static char * buildconfig_strstr(const char *bc, const char *option)
static gchar clientbuild_list[]
static DWORD remmina_rdp_verify_certificate(freerdp *instance, const char *common_name, const char *subject, const char *issuer, const char *fingerprint, BOOL host_mismatch) __attribute__((unused))
void remmina_rdp_event_update_scale(RemminaProtocolWidget *gp)
static BOOL rf_begin_paint(rdpContext *context)
void(* file_set_string)(RemminaFile *remminafile, const gchar *setting, const gchar *value)
void(* protocol_plugin_set_height)(RemminaProtocolWidget *gp, gint height)
static BOOL rf_end_paint(rdpContext *context)
static gpointer remmina_rdp_main_thread(gpointer data)
void remmina_rdp_event_unfocus(RemminaProtocolWidget *gp)
static BOOL remmina_rdp_pre_connect(freerdp *instance)
static gchar * remmina_rdp_find_prdriver(char *smap, char *prn)
static gchar timeout_tooltip[]
static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp)
struct remmina_plugin_rdp_ui_object::@50::@57 event
gchar *(* protocol_plugin_start_direct_tunnel)(RemminaProtocolWidget *gp, gint default_port, gboolean port_plus)
void remmina_rdp_monitor_get(rfContext *rfi, gchar **monitorids, guint32 *maxwidth, guint32 *maxheight)
Set the MonitorIDs, the maxwidth and maxheight.
static const RemminaProtocolSetting remmina_rdp_basic_settings[]
static gboolean remmina_rdp_get_screenshot(RemminaProtocolWidget *gp, RemminaPluginScreenshotData *rpsd)
void remmina_rdp_event_event_push(RemminaProtocolWidget *gp, const RemminaPluginRdpEvent *e)
const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)
static gchar drive_tooltip[]
RemminaPluginService * remmina_plugin_service
gboolean remmina_rdp_event_on_map(RemminaProtocolWidget *gp)
struct timeval clientformatdatarequest_tv
static gpointer gwtransp_list[]
static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
gchar *(* protocol_plugin_init_get_domain)(RemminaProtocolWidget *gp)
N_("Unable to connect to VNC server")
gboolean(* is_main_thread)(void)
RemminaFile * remmina_rdp_file_import(RemminaFilePlugin *plugin, const gchar *from_file)
enum rf_clipboard::@41 srv_clip_data_wait
struct rf_context rfContext
RemminaPluginRdpUiType type
guint remmina_rdp_settings_get_keyboard_layout(void)
static gboolean remmina_rdp_set_connection_type(rdpSettings *settings, guint32 type)