diff options
author | akallabeth <akallabeth@posteo.net> | 2023-11-27 15:29:16 +0300 |
---|---|---|
committer | akallabeth <akallabeth@posteo.net> | 2023-11-27 18:00:31 +0300 |
commit | 4c3879e87578658a6bdf0ed30579f2fcbf0434d7 (patch) | |
tree | b9890bcb7aaf323ed25ea4c4404ee299ab62f715 | |
parent | 06d5c2f96d3e2b64ac4f7abc74f7c95b31d08a73 (diff) |
[freerdp] update to build for stable-3.0
* remove direct rdpSettings access
* remove cached pointers in rf_context
* base rf_context on rdpClientContext
* simplify FreeRDP version detection
-rw-r--r-- | cmake/FindFREERDP.cmake | 64 | ||||
-rw-r--r-- | cmake/FindFREERDP3.cmake | 64 | ||||
-rw-r--r-- | flatpak/org.remmina.Remmina-local.json | 2 | ||||
-rw-r--r-- | flatpak/org.remmina.Remmina.json | 2 | ||||
-rw-r--r-- | plugins/CMakeLists.txt | 17 | ||||
-rw-r--r-- | plugins/rdp/CMakeLists.txt | 43 | ||||
-rw-r--r-- | plugins/rdp/rdp_channels.c | 13 | ||||
-rw-r--r-- | plugins/rdp/rdp_channels.h | 11 | ||||
-rw-r--r-- | plugins/rdp/rdp_cliprdr.c | 37 | ||||
-rw-r--r-- | plugins/rdp/rdp_event.c | 8 | ||||
-rw-r--r-- | plugins/rdp/rdp_graphics.c | 316 | ||||
-rw-r--r-- | plugins/rdp/rdp_monitor.c | 6 | ||||
-rw-r--r-- | plugins/rdp/rdp_plugin.c | 726 | ||||
-rw-r--r-- | plugins/rdp/rdp_plugin.h | 16 | ||||
-rw-r--r-- | plugins/rdp/rdp_settings.c | 12 |
15 files changed, 505 insertions, 832 deletions
diff --git a/cmake/FindFREERDP.cmake b/cmake/FindFREERDP.cmake deleted file mode 100644 index 610c398e1..000000000 --- a/cmake/FindFREERDP.cmake +++ /dev/null @@ -1,64 +0,0 @@ -# Remmina - The GTK+ Remote Desktop Client -# -# Copyright (C) 2011 Marc-Andre Moreau -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. - -find_package(PkgConfig) -if(PKG_CONFIG_FOUND) - pkg_check_modules(PC_FREERDP freerdp2>=2.0.0) -endif() - -set(FREERDP_DEFINITIONS ${PC_FREERDP_CFLAGS_OTHER}) - -find_path(FREERDP_INCLUDE_DIR NAMES freerdp/freerdp.h - HINTS ${PC_FREERDP_INCLUDEDIR} ${PC_FREERDP_INCLUDE_DIRS} ${CMAKE_PREFIX_PATH}/include/freerdp2/) - -find_path(WINPR_INCLUDE_DIR NAMES winpr/winpr.h - HINTS ${PC_FREERDP_INCLUDEDIR} ${PC_FREERDP_INCLUDE_DIRS} ${CMAKE_PREFIX_PATH}/include/winpr2/) - -find_library(FREERDP_LIBRARY NAMES freerdp2 - HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) - -if(NOT FREERDP_LIBRARY) - find_library(FREERDP_LIBRARY NAMES freerdp - HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) -endif() - -find_library(FREERDP_CLIENT_LIBRARY NAMES freerdp-client2 - HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) - -if(NOT FREERDP_CLIENT_LIBRARY) - find_library(FREERDP_CLIENT_LIBRARY NAMES freerdp-client - HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) -endif() - -find_library(FREERDP_WINPR_LIBRARY NAMES winpr2 - HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) - -if(NOT FREERDP_WINPR_LIBRARY) - find_library(FREERDP_WINPR_LIBRARY NAMES winpr - HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) -endif() - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(FREERDP DEFAULT_MSG FREERDP_LIBRARY FREERDP_INCLUDE_DIR) - -set(FREERDP_LIBRARIES ${FREERDP_LIBRARY} ${FREERDP_CLIENT_LIBRARY} ${FREERDP_WINPR_LIBRARY} ) -set(FREERDP_INCLUDE_DIRS ${FREERDP_INCLUDE_DIR} ${WINPR_INCLUDE_DIR}) - -mark_as_advanced(FREERDP_INCLUDE_DIR FREERDP_LIBRARY) diff --git a/cmake/FindFREERDP3.cmake b/cmake/FindFREERDP3.cmake deleted file mode 100644 index 55da11583..000000000 --- a/cmake/FindFREERDP3.cmake +++ /dev/null @@ -1,64 +0,0 @@ -# Remmina - The GTK+ Remote Desktop Client -# -# Copyright (C) 2011 Marc-Andre Moreau -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. - -find_package(PkgConfig) -if(PKG_CONFIG_FOUND) - pkg_check_modules(PC_FREERDP3 freerdp3>=3.0.0) -endif() - -set(FREERDP3_DEFINITIONS ${PC_FREERDP3_CFLAGS_OTHER}) - -find_path(FREERDP3_INCLUDE_DIR NAMES freerdp/freerdp.h - HINTS ${PC_FREERDP3_INCLUDEDIR} ${PC_FREERDP3_INCLUDE_DIRS} ${CMAKE_PREFIX_PATH}/include/freerdp3/) - -find_path(WINPR_INCLUDE_DIR NAMES winpr/winpr.h - HINTS ${PC_FREERDP3_INCLUDEDIR} ${PC_FREERDP3_INCLUDE_DIRS} ${CMAKE_PREFIX_PATH}/include/winpr3/) - -find_library(FREERDP3_LIBRARY NAMES freerdp3 - HINTS ${PC_FREERDP3_LIBDIR} ${PC_FREERDP3_LIBRARY_DIRS}) - -if(NOT FREERDP3_LIBRARY) - find_library(FREERDP3_LIBRARY NAMES freerdp - HINTS ${PC_FREERDP3_LIBDIR} ${PC_FREERDP3_LIBRARY_DIRS}) -endif() - -find_library(FREERDP3_CLIENT_LIBRARY NAMES freerdp-client3 - HINTS ${PC_FREERDP3_LIBDIR} ${PC_FREERDP3_LIBRARY_DIRS}) - -if(NOT FREERDP3_CLIENT_LIBRARY) - find_library(FREERDP3_CLIENT_LIBRARY NAMES freerdp-client - HINTS ${PC_FREERDP3_LIBDIR} ${PC_FREERDP3_LIBRARY_DIRS}) -endif() - -find_library(FREERDP3_WINPR_LIBRARY NAMES winpr3 - HINTS ${PC_FREERDP3_LIBDIR} ${PC_FREERDP3_LIBRARY_DIRS}) - -if(NOT FREERDP3_WINPR_LIBRARY) - find_library(FREERDP3_WINPR_LIBRARY NAMES winpr - HINTS ${PC_FREERDP3_LIBDIR} ${PC_FREERDP3_LIBRARY_DIRS}) -endif() - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(FREERDP3 DEFAULT_MSG FREERDP3_LIBRARY FREERDP3_INCLUDE_DIR) - -set(FREERDP3_LIBRARIES ${FREERDP3_LIBRARY} ${FREERDP3_CLIENT_LIBRARY} ${FREERDP3_WINPR_LIBRARY} ) -set(FREERDP3_INCLUDE_DIRS ${FREERDP3_INCLUDE_DIR} ${WINPR_INCLUDE_DIR}) - -mark_as_advanced(FREERDP3_INCLUDE_DIR FREERDP3_LIBRARY) diff --git a/flatpak/org.remmina.Remmina-local.json b/flatpak/org.remmina.Remmina-local.json index 139dabbc1..0eec65d54 100644 --- a/flatpak/org.remmina.Remmina-local.json +++ b/flatpak/org.remmina.Remmina-local.json @@ -540,4 +540,4 @@ ] } ] -}
\ No newline at end of file +} diff --git a/flatpak/org.remmina.Remmina.json b/flatpak/org.remmina.Remmina.json index d6a46f5d5..109929b51 100644 --- a/flatpak/org.remmina.Remmina.json +++ b/flatpak/org.remmina.Remmina.json @@ -532,4 +532,4 @@ ] } ] -}
\ No newline at end of file +} diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 829b3dc5a..70404a2dd 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -49,22 +49,7 @@ if(LIBSSH_FOUND) target_link_libraries(remmina ${SSH_LIBRARIES}) endif() -set(FREERDP_REQUIRED_MAJOR 2) -set(FREERDP_REQUIRED_MINOR 0) -set(FREERDP_REQUIRED_REVISION 0) -set(FREERDP_REQUIRED_VERSIONSTRING - ${FREERDP_REQUIRED_MAJOR}.${FREERDP_REQUIRED_MINOR}.${FREERDP_REQUIRED_REVISION}) -find_package(FREERDP3) -find_package(FREERDP) -if(FREERDP3_FOUND) - add_definitions(-DWITH_FREERDP3) - option(WITH_FREERDP3 "Building RDP with FREERDP 3" ON) - set(FREERDP_REQUIRED_MAJOR 3) - set(FREERDP_FOUND FREERDP3_FOUND) - add_subdirectory(rdp) -elseif(FREERDP_FOUND) - add_subdirectory(rdp) -endif() +add_subdirectory(rdp) # X2Go option(WITH_X2GO "Build X2Go plugin" OFF) diff --git a/plugins/rdp/CMakeLists.txt b/plugins/rdp/CMakeLists.txt index c03054ef5..93b07c0c1 100644 --- a/plugins/rdp/CMakeLists.txt +++ b/plugins/rdp/CMakeLists.txt @@ -36,6 +36,22 @@ set(CMAKE_THREAD_PREFER_PTHREAD TRUE) find_package(Threads REQUIRED) +option(WITH_FREERDP3 "Compile the RDP plugin using symbols from FreeRDP3" OFF) +if (WITH_FREERDP3) + set(FREERDP_REQUIRED_VERSION 3) + set(FREERDP_REQUIRED_MAJOR 3) + set(FREERDP_REQUIRED_MINOR 0) + set(FREERDP_REQUIRED_REVISION 0) +else() + set(FREERDP_REQUIRED_MAJOR 2) + set(FREERDP_REQUIRED_MINOR 0) + set(FREERDP_REQUIRED_REVISION 0) +endif() + +find_package(WinPR ${FREERDP_REQUIRED_VERSION} REQUIRED) +find_package(FreeRDP ${FREERDP_REQUIRED_VERSION} REQUIRED) +find_package(FreeRDP-Client ${FREERDP_REQUIRED_VERSION} REQUIRED) + find_suggested_package(Cups) set(REMMINA_PLUGIN_RDP_SRCS @@ -61,36 +77,19 @@ add_definitions(-DFREERDP_REQUIRED_MAJOR=${FREERDP_REQUIRED_MAJOR}) add_definitions(-DFREERDP_REQUIRED_MINOR=${FREERDP_REQUIRED_MINOR}) add_definitions(-DFREERDP_REQUIRED_REVISION=${FREERDP_REQUIRED_REVISION}) -option(WITH_FREERDP_MASTER "Compile the RDP plugin using symbols from FreeRDP master branch." OFF) -if(WITH_FREERDP_MASTER) - message(STATUS "Compiling the RDP plugin using symbols from FreeRDP master branch.") - add_definitions(-DWITH_FREERDP_MASTER=ON) -endif() - add_library(remmina-plugin-rdp MODULE ${REMMINA_PLUGIN_RDP_SRCS}) set_target_properties(remmina-plugin-rdp PROPERTIES PREFIX "") set_target_properties(remmina-plugin-rdp PROPERTIES NO_SONAME 1) -if(WITH_FREERDP3) - include_directories(${REMMINA_COMMON_INCLUDE_DIRS} ${FREERDP3_INCLUDE_DIRS}) - target_link_libraries(remmina-plugin-rdp - ${REMMINA_COMMON_LIBRARIES} ${FREERDP3_LIBRARIES}) -else() - include_directories(${REMMINA_COMMON_INCLUDE_DIRS} ${FREERDP_INCLUDE_DIRS}) - target_link_libraries(remmina-plugin-rdp - ${REMMINA_COMMON_LIBRARIES} ${FREERDP_LIBRARIES}) -endif() +include_directories(${REMMINA_COMMON_INCLUDE_DIRS} ${FreeRDP-Client_INCLUDE_DIR} ${FreeRDP_INCLUDE_DIR} ${WinPR_INCLUDE_DIR}) +target_link_libraries(remmina-plugin-rdp + ${REMMINA_COMMON_LIBRARIES} freerdp-client) if(CUPS_FOUND) add_definitions(-DHAVE_CUPS) include_directories(${CUPS_INCLUDE_DIR}) - if(WITH_FREERDP3) - target_link_libraries(remmina-plugin-rdp - ${REMMINA_COMMON_LIBRARIES} ${FREERDP3_LIBRARIES} ${CUPS_LIBRARIES}) - else() - target_link_libraries(remmina-plugin-rdp - ${REMMINA_COMMON_LIBRARIES} ${FREERDP_LIBRARIES} ${CUPS_LIBRARIES}) - endif() + target_link_libraries(remmina-plugin-rdp + ${REMMINA_COMMON_LIBRARIES} freerdp-client ${CUPS_LIBRARIES}) endif() install(TARGETS remmina-plugin-rdp DESTINATION ${REMMINA_PLUGINDIR}) diff --git a/plugins/rdp/rdp_channels.c b/plugins/rdp/rdp_channels.c index b063c1b44..fabb25f56 100644 --- a/plugins/rdp/rdp_channels.c +++ b/plugins/rdp/rdp_channels.c @@ -43,7 +43,7 @@ #include <freerdp/client/cliprdr.h> #include <freerdp/gdi/gfx.h> -void remmina_rdp_OnChannelConnectedEventHandler(void* context, ChannelConnectedEventArgs* e) +void remmina_rdp_OnChannelConnectedEventHandler(void *context, CONST_ARG ChannelConnectedEventArgs *e) { TRACE_CALL(__func__); @@ -56,9 +56,9 @@ void remmina_rdp_OnChannelConnectedEventHandler(void* context, ChannelConnectedE g_print("Unimplemented: channel %s connected but we can’t use it\n", e->name); // xf_tsmf_init(xfc, (TsmfClientContext*) e->pInterface); }else if (g_strcmp0(e->name, RDPGFX_DVC_CHANNEL_NAME) == 0) { - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_SoftwareGdi)) { + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_SoftwareGdi)) { rfi->rdpgfxchan = TRUE; - gdi_graphics_pipeline_init(rfi->context.gdi, (RdpgfxClientContext*) e->pInterface); + gdi_graphics_pipeline_init(rfi->clientContext.context.gdi, (RdpgfxClientContext*) e->pInterface); } else g_print("Unimplemented: channel %s connected but libfreerdp is in HardwareGdi mode\n", e->name); @@ -83,14 +83,13 @@ void remmina_rdp_OnChannelConnectedEventHandler(void* context, ChannelConnectedE REMMINA_PLUGIN_DEBUG("Channel %s has been opened", e->name); } -void remmina_rdp_OnChannelDisconnectedEventHandler(void* context, ChannelDisconnectedEventArgs* e) -{ +void remmina_rdp_OnChannelDisconnectedEventHandler(void *context, CONST_ARG ChannelDisconnectedEventArgs *e) { TRACE_CALL(__func__); rfContext* rfi = (rfContext*)context; if (strcmp(e->name, RDPGFX_DVC_CHANNEL_NAME) == 0) { - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_SoftwareGdi)) - gdi_graphics_pipeline_uninit(rfi->context.gdi, (RdpgfxClientContext*) e->pInterface); + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_SoftwareGdi)) + gdi_graphics_pipeline_uninit(rfi->clientContext.context.gdi, (RdpgfxClientContext*) e->pInterface); } REMMINA_PLUGIN_DEBUG("Channel %s has been closed", e->name); diff --git a/plugins/rdp/rdp_channels.h b/plugins/rdp/rdp_channels.h index 8d1962410..f614610ba 100644 --- a/plugins/rdp/rdp_channels.h +++ b/plugins/rdp/rdp_channels.h @@ -37,6 +37,7 @@ #pragma once #include <glib.h> +#include <freerdp/version.h> #include <freerdp/freerdp.h> #include <freerdp/client/channels.h> #include <freerdp/client/rdpei.h> @@ -48,8 +49,14 @@ G_BEGIN_DECLS -void remmina_rdp_OnChannelConnectedEventHandler(void *context, ChannelConnectedEventArgs *e); -void remmina_rdp_OnChannelDisconnectedEventHandler(void *context, ChannelDisconnectedEventArgs *e); +#if FREERDP_VERSION_MAJOR >= 3 +#define CONST_ARG const +#else +#define CONST_ARG +#endif + +void remmina_rdp_OnChannelConnectedEventHandler(void *context, CONST_ARG ChannelConnectedEventArgs *e); +void remmina_rdp_OnChannelDisconnectedEventHandler(void *context, CONST_ARG ChannelDisconnectedEventArgs *e); G_END_DECLS diff --git a/plugins/rdp/rdp_cliprdr.c b/plugins/rdp/rdp_cliprdr.c index a39e4f4c7..035d93a3f 100644 --- a/plugins/rdp/rdp_cliprdr.c +++ b/plugins/rdp/rdp_cliprdr.c @@ -45,6 +45,12 @@ #define CLIPBOARD_TRANSFER_WAIT_TIME 6 +#define CB_FORMAT_HTML 0xD010 +#define CB_FORMAT_PNG 0xD011 +#define CB_FORMAT_JPEG 0xD012 +#define CB_FORMAT_GIF 0xD013 +#define CB_FORMAT_TEXTURILIST 0xD014 + UINT32 remmina_rdp_cliprdr_get_format_from_gdkatom(GdkAtom atom) { TRACE_CALL(__func__); @@ -346,9 +352,15 @@ static UINT remmina_rdp_cliprdr_server_format_list(CliprdrClientContext *context REMMINA_PLUGIN_DEBUG("gp=%p: sending ClientFormatListResponse to server", gp); +#if FREERDP_VERSION_MAJOR >= 3 + formatListResponse.common.msgType = CB_FORMAT_LIST_RESPONSE; + formatListResponse.common.msgFlags = CB_RESPONSE_OK; // Can be CB_RESPONSE_FAIL in case of error + formatListResponse.common.dataLen = 0; +#else formatListResponse.msgType = CB_FORMAT_LIST_RESPONSE; formatListResponse.msgFlags = CB_RESPONSE_OK; // Can be CB_RESPONSE_FAIL in case of error formatListResponse.dataLen = 0; +#endif rc = clipboard->context->ClientFormatListResponse(clipboard->context, &formatListResponse); /* Schedule GTK event to tell GTK to change the local clipboard calling gtk_clipboard_set_with_owner * via REMMINA_RDP_UI_CLIPBOARD_SET_DATA @@ -442,7 +454,11 @@ static UINT remmina_rdp_cliprdr_server_format_data_response(CliprdrClientContext rfi = GET_PLUGIN_DATA(gp); data = formatDataResponse->requestedFormatData; +#if FREERDP_VERSION_MAJOR >= 3 + size = formatDataResponse->common.dataLen; +#else size = formatDataResponse->dataLen; +#endif REMMINA_PLUGIN_DEBUG("gp=%p server FormatDataResponse received: clipboard data arrived form server.", gp); gettimeofday(&now, NULL); @@ -457,8 +473,13 @@ static UINT remmina_rdp_cliprdr_server_format_data_response(CliprdrClientContext switch (rfi->clipboard.format) { case CF_UNICODETEXT: { - size = ConvertFromUnicode(CP_UTF8, 0, (WCHAR *)data, size / 2, (CHAR **)&output, 0, NULL, NULL); - crlf2lf(output, &size); + size = 0; + output = + g_utf16_to_utf8((const WCHAR *)data, size / sizeof(WCHAR), NULL, NULL, NULL); + if (output) { + size = strlen(output) + 1; + crlf2lf(output, &size); + } break; } @@ -764,8 +785,13 @@ CLIPRDR_FORMAT_LIST *remmina_rdp_cliprdr_get_client_format_list(RemminaProtocolW if (result) g_free(targets); +#if FREERDP_VERSION_MAJOR >= 3 + retp->pFormatList.common.msgType = CB_FORMAT_LIST; + retp->pFormatList.common.msgFlags = 0; +#else retp->pFormatList.msgType = CB_FORMAT_LIST; retp->pFormatList.msgFlags = 0; +#endif return (CLIPRDR_FORMAT_LIST *)retp; } @@ -821,9 +847,12 @@ void remmina_rdp_cliprdr_get_clipboard_data(RemminaProtocolWidget *gp, RemminaPl } case CF_UNICODETEXT: { - size = strlen((char *)inbuf); + size = strlen((const char *)inbuf); inbuf = lf2crlf(inbuf, &size); - size = (ConvertToUnicode(CP_UTF8, 0, (CHAR *)inbuf, -1, (WCHAR **)&outbuf, 0)) * sizeof(WCHAR); + outbuf = g_utf8_to_utf16((const char *)inbuf, size, NULL, NULL, NULL); + size = 0; + if (outbuf) + size = _wcslen((const char*)outbuf); g_free(inbuf); break; } diff --git a/plugins/rdp/rdp_event.c b/plugins/rdp/rdp_event.c index 88f1802e6..19b349c22 100644 --- a/plugins/rdp/rdp_event.c +++ b/plugins/rdp/rdp_event.c @@ -122,7 +122,7 @@ static gboolean remmina_rdp_event_on_focus_in(GtkWidget *widget, GdkEventKey *ev if (!rfi || !rfi->connected || rfi->is_reconnecting) return FALSE; - input = rfi->instance->input; + input = rfi->clientContext.context.input; UINT32 toggle_keys_state = 0; #if GTK_CHECK_VERSION(3, 20, 0) @@ -437,8 +437,8 @@ static gboolean remmina_rdp_event_delayed_monitor_layout(RemminaProtocolWidget * } rdp_event.type = REMMINA_RDP_EVENT_TYPE_SEND_MONITOR_LAYOUT; if (remmina_plugin_service->file_get_int(remminafile, "multimon", FALSE)) { - const rdpMonitor *base = freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); - for (gint i = 0; i < freerdp_settings_get_uint32(rfi->settings, FreeRDP_MonitorCount); ++i) { + const rdpMonitor *base = freerdp_settings_get_pointer(rfi->clientContext.context.settings, FreeRDP_MonitorDefArray); + for (gint i = 0; i < freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_MonitorCount); ++i) { const rdpMonitor *current = &base[i]; REMMINA_PLUGIN_DEBUG("Sending display layout n° %d", i); rdp_event.monitor_layout.Flags = current->is_primary; @@ -1186,7 +1186,7 @@ static void remmina_rdp_event_connected(RemminaProtocolWidget *gp, RemminaPlugin remmina_rdp_event_update_scale(gp); remmina_plugin_service->protocol_plugin_signal_connection_opened(gp); - const gchar *host = freerdp_settings_get_string (rfi->settings, FreeRDP_ServerHostname); + const gchar *host = freerdp_settings_get_string (rfi->clientContext.context.settings, FreeRDP_ServerHostname); // TRANSLATORS: the placeholder may be either an IP/FQDN or a server hostname REMMINA_PLUGIN_AUDIT(_("Connected to %s via RDP"), host); } diff --git a/plugins/rdp/rdp_graphics.c b/plugins/rdp/rdp_graphics.c index 68e64c12c..b97f30e1a 100644 --- a/plugins/rdp/rdp_graphics.c +++ b/plugins/rdp/rdp_graphics.c @@ -47,142 +47,14 @@ //#define RF_BITMAP //#define RF_GLYPH -/* Bitmap Class */ - -BOOL rf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - UINT8* data; - Pixmap pixmap; - XImage* image; - rfContext* rfi = (rfContext*)context; - - XSetFunction(rfi->display, rfi->gc, GXcopy); - pixmap = XCreatePixmap(rfi->display, rfi->drawable, bitmap->width, bitmap->height, rfi->depth); - - if (bitmap->data != NULL) { - data = freerdp_image_convert(bitmap->data, NULL, - bitmap->width, bitmap->height, rfi->srcBpp, rfi->bpp, rfi->clrconv); - - if (bitmap->ephemeral != TRUE) { - image = XCreateImage(rfi->display, rfi->visual, rfi->depth, - ZPixmap, 0, (char*)data, bitmap->width, bitmap->height, rfi->scanline_pad, 0); - - XPutImage(rfi->display, pixmap, rfi->gc, image, 0, 0, 0, 0, bitmap->width, bitmap->height); - XFree(image); - - if (data != bitmap->data) && (data != NULL) - free(data); - }else { - if (data != bitmap->data) && (data != NULL) - free(bitmap->data); - - bitmap->data = data; - } - } - - ((rfBitmap*)bitmap)->pixmap = pixmap; -#endif - return TRUE; -} - -void rf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - rfContext* rfi = (rfContext*)context; - - printf("rf_Bitmap_Free\n"); - - if (((rfBitmap*)bitmap)->pixmap != 0) - XFreePixmap(rfi->display, ((rfBitmap*)bitmap)->pixmap); -#endif -} - -BOOL rf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - XImage* image; - int width, height; - rfContext* rfi = (rfContext*)context; - - printf("rf_Bitmap_Paint\n"); - - width = bitmap->right - bitmap->left + 1; - height = bitmap->bottom - bitmap->top + 1; - - XSetFunction(rfi->display, rfi->gc, GXcopy); - - image = XCreateImage(rfi->display, rfi->visual, rfi->depth, - ZPixmap, 0, (char*)bitmap->data, bitmap->width, bitmap->height, rfi->scanline_pad, 0); - - XPutImage(rfi->display, rfi->primary, rfi->gc, - image, 0, 0, bitmap->left, bitmap->top, width, height); - - XFree(image); - - //XCopyArea(rfi->display, rfi->primary, rfi->drawable, rfi->gc, - // bitmap->left, bitmap->top, width, height, bitmap->left, bitmap->top); - - //gdi_InvalidateRegion(rfi->hdc, bitmap->left, bitmap->top, width, height); -#endif - return FALSE; -} - -BOOL rf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, - const BYTE* data, UINT32 width, UINT32 height, UINT32 bpp, UINT32 length, BOOL compressed, UINT32 codec_id) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - UINT16 size; - - printf("rf_Bitmap_Decompress\n"); - - size = width * height * (bpp + 7) / 8; - - if (bitmap->data == NULL) - bitmap->data = (UINT8*)xmalloc(size); - else - bitmap->data = (UINT8*)xrealloc(bitmap->data, size); - - if (compressed) { - BOOL status; - - status = bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp); - - if (status != TRUE) { - printf("Bitmap Decompression Failed\n"); - } - }else { - freerdp_image_flip(data, bitmap->data, width, height, bpp); - } - - bitmap->compressed = FALSE; - bitmap->length = size; - bitmap->bpp = bpp; -#endif - return TRUE; -} - -BOOL rf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - rfContext* rfi = (rfContext*)context; - - if (primary) - rfi->drawing = rfi->primary; - else - rfi->drawing = ((rfBitmap*)bitmap)->pixmap; -#endif - return TRUE; -} - /* Pointer Class */ +#if FREERDP_VERSION_MAJOR < 3 +#define CONST_ARG const +#else +#define CONST_ARG +#endif -BOOL rf_Pointer_New(rdpContext* context, rdpPointer* pointer) +static BOOL rf_Pointer_New(rdpContext* context, rdpPointer* pointer) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -199,7 +71,7 @@ BOOL rf_Pointer_New(rdpContext* context, rdpPointer* pointer) return FALSE; } -void rf_Pointer_Free(rdpContext* context, rdpPointer* pointer) +static void rf_Pointer_Free(rdpContext* context, rdpPointer* pointer) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -216,7 +88,7 @@ void rf_Pointer_Free(rdpContext* context, rdpPointer* pointer) } } -BOOL rf_Pointer_Set(rdpContext* context, const rdpPointer* pointer) +static BOOL rf_Pointer_Set(rdpContext* context, CONST_ARG rdpPointer* pointer) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -231,7 +103,7 @@ BOOL rf_Pointer_Set(rdpContext* context, const rdpPointer* pointer) } -BOOL rf_Pointer_SetNull(rdpContext* context) +static BOOL rf_Pointer_SetNull(rdpContext* context) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -244,7 +116,7 @@ BOOL rf_Pointer_SetNull(rdpContext* context) return remmina_rdp_event_queue_ui_sync_retint(rfi->protocol_widget, ui) ? TRUE : FALSE; } -BOOL rf_Pointer_SetDefault(rdpContext* context) +static BOOL rf_Pointer_SetDefault(rdpContext* context) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -257,7 +129,7 @@ BOOL rf_Pointer_SetDefault(rdpContext* context) return remmina_rdp_event_queue_ui_sync_retint(rfi->protocol_widget, ui) ? TRUE : FALSE; } -BOOL rf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) +static BOOL rf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -271,169 +143,21 @@ BOOL rf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) return remmina_rdp_event_queue_ui_sync_retint(rfi->protocol_widget, ui) ? TRUE : FALSE; } -/* Glyph Class */ - -BOOL rf_Glyph_New(rdpContext* context, const rdpGlyph* glyph) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - int scanline; - XImage* image; - rfContext* rfi; - rfGlyph* rf_glyph; - - rf_glyph = (rfGlyph*)glyph; - rfi = (rfContext*)context; - - scanline = (glyph->cx + 7) / 8; - - rf_glyph->pixmap = XCreatePixmap(rfi->display, rfi->drawing, glyph->cx, glyph->cy, 1); - - image = XCreateImage(rfi->display, rfi->visual, 1, - ZPixmap, 0, (char*)glyph->aj, glyph->cx, glyph->cy, 8, scanline); - - image->byte_order = MSBFirst; - image->bitmap_bit_order = MSBFirst; - - XInitImage(image); - XPutImage(rfi->display, rf_glyph->pixmap, rfi->gc_mono, image, 0, 0, 0, 0, glyph->cx, glyph->cy); - XFree(image); -#endif - return TRUE; -} - -void rf_Glyph_Free(rdpContext* context, rdpGlyph* glyph) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - rfContext* rfi = (rfContext*)context; - - if (((rfGlyph*)glyph)->pixmap != 0) - XFreePixmap(rfi->display, ((rfGlyph*)glyph)->pixmap); -#endif -} - -static BOOL rf_Glyph_Draw(rdpContext* context, const rdpGlyph* glyph, INT32 x, - INT32 y, INT32 w, INT32 h, INT32 sx, INT32 sy, - BOOL fOpRedundant) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - rfGlyph* rf_glyph; - rfContext* rfi = (rfContext*)context; - - rf_glyph = (rfGlyph*)glyph; - - XSetStipple(rfi->display, rfi->gc, rf_glyph->pixmap); - XSetTSOrigin(rfi->display, rfi->gc, x, y); - XFillRectangle(rfi->display, rfi->drawing, rfi->gc, x, y, glyph->cx, glyph->cy); - XSetStipple(rfi->display, rfi->gc, rfi->bitmap_mono); -#endif - return TRUE; -} - -static BOOL rf_Glyph_BeginDraw(rdpContext* context, INT32 x, INT32 y, - INT32 width, INT32 height, UINT32 bgcolor, - UINT32 fgcolor, BOOL fOpRedundant) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - rfContext* rfi = (rfContext*)context; - - bgcolor = (rfi->clrconv->invert) ? - freerdp_color_convert_var_bgr(bgcolor, rfi->srcBpp, 32, rfi->clrconv) : - freerdp_color_convert_var_rgb(bgcolor, rfi->srcBpp, 32, rfi->clrconv); - - fgcolor = (rfi->clrconv->invert) ? - freerdp_color_convert_var_bgr(fgcolor, rfi->srcBpp, 32, rfi->clrconv) : - freerdp_color_convert_var_rgb(fgcolor, rfi->srcBpp, 32, rfi->clrconv); - - XSetFunction(rfi->display, rfi->gc, GXcopy); - XSetFillStyle(rfi->display, rfi->gc, FillSolid); - XSetForeground(rfi->display, rfi->gc, fgcolor); - XFillRectangle(rfi->display, rfi->drawing, rfi->gc, x, y, width, height); - - XSetForeground(rfi->display, rfi->gc, bgcolor); - XSetBackground(rfi->display, rfi->gc, fgcolor); - XSetFillStyle(rfi->display, rfi->gc, FillStippled); -#endif - return TRUE; -} - -static BOOL rf_Glyph_EndDraw(rdpContext* context, INT32 x, INT32 y, - INT32 width, INT32 height, - UINT32 bgcolor, UINT32 fgcolor) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - rfContext* rfi = (rfContext*)context; - - if (rfi->drawing == rfi->primary) { - //XCopyArea(rfi->display, rfi->primary, rfi->drawable, rfi->gc, x, y, width, height, x, y); - //gdi_InvalidateRegion(rfi->hdc, x, y, width, height); - } -#endif - return TRUE; -} - /* Graphics Module */ void rf_register_graphics(rdpGraphics* graphics) { TRACE_CALL(__func__); - rdpBitmap* bitmap; - rdpPointer* pointer; - rdpGlyph* glyph; - - bitmap = (rdpBitmap*)malloc(sizeof(rdpBitmap)); - ZeroMemory(bitmap, sizeof(rdpBitmap)); -#ifdef RF_BITMAP - bitmap->size = sizeof(rfBitmap); -#else - bitmap->size = 0; -#endif - - bitmap->New = rf_Bitmap_New; - bitmap->Free = rf_Bitmap_Free; - bitmap->Paint = rf_Bitmap_Paint; - bitmap->Decompress = rf_Bitmap_Decompress; - bitmap->SetSurface = rf_Bitmap_SetSurface; - - graphics_register_bitmap(graphics, bitmap); - free(bitmap); - - pointer = (rdpPointer*)malloc(sizeof(rdpPointer)); - ZeroMemory(pointer, sizeof(rdpPointer)); - - pointer->size = sizeof(rfPointer); - - pointer->New = rf_Pointer_New; - pointer->Free = rf_Pointer_Free; - pointer->Set = rf_Pointer_Set; - pointer->SetNull = rf_Pointer_SetNull; - pointer->SetDefault = rf_Pointer_SetDefault; - pointer->SetPosition = rf_Pointer_SetPosition; - - graphics_register_pointer(graphics, pointer); - - free(pointer); - - glyph = (rdpGlyph*)malloc(sizeof(rdpGlyph)); - ZeroMemory(glyph, sizeof(rdpGlyph)); - -#ifdef RF_GLYPH - glyph->size = sizeof(rfGlyph); -#else - glyph->size = 0; -#endif + rdpPointer pointer={0}; - glyph->New = rf_Glyph_New; - glyph->Free = rf_Glyph_Free; - glyph->Draw = rf_Glyph_Draw; - glyph->BeginDraw = rf_Glyph_BeginDraw; - glyph->EndDraw = rf_Glyph_EndDraw; + pointer.size = sizeof(rfPointer); - graphics_register_glyph(graphics, glyph); + pointer.New = rf_Pointer_New; + pointer.Free = rf_Pointer_Free; + pointer.Set = rf_Pointer_Set; + pointer.SetNull = rf_Pointer_SetNull; + pointer.SetDefault = rf_Pointer_SetDefault; + pointer.SetPosition = rf_Pointer_SetPosition; - free(glyph); + graphics_register_pointer(graphics, &pointer); } diff --git a/plugins/rdp/rdp_monitor.c b/plugins/rdp/rdp_monitor.c index 384cdb496..4aaf4133b 100644 --- a/plugins/rdp/rdp_monitor.c +++ b/plugins/rdp/rdp_monitor.c @@ -87,10 +87,10 @@ void remmina_rdp_monitor_get (rfContext *rfi, gchar **monitorids, guint32 *maxwi GdkRectangle tempgeom = { 0, 0, 0, 0 }; GdkRectangle destgeom = { 0, 0, 0, 0 }; rdpSettings* settings; - if (!rfi || !rfi->settings) + if (!rfi || !rfi->clientContext.context.settings) return; - settings = rfi->settings; + settings = rfi->clientContext.context.settings; *maxwidth = freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth); *maxheight = freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight); @@ -226,6 +226,6 @@ void remmina_rdp_monitor_get (rfContext *rfi, gchar **monitorids, guint32 *maxwi *maxheight = destgeom.height; REMMINA_PLUGIN_DEBUG("maxw and maxh: %ux%u", *maxwidth, *maxheight); if (n_monitors > 1) - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportMonitorLayoutPdu, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportMonitorLayoutPdu, TRUE); *monitorids = g_strdup(buffer); } diff --git a/plugins/rdp/rdp_plugin.c b/plugins/rdp/rdp_plugin.c index d3af594f2..c53c05445 100644 --- a/plugins/rdp/rdp_plugin.c +++ b/plugins/rdp/rdp_plugin.c @@ -57,19 +57,24 @@ #else #include <cairo/cairo.h> #endif +#include <ctype.h> #include <freerdp/addin.h> #include <freerdp/assistance.h> -#include <freerdp/settings.h> -#include <freerdp/freerdp.h> -#include <freerdp/constants.h> -#include <freerdp/client/cliprdr.h> +#if FREERDP_VERSION_MAJOR >= 3 +#include <freerdp/channels/rdp2tcp.h> +#else +#define RDP2TCP_DVC_CHANNEL_NAME "rdp2tcp" +#endif #include <freerdp/client/channels.h> +#include <freerdp/client/cliprdr.h> #include <freerdp/client/cmdline.h> +#include <freerdp/constants.h> #include <freerdp/error.h> #include <freerdp/event.h> -#include <winpr/memory.h> +#include <freerdp/freerdp.h> +#include <freerdp/settings.h> #include <winpr/cmdline.h> -#include <ctype.h> +#include <winpr/memory.h> #ifdef HAVE_CUPS #include <cups/cups.h> @@ -102,12 +107,36 @@ #define REMMINA_CONNECTION_TYPE_NONE 0 -#ifdef WITH_FREERDP3 +#if FREERDP_VERSION_MAJOR >= 3 #define CLPARAM const char #else #define CLPARAM char #endif +#if FREERDP_VERSION_MAJOR < 3 +static HANDLE freerdp_abort_event(rdpContext* context) { + WINPR_ASSERT(context); + return context->abortEvent; +} + +static BOOL freerdp_settings_set_pointer_len(rdpSettings* settings, size_t id, const void* data, size_t len) +{ + switch(id) { + case FreeRDP_LoadBalanceInfo: + free(settings->LoadBalanceInfo); + settings->LoadBalanceInfo = _strdup(data); + settings->LoadBalanceInfoLength = len; + return TRUE; + default: + return FALSE; + } +} + +static void freerdp_abort_connect_context(rdpContext* context) { + WINPR_ASSERT(context); + freerdp_abort_connect(context->instance); +} +#endif RemminaPluginService *remmina_plugin_service = NULL; @@ -224,7 +253,7 @@ static BOOL rf_process_event_queue(RemminaProtocolWidget *gp) if (rfi->event_queue == NULL) return true; - input = rfi->instance->input; + input = rfi->clientContext.context.input; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); @@ -266,10 +295,18 @@ static BOOL rf_process_event_queue(RemminaProtocolWidget *gp) break; case REMMINA_RDP_EVENT_TYPE_CLIPBOARD_SEND_CLIENT_FORMAT_DATA_RESPONSE: - response.msgFlags = (event->clipboard_formatdataresponse.data) ? CB_RESPONSE_OK : CB_RESPONSE_FAIL; + { + UINT32 msgFlags = (event->clipboard_formatdataresponse.data) ? CB_RESPONSE_OK : CB_RESPONSE_FAIL; +#if FREERDP_VERSION_MAJOR >= 3 + response.common.msgFlags = msgFlags; + response.common.dataLen = event->clipboard_formatdataresponse.size; +#else + response.msgFlags = msgFlags; response.dataLen = event->clipboard_formatdataresponse.size; +#endif response.requestedFormatData = event->clipboard_formatdataresponse.data; rfi->clipboard.context->ClientFormatDataResponse(rfi->clipboard.context, &response); + } break; case REMMINA_RDP_EVENT_TYPE_CLIPBOARD_SEND_CLIENT_FORMAT_DATA_REQUEST: @@ -281,18 +318,18 @@ static BOOL rf_process_event_queue(RemminaProtocolWidget *gp) case REMMINA_RDP_EVENT_TYPE_SEND_MONITOR_LAYOUT: if (remmina_plugin_service->file_get_int(remminafile, "multimon", FALSE)) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_UseMultimon, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_UseMultimon, TRUE); /* TODO Add an option for this */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_ForceMultimon, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_Fullscreen, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ForceMultimon, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_Fullscreen, TRUE); /* got some crashes with g_malloc0, to be investigated */ - dcml = calloc(freerdp_settings_get_uint32(rfi->settings, FreeRDP_MonitorCount), sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT)); + dcml = calloc(freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_MonitorCount), sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT)); REMMINA_PLUGIN_DEBUG("REMMINA_RDP_EVENT_TYPE_SEND_MONITOR_LAYOUT:"); if (!dcml) break; - const rdpMonitor *base = freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); - for (gint i = 0; i < freerdp_settings_get_uint32(rfi->settings, FreeRDP_MonitorCount); ++i) { + const rdpMonitor *base = freerdp_settings_get_pointer(rfi->clientContext.context.settings, FreeRDP_MonitorDefArray); + for (gint i = 0; i < freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_MonitorCount); ++i) { const rdpMonitor *current = &base[i]; REMMINA_PLUGIN_DEBUG("Sending display layout for monitor n° %d", i); dcml[i].Flags = (current->is_primary ? DISPLAY_CONTROL_MONITOR_PRIMARY : 0); @@ -317,7 +354,7 @@ static BOOL rf_process_event_queue(RemminaProtocolWidget *gp) dcml[i].DesktopScaleFactor = event->monitor_layout.desktopScaleFactor; dcml[i].DeviceScaleFactor = event->monitor_layout.deviceScaleFactor; } - rfi->dispcontext->SendMonitorLayout(rfi->dispcontext, freerdp_settings_get_uint32(rfi->settings, FreeRDP_MonitorCount), dcml); + rfi->dispcontext->SendMonitorLayout(rfi->dispcontext, freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_MonitorCount), dcml); g_free(dcml); } else { dcml = g_malloc0(sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT)); @@ -335,7 +372,7 @@ static BOOL rf_process_event_queue(RemminaProtocolWidget *gp) break; case REMMINA_RDP_EVENT_DISCONNECT: /* Disconnect requested via GUI (i.e: tab destroy/close) */ - freerdp_abort_connect(rfi->instance); + freerdp_abort_connect_context(&rfi->clientContext.context); break; } @@ -382,13 +419,13 @@ static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp) /* settings->CertificateName and settings->ServerHostname is created * only on 1st connect, not on reconnections */ - freerdp_settings_set_string(rfi->settings, FreeRDP_ServerHostname, host); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname, host); if (cert_port == 3389) { - freerdp_settings_set_string(rfi->settings, FreeRDP_CertificateName, cert_host); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_CertificateName, cert_host); } else { s = g_strdup_printf("%s:%d", cert_host, cert_port); - freerdp_settings_set_string(rfi->settings, FreeRDP_CertificateName, s); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_CertificateName, s); g_free(s); } } @@ -399,7 +436,7 @@ static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp) g_free(host); g_free(hostport); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ServerPort, port); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ServerPort, port); return TRUE; } @@ -407,7 +444,7 @@ static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp) static BOOL rf_auto_reconnect(rfContext *rfi) { TRACE_CALL(__func__); - rdpSettings *settings = rfi->instance->settings; + rdpSettings *settings = rfi->clientContext.context.settings; RemminaPluginRdpUiObject *ui; time_t treconn; gchar *cval; @@ -439,7 +476,7 @@ static BOOL rf_auto_reconnect(rfContext *rfi) rfi->reconnect_nattempt = 0; /* Only auto reconnect on network disconnects. */ - switch (freerdp_error_info(rfi->instance)) { + switch (freerdp_error_info(rfi->clientContext.context.instance)) { case ERRINFO_GRAPHICS_SUBSYSTEM_FAILED: /* Disconnected by server hitting a bug or resource limit */ break; @@ -459,7 +496,7 @@ static BOOL rf_auto_reconnect(rfContext *rfi) /* A network disconnect was detected and we should try to reconnect */ REMMINA_PLUGIN_DEBUG("[%s] network disconnection detected, initiating reconnection attempt", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); ui = g_new0(RemminaPluginRdpUiObject, 1); ui->type = REMMINA_RDP_UI_RECONNECT_PROGRESS; @@ -476,19 +513,19 @@ static BOOL rf_auto_reconnect(rfContext *rfi) /* Quit retrying if max retries has been exceeded */ if (rfi->reconnect_nattempt++ >= rfi->reconnect_maxattempts) { REMMINA_PLUGIN_DEBUG("[%s] maximum number of reconnection attempts exceeded.", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; } if (rfi->stop_reconnecting_requested) { REMMINA_PLUGIN_DEBUG("[%s] reconnect request loop interrupted by user.", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; } /* Attempt the next reconnect */ REMMINA_PLUGIN_DEBUG("[%s] reconnection, attempt #%d of %d", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname), rfi->reconnect_nattempt, rfi->reconnect_maxattempts); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname), rfi->reconnect_nattempt, rfi->reconnect_maxattempts); ui = g_new0(RemminaPluginRdpUiObject, 1); ui->type = REMMINA_RDP_UI_RECONNECT_PROGRESS; @@ -499,11 +536,11 @@ static BOOL rf_auto_reconnect(rfContext *rfi) /* Reconnect the SSH tunnel, if needed */ if (!remmina_rdp_tunnel_init(rfi->protocol_widget)) { REMMINA_PLUGIN_DEBUG("[%s] unable to recreate tunnel with remmina_rdp_tunnel_init.", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); } else { - if (freerdp_reconnect(rfi->instance)) { + if (freerdp_reconnect(rfi->clientContext.context.instance)) { /* Reconnection is successful */ - REMMINA_PLUGIN_DEBUG("[%s] reconnected.", freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + REMMINA_PLUGIN_DEBUG("[%s] reconnected.", freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); rfi->is_reconnecting = FALSE; return TRUE; } @@ -594,8 +631,8 @@ static BOOL rf_desktop_resize(rdpContext *context) rfi = (rfContext *)context; gp = rfi->protocol_widget; - w = freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth); - h = freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopHeight); + w = freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth); + h = freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight); remmina_plugin_service->protocol_plugin_set_width(gp, w); remmina_plugin_service->protocol_plugin_set_height(gp, h); @@ -685,7 +722,7 @@ static BOOL remmina_rdp_pre_connect(freerdp *instance) rdpSettings *settings; rdpContext *context = instance->context; - settings = instance->settings; + settings = context->settings; channels = context->channels; freerdp_settings_set_uint32(settings, FreeRDP_OsMajorType, OSMAJORTYPE_UNIX); freerdp_settings_set_uint32(settings, FreeRDP_OsMinorType, OSMINORTYPE_UNSPECIFIED); @@ -717,9 +754,9 @@ static BOOL remmina_rdp_post_connect(freerdp *instance) rfi->attempt_interactive_authentication = FALSE; // We authenticated! - rfi->srcBpp = freerdp_settings_get_uint32(rfi->settings, FreeRDP_ColorDepth); + rfi->srcBpp = freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth); - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_RemoteFxCodec) == FALSE) + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_RemoteFxCodec) == FALSE) rfi->sw_gdi = TRUE; rf_register_graphics(instance->context->graphics); @@ -752,21 +789,21 @@ static BOOL remmina_rdp_post_connect(freerdp *instance) return FALSE; } - if (instance->context->codecs->h264 == NULL && freerdp_settings_get_bool(rfi->settings, FreeRDP_GfxH264)) { + if (instance->context->codecs->h264 == NULL && freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_GfxH264)) { gdi_free(instance); rfi->postconnect_error = REMMINA_POSTCONNECT_ERROR_NO_H264; return FALSE; } // pointer_cache_register_callbacks(instance->update); + rdpUpdate *update = instance->context->update; + update->BeginPaint = rf_begin_paint; + update->EndPaint = rf_end_paint; + update->DesktopResize = rf_desktop_resize; - instance->update->BeginPaint = rf_begin_paint; - instance->update->EndPaint = rf_end_paint; - instance->update->DesktopResize = rf_desktop_resize; - - instance->update->PlaySound = rf_play_sound; - instance->update->SetKeyboardIndicators = rf_keyboard_set_indicators; - instance->update->SetKeyboardImeStatus = rf_keyboard_set_ime_status; + update->PlaySound = rf_play_sound; + update->SetKeyboardIndicators = rf_keyboard_set_indicators; + update->SetKeyboardImeStatus = rf_keyboard_set_ime_status; remmina_rdp_clipboard_init(rfi); rfi->connected = true; @@ -803,13 +840,13 @@ static BOOL remmina_rdp_authenticate(freerdp *instance, char **username, char ** NULL); if (ret == GTK_RESPONSE_OK) { s_username = remmina_plugin_service->protocol_plugin_init_get_username(gp); - if (s_username) freerdp_settings_set_string(rfi->settings, FreeRDP_Username, s_username); + if (s_username) freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Username, s_username); s_password = remmina_plugin_service->protocol_plugin_init_get_password(gp); - if (s_password) freerdp_settings_set_string(rfi->settings, FreeRDP_Password, s_password); + if (s_password) freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Password, s_password); s_domain = remmina_plugin_service->protocol_plugin_init_get_domain(gp); - if (s_domain) freerdp_settings_set_string(rfi->settings, FreeRDP_Domain, s_domain); + if (s_domain) freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Domain, s_domain); remmina_plugin_service->file_set_string(remminafile, "username", s_username); remmina_plugin_service->file_set_string(remminafile, "domain", s_domain); @@ -879,13 +916,13 @@ static BOOL remmina_rdp_gw_authenticate(freerdp *instance, char **username, char if (ret == GTK_RESPONSE_OK) { s_username = remmina_plugin_service->protocol_plugin_init_get_username(gp); - if (s_username) freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayUsername, s_username); + if (s_username) freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayUsername, s_username); s_password = remmina_plugin_service->protocol_plugin_init_get_password(gp); - if (s_password) freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayPassword, s_password); + if (s_password) freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayPassword, s_password); s_domain = remmina_plugin_service->protocol_plugin_init_get_domain(gp); - if (s_domain) freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayDomain, s_domain); + if (s_domain) freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayDomain, s_domain); save = remmina_plugin_service->protocol_plugin_init_get_savepassword(gp); @@ -1007,21 +1044,25 @@ static void remmina_rdp_main_loop(RemminaProtocolWidget *gp) int jitter_time = remmina_plugin_service->file_get_int(remminafile, "rdp_mouse_jitter", 0); time(&last_time); - while (!freerdp_shall_disconnect(rfi->instance)) { - //move mouse if we've been idle and option is selected +#if FREERDP_VERSION_MAJOR >= 3 + while (!freerdp_shall_disconnect_context(&rfi->clientContext.context)) { +#else + while (!freerdp_shall_disconnect(rfi->clientContext.context.instance)) { +#endif + // move mouse if we've been idle and option is selected time(&cur_time); time_diff = cur_time - last_time; if (jitter_time > 0 && time_diff > jitter_time){ last_time = cur_time; remmina_rdp_mouse_jitter(gp); } - - HANDLE handles[64]={0}; - DWORD nCount = freerdp_get_event_handles(rfi->instance->context, &handles[0], 64); + + HANDLE handles[MAXIMUM_WAIT_OBJECTS] = {0}; + DWORD nCount = freerdp_get_event_handles(&rfi->clientContext.context, &handles[0], ARRAYSIZE(handles)); if (rfi->event_handle) handles[nCount++] = rfi->event_handle; - handles[nCount++] = rfi->instance->context->abortEvent; + handles[nCount++] = freerdp_abort_event(&rfi->clientContext.context); if (nCount == 0) { fprintf(stderr, "freerdp_get_event_handles failed\n"); @@ -1045,25 +1086,25 @@ static void remmina_rdp_main_loop(RemminaProtocolWidget *gp) } /* Check if a processed event called freerdp_abort_connect() and exit if true */ - if (WaitForSingleObject(rfi->instance->context->abortEvent, 0) == WAIT_OBJECT_0) + if (WaitForSingleObject(freerdp_abort_event(&rfi->clientContext.context), 0) == WAIT_OBJECT_0) /* Session disconnected by local user action */ break; - if (!freerdp_check_event_handles(rfi->instance->context)) { + if (!freerdp_check_event_handles(&rfi->clientContext.context)) { if (rf_auto_reconnect(rfi)) { /* Reset the possible reason/error which made us doing many reconnection reattempts and continue */ remmina_plugin_service->protocol_plugin_set_error(gp, NULL); continue; } - if (freerdp_get_last_error(rfi->instance->context) == FREERDP_ERROR_SUCCESS) + if (freerdp_get_last_error(&rfi->clientContext.context) == FREERDP_ERROR_SUCCESS) fprintf(stderr, "Could not check FreeRDP file descriptor\n"); break; } } - const gchar *host = freerdp_settings_get_string (rfi->settings, FreeRDP_ServerHostname); + const gchar *host = freerdp_settings_get_string (rfi->clientContext.context.settings, FreeRDP_ServerHostname); // TRANSLATORS: the placeholder may be either an IP/FQDN or a server hostname REMMINA_PLUGIN_AUDIT(_("Disconnected from %s via RDP"), host); - freerdp_disconnect(rfi->instance); + freerdp_disconnect(rfi->clientContext.context.instance); REMMINA_PLUGIN_DEBUG("RDP client disconnected"); } @@ -1194,7 +1235,7 @@ static int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t RDPDR_PRINTER *printer; printer = (RDPDR_PRINTER *)calloc(1, sizeof(RDPDR_PRINTER)); -#ifdef WITH_FREERDP3 +#if FREERDP_VERSION_MAJOR >= 3 RDPDR_DEVICE *pdev; pdev = &(printer->device); #else @@ -1205,8 +1246,8 @@ static int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t pdev->Type = RDPDR_DTYP_PRINT; REMMINA_PLUGIN_DEBUG("Printer Type: %d", pdev->Type); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RedirectPrinters, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_DeviceRedirection, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RedirectPrinters, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_DeviceRedirection, TRUE); REMMINA_PLUGIN_DEBUG("Destination: %s", dest->name); if (!(pdev->Name = _strdup(dest->name))) { @@ -1238,7 +1279,7 @@ static int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t } REMMINA_PLUGIN_DEBUG("Printer Driver: %s", printer->DriverName); - if (!freerdp_device_collection_add(rfi->settings, (RDPDR_DEVICE *)printer)) { + if (!freerdp_device_collection_add(rfi->clientContext.context.settings, (RDPDR_DEVICE *)printer)) { free(printer->DriverName); free(pdev->Name); free(printer); @@ -1382,7 +1423,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) gint desktopOrientation, desktopScaleFactor, deviceScaleFactor; - channels = rfi->instance->context->channels; + channels = rfi->clientContext.context.channels; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); @@ -1394,7 +1435,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) if ((datapath != NULL) && (datapath[0] != '\0')) if (access(datapath, W_OK) == 0) - freerdp_settings_set_string(rfi->settings, FreeRDP_ConfigPath, datapath); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_ConfigPath, datapath); g_free(datapath); if (remmina_plugin_service->file_get_int(remminafile, "assistance_mode", 0)){ @@ -1421,7 +1462,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) } - if (!freerdp_assistance_populate_settings_from_assistance_file(file, rfi->settings)){ + if (!freerdp_assistance_populate_settings_from_assistance_file(file, rfi->clientContext.context.settings)){ REMMINA_PLUGIN_DEBUG("Could not populate settings from assistance file"); return FALSE; } @@ -1431,72 +1472,72 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) #if defined(PROXY_TYPE_IGNORE) if (!remmina_plugin_service->file_get_int(remminafile, "useproxyenv", FALSE) ? TRUE : FALSE) { REMMINA_PLUGIN_DEBUG("Not using system proxy settings"); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE); } #endif if (!remmina_rdp_tunnel_init(gp)) return FALSE; - freerdp_settings_set_bool(rfi->settings, FreeRDP_AutoReconnectionEnabled, (remmina_plugin_service->file_get_int(remminafile, "disableautoreconnect", FALSE) ? FALSE : TRUE)); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AutoReconnectionEnabled, (remmina_plugin_service->file_get_int(remminafile, "disableautoreconnect", FALSE) ? FALSE : TRUE)); /* Disable RDP auto reconnection when SSH tunnel is enabled */ if (remmina_plugin_service->file_get_int(remminafile, "ssh_tunnel_enabled", FALSE)) - freerdp_settings_set_bool(rfi->settings, FreeRDP_AutoReconnectionEnabled, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AutoReconnectionEnabled, FALSE); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, remmina_plugin_service->file_get_int(remminafile, "colordepth", 99)); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, remmina_plugin_service->file_get_int(remminafile, "colordepth", 99)); - freerdp_settings_set_bool(rfi->settings, FreeRDP_SoftwareGdi, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SoftwareGdi, TRUE); REMMINA_PLUGIN_DEBUG("gfx_h264_available: %d", gfx_h264_available); /* Avoid using H.264 modes if they are not available on libfreerdp */ - if (!gfx_h264_available && (freerdp_settings_get_bool(rfi->settings, FreeRDP_ColorDepth) == 65 || freerdp_settings_get_bool(rfi->settings, FreeRDP_ColorDepth == 66))) - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 64); // Fallback to GFX RFX + if (!gfx_h264_available && (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth) == 65 || freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_ColorDepth == 66))) + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, 64); // Fallback to GFX RFX - if (freerdp_settings_get_uint32(rfi->settings, FreeRDP_ColorDepth) == 0) { + if (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth) == 0) { /* RFX (Win7)*/ - freerdp_settings_set_bool(rfi->settings, FreeRDP_RemoteFxCodec, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline, FALSE); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 32); - } else if (freerdp_settings_get_uint32(rfi->settings, FreeRDP_ColorDepth) == 63) { + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RemoteFxCodec, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline, FALSE); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, 32); + } else if (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth) == 63) { /* /gfx (RFX Progressive) (Win8) */ - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 32); - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxH264, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxAVC444, FALSE); - } else if (freerdp_settings_get_uint32(rfi->settings, FreeRDP_ColorDepth) == 64) { + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, 32); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxH264, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxAVC444, FALSE); + } else if (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth) == 64) { /* /gfx:rfx (Win8) */ - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 32); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RemoteFxCodec, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxH264, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxAVC444, FALSE); - } else if (freerdp_settings_get_uint32(rfi->settings, FreeRDP_ColorDepth) == 65) { + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, 32); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RemoteFxCodec, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxH264, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxAVC444, FALSE); + } else if (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth) == 65) { /* /gfx:avc420 (Win8.1) */ - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 32); - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxH264, gfx_h264_available); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxAVC444, FALSE); - } else if (freerdp_settings_get_uint32(rfi->settings, FreeRDP_ColorDepth) == 66) { + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, 32); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxH264, gfx_h264_available); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxAVC444, FALSE); + } else if (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth) == 66) { /* /gfx:avc444 (Win10) */ - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 32); - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxH264, gfx_h264_available); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxAVC444, gfx_h264_available); - } else if (freerdp_settings_get_uint32(rfi->settings, FreeRDP_ColorDepth) == 99) { + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, 32); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxH264, gfx_h264_available); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxAVC444, gfx_h264_available); + } else if (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth) == 99) { /* Automatic (Let the server choose its best format) */ - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 32); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RemoteFxCodec, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxH264, gfx_h264_available); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GfxAVC444, gfx_h264_available); - } - - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_RemoteFxCodec) || - freerdp_settings_get_bool(rfi->settings, FreeRDP_NSCodec) || - freerdp_settings_get_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline)) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_FastPathOutput, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_FrameMarkerCommandEnabled, TRUE); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 32); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, 32); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RemoteFxCodec, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxH264, gfx_h264_available); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GfxAVC444, gfx_h264_available); + } + + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_RemoteFxCodec) || + freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_NSCodec) || + freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline)) { + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_FastPathOutput, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_FrameMarkerCommandEnabled, TRUE); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ColorDepth, 32); rfi->bpp = 32; } @@ -1505,51 +1546,51 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) /* multiple of 4 */ w = (w + 3) & ~0x3; h = (h + 3) & ~0x3; - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopWidth, w); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopHeight, h); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth, w); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight, h); REMMINA_PLUGIN_DEBUG("Resolution set by the user: %dx%d", w, h); /* Workaround for FreeRDP issue #5417: in GFX AVC modes we can't go under * AVC_MIN_DESKTOP_WIDTH x AVC_MIN_DESKTOP_HEIGHT */ - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline) && - freerdp_settings_get_bool(rfi->settings, FreeRDP_GfxH264)) { - if (freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth) < - AVC_MIN_DESKTOP_WIDTH) - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopWidth, - AVC_MIN_DESKTOP_WIDTH); - if (freerdp_settings_get_uint32(rfi->settings, + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline) && + freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_GfxH264)) { + if (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth) < + AVC_MIN_DESKTOP_WIDTH) + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth, + AVC_MIN_DESKTOP_WIDTH); + if (freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight) < - AVC_MIN_DESKTOP_HEIGHT) - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopHeight, - AVC_MIN_DESKTOP_HEIGHT); + AVC_MIN_DESKTOP_HEIGHT) + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight, + AVC_MIN_DESKTOP_HEIGHT); } /* Workaround for FreeRDP issue #5119. This will make our horizontal resolution * an even value, but it will add a vertical black 1 pixel line on the * right of the desktop */ - if ((freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth) & 1) != 0) { - UINT32 tmp = freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopWidth, tmp - 1); + if ((freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth) & 1) != 0) { + UINT32 tmp = freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth, tmp - 1); } - remmina_plugin_service->protocol_plugin_set_width(gp, freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth)); - remmina_plugin_service->protocol_plugin_set_height(gp, freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopHeight)); + remmina_plugin_service->protocol_plugin_set_width(gp, freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth)); + remmina_plugin_service->protocol_plugin_set_height(gp, freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight)); - w = freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth); - h = freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopHeight); + w = freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth); + h = freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight); REMMINA_PLUGIN_DEBUG("Resolution set after workarounds: %dx%d", w, h); if (remmina_plugin_service->file_get_string(remminafile, "username")) - freerdp_settings_set_string(rfi->settings, FreeRDP_Username, remmina_plugin_service->file_get_string(remminafile, "username")); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Username, remmina_plugin_service->file_get_string(remminafile, "username")); if (remmina_plugin_service->file_get_string(remminafile, "domain")) - freerdp_settings_set_string(rfi->settings, FreeRDP_Domain, remmina_plugin_service->file_get_string(remminafile, "domain")); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Domain, remmina_plugin_service->file_get_string(remminafile, "domain")); s = remmina_plugin_service->file_get_string(remminafile, "password"); - if (s) freerdp_settings_set_string(rfi->settings, FreeRDP_Password, s); + if (s) freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Password, s); - freerdp_settings_set_bool(rfi->settings, FreeRDP_AutoLogonEnabled, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AutoLogonEnabled, TRUE); /** * Proxy support @@ -1567,21 +1608,21 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) REMMINA_PLUGIN_DEBUG("proxy_port: %d", proxy_port); if (proxy_type && proxy_hostname) { if (g_strcmp0(proxy_type, "no_proxy") == 0) - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE); else if (g_strcmp0(proxy_type, "http") == 0) - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ProxyType, PROXY_TYPE_HTTP); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ProxyType, PROXY_TYPE_HTTP); else if (g_strcmp0(proxy_type, "socks5") == 0) - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ProxyType, PROXY_TYPE_SOCKS); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ProxyType, PROXY_TYPE_SOCKS); else g_warning("Invalid proxy protocol, at the moment only no_proxy, HTTP and SOCKS5 are supported"); - REMMINA_PLUGIN_DEBUG("ProxyType set to: %" PRIu32, freerdp_settings_get_uint32(rfi->settings, FreeRDP_ProxyType)); - freerdp_settings_set_string(rfi->settings, FreeRDP_ProxyHostname, proxy_hostname); + REMMINA_PLUGIN_DEBUG("ProxyType set to: %" PRIu32, freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_ProxyType)); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_ProxyHostname, proxy_hostname); if (proxy_username) - freerdp_settings_set_string(rfi->settings, FreeRDP_ProxyUsername, proxy_username); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_ProxyUsername, proxy_username); if (proxy_password) - freerdp_settings_set_string(rfi->settings, FreeRDP_ProxyPassword, proxy_password); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_ProxyPassword, proxy_password); if (proxy_port) - freerdp_settings_set_uint16(rfi->settings, FreeRDP_ProxyPort, proxy_port); + freerdp_settings_set_uint16(rfi->clientContext.context.settings, FreeRDP_ProxyPort, proxy_port); } g_free(proxy_hostname); g_free(proxy_username); @@ -1595,122 +1636,120 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) } /* Remote Desktop Gateway server address */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayEnabled, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayEnabled, FALSE); s = remmina_plugin_service->file_get_string(remminafile, "gateway_server"); if (s) { cs = remmina_plugin_service->file_get_string(remminafile, "gwtransp"); #if FREERDP_CHECK_VERSION(2, 3, 1) if (remmina_plugin_service->file_get_int(remminafile, "websockets", FALSE)) - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayHttpUseWebsockets, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayHttpUseWebsockets, TRUE); else - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayHttpUseWebsockets, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayHttpUseWebsockets, FALSE); #endif if (g_strcmp0(cs, "http") == 0) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayRpcTransport, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayHttpTransport, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayRpcTransport, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayHttpTransport, TRUE); } else if (g_strcmp0(cs, "rpc") == 0) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayRpcTransport, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayHttpTransport, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayRpcTransport, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayHttpTransport, FALSE); } else if (g_strcmp0(cs, "auto") == 0) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayRpcTransport, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayHttpTransport, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayRpcTransport, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayHttpTransport, TRUE); } remmina_plugin_service->get_server_port(s, 443, &gateway_host, &gateway_port); - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayHostname, gateway_host); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_GatewayPort, gateway_port); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayEnabled, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayUseSameCredentials, TRUE); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayHostname, gateway_host); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_GatewayPort, gateway_port); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayEnabled, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayUseSameCredentials, TRUE); } /* Remote Desktop Gateway domain */ if (remmina_plugin_service->file_get_string(remminafile, "gateway_domain")) { - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayDomain, remmina_plugin_service->file_get_string(remminafile, "gateway_domain")); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayUseSameCredentials, FALSE); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayDomain, remmina_plugin_service->file_get_string(remminafile, "gateway_domain")); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayUseSameCredentials, FALSE); } /* Remote Desktop Gateway username */ if (remmina_plugin_service->file_get_string(remminafile, "gateway_username")) { - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayUsername, remmina_plugin_service->file_get_string(remminafile, "gateway_username")); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayUseSameCredentials, FALSE); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayUsername, remmina_plugin_service->file_get_string(remminafile, "gateway_username")); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayUseSameCredentials, FALSE); } /* Remote Desktop Gateway password */ s = remmina_plugin_service->file_get_string(remminafile, "gateway_password"); if (s) { - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayPassword, s); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayUseSameCredentials, FALSE); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayPassword, s); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayUseSameCredentials, FALSE); } /* If no different credentials were provided for the Remote Desktop Gateway * use the same authentication credentials for the host */ - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_GatewayEnabled) && freerdp_settings_get_bool(rfi->settings, FreeRDP_GatewayUseSameCredentials)) { - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayDomain, freerdp_settings_get_string(rfi->settings, FreeRDP_Domain)); - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayUsername, freerdp_settings_get_string(rfi->settings, FreeRDP_Username)); - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayPassword, freerdp_settings_get_string(rfi->settings, FreeRDP_Password)); + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_GatewayEnabled) && freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_GatewayUseSameCredentials)) { + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayDomain, freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_Domain)); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayUsername, freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_Username)); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayPassword, freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_Password)); } /* Remote Desktop Gateway usage */ - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_GatewayEnabled)) - freerdp_set_gateway_usage_method(rfi->settings, + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_GatewayEnabled)) + freerdp_set_gateway_usage_method(rfi->clientContext.context.settings, remmina_plugin_service->file_get_int(remminafile, "gateway_usage", FALSE) ? TSC_PROXY_MODE_DETECT : TSC_PROXY_MODE_DIRECT); - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayAccessToken, - remmina_plugin_service->file_get_string(remminafile, "gatewayaccesstoken")); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayAccessToken, + remmina_plugin_service->file_get_string(remminafile, "gatewayaccesstoken")); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_AuthenticationLevel, remmina_plugin_service->file_get_int( - remminafile, "authentication level", freerdp_settings_get_uint32(rfi->settings, FreeRDP_AuthenticationLevel))); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_AuthenticationLevel, remmina_plugin_service->file_get_int( + remminafile, "authentication level", freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_AuthenticationLevel))); /* Certificate ignore */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_IgnoreCertificate, remmina_plugin_service->file_get_int(remminafile, "cert_ignore", 0)); - freerdp_settings_set_bool(rfi->settings, FreeRDP_OldLicenseBehaviour, remmina_plugin_service->file_get_int(remminafile, "old-license", 0)); - freerdp_settings_set_bool(rfi->settings, FreeRDP_AllowUnanouncedOrdersFromServer, remmina_plugin_service->file_get_int(remminafile, "relax-order-checks", 0)); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_GlyphSupportLevel, (remmina_plugin_service->file_get_int(remminafile, "glyph-cache", 0) ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE)); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_IgnoreCertificate, remmina_plugin_service->file_get_int(remminafile, "cert_ignore", 0)); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_OldLicenseBehaviour, remmina_plugin_service->file_get_int(remminafile, "old-license", 0)); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AllowUnanouncedOrdersFromServer, remmina_plugin_service->file_get_int(remminafile, "relax-order-checks", 0)); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_GlyphSupportLevel, (remmina_plugin_service->file_get_int(remminafile, "glyph-cache", 0) ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE)); if ((cs = remmina_plugin_service->file_get_string(remminafile, "clientname"))) - freerdp_settings_set_string(rfi->settings, FreeRDP_ClientHostname, cs); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_ClientHostname, cs); else - freerdp_settings_set_string(rfi->settings, FreeRDP_ClientHostname, g_get_host_name()); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_ClientHostname, g_get_host_name()); /* Client Build number is optional, if not specified defaults to 0, allow for comments to appear after number */ if ((cs = remmina_plugin_service->file_get_string(remminafile, "clientbuild"))) { if (*cs) { UINT32 val = strtoul(cs, NULL, 0); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ClientBuild, val); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_ClientBuild, val); } } if (remmina_plugin_service->file_get_string(remminafile, "loadbalanceinfo")) { - char *tmp = strdup(remmina_plugin_service->file_get_string(remminafile, "loadbalanceinfo")); - rfi->settings->LoadBalanceInfo = (BYTE *)tmp; - - freerdp_settings_set_uint32(rfi->settings, FreeRDP_LoadBalanceInfoLength, strlen(tmp)); + const gchar *tmp = strdup(remmina_plugin_service->file_get_string(remminafile, "loadbalanceinfo")); + freerdp_settings_set_pointer_len(rfi->clientContext.context.settings, FreeRDP_LoadBalanceInfo, tmp, strlen(tmp) + 1); } if (remmina_plugin_service->file_get_string(remminafile, "exec")) - freerdp_settings_set_string(rfi->settings, FreeRDP_AlternateShell, remmina_plugin_service->file_get_string(remminafile, "exec")); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_AlternateShell, remmina_plugin_service->file_get_string(remminafile, "exec")); if (remmina_plugin_service->file_get_string(remminafile, "execpath")) - freerdp_settings_set_string(rfi->settings, FreeRDP_ShellWorkingDirectory, remmina_plugin_service->file_get_string(remminafile, "execpath")); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_ShellWorkingDirectory, remmina_plugin_service->file_get_string(remminafile, "execpath")); sm = g_strdup_printf("rdp_quality_%i", remmina_plugin_service->file_get_int(remminafile, "quality", DEFAULT_QUALITY_0)); value = remmina_plugin_service->pref_get_value(sm); g_free(sm); if (value && value[0]) { - freerdp_settings_set_uint32(rfi->settings, FreeRDP_PerformanceFlags, strtoul(value, NULL, 16)); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_PerformanceFlags, strtoul(value, NULL, 16)); } else { switch (remmina_plugin_service->file_get_int(remminafile, "quality", DEFAULT_QUALITY_0)) { case 9: - freerdp_settings_set_uint32(rfi->settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_9); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_9); break; case 2: - freerdp_settings_set_uint32(rfi->settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_2); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_2); break; case 1: - freerdp_settings_set_uint32(rfi->settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_1); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_1); break; case 0: default: - freerdp_settings_set_uint32(rfi->settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_0); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_0); break; } } @@ -1738,134 +1777,140 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) else type = REMMINA_CONNECTION_TYPE_NONE; - if (!remmina_rdp_set_connection_type(rfi->settings, type)) + if (!remmina_rdp_set_connection_type(rfi->clientContext.context.settings, type)) REMMINA_PLUGIN_DEBUG("Network settings not set"); } /* PerformanceFlags bitmask need also to be splitted into BOOL variables - * like freerdp_settings_set_bool(rfi->settings, FreeRDP_DisableWallpaper, freerdp_settings_set_bool(rfi->settings, FreeRDP_AllowFontSmoothing… + * like freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_DisableWallpaper, freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AllowFontSmoothing… * or freerdp_get_param_bool() function will return the wrong value */ - freerdp_performance_flags_split(rfi->settings); + freerdp_performance_flags_split(rfi->clientContext.context.settings); #ifdef GDK_WINDOWING_X11 #if FREERDP_CHECK_VERSION(2, 3, 0) rdp_kbd_remap = remmina_get_rdp_kbd_remap(remmina_plugin_service->file_get_string(remminafile, "keymap")); if (rdp_kbd_remap != NULL) { - freerdp_settings_set_string(rfi->settings, FreeRDP_KeyboardRemappingList, rdp_kbd_remap); - REMMINA_PLUGIN_DEBUG("rdp_keyboard_remapping_list: %s", rfi->settings->KeyboardRemappingList); - g_free(rdp_kbd_remap); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_KeyboardRemappingList, rdp_kbd_remap); + REMMINA_PLUGIN_DEBUG( + "rdp_keyboard_remapping_list: %s", + freerdp_settings_get_string(rfi->clientContext.context.settings, + FreeRDP_KeyboardRemappingList)); + g_free(rdp_kbd_remap); } else { - freerdp_settings_set_string(rfi->settings, FreeRDP_KeyboardRemappingList, remmina_plugin_service->pref_get_value("rdp_kbd_remap")); - REMMINA_PLUGIN_DEBUG("rdp_keyboard_remapping_list: %s", rfi->settings->KeyboardRemappingList); - } + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_KeyboardRemappingList, remmina_plugin_service->pref_get_value("rdp_kbd_remap")); + REMMINA_PLUGIN_DEBUG( + "rdp_keyboard_remapping_list: %s", + freerdp_settings_get_string(rfi->clientContext.context.settings, + FreeRDP_KeyboardRemappingList)); + } #endif #endif - freerdp_settings_set_uint32(rfi->settings, FreeRDP_KeyboardLayout, remmina_rdp_settings_get_keyboard_layout()); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_KeyboardLayout, remmina_rdp_settings_get_keyboard_layout()); if (remmina_plugin_service->file_get_int(remminafile, "console", FALSE)) - freerdp_settings_set_bool(rfi->settings, FreeRDP_ConsoleSession, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ConsoleSession, TRUE); if (remmina_plugin_service->file_get_int(remminafile, "restricted-admin", FALSE)) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_ConsoleSession, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RestrictedAdminModeRequired, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ConsoleSession, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RestrictedAdminModeRequired, TRUE); } if (remmina_plugin_service->file_get_string(remminafile, "pth")) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_ConsoleSession, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RestrictedAdminModeRequired, TRUE); - freerdp_settings_set_string(rfi->settings, FreeRDP_PasswordHash, remmina_plugin_service->file_get_string(remminafile, "pth")); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ConsoleSession, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RestrictedAdminModeRequired, TRUE); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_PasswordHash, remmina_plugin_service->file_get_string(remminafile, "pth")); remmina_plugin_service->file_set_int(remminafile, "restricted-admin", TRUE); } cs = remmina_plugin_service->file_get_string(remminafile, "security"); if (g_strcmp0(cs, "rdp") == 0) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_RdpSecurity, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_TlsSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_NlaSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_ExtSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_UseRdpSecurityLayer, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RdpSecurity, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_TlsSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_NlaSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ExtSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_UseRdpSecurityLayer, TRUE); } else if (g_strcmp0(cs, "tls") == 0) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_RdpSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_TlsSecurity, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_NlaSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_ExtSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RdpSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_TlsSecurity, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_NlaSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ExtSecurity, FALSE); } else if (g_strcmp0(cs, "nla") == 0) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_RdpSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_TlsSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_NlaSecurity, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_ExtSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RdpSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_TlsSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_NlaSecurity, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ExtSecurity, FALSE); } else if (g_strcmp0(cs, "ext") == 0) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_RdpSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_TlsSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_NlaSecurity, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_ExtSecurity, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RdpSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_TlsSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_NlaSecurity, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ExtSecurity, TRUE); } else { /* This is "-nego" switch of xfreerdp */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_NegotiateSecurityLayer, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_NegotiateSecurityLayer, TRUE); } cs = remmina_plugin_service->file_get_string(remminafile, "tls-seclevel"); if (cs && g_strcmp0(cs,"")!=0) { i = atoi(cs); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_TlsSecLevel, i); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_TlsSecLevel, i); } - freerdp_settings_set_bool(rfi->settings, FreeRDP_CompressionEnabled, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_CompressionEnabled, TRUE); if (remmina_plugin_service->file_get_int(remminafile, "disable_fastpath", FALSE)) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_FastPathInput, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_FastPathOutput, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_FastPathInput, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_FastPathOutput, FALSE); } else { - freerdp_settings_set_bool(rfi->settings, FreeRDP_FastPathInput, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_FastPathOutput, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_FastPathInput, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_FastPathOutput, TRUE); } /* Orientation and scaling settings */ remmina_rdp_settings_get_orientation_scale_prefs(&desktopOrientation, &desktopScaleFactor, &deviceScaleFactor); - freerdp_settings_set_uint16(rfi->settings, FreeRDP_DesktopOrientation, desktopOrientation); + freerdp_settings_set_uint16(rfi->clientContext.context.settings, FreeRDP_DesktopOrientation, desktopOrientation); if (desktopScaleFactor != 0 && deviceScaleFactor != 0) { - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopScaleFactor, desktopScaleFactor); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DeviceScaleFactor, deviceScaleFactor); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopScaleFactor, desktopScaleFactor); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DeviceScaleFactor, deviceScaleFactor); } /* Try to enable "Display Control Virtual Channel Extension", needed to * dynamically resize remote desktop. This will automatically open * the "disp" dynamic channel, if available */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportDisplayControl, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportDisplayControl, TRUE); - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_SupportDisplayControl)) { + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_SupportDisplayControl)) { CLPARAM *d[1]; int dcount; dcount = 1; d[0] = "disp"; - freerdp_client_add_dynamic_channel(rfi->settings, dcount, d); + freerdp_client_add_dynamic_channel(rfi->clientContext.context.settings, dcount, d); } - if (freerdp_settings_get_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline)) { + if (freerdp_settings_get_bool(rfi->clientContext.context.settings, FreeRDP_SupportGraphicsPipeline)) { CLPARAM *d[1]; int dcount; dcount = 1; d[0] = "rdpgfx"; - freerdp_client_add_dynamic_channel(rfi->settings, dcount, d); + freerdp_client_add_dynamic_channel(rfi->clientContext.context.settings, dcount, d); } /* Sound settings */ cs = remmina_plugin_service->file_get_string(remminafile, "sound"); if (g_strcmp0(cs, "remote") == 0) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_RemoteConsoleAudio, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RemoteConsoleAudio, TRUE); } else if ((cs != NULL && cs[0] != '\0') && g_str_has_prefix(cs, "local")) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_AudioPlayback, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_AudioCapture, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AudioPlayback, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AudioCapture, TRUE); } else { /* Disable sound */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_AudioPlayback, FALSE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RemoteConsoleAudio, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AudioPlayback, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RemoteConsoleAudio, FALSE); } cs = remmina_plugin_service->file_get_string(remminafile, "microphone"); @@ -1874,14 +1919,14 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) REMMINA_PLUGIN_DEBUG("“microphone” was set to 0, setting to \"\""); remmina_plugin_service->file_set_string(remminafile, "microphone", ""); } else { - freerdp_settings_set_bool(rfi->settings, FreeRDP_AudioCapture, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_AudioCapture, TRUE); REMMINA_PLUGIN_DEBUG("“microphone” set to “%s”", cs); CLPARAM **p; size_t count; p = remmina_rdp_CommandLineParseCommaSeparatedValuesEx("audin", g_strdup(cs), &count); - freerdp_client_add_dynamic_channel(rfi->settings, count, p); + freerdp_client_add_dynamic_channel(rfi->clientContext.context.settings, count, p); g_free(p); } } @@ -1893,9 +1938,9 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) size_t count; p = remmina_rdp_CommandLineParseCommaSeparatedValuesEx("rdpsnd", g_strdup(cs), &count); - status = freerdp_client_add_static_channel(rfi->settings, count, p); + status = freerdp_client_add_static_channel(rfi->clientContext.context.settings, count, p); if (status) - status = freerdp_client_add_dynamic_channel(rfi->settings, count, p); + status = freerdp_client_add_dynamic_channel(rfi->clientContext.context.settings, count, p); g_free(p); } @@ -1922,7 +1967,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) CLPARAM **p; size_t count; p = remmina_rdp_CommandLineParseCommaSeparatedValuesEx("urbdrc", g_strdup(cs), &count); - freerdp_client_add_dynamic_channel(rfi->settings, count, p); + freerdp_client_add_dynamic_channel(rfi->clientContext.context.settings, count, p); g_free(p); } @@ -1931,7 +1976,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) CLPARAM **p; size_t count; p = remmina_rdp_CommandLineParseCommaSeparatedValues(g_strdup(cs), &count); - freerdp_client_add_static_channel(rfi->settings, count, p); + freerdp_client_add_static_channel(rfi->clientContext.context.settings, count, p); g_free(p); } @@ -1940,16 +1985,21 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) CLPARAM **p; size_t count; p = remmina_rdp_CommandLineParseCommaSeparatedValues(g_strdup(cs), &count); - freerdp_client_add_dynamic_channel(rfi->settings, count, p); + freerdp_client_add_dynamic_channel(rfi->clientContext.context.settings, count, p); g_free(p); } - cs = remmina_plugin_service->file_get_string(remminafile, "rdp2tcp"); + cs = remmina_plugin_service->file_get_string(remminafile, RDP2TCP_DVC_CHANNEL_NAME); if (cs != NULL && cs[0] != '\0') { - g_free(rfi->settings->RDP2TCPArgs); - rfi->settings->RDP2TCPArgs = g_strdup(cs); - REMMINA_PLUGIN_DEBUG("rdp2tcp set to %s", rfi->settings->RDP2TCPArgs); - remmina_rdp_load_static_channel_addin(channels, rfi->settings, "rdp2tcp", rfi->settings->RDP2TCPArgs); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_RDP2TCPArgs, cs); + +#if FREERDP_VERSION_MAJOR >= 3 + char* args = freerdp_settings_get_string_writable(rfi->clientContext.context.settings, FreeRDP_RDP2TCPArgs); +#else + char* args = freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_RDP2TCPArgs); +#endif + REMMINA_PLUGIN_DEBUG(RDP2TCP_DVC_CHANNEL_NAME " set to %s",args); + remmina_rdp_load_static_channel_addin(channels, rfi->clientContext.context.settings, RDP2TCP_DVC_CHANNEL_NAME, args); } int vermaj, vermin, verrev; @@ -1962,14 +2012,14 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) guint64 val = g_ascii_strtoull(cs, (gchar **)&endptr, 10); if (val > 600000 || val <= 0) val = 600000; - freerdp_settings_set_uint32(rfi->settings, FreeRDP_TcpAckTimeout, (UINT32)val); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_TcpAckTimeout, (UINT32)val); } #endif if (remmina_plugin_service->file_get_int(remminafile, "preferipv6", FALSE) ? TRUE : FALSE) - freerdp_settings_set_bool(rfi->settings, FreeRDP_PreferIPv6OverIPv4, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_PreferIPv6OverIPv4, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RedirectClipboard, remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE) ? FALSE : TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RedirectClipboard, remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE) ? FALSE : TRUE); cs = remmina_plugin_service->file_get_string(remminafile, "sharefolder"); if (cs != NULL && cs[0] != '\0') { @@ -1984,7 +2034,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) //CLPARAM **p; //size_t count; //p = remmina_rdp_CommandLineParseCommaSeparatedValuesEx("drive", g_strdup(cs), &count); - //status = freerdp_client_add_device_channel(rfi->settings, count, p); + //status = freerdp_client_add_device_channel(rfi->clientContext.context.settings, count, p); //g_free(p); } cs = remmina_plugin_service->file_get_string(remminafile, "drive"); @@ -1997,7 +2047,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) for (i = 0; folders[i] != NULL; i++) { REMMINA_PLUGIN_DEBUG("Parsing folder %s", folders[i]); p = remmina_rdp_CommandLineParseCommaSeparatedValuesEx("drive", g_strdup(folders[i]), &count); - status = freerdp_client_add_device_channel(rfi->settings, count, p); + status = freerdp_client_add_device_channel(rfi->clientContext.context.settings, count, p); g_free(p); } g_strfreev(folders); @@ -2019,15 +2069,15 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) int dcount; dcount = 1; d[0] = "printer"; - freerdp_client_add_device_channel(rfi->settings, dcount, d); + freerdp_client_add_device_channel(rfi->clientContext.context.settings, dcount, d); } #endif /* HAVE_CUPS */ } if (remmina_plugin_service->file_get_int(remminafile, "span", FALSE)) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_SpanMonitors, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_UseMultimon, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_Fullscreen, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SpanMonitors, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_UseMultimon, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_Fullscreen, TRUE); remmina_plugin_service->file_set_int(remminafile, "multimon", 1); } @@ -2036,10 +2086,10 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) guint32 maxheight = 0; gchar *monitorids; guint32 i; - freerdp_settings_set_bool(rfi->settings, FreeRDP_UseMultimon, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_UseMultimon, TRUE); /* TODO Add an option for this */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_ForceMultimon, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_Fullscreen, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ForceMultimon, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_Fullscreen, TRUE); gchar *monitorids_string = g_strdup(remmina_plugin_service->file_get_string(remminafile, "monitorids")); /* Otherwise we get all the attached monitors @@ -2049,7 +2099,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) if (monitorids_string != NULL && monitorids_string[0] != '\0') { if (g_strstr_len(monitorids_string, -1, ",") != NULL) { if (g_strstr_len(monitorids_string, -1, ":") != NULL) { - rdpMonitor *base = (rdpMonitor *)freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); + rdpMonitor *base = (rdpMonitor *)freerdp_settings_get_pointer(rfi->clientContext.context.settings, FreeRDP_MonitorDefArray); /* We have an ID and an orientation degree */ gchar **temp_items; gchar **rot_items; @@ -2075,11 +2125,11 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) } remmina_rdp_monitor_get(rfi, &monitorids, &maxwidth, &maxheight); if (monitorids != NULL && monitorids[0] != '\0') { - UINT32 *base = (UINT32 *)freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorIds); + UINT32 *base = (UINT32 *)freerdp_settings_get_pointer(rfi->clientContext.context.settings, FreeRDP_MonitorIds); gchar **items; items = g_strsplit(monitorids, ",", -1); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_NumMonitorIds, g_strv_length(items)); - REMMINA_PLUGIN_DEBUG("NumMonitorIds: %d", freerdp_settings_get_uint32(rfi->settings, FreeRDP_NumMonitorIds)); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_NumMonitorIds, g_strv_length(items)); + REMMINA_PLUGIN_DEBUG("NumMonitorIds: %d", freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_NumMonitorIds)); for (i = 0; i < g_strv_length(items); i++) { UINT32 *current = &base[i]; *current = atoi(items[i]); @@ -2090,14 +2140,14 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) } if (maxwidth && maxheight) { REMMINA_PLUGIN_DEBUG("Setting DesktopWidth and DesktopHeight to: %dx%d", maxwidth, maxheight); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopWidth, maxwidth); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopHeight, maxheight); - 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)); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth, maxwidth); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight, maxheight); + REMMINA_PLUGIN_DEBUG("DesktopWidth and DesktopHeight set to: %dx%d", freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth), freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight)); } else { - 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)); + REMMINA_PLUGIN_DEBUG("Cannot set Desktop Size, we are using the previously set values: %dx%d", freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth), freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight)); } - remmina_plugin_service->protocol_plugin_set_width(gp, freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth)); - remmina_plugin_service->protocol_plugin_set_height(gp, freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopHeight)); + remmina_plugin_service->protocol_plugin_set_width(gp, freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopWidth)); + remmina_plugin_service->protocol_plugin_set_height(gp, freerdp_settings_get_uint32(rfi->clientContext.context.settings, FreeRDP_DesktopHeight)); } const gchar *sn = remmina_plugin_service->file_get_string(remminafile, "smartcardname"); @@ -2106,7 +2156,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) RDPDR_SMARTCARD *smartcard; smartcard = (RDPDR_SMARTCARD *)calloc(1, sizeof(RDPDR_SMARTCARD)); -#ifdef WITH_FREERDP3 +#if FREERDP_VERSION_MAJOR >= 3 RDPDR_DEVICE *sdev; sdev = &(smartcard->device); #else @@ -2116,27 +2166,27 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) sdev->Type = RDPDR_DTYP_SMARTCARD; - freerdp_settings_set_bool(rfi->settings, FreeRDP_DeviceRedirection, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_DeviceRedirection, TRUE); if (sn != NULL && sn[0] != '\0') sdev->Name = _strdup(sn); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RedirectSmartCards, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RedirectSmartCards, TRUE); - freerdp_device_collection_add(rfi->settings, (RDPDR_DEVICE *)smartcard); + freerdp_device_collection_add(rfi->clientContext.context.settings, (RDPDR_DEVICE *)smartcard); } if (remmina_plugin_service->file_get_int(remminafile, "passwordispin", FALSE)) /* Option works only combined with Username and Domain, because FreeRDP * doesn’t know anything about info on smart card */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_PasswordIsSmartcardPin, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_PasswordIsSmartcardPin, TRUE); /* /serial[:<name>[,<path>[,<driver>[,permissive]]]] */ if (remmina_plugin_service->file_get_int(remminafile, "shareserial", FALSE)) { RDPDR_SERIAL *serial; serial = (RDPDR_SERIAL *)calloc(1, sizeof(RDPDR_SERIAL)); -#ifdef WITH_FREERDP3 +#if FREERDP_VERSION_MAJOR >= 3 RDPDR_DEVICE *sdev; sdev = &(serial->device); #else @@ -2146,7 +2196,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) sdev->Type = RDPDR_DTYP_SERIAL; - freerdp_settings_set_bool(rfi->settings, FreeRDP_DeviceRedirection, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_DeviceRedirection, TRUE); const gchar *sn = remmina_plugin_service->file_get_string(remminafile, "serialname"); if (sn != NULL && sn[0] != '\0') @@ -2163,16 +2213,16 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) if (remmina_plugin_service->file_get_int(remminafile, "serialpermissive", FALSE)) serial->Permissive = _strdup("permissive"); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RedirectSerialPorts, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RedirectSerialPorts, TRUE); - freerdp_device_collection_add(rfi->settings, (RDPDR_DEVICE *)serial); + freerdp_device_collection_add(rfi->clientContext.context.settings, (RDPDR_DEVICE *)serial); } if (remmina_plugin_service->file_get_int(remminafile, "shareparallel", FALSE)) { RDPDR_PARALLEL *parallel; parallel = (RDPDR_PARALLEL *)calloc(1, sizeof(RDPDR_PARALLEL)); -#ifdef WITH_FREERDP3 +#if FREERDP_VERSION_MAJOR >= 3 RDPDR_DEVICE *pdev; pdev = &(parallel->device); #else @@ -2182,9 +2232,9 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) pdev->Type = RDPDR_DTYP_PARALLEL; - freerdp_settings_set_bool(rfi->settings, FreeRDP_DeviceRedirection, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_DeviceRedirection, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_RedirectParallelPorts, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_RedirectParallelPorts, TRUE); const gchar *pn = remmina_plugin_service->file_get_string(remminafile, "parallelname"); if (pn != NULL && pn[0] != '\0') @@ -2193,48 +2243,48 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) if (dp != NULL && dp[0] != '\0') parallel->Path = _strdup(dp); - freerdp_device_collection_add(rfi->settings, (RDPDR_DEVICE *)parallel); + freerdp_device_collection_add(rfi->clientContext.context.settings, (RDPDR_DEVICE *)parallel); } /** * multitransport enables RDP8 UDP support */ if (remmina_plugin_service->file_get_int(remminafile, "multitransport", FALSE)) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_DeviceRedirection, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportMultitransport, TRUE); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_MultitransportFlags, - (TRANSPORT_TYPE_UDP_FECR | TRANSPORT_TYPE_UDP_FECL | TRANSPORT_TYPE_UDP_PREFERRED)); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_DeviceRedirection, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_SupportMultitransport, TRUE); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_MultitransportFlags, + (TRANSPORT_TYPE_UDP_FECR | TRANSPORT_TYPE_UDP_FECL | TRANSPORT_TYPE_UDP_PREFERRED)); } else { - freerdp_settings_set_uint32(rfi->settings, FreeRDP_MultitransportFlags, 0); + freerdp_settings_set_uint32(rfi->clientContext.context.settings, FreeRDP_MultitransportFlags, 0); } /* If needed, force interactive authentication by deleting all authentication fields, * forcing libfreerdp to call our callbacks for authentication. * This usually happens from a second attempt of connection, never on the 1st one. */ if (rfi->attempt_interactive_authentication) { - freerdp_settings_set_string(rfi->settings, FreeRDP_Username, NULL); - freerdp_settings_set_string(rfi->settings, FreeRDP_Password, NULL); - freerdp_settings_set_string(rfi->settings, FreeRDP_Domain, NULL); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Username, NULL); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Password, NULL); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_Domain, NULL); - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayDomain, NULL); - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayUsername, NULL); - freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayPassword, NULL); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayDomain, NULL); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayUsername, NULL); + freerdp_settings_set_string(rfi->clientContext.context.settings, FreeRDP_GatewayPassword, NULL); - freerdp_settings_set_bool(rfi->settings, FreeRDP_GatewayUseSameCredentials, FALSE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_GatewayUseSameCredentials, FALSE); } gboolean orphaned; - if (!freerdp_connect(rfi->instance)) { + if (!freerdp_connect(rfi->clientContext.context.instance)) { orphaned = (GET_PLUGIN_DATA(rfi->protocol_widget) == NULL); if (!orphaned) { UINT32 e; - e = freerdp_get_last_error(rfi->instance->context); + e = freerdp_get_last_error(&rfi->clientContext.context); switch (e) { case FREERDP_ERROR_AUTHENTICATION_FAILED: - case STATUS_LOGON_FAILURE: // wrong return code from FreeRDP introduced at the end of July 2016? (fixed with b86c0ba) + case STATUS_LOGON_FAILURE: // wrong return code from FreeRDP introduced at the end of July 2016? (fixed with b86c0ba) #ifdef FREERDP_ERROR_CONNECT_LOGON_FAILURE case FREERDP_ERROR_CONNECT_LOGON_FAILURE: #endif @@ -2246,34 +2296,34 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) case FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT: #endif remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not access the RDP server “%s”.\nAccount locked out."), - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; case STATUS_ACCOUNT_EXPIRED: #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED case FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED: #endif remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not access the RDP server “%s”.\nAccount expired."), - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; case STATUS_PASSWORD_EXPIRED: #ifdef FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED case FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED: #endif remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not access the RDP server “%s”.\nPassword expired."), - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; case STATUS_ACCOUNT_DISABLED: #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED case FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED: #endif remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not access the RDP server “%s”.\nAccount disabled."), - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; #ifdef FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES /* https://msdn.microsoft.com/en-us/library/ee392247.aspx */ case FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES: remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not access the RDP server “%s”.\nInsufficient user privileges."), - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; #endif case STATUS_ACCOUNT_RESTRICTION: @@ -2281,7 +2331,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) case FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION: #endif remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not access the RDP server “%s”.\nAccount restricted."), - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; case STATUS_PASSWORD_MUST_CHANGE: @@ -2289,22 +2339,22 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) case FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE: #endif remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not access the RDP server “%s”.\nChange user password before connecting."), - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; case FREERDP_ERROR_CONNECT_FAILED: - remmina_plugin_service->protocol_plugin_set_error(gp, _("Lost connection to the RDP server “%s”."), freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + remmina_plugin_service->protocol_plugin_set_error(gp, _("Lost connection to the RDP server “%s”."), freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; case FREERDP_ERROR_DNS_NAME_NOT_FOUND: - 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)); + remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not find the address for the RDP server “%s”."), freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; case FREERDP_ERROR_TLS_CONNECT_FAILED: remmina_plugin_service->protocol_plugin_set_error(gp, - _("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)); + _("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->clientContext.context.settings, FreeRDP_ServerHostname)); break; case FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED: // TRANSLATORS: the placeholder may be either an IP/FQDN or a server hostname - 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)); + 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->clientContext.context.settings, FreeRDP_ServerHostname)); break; #ifdef FREERDP_ERROR_POST_CONNECT_FAILED case FREERDP_ERROR_POST_CONNECT_FAILED: @@ -2312,26 +2362,26 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) switch (rfi->postconnect_error) { case REMMINA_POSTCONNECT_ERROR_OK: /* We should never come here */ - remmina_plugin_service->protocol_plugin_set_error(gp, _("Cannot connect to the RDP server “%s”."), freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + remmina_plugin_service->protocol_plugin_set_error(gp, _("Cannot connect to the RDP server “%s”."), freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; case REMMINA_POSTCONNECT_ERROR_GDI_INIT: remmina_plugin_service->protocol_plugin_set_error(gp, _("Could not start libfreerdp-gdi.")); break; case REMMINA_POSTCONNECT_ERROR_NO_H264: - 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)); + 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->clientContext.context.settings, FreeRDP_ServerHostname)); break; } break; #endif #ifdef FREERDP_ERROR_SERVER_DENIED_CONNECTION case FREERDP_ERROR_SERVER_DENIED_CONNECTION: - remmina_plugin_service->protocol_plugin_set_error(gp, _("The “%s” server refused the connection."), freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + remmina_plugin_service->protocol_plugin_set_error(gp, _("The “%s” server refused the connection."), freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; #endif case 0x800759DB: // E_PROXY_NAP_ACCESSDENIED https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tsgu/84cd92e4-592c-4219-95d8-18021ac654b0 remmina_plugin_service->protocol_plugin_set_error(gp, _("The Remote Desktop Gateway “%s” denied the user “%s\\%s” access due to policy."), - freerdp_settings_get_string(rfi->settings, FreeRDP_GatewayHostname), freerdp_settings_get_string(rfi->settings, FreeRDP_GatewayDomain), freerdp_settings_get_string(rfi->settings, FreeRDP_GatewayUsername)); + freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_GatewayHostname), freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_GatewayDomain), freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_GatewayUsername)); break; case FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS: @@ -2340,7 +2390,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) default: g_printf("libfreerdp returned code is %08X\n", e); - remmina_plugin_service->protocol_plugin_set_error(gp, _("Cannot connect to the “%s” RDP server."), freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + remmina_plugin_service->protocol_plugin_set_error(gp, _("Cannot connect to the “%s” RDP server."), freerdp_settings_get_string(rfi->clientContext.context.settings, FreeRDP_ServerHostname)); break; } } @@ -2349,7 +2399,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) } if (GET_PLUGIN_DATA(rfi->protocol_widget) == NULL) orphaned = true; else orphaned = false; - if (!orphaned && freerdp_get_last_error(rfi->instance->context) == FREERDP_ERROR_SUCCESS && !rfi->user_cancelled) + if (!orphaned && freerdp_get_last_error(&rfi->clientContext.context) == FREERDP_ERROR_SUCCESS && !rfi->user_cancelled) remmina_rdp_main_loop(gp); return TRUE; @@ -2359,7 +2409,7 @@ static void rfi_uninit(rfContext *rfi) { freerdp *instance; - instance = rfi->instance; + instance = rfi->clientContext.context.instance; if (rfi->remmina_plugin_thread) { rfi->thread_cancelled = TRUE; // Avoid all rf_queue function to run @@ -2370,7 +2420,7 @@ static void rfi_uninit(rfContext *rfi) if (instance) { if (rfi->connected) { - freerdp_abort_connect(instance); + freerdp_abort_connect_context(&rfi->clientContext.context); rfi->connected = false; } } @@ -2381,7 +2431,7 @@ static void rfi_uninit(rfContext *rfi) IFCALL(pEntryPoints->GlobalUninit); free(instance->pClientEntryPoints); freerdp_context_free(instance); /* context is rfContext* rfi */ - freerdp_free(instance); /* This implicitly frees instance->context and rfi is no longer valid */ + freerdp_free(instance); /* This implicitly frees instance->context and rfi is no longer valid */ } } @@ -2395,7 +2445,7 @@ static gboolean complete_cleanup_on_main_thread(gpointer data) remmina_rdp_clipboard_free(rfi); - gdi_free(rfi->instance); + gdi_free(rfi->clientContext.context.instance); gp = rfi->protocol_widget; if (GET_PLUGIN_DATA(gp) == NULL) orphaned = true; else orphaned = false; @@ -2466,8 +2516,7 @@ static void remmina_rdp_init(RemminaProtocolWidget *gp) g_object_set_data_full(G_OBJECT(gp), "plugin-data", rfi, free); rfi->protocol_widget = gp; - rfi->instance = instance; - rfi->settings = instance->settings; + rfi->clientContext.context.settings = instance->context->settings; rfi->connected = false; rfi->is_reconnecting = false; rfi->stop_reconnecting_requested = false; @@ -2599,10 +2648,10 @@ static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaPro if (rfi) { RemminaFile *remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (remmina_plugin_service->file_get_int(remminafile, "multimon", FALSE)) { - freerdp_settings_set_bool(rfi->settings, FreeRDP_UseMultimon, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_UseMultimon, TRUE); /* TODO Add an option for this */ - freerdp_settings_set_bool(rfi->settings, FreeRDP_ForceMultimon, TRUE); - freerdp_settings_set_bool(rfi->settings, FreeRDP_Fullscreen, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_ForceMultimon, TRUE); + freerdp_settings_set_bool(rfi->clientContext.context.settings, FreeRDP_Fullscreen, TRUE); remmina_rdp_event_send_delayed_monitor_layout(gp); } } else { @@ -2656,8 +2705,13 @@ static gboolean remmina_rdp_get_screenshot(RemminaProtocolWidget *gp, RemminaPlu gdi = ((rdpContext *)rfi)->gdi; +#if FREERDP_VERSION_MAJOR >= 3 + bytesPerPixel = FreeRDPGetBytesPerPixel(gdi->hdc->format); + bitsPerPixel = FreeRDPGetBitsPerPixel(gdi->hdc->format); +#else bytesPerPixel = GetBytesPerPixel(gdi->hdc->format); bitsPerPixel = GetBitsPerPixel(gdi->hdc->format); +#endif /** @todo we should lock FreeRDP subthread to update rfi->primary_buffer, rfi->gdi and w/h, * from here to memcpy, but… how ? */ @@ -3068,9 +3122,9 @@ G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service) /* Check that we are linked to the correct version of libfreerdp */ freerdp_get_version(&vermaj, &vermin, &verrev); - if (vermaj < FREERDP_REQUIRED_MAJOR || - (vermaj == FREERDP_REQUIRED_MAJOR && (vermin < FREERDP_REQUIRED_MINOR || - (vermin == FREERDP_REQUIRED_MINOR && verrev < FREERDP_REQUIRED_REVISION)))) { + if ((vermaj < FREERDP_REQUIRED_MAJOR) || + ((vermaj == FREERDP_REQUIRED_MAJOR) && ((vermin < FREERDP_REQUIRED_MINOR) || + ((vermin == FREERDP_REQUIRED_MINOR) && (verrev < FREERDP_REQUIRED_REVISION))))) { g_printf("Upgrade your FreeRDP library version from %d.%d.%d to at least libfreerdp %d.%d.%d " "to run the RDP plugin.\n", vermaj, vermin, verrev, @@ -3117,7 +3171,7 @@ G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service) snprintf(remmina_plugin_rdp_version, sizeof(remmina_plugin_rdp_version), "RDP plugin: %s (Git %s), Compiled with libfreerdp %s (%s), Running with libfreerdp %s (rev %s), H.264 %s", VERSION, REMMINA_GIT_REVISION, -#ifdef WITH_FREERDP3 +#if FREERDP_VERSION_MAJOR >= 3 FREERDP_VERSION_FULL, FREERDP_GIT_REVISION, #else FREERDP_VERSION_FULL, GIT_REVISION, diff --git a/plugins/rdp/rdp_plugin.h b/plugins/rdp/rdp_plugin.h index edec7a752..a0f0cc70d 100644 --- a/plugins/rdp/rdp_plugin.h +++ b/plugins/rdp/rdp_plugin.h @@ -318,19 +318,15 @@ typedef struct remmina_plugin_rdp_keymap_entry { } RemminaPluginRdpKeymapEntry; struct rf_context { - rdpContext context; - DEFINE_RDP_CLIENT_COMMON(); + rdpClientContext clientContext; - RemminaProtocolWidget * protocol_widget; + RemminaProtocolWidget *protocol_widget; /* main */ - rdpSettings * settings; - freerdp * instance; - - pthread_t remmina_plugin_thread; - RemminaScaleMode scale; - gboolean user_cancelled; - gboolean thread_cancelled; + pthread_t remmina_plugin_thread; + RemminaScaleMode scale; + gboolean user_cancelled; + gboolean thread_cancelled; CliprdrClientContext * cliprdr; DispClientContext * dispcontext; diff --git a/plugins/rdp/rdp_settings.c b/plugins/rdp/rdp_settings.c index a012fdbcd..b0110c66e 100644 --- a/plugins/rdp/rdp_settings.c +++ b/plugins/rdp/rdp_settings.c @@ -206,7 +206,6 @@ static void remmina_rdp_settings_grid_destroy(GtkWidget *widget, gpointer data) static void remmina_rdp_settings_grid_load_layout(RemminaPluginRdpsetGrid *grid) { TRACE_CALL(__func__); - gint i; gchar *s; GtkTreeIter iter; RDP_KEYBOARD_LAYOUT *layouts; @@ -219,9 +218,14 @@ static void remmina_rdp_settings_grid_load_layout(RemminaPluginRdpsetGrid *grid) gtk_label_set_text(GTK_LABEL(grid->keyboard_layout_label), "-"); +#if FREERDP_VERSION_MAJOR >= 3 + size_t layout_count = 0; + layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT, &layout_count); +#else layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); +#endif - for (i = 0; layouts[i].code; i++) { + for (DWORD i = 0; layouts[i].code; i++) { s = g_strdup_printf("%08X - %s", layouts[i].code, layouts[i].name); gtk_list_store_append(grid->keyboard_layout_store, &iter); gtk_list_store_set(grid->keyboard_layout_store, &iter, 0, layouts[i].code, 1, s, -1); @@ -235,7 +239,11 @@ static void remmina_rdp_settings_grid_load_layout(RemminaPluginRdpsetGrid *grid) g_free(s); } +#if FREERDP_VERSION_MAJOR >= 3 + freerdp_keyboard_layouts_free(layouts, layout_count); +#else freerdp_keyboard_layouts_free(layouts); +#endif } static void remmina_rdp_settings_grid_load_devicescalefactor_combo(RemminaPluginRdpsetGrid *grid) |