51 #include <cairo/cairo-xlib.h> 52 #include <freerdp/addin.h> 53 #include <freerdp/settings.h> 54 #include <freerdp/freerdp.h> 55 #include <freerdp/constants.h> 56 #include <freerdp/client/cliprdr.h> 57 #include <freerdp/client/channels.h> 58 #include <freerdp/client/cmdline.h> 59 #include <freerdp/error.h> 60 #include <freerdp/event.h> 61 #include <winpr/memory.h> 65 #include <cups/cups.h> 70 #ifdef GDK_WINDOWING_X11 72 #include <X11/XKBlib.h> 76 #if defined(__FreeBSD__) 77 #include <pthread_np.h> 80 #define REMMINA_RDP_FEATURE_TOOL_REFRESH 1 81 #define REMMINA_RDP_FEATURE_SCALE 2 82 #define REMMINA_RDP_FEATURE_UNFOCUS 3 83 #define REMMINA_RDP_FEATURE_TOOL_SENDCTRLALTDEL 4 84 #define REMMINA_RDP_FEATURE_DYNRESUPDATE 5 87 #define FREERDP_CLIENTHOSTNAME_LEN 32 101 DISPLAY_CONTROL_MONITOR_LAYOUT *dcml;
102 CLIPRDR_FORMAT_DATA_RESPONSE response = { 0 };
110 switch (event->
type) {
112 flags =
event->key_event.extended ? KBD_FLAGS_EXTENDED : 0;
113 flags |=
event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
114 input->KeyboardEvent(input, flags, event->
key_event.key_code);
121 flags =
event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
122 input->UnicodeKeyboardEvent(input, flags, event->
key_event.unicode_code);
127 input->ExtendedMouseEvent(input, event->
mouse_event.flags,
140 response.msgFlags = (
event->clipboard_formatdataresponse.data) ? CB_RESPONSE_OK : CB_RESPONSE_FAIL;
141 response.dataLen =
event->clipboard_formatdataresponse.size;
142 response.requestedFormatData =
event->clipboard_formatdataresponse.data;
152 dcml = g_malloc0(
sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT));
154 dcml->Flags = DISPLAY_CONTROL_MONITOR_PRIMARY;
155 dcml->Width =
event->monitor_layout.width;
156 dcml->Height =
event->monitor_layout.height;
157 dcml->Orientation =
event->monitor_layout.desktopOrientation;
158 dcml->DesktopScaleFactor =
event->monitor_layout.desktopScaleFactor;
159 dcml->DeviceScaleFactor =
event->monitor_layout.deviceScaleFactor;
166 freerdp_abort_connect(rfi->
instance);
178 TRACE_CALL(__func__);
193 remmina_plugin_service->
debug(
"Tunnel init");
195 if (hostport == NULL)
200 remmina_plugin_service->
debug(
"protocol_plugin_start_direct_tunnel() returned %s", hostport);
209 rfi->
settings->ServerHostname = strdup(host);
211 if (cert_port == 3389) {
212 rfi->
settings->CertificateName = strdup(cert_host);
214 s = g_strdup_printf(
"%s:%d", cert_host, cert_port);
215 rfi->
settings->CertificateName = strdup(s);
220 remmina_plugin_service->
debug(
"Tunnel has been optionally initialized. Now connecting to %s:%d", host, port);
222 if (cert_host != host) g_free(cert_host);
235 TRACE_CALL(__func__);
236 rdpSettings *settings = rfi->
instance->settings;
245 if (freerdp_error_info(rfi->
instance) != 0) {
250 if (!settings->AutoReconnectionEnabled) {
257 remmina_plugin_service->
debug(
"[%s] network disconnection detected, initiating reconnection attempt",
275 remmina_plugin_service->
debug(
"[%s] maximum number of reconnection attempts exceeded.",
281 remmina_plugin_service->
debug(
"[%s] reconnection, attempt #%d of %d",
288 treconn = time(NULL);
292 remmina_plugin_service->
debug(
"[%s] unable to recreate tunnel with remmina_rdp_tunnel_init.",
295 if (freerdp_reconnect(rfi->
instance)) {
297 remmina_plugin_service->
debug(
"[%s] reconnected.", rfi->
settings->ServerHostname);
304 while (time(NULL) - treconn < 5)
314 TRACE_CALL(__func__);
321 if (!gdi || !gdi->primary || !gdi->primary->hdc || !gdi->primary->hdc->hwnd)
329 TRACE_CALL(__func__);
340 if (gdi->primary->hdc->hwnd->invalid->null)
343 if (gdi->primary->hdc->hwnd->ninvalid < 1)
346 ninvalid = gdi->primary->hdc->hwnd->ninvalid;
347 cinvalid = gdi->primary->hdc->hwnd->cinvalid;
349 for (i = 0; i < ninvalid; i++) {
350 reg[i].
x = cinvalid[i].x;
351 reg[i].
y = cinvalid[i].y;
352 reg[i].
w = cinvalid[i].w;
353 reg[i].
h = cinvalid[i].h;
358 ui->
reg.ninvalid = ninvalid;
364 gdi->primary->hdc->hwnd->invalid->null = TRUE;
365 gdi->primary->hdc->hwnd->ninvalid = 0;
373 TRACE_CALL(__func__);
391 gdi_resize(((rdpContext *)rfi)->gdi, rfi->settings->DesktopWidth, rfi->settings->DesktopHeight);
406 static BOOL
rf_play_sound(rdpContext *context,
const PLAY_SOUND_UPDATE *play_sound)
408 TRACE_CALL(__func__);
416 disp = gtk_widget_get_display(GTK_WIDGET(gp));
417 gdk_display_beep(disp);
424 TRACE_CALL(__func__);
431 disp = gtk_widget_get_display(GTK_WIDGET(gp));
433 #ifdef GDK_WINDOWING_X11 434 if (GDK_IS_X11_DISPLAY(disp)) {
436 Display *x11_display;
437 x11_display = gdk_x11_display_get_xdisplay(disp);
438 XkbLockModifiers(x11_display, XkbUseCoreKbd,
440 ((led_flags & KBD_SYNC_CAPS_LOCK) ? LockMask : 0) |
441 ((led_flags & KBD_SYNC_NUM_LOCK) ? Mod2Mask : 0)
454 TRACE_CALL(__func__);
466 TRACE_CALL(__func__);
468 ALIGN64 rdpSettings *settings;
471 settings = instance->settings;
473 settings->OsMajorType = OSMAJORTYPE_UNIX;
474 settings->OsMinorType = OSMINORTYPE_UNSPECIFIED;
476 settings->BitmapCacheEnabled = True;
477 settings->OffscreenSupportLevel = True;
479 if (settings->RemoteFxCodec == True) {
480 settings->FrameAcknowledge = False;
481 settings->LargePointerFlag = True;
482 settings->PerformanceFlags = PERF_FLAG_NONE;
487 PubSub_SubscribeChannelConnected(instance->context->pubSub,
489 PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
492 freerdp_client_load_addins(instance->context->channels, instance->settings);
499 TRACE_CALL(__func__);
503 UINT32 freerdp_local_color_format;
513 if (rfi->
settings->RemoteFxCodec == FALSE)
518 if (rfi->
bpp == 32) {
519 freerdp_local_color_format = PIXEL_FORMAT_BGRA32;
521 }
else if (rfi->
bpp == 24) {
523 freerdp_local_color_format = PIXEL_FORMAT_BGRX32;
526 freerdp_local_color_format = PIXEL_FORMAT_RGB16;
530 if (!gdi_init(instance, freerdp_local_color_format)) {
535 if (instance->context->codecs->h264 == NULL && rfi->
settings->GfxH264) {
563 TRACE_CALL(__func__);
564 gchar *s_username, *s_password, *s_domain;
569 gboolean disablepasswordstoring;
575 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
579 _(
"Enter RDP authentication credentials"),
584 if (ret == GTK_RESPONSE_OK) {
586 if (s_username) rfi->
settings->Username = strdup(s_username);
589 if (s_password) rfi->
settings->Password = strdup(s_password);
592 if (s_domain) rfi->
settings->Domain = strdup(s_domain);
594 remmina_plugin_service->
file_set_string(remminafile,
"username", s_username);
595 remmina_plugin_service->
file_set_string(remminafile,
"domain", s_domain);
602 remmina_plugin_service->
file_set_string(remminafile,
"password", s_password);
604 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
608 if (s_username) g_free(s_username);
609 if (s_password) g_free(s_password);
610 if (s_domain) g_free(s_domain);
622 TRACE_CALL(__func__);
623 gchar *s_username, *s_password, *s_domain;
628 gboolean disablepasswordstoring;
635 if (!remmina_plugin_service->
file_get_string(remminafile,
"gateway_server"))
637 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
641 _(
"Enter RDP gateway authentication credentials"),
642 remmina_plugin_service->
file_get_string(remminafile,
"gateway_username"),
643 remmina_plugin_service->
file_get_string(remminafile,
"gateway_password"),
644 remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain"),
647 if (ret == GTK_RESPONSE_OK) {
649 if (s_username) rfi->
settings->GatewayUsername = strdup(s_username);
652 if (s_password) rfi->
settings->GatewayPassword = strdup(s_password);
655 if (s_domain) rfi->
settings->GatewayDomain = strdup(s_domain);
657 remmina_plugin_service->
file_set_string(remminafile,
"gateway_username", s_username);
658 remmina_plugin_service->
file_set_string(remminafile,
"gateway_domain", s_domain);
662 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", s_password);
664 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", NULL);
667 if (s_username) g_free(s_username);
668 if (s_password) g_free(s_password);
669 if (s_domain) g_free(s_domain);
681 const char *issuer,
const char *fingerprint, BOOL host_mismatch)
683 TRACE_CALL(__func__);
693 if (status == GTK_RESPONSE_OK)
699 const char *common_name,
const char *subject,
const char *issuer,
700 const char *new_fingerprint,
const char *old_subject,
const char *old_issuer,
const char *old_fingerprint)
702 TRACE_CALL(__func__);
712 if (status == GTK_RESPONSE_OK)
720 TRACE_CALL(__func__);
722 if (!instance || !instance->context)
725 PubSub_UnsubscribeChannelConnected(instance->context->pubSub,
727 PubSub_UnsubscribeChannelDisconnected(instance->context->pubSub,
736 TRACE_CALL(__func__);
744 while (!freerdp_shall_disconnect(rfi->
instance)) {
745 nCount = freerdp_get_event_handles(rfi->
instance->context, &handles[0], 64);
749 handles[nCount++] = rfi->
instance->context->abortEvent;
752 fprintf(stderr,
"freerdp_get_event_handles failed\n");
756 status = WaitForMultipleObjects(nCount, handles, FALSE, 100);
758 if (status == WAIT_FAILED) {
759 fprintf(stderr,
"WaitForMultipleObjects failed with %lu\n", (
unsigned long)status);
765 fprintf(stderr,
"Could not process local keyboard/mouse event queue\n");
768 if (read(rfi->
event_pipe[0], buf,
sizeof(buf))) {
773 if (WaitForSingleObject(rfi->
instance->context->abortEvent, 0) == WAIT_OBJECT_0)
777 if (!freerdp_check_event_handles(rfi->
instance->context)) {
783 if (freerdp_get_last_error(rfi->
instance->context) == FREERDP_ERROR_SUCCESS)
784 fprintf(stderr,
"Could not check FreeRDP file descriptor\n");
789 remmina_plugin_service->
debug(
"RDP client disconnected");
794 TRACE_CALL(__func__);
795 PVIRTUALCHANNELENTRY entry = NULL;
796 PVIRTUALCHANNELENTRYEX entryEx = NULL;
797 entryEx = (PVIRTUALCHANNELENTRYEX)(
void*)freerdp_load_channel_addin_entry(
798 name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC | FREERDP_ADDIN_CHANNEL_ENTRYEX);
801 entry = freerdp_load_channel_addin_entry(name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC);
805 if (freerdp_channels_client_load_ex(channels, settings, entryEx, data) == 0)
807 fprintf(stderr,
"loading channel %s\n", name);
813 if (freerdp_channels_client_load(channels, settings, entry, data) == 0)
815 fprintf(stderr,
"loading channel %s\n", name);
834 S_WAITSEMICOLON } state = S_WAITPR;
837 while ((c = *smap++) != 0) {
840 if (c !=
'\"')
return NULL;
846 if (matching && c == *p && *p != 0) {
848 }
else if (c ==
'\"') {
859 state = S_WAITDRIVER;
872 state = S_WAITSEMICOLON;
875 case S_WAITSEMICOLON:
886 p = (
char *)malloc(sz);
902 rdpChannels *channels;
904 channels = rfi->
instance->context->channels;
919 const char *model = NULL;
922 const gchar *s = remmina_plugin_service->
file_get_string(remminafile,
"printer_overrides");
924 RDPDR_PRINTER *printer;
925 printer = (RDPDR_PRINTER *)calloc(1,
sizeof(RDPDR_PRINTER));
927 printer->Type = RDPDR_DTYP_PRINT;
928 remmina_plugin_service->
debug(
"Printer Type: %d", printer->Type);
930 rfi->
settings->RedirectPrinters = TRUE;
933 remmina_plugin_service->
debug(
"Destination: %s", dest->name);
934 if (!(printer->Name = _strdup(dest->name))) {
939 remmina_plugin_service->
debug(
"Printer Name: %s", printer->Name);
944 printer->DriverName = strdup(d);
945 remmina_plugin_service->
debug(
"Printer DriverName set to: %s", printer->DriverName);
959 model = _strdup(
"MS Publisher Imagesetter");
960 printer->DriverName = _strdup(model);
963 remmina_plugin_service->
debug(
"Printer Driver: %s", printer->DriverName);
964 if (!freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)printer)) {
965 free(printer->DriverName);
970 rfi->
settings->DeviceRedirection = TRUE;
978 TRACE_CALL(__func__);
979 guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_Delete };
983 keys, G_N_ELEMENTS(keys), GDK_KEY_PRESS | GDK_KEY_RELEASE);
988 TRACE_CALL(__func__);
994 char *rdpsnd_params[3];
996 char rdpsnd_param1[16];
997 char rdpsnd_param2[16];
1001 rdpChannels *channels;
1002 gchar *gateway_host;
1005 gint desktopOrientation, desktopScaleFactor, deviceScaleFactor;
1007 channels = rfi->
instance->context->channels;
1011 #if defined(PROXY_TYPE_IGNORE) 1012 if (!remmina_plugin_service->
file_get_int(remminafile,
"useproxyenv", FALSE) ? TRUE : FALSE) {
1013 remmina_plugin_service->
debug(
"Not using system proxy settings");
1014 rfi->
settings->ProxyType = PROXY_TYPE_IGNORE;
1021 rfi->
settings->AutoReconnectionEnabled = (remmina_plugin_service->
file_get_int(remminafile,
"disableautoreconnect", FALSE) ? FALSE : TRUE);
1023 if (remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE))
1024 rfi->
settings->AutoReconnectionEnabled = FALSE;
1026 rfi->
settings->ColorDepth = remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 66);
1034 if (rfi->
settings->ColorDepth == 0) {
1036 rfi->
settings->RemoteFxCodec = TRUE;
1037 rfi->
settings->SupportGraphicsPipeline = FALSE;
1039 }
else if (rfi->
settings->ColorDepth == 64) {
1042 rfi->
settings->SupportGraphicsPipeline = TRUE;
1045 }
else if (rfi->
settings->ColorDepth == 65) {
1048 rfi->
settings->SupportGraphicsPipeline = TRUE;
1051 }
else if (rfi->
settings->ColorDepth >= 66) {
1054 rfi->
settings->SupportGraphicsPipeline = TRUE;
1065 if (rfi->
settings->DesktopWidth < AVC_MIN_DESKTOP_WIDTH)
1066 rfi->
settings->DesktopWidth = AVC_MIN_DESKTOP_WIDTH;
1067 if (rfi->
settings->DesktopHeight < AVC_MIN_DESKTOP_HEIGHT)
1068 rfi->
settings->DesktopHeight = AVC_MIN_DESKTOP_HEIGHT;
1074 if ((rfi->
settings->DesktopWidth & 1) != 0)
1088 if (s) rfi->
settings->Password = strdup(s);
1090 rfi->
settings->AutoLogonEnabled = 1;
1096 gchar *proxy_type = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_type"));
1097 gchar *proxy_username = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_username"));
1098 gchar *proxy_password = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_password"));
1099 gchar *proxy_hostname = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_hostname"));
1100 gint proxy_port = remmina_plugin_service->
file_get_int(remminafile,
"proxy_port", 80);
1101 remmina_plugin_service->
debug(
"proxy_type: %s", proxy_type);
1102 remmina_plugin_service->
debug(
"proxy_username: %s", proxy_username);
1103 remmina_plugin_service->
debug(
"proxy_password: %s", proxy_password);
1104 remmina_plugin_service->
debug(
"proxy_hostname: %s", proxy_hostname);
1105 remmina_plugin_service->
debug(
"proxy_port: %d", proxy_port);
1106 if (proxy_type && proxy_hostname) {
1107 if (g_strcmp0(proxy_type,
"no_proxy") == 0)
1108 rfi->
settings->ProxyType = PROXY_TYPE_IGNORE;
1109 else if (g_strcmp0(proxy_type,
"http") == 0)
1110 rfi->
settings->ProxyType = PROXY_TYPE_HTTP;
1111 else if (g_strcmp0(proxy_type,
"socks5") == 0)
1112 rfi->
settings->ProxyType = PROXY_TYPE_SOCKS;
1114 g_warning(
"Invalid proxy protocol, at the moment only no_proxy, HTTP and SOCKS5 are supported");
1115 remmina_plugin_service->
debug(
"ProxyType set to: %d", rfi->
settings->ProxyType);
1116 rfi->
settings->ProxyHostname = proxy_hostname;
1118 rfi->
settings->ProxyUsername = proxy_username;
1120 rfi->
settings->ProxyPassword = proxy_password;
1122 rfi->
settings->ProxyPort = proxy_port;
1126 rfi->
settings->GatewayEnabled = FALSE;
1127 s = remmina_plugin_service->
file_get_string(remminafile,
"gateway_server");
1129 cs = remmina_plugin_service->
file_get_string(remminafile,
"gwtransp");
1130 if (g_strcmp0(cs,
"http") == 0) {
1131 rfi->
settings->GatewayRpcTransport = False;
1132 rfi->
settings->GatewayHttpTransport = True;
1133 }
else if (g_strcmp0(cs,
"rpc") == 0) {
1134 rfi->
settings->GatewayRpcTransport = True;
1135 rfi->
settings->GatewayHttpTransport = False;
1136 }
else if (g_strcmp0(cs,
"auto") == 0) {
1137 rfi->
settings->GatewayRpcTransport = True;
1138 rfi->
settings->GatewayHttpTransport = True;
1140 remmina_plugin_service->
get_server_port(s, 443, &gateway_host, &gateway_port);
1141 rfi->
settings->GatewayHostname = gateway_host;
1142 rfi->
settings->GatewayPort = gateway_port;
1143 rfi->
settings->GatewayEnabled = TRUE;
1144 rfi->
settings->GatewayUseSameCredentials = TRUE;
1147 if (remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain")) {
1148 rfi->
settings->GatewayDomain = strdup(remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain"));
1149 rfi->
settings->GatewayUseSameCredentials = FALSE;
1152 if (remmina_plugin_service->
file_get_string(remminafile,
"gateway_username")) {
1153 rfi->
settings->GatewayUsername = strdup(remmina_plugin_service->
file_get_string(remminafile,
"gateway_username"));
1154 rfi->
settings->GatewayUseSameCredentials = FALSE;
1157 s = remmina_plugin_service->
file_get_string(remminafile,
"gateway_password");
1159 rfi->
settings->GatewayPassword = strdup(s);
1160 rfi->
settings->GatewayUseSameCredentials = FALSE;
1164 if (rfi->
settings->GatewayEnabled && rfi->
settings->GatewayUseSameCredentials) {
1165 g_free(rfi->
settings->GatewayDomain);
1167 g_free(rfi->
settings->GatewayUsername);
1169 g_free(rfi->
settings->GatewayPassword);
1174 freerdp_set_gateway_usage_method(rfi->
settings,
1175 remmina_plugin_service->
file_get_int(remminafile,
"gateway_usage", FALSE) ? TSC_PROXY_MODE_DETECT : TSC_PROXY_MODE_DIRECT);
1177 #ifdef WITH_FREERDP_MASTER 1178 #pragma message "Using FreeRDP master branch!" 1180 freerdp_settings_set_string(rfi->
settings, (
size_t)FreeRDP_GatewayAccessToken,
1181 remmina_plugin_service->
file_get_string(remminafile,
"gatewayaccesstoken"));
1183 rfi->
settings->GatewayAccessToken = g_strdup(
1184 remmina_plugin_service->
file_get_string(remminafile,
"gatewayaccesstoken"));
1188 remminafile,
"authentication level", rfi->
settings->AuthenticationLevel);
1191 rfi->
settings->IgnoreCertificate = remmina_plugin_service->
file_get_int(remminafile,
"cert_ignore", 0);
1193 rfi->
settings->OldLicenseBehaviour = remmina_plugin_service->
file_get_int(remminafile,
"old-license", 0);
1195 rfi->
settings->AllowUnanouncedOrdersFromServer = remmina_plugin_service->
file_get_int(remminafile,
"relax-order-checks", 0);
1197 rfi->
settings->GlyphSupportLevel = (remmina_plugin_service->
file_get_int(remminafile,
"glyph-cache", 0) ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE);
1200 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"clientname")))
1201 strncpy(rfi->
settings->ClientHostname, cs, FREERDP_CLIENTHOSTNAME_LEN - 1);
1203 strncpy(rfi->
settings->ClientHostname, g_get_host_name(), FREERDP_CLIENTHOSTNAME_LEN - 1);
1204 rfi->
settings->ClientHostname[FREERDP_CLIENTHOSTNAME_LEN - 1] = 0;
1207 if ((cs=remmina_plugin_service->
file_get_string(remminafile,
"clientbuild"))) {
1209 rfi->
settings->ClientBuild = strtoul(cs, NULL, 0);
1213 if (remmina_plugin_service->
file_get_string(remminafile,
"loadbalanceinfo")) {
1214 rfi->
settings->LoadBalanceInfo = (BYTE *)strdup(remmina_plugin_service->
file_get_string(remminafile,
"loadbalanceinfo"));
1215 rfi->
settings->LoadBalanceInfoLength = (UINT32)strlen((
char *)rfi->
settings->LoadBalanceInfo);
1222 rfi->
settings->ShellWorkingDirectory = strdup(remmina_plugin_service->
file_get_string(remminafile,
"execpath"));
1224 sm = g_strdup_printf(
"rdp_quality_%i", remmina_plugin_service->
file_get_int(remminafile,
"quality", DEFAULT_QUALITY_0));
1228 if (value && value[0]) {
1229 rfi->
settings->PerformanceFlags = strtoul(value, NULL, 16);
1231 switch (remmina_plugin_service->
file_get_int(remminafile,
"quality", DEFAULT_QUALITY_0)) {
1233 rfi->
settings->PerformanceFlags = DEFAULT_QUALITY_9;
1237 rfi->
settings->PerformanceFlags = DEFAULT_QUALITY_2;
1241 rfi->
settings->PerformanceFlags = DEFAULT_QUALITY_1;
1246 rfi->
settings->PerformanceFlags = DEFAULT_QUALITY_0;
1256 freerdp_performance_flags_split(rfi->
settings);
1260 if (remmina_plugin_service->
file_get_int(remminafile,
"console", FALSE))
1261 rfi->
settings->ConsoleSession = True;
1263 cs = remmina_plugin_service->
file_get_string(remminafile,
"security");
1264 if (g_strcmp0(cs,
"rdp") == 0) {
1266 rfi->
settings->TlsSecurity = False;
1267 rfi->
settings->NlaSecurity = False;
1268 rfi->
settings->ExtSecurity = False;
1269 rfi->
settings->UseRdpSecurityLayer = True;
1270 }
else if (g_strcmp0(cs,
"tls") == 0) {
1271 rfi->
settings->RdpSecurity = False;
1273 rfi->
settings->NlaSecurity = False;
1274 rfi->
settings->ExtSecurity = False;
1275 }
else if (g_strcmp0(cs,
"nla") == 0) {
1276 rfi->
settings->RdpSecurity = False;
1277 rfi->
settings->TlsSecurity = False;
1279 rfi->
settings->ExtSecurity = False;
1280 }
else if (g_strcmp0(cs,
"ext") == 0) {
1281 rfi->
settings->RdpSecurity = False;
1282 rfi->
settings->TlsSecurity = False;
1283 rfi->
settings->NlaSecurity = False;
1287 rfi->
settings->NegotiateSecurityLayer = True;
1290 rfi->
settings->CompressionEnabled = True;
1291 if (remmina_plugin_service->
file_get_int(remminafile,
"disable_fastpath", FALSE)) {
1292 rfi->
settings->FastPathInput = False;
1293 rfi->
settings->FastPathOutput = False;
1295 rfi->
settings->FastPathInput = True;
1296 rfi->
settings->FastPathOutput = True;
1302 rfi->
settings->DesktopOrientation = desktopOrientation;
1303 if (desktopScaleFactor != 0 && deviceScaleFactor != 0) {
1304 rfi->
settings->DesktopScaleFactor = desktopScaleFactor;
1305 rfi->
settings->DeviceScaleFactor = deviceScaleFactor;
1311 rfi->
settings->SupportDisplayControl = TRUE;
1317 if (g_strcmp0(cs,
"remote") == 0) {
1318 rfi->
settings->RemoteConsoleAudio = TRUE;
1319 }
else if (g_str_has_prefix(cs,
"local")) {
1320 rfi->
settings->AudioPlayback = TRUE;
1321 rfi->
settings->DeviceRedirection = TRUE;
1324 rdpsnd_params[rdpsnd_nparams++] =
"rdpsnd";
1326 cs = strchr(cs,
',');
1328 rdpsnd_rate = atoi(cs + 1);
1329 if (rdpsnd_rate > 1000 && rdpsnd_rate < 150000) {
1330 snprintf(rdpsnd_param1,
sizeof(rdpsnd_param1),
"rate:%d", rdpsnd_rate);
1331 rdpsnd_params[rdpsnd_nparams++] = rdpsnd_param1;
1332 cs = strchr(cs + 1,
',');
1334 rdpsnd_channel = atoi(cs + 1);
1335 if (rdpsnd_channel >= 1 && rdpsnd_channel <= 2) {
1336 snprintf(rdpsnd_param2,
sizeof(rdpsnd_param2),
"channel:%d", rdpsnd_channel);
1337 rdpsnd_params[rdpsnd_nparams++] = rdpsnd_param2;
1343 freerdp_client_add_static_channel(rfi->
settings, rdpsnd_nparams, (
char **)rdpsnd_params);
1346 rfi->
settings->AudioPlayback = FALSE;
1347 rfi->
settings->RemoteConsoleAudio = FALSE;
1350 if (remmina_plugin_service->
file_get_int(remminafile,
"microphone", FALSE) ? TRUE : FALSE) {
1357 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1360 if (remmina_plugin_service->
file_get_int(remminafile,
"preferipv6", FALSE) ? TRUE : FALSE)
1361 rfi->
settings->PreferIPv6OverIPv4 = TRUE;
1363 rfi->
settings->RedirectClipboard = (remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE) ? FALSE : TRUE);
1365 cs = remmina_plugin_service->
file_get_string(remminafile,
"sharefolder");
1367 if (cs && cs[0] ==
'/') {
1371 drive = (RDPDR_DRIVE *)calloc(1,
sizeof(RDPDR_DRIVE));
1373 rfi->
settings->DeviceRedirection = TRUE;
1376 s = strrchr(cs,
'/');
1377 if (s == NULL || s[1] == 0)
1381 sm = g_convert_with_fallback(s, -1,
"ascii",
"utf-8",
"_", NULL, &sz, NULL);
1383 drive->Type = RDPDR_DTYP_FILESYSTEM;
1384 drive->Name = _strdup(sm);
1385 drive->Path = _strdup(cs);
1388 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)drive);
1389 rfi->
settings->DeviceRedirection = TRUE;
1392 if (remmina_plugin_service->
file_get_int(remminafile,
"shareprinter", FALSE)) {
1394 remmina_plugin_service->
debug(
"Sharing printers");
1396 remmina_plugin_service->
debug(
"All printers have been shared");
1399 remmina_plugin_service->
debug(
"Cannot share printers, are there any available?");
1404 if (remmina_plugin_service->
file_get_int(remminafile,
"sharesmartcard", FALSE)) {
1405 RDPDR_SMARTCARD *smartcard;
1406 smartcard = (RDPDR_SMARTCARD *)calloc(1,
sizeof(RDPDR_SMARTCARD));
1408 smartcard->Type = RDPDR_DTYP_SMARTCARD;
1410 rfi->
settings->DeviceRedirection = TRUE;
1413 const gchar *sn = remmina_plugin_service->
file_get_string(remminafile,
"smartcardname");
1414 if (sn != NULL && sn[0] !=
'\0')
1415 smartcard->Name = _strdup(sn);
1417 rfi->
settings->RedirectSmartCards = TRUE;
1419 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)smartcard);
1422 if (remmina_plugin_service->
file_get_int(remminafile,
"passwordispin", FALSE))
1425 rfi->
settings->PasswordIsSmartcardPin = TRUE;
1428 if (remmina_plugin_service->
file_get_int(remminafile,
"shareserial", FALSE)) {
1429 RDPDR_SERIAL *serial;
1430 serial = (RDPDR_SERIAL *)calloc(1,
sizeof(RDPDR_SERIAL));
1432 serial->Type = RDPDR_DTYP_SERIAL;
1434 rfi->
settings->DeviceRedirection = TRUE;
1437 const gchar *sn = remmina_plugin_service->
file_get_string(remminafile,
"serialname");
1438 if (sn != NULL && sn[0] !=
'\0')
1439 serial->Name = _strdup(sn);
1441 const gchar *sd = remmina_plugin_service->
file_get_string(remminafile,
"serialdriver");
1442 if (sd != NULL && sd[0] !=
'\0')
1443 serial->Driver = _strdup(sd);
1445 const gchar *sp = remmina_plugin_service->
file_get_string(remminafile,
"serialpath");
1446 if (sp != NULL && sp[0] !=
'\0')
1447 serial->Path = _strdup(sp);
1449 if (remmina_plugin_service->
file_get_int(remminafile,
"serialpermissive", FALSE))
1450 serial->Permissive = _strdup(
"permissive");
1452 rfi->
settings->RedirectSerialPorts = TRUE;
1454 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)serial);
1457 if (remmina_plugin_service->
file_get_int(remminafile,
"shareparallel", FALSE)) {
1458 RDPDR_PARALLEL *parallel;
1459 parallel = (RDPDR_PARALLEL *)calloc(1,
sizeof(RDPDR_PARALLEL));
1461 parallel->Type = RDPDR_DTYP_PARALLEL;
1463 rfi->
settings->DeviceRedirection = TRUE;
1466 rfi->
settings->RedirectParallelPorts = TRUE;
1468 const gchar *pn = remmina_plugin_service->
file_get_string(remminafile,
"parallelname");
1469 if (pn != NULL && pn[0] !=
'\0')
1470 parallel->Name = _strdup(pn);
1471 const gchar *dp = remmina_plugin_service->
file_get_string(remminafile,
"parallelpath");
1472 if (dp != NULL && dp[0] !=
'\0')
1473 parallel->Path = _strdup(dp);
1475 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)parallel);
1481 if (remmina_plugin_service->
file_get_int(remminafile,
"multitransport", FALSE)) {
1482 rfi->
settings->DeviceRedirection = TRUE;
1483 rfi->
settings->SupportMultitransport = TRUE;
1484 rfi->
settings->MultitransportFlags =
1485 (TRANSPORT_TYPE_UDP_FECR | TRANSPORT_TYPE_UDP_FECL | TRANSPORT_TYPE_UDP_PREFERRED);
1487 rfi->
settings->MultitransportFlags = 0;
1502 rfi->
settings->GatewayDomain = NULL;
1504 rfi->
settings->GatewayUsername = NULL;
1506 rfi->
settings->GatewayPassword = NULL;
1507 rfi->
settings->GatewayUseSameCredentials = FALSE;
1512 if (!freerdp_connect(rfi->
instance)) {
1513 if (GET_PLUGIN_DATA(rfi->
protocol_widget) == NULL) orphaned = True;
else orphaned = False;
1517 e = freerdp_get_last_error(rfi->
instance->context);
1520 case FREERDP_ERROR_AUTHENTICATION_FAILED:
1521 case STATUS_LOGON_FAILURE:
1522 #ifdef FREERDP_ERROR_CONNECT_LOGON_FAILURE 1523 case FREERDP_ERROR_CONNECT_LOGON_FAILURE:
1528 case STATUS_ACCOUNT_LOCKED_OUT:
1529 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT 1530 case FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT:
1532 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server \"%s\".\nAccount locked out."),
1535 case STATUS_ACCOUNT_EXPIRED:
1536 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED 1537 case FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED:
1542 case STATUS_PASSWORD_EXPIRED:
1543 #ifdef FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED 1544 case FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED:
1549 case STATUS_ACCOUNT_DISABLED:
1550 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED 1551 case FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED:
1556 #ifdef FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES 1558 case FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES:
1559 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server \"%s\".\nInsufficient user privileges."),
1563 case STATUS_ACCOUNT_RESTRICTION:
1564 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION 1565 case FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION:
1567 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server \"%s\".\nAccount restricted."),
1571 case STATUS_PASSWORD_MUST_CHANGE:
1572 #ifdef FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE 1573 case FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE:
1575 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server \"%s\".\nChange user password before connecting."),
1579 case FREERDP_ERROR_CONNECT_FAILED:
1582 case FREERDP_ERROR_DNS_NAME_NOT_FOUND:
1585 case FREERDP_ERROR_TLS_CONNECT_FAILED:
1587 _(
"Could not connect to the RDP server \"%s\" via TLS. Check that client and server support a common TLS version."), rfi->
settings->ServerHostname);
1589 case FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED:
1590 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Unable to establish a connection to the RDP server. Check \"Security protocol negotiation\" \"%s\"."), rfi->
settings->ServerHostname);
1592 #ifdef FREERDP_ERROR_POST_CONNECT_FAILED 1593 case FREERDP_ERROR_POST_CONNECT_FAILED:
1596 case REMMINA_POSTCONNECT_ERROR_OK:
1600 case REMMINA_POSTCONNECT_ERROR_GDI_INIT:
1603 case REMMINA_POSTCONNECT_ERROR_NO_H264:
1604 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."), rfi->
settings->ServerHostname);
1609 #ifdef FREERDP_ERROR_SERVER_DENIED_CONNECTION 1610 case FREERDP_ERROR_SERVER_DENIED_CONNECTION:
1616 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"The Remote Desktop Gateway \"%s\" denied the user \"%s\\%s\" access due to policy."),
1620 case FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS:
1625 g_printf(
"libfreerdp returned code is %08X\n", e);
1634 if (GET_PLUGIN_DATA(rfi->
protocol_widget) == NULL) orphaned = True;
else orphaned = False;
1635 if (!orphaned && freerdp_get_last_error(rfi->
instance->context) == FREERDP_ERROR_SUCCESS && !rfi->
user_cancelled)
1656 freerdp_abort_connect(instance);
1667 RDP_CLIENT_ENTRY_POINTS *pEntryPoints = instance->pClientEntryPoints;
1669 IFCALL(pEntryPoints->GlobalUninit);
1670 free(instance->pClientEntryPoints);
1671 freerdp_context_free(instance);
1672 freerdp_free(instance);
1678 TRACE_CALL(__func__);
1689 if (GET_PLUGIN_DATA(gp) == NULL) orphaned = True;
else orphaned = False;
1694 if (!orphaned) g_object_steal_data(G_OBJECT(gp),
"plugin-data");
1703 return G_SOURCE_REMOVE;
1708 TRACE_CALL(__func__);
1712 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
1716 rfi = GET_PLUGIN_DATA(gp);
1734 TRACE_CALL(__func__);
1738 instance = freerdp_new();
1747 instance->ContextSize =
sizeof(
rfContext);
1748 freerdp_context_new(instance);
1751 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", rfi, free);
1755 rfi->
settings = instance->settings;
1760 freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
1767 TRACE_CALL(__func__);
1770 const gchar *profile_name, *p;
1771 gchar thname[16], c;
1781 "Could not start pthread. Falling back to non-thread mode…");
1789 profile_name = remmina_plugin_service->
file_get_string(remminafile,
"name");
1791 strcpy(thname,
"RemmRDP:");
1792 nthname = strlen(thname);
1793 while((c = *p) != 0 && nthname <
sizeof(thname) - 1 ) {
1795 thname[nthname++] = c;
1798 thname[nthname] = 0;
1799 #if defined(__linux__) 1801 #elif defined(__FreeBSD__) 1810 TRACE_CALL(__func__);
1816 g_warning(
"WARNING: %s called on a subthread, which may not work or crash Remmina.", __func__);
1824 g_object_steal_data(G_OBJECT(gp),
"plugin-data");
1831 remmina_plugin_service->
debug(
"[RDP] requesting clipboard transfer to abort");
1845 TRACE_CALL(__func__);
1851 TRACE_CALL(__func__);
1854 switch (feature->
id) {
1855 case REMMINA_RDP_FEATURE_UNFOCUS:
1859 case REMMINA_RDP_FEATURE_SCALE:
1864 printf(
"Remmina RDP plugin warning: Null value for rfi in %s REMMINA_RDP_FEATURE_SCALE\n", __func__);
1868 case REMMINA_RDP_FEATURE_DYNRESUPDATE:
1871 case REMMINA_RDP_FEATURE_TOOL_REFRESH:
1877 printf(
"Remmina RDP plugin warning: Null value for rfi in %s REMMINA_RDP_FEATURE_TOOL_REFRESH\n", __func__);
1881 case REMMINA_RDP_FEATURE_TOOL_SENDCTRLALTDEL:
1893 TRACE_CALL(__func__);
1896 keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE);
1906 UINT32 bytesPerPixel;
1907 UINT32 bitsPerPixel;
1912 gdi = ((rdpContext *)rfi)->gdi;
1914 bytesPerPixel = GetBytesPerPixel(gdi->hdc->format);
1915 bitsPerPixel = GetBitsPerPixel(gdi->hdc->format);
1920 szmem = gdi->width * gdi->height * bytesPerPixel;
1922 remmina_plugin_service->
debug(
"allocating %zu bytes for a full screenshot", szmem);
1923 rpsd->
buffer = malloc(szmem);
1925 remmina_plugin_service->
debug(
"could not set aside %zu bytes for a full screenshot", szmem);
1928 rpsd->
width = gdi->width;
1929 rpsd->
height = gdi->height;
1933 memcpy(rpsd->
buffer, gdi->primary_buffer, szmem);
1943 "66",
N_(
"GFX AVC444 (32 bpp)"),
1944 "65",
N_(
"GFX AVC420 (32 bpp)"),
1945 "64",
N_(
"GFX RFX (32 bpp)"),
1946 "0",
N_(
"RemoteFX (32 bpp)"),
1947 "32",
N_(
"True colour (32 bpp)"),
1948 "24",
N_(
"True colour (24 bpp)"),
1949 "16",
N_(
"High colour (16 bpp)"),
1950 "15",
N_(
"High colour (15 bpp)"),
1951 "8",
N_(
"256 colours (8 bpp)"),
1958 "0",
N_(
"Poor (fastest)"),
1961 "9",
N_(
"Best (slowest)"),
1969 "local",
N_(
"Local"),
1970 "local,11025,1",
N_(
"Local - low quality"),
1971 "local,22050,2",
N_(
"Local - medium quality"),
1972 "local,44100,2",
N_(
"Local - high quality"),
1973 "remote",
N_(
"Remote"),
1980 "",
N_(
"Negotiate protocol security"),
1981 "nla",
N_(
"NLA protocol security"),
1982 "tls",
N_(
"TLS protocol security"),
1983 "rdp",
N_(
"RDP protocol security"),
1984 "ext",
N_(
"NLA extended protocol security"),
1997 N_(
"2600 (Windows XP), 7601 (Windows Vista/7), 9600 (Windows 8 and newer)");
2000 N_(
"Used i.a. by terminal services in smart card channel to distinguish client capabilities:\n" 2001 " • < 4034: Windows XP base smart card functions\n" 2002 " • 4034-7064: Windows Vista/7: SCardReadCache(), SCardWriteCache(),\n" 2003 " SCardGetTransmitCount()\n" 2004 " • >= 7065: Windows 8 and newer: SCardGetReaderIcon(), SCardGetDeviceTypeId()");
2051 {
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\"") },
2072 #if defined(PROXY_TYPE_IGNORE) 2102 N_(
"RDP - Remote Desktop Protocol"),
2105 "remmina-rdp-symbolic",
2106 "remmina-rdp-ssh-symbolic",
2125 N_(
"RDP - RDP File Handler"),
2140 N_(
"RDP - Preferences"),
2149 TRACE_CALL(__func__);
2153 p = strcasestr(bc, option);
2157 if (p > bc && *(p - 1) >
' ')
2160 n = p + strlen(option);
2169 int vermaj, vermin, verrev;
2171 TRACE_CALL(__func__);
2172 remmina_plugin_service = service;
2176 freerdp_get_version(&vermaj, &vermin, &verrev);
2177 if (vermaj < FREERDP_REQUIRED_MAJOR ||
2178 (vermaj == FREERDP_REQUIRED_MAJOR && (vermin < FREERDP_REQUIRED_MINOR ||
2179 (vermin == FREERDP_REQUIRED_MINOR && verrev < FREERDP_REQUIRED_REVISION)))) {
2180 g_printf(
"Upgrade your FreeRDP library version from %d.%d.%d to at least libfreerdp %d.%d.%d " 2181 "to run the RDP plugin.\n",
2182 FREERDP_REQUIRED_MAJOR, FREERDP_REQUIRED_MINOR, FREERDP_REQUIRED_REVISION,
2183 vermaj, vermin, verrev);
2187 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
2188 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
2193 remmina_rdpf.
export_hints = _(
"Export connection in Windows .rdp file format");
2206 gpointer *src, *dst;
2209 if (strcmp(*src,
"66") != 0 && strcmp(*src,
"65") != 0) {
2212 *(dst + 1) = *(src + 1);
2222 "RDP plugin: %s (Git %s), Compiled with libfreerdp: %s (%s), Running with libfreerdp: %s (rev %s), H.264: %s",
2223 VERSION, REMMINA_GIT_REVISION,
2224 FREERDP_VERSION_FULL, GIT_REVISION,
2225 freerdp_get_version_string(),
2226 freerdp_get_build_revision(),
CliprdrClientContext * context
struct remmina_plugin_rdp_event::@40::@44 clipboard_formatlist
gboolean thread_cancelled
struct remmina_plugin_rdp_event::@40::@46 clipboard_formatdatarequest
RemminaScaleMode(* remmina_protocol_widget_get_current_scale_mode)(RemminaProtocolWidget *gp)
void(* debug)(const gchar *fmt,...)
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,...)
static RemminaProtocolPlugin remmina_rdp
void remmina_rdp_OnChannelDisconnectedEventHandler(rdpContext *context, ChannelConnectedEventArgs *e)
enum rf_context::@57 postconnect_error
enum rf_clipboard::@39 srv_clip_data_wait
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
pthread_t remmina_plugin_thread
const gchar * export_hints
void remmina_rdp_cliprdr_detach_owner(RemminaProtocolWidget *gp)
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_changed_certificate(freerdp *instance, const char *common_name, const char *subject, const char *issuer, const char *new_fingerprint, const char *old_subject, const char *old_issuer, const char *old_fingerprint)
gint(* protocol_plugin_init_certificate)(RemminaProtocolWidget *gp, const gchar *subject, const gchar *issuer, const gchar *fingerprint)
static BOOL rf_desktop_resize(rdpContext *context)
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
void(* protocol_plugin_send_keys_signals)(GtkWidget *widget, const guint *keyvals, int length, GdkEventType action)
int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t *dest)
Callback function used by cupsEnumDests.
void(* protocol_plugin_signal_connection_closed)(RemminaProtocolWidget *gp)
gint(* protocol_plugin_get_width)(RemminaProtocolWidget *gp)
static void remmina_rdp_init(RemminaProtocolWidget *gp)
void(* get_server_port)(const gchar *server, gint defaultport, gchar **host, gint *port)
gboolean remmina_rdp_file_export(RemminaFile *remminafile, const gchar *to_file)
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
static void remmina_rdp_post_disconnect(freerdp *instance)
gchar * remmina_rdp_find_prdriver(char *smap, char *prn)
struct remmina_plugin_rdp_ui_object::@48::@50 reg
GtkWidget * remmina_rdp_settings_new(void)
struct remmina_plugin_rdp_event::@40::@43 mouse_event
int reconnect_maxattempts
gint(* protocol_plugin_changed_certificate)(RemminaProtocolWidget *gp, const gchar *subject, const gchar *issuer, const gchar *new_fingerprint, const gchar *old_fingerprint)
gboolean remmina_rdp_file_export_test(RemminaFile *remminafile)
static gchar clientbuild_tooltip[]
RemminaPluginRdpEventType type
gboolean(* protocol_plugin_init_get_savepassword)(RemminaProtocolWidget *gp)
static void rfi_uninit(rfContext *rfi)
static char remmina_rdp_plugin_default_drive_name[]
gboolean(* register_plugin)(RemminaPlugin *plugin)
BOOL rf_begin_paint(rdpContext *context)
RemminaFile * remmina_rdp_file_import(const gchar *from_file)
static gpointer sound_list[]
cairo_format_t cairo_format
struct remmina_plugin_rdp_event::@40::@42 key_event
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)
static gpointer colordepth_list[]
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)
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)
RemminaFile *(* protocol_plugin_get_file)(RemminaProtocolWidget *gp)
void(* protocol_plugin_desktop_resize)(RemminaProtocolWidget *gp)
static BOOL remmina_rdp_post_connect(freerdp *instance)
BOOL rf_keyboard_set_ime_status(rdpContext *context, UINT16 imeId, UINT32 imeState, UINT32 imeConvMode)
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 char remmina_plugin_rdp_version[256]
gboolean remmina_rdp_file_import_test(const gchar *from_file)
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
BOOL rf_end_paint(rdpContext *context)
static char * buildconfig_strstr(const char *bc, const char *option)
struct remmina_plugin_rdp_ui_object::@48::@55 event
static gchar clientbuild_list[]
void remmina_rdp_event_update_scale(RemminaProtocolWidget *gp)
void(* file_set_string)(RemminaFile *remminafile, const gchar *setting, const gchar *value)
void(* protocol_plugin_set_height)(RemminaProtocolWidget *gp, gint height)
static gpointer remmina_rdp_main_thread(gpointer data)
void remmina_rdp_event_unfocus(RemminaProtocolWidget *gp)
static BOOL remmina_rdp_pre_connect(freerdp *instance)
int remmina_rdp_load_static_channel_addin(rdpChannels *channels, rdpSettings *settings, char *name, void *data)
static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp)
gchar *(* protocol_plugin_start_direct_tunnel)(RemminaProtocolWidget *gp, gint default_port, gboolean port_plus)
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)
BOOL rf_auto_reconnect(rfContext *rfi)
const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)
static DWORD remmina_rdp_verify_certificate(freerdp *instance, const char *common_name, const char *subject, const char *issuer, const char *fingerprint, BOOL host_mismatch)
RFX_CONTEXT * rfx_context
void remmina_rdp_OnChannelConnectedEventHandler(rdpContext *context, ChannelConnectedEventArgs *e)
RemminaPluginService * remmina_plugin_service
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)
struct rf_context rfContext
RemminaPluginRdpUiType type
guint remmina_rdp_settings_get_keyboard_layout(void)