diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100755 new mode 100644 index e6034689b..1a19ad718 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,7 @@ include(GNUInstallDirsWrapper) include(CMakePackageConfigHelpers) # Soname versioning +set(WITH_LIBRARY_VERSIONING "ON") set(FREERDP_VERSION_MAJOR "1") set(FREERDP_VERSION_MINOR "2") set(FREERDP_VERSION_REVISION "0") @@ -232,9 +233,23 @@ endif() if(WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -D_UNICODE") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WIN32_WINNT=0x0501") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN") + + if(NOT DEFINED CMAKE_WINDOWS_VERSION) + set(CMAKE_WINDOWS_VERSION "WINXP") + endif() + + if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501") + elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601") + elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602") + endif() endif() if(IOS) @@ -301,6 +316,8 @@ endif(APPLE) # Android if(ANDROID) + set(WITH_LIBRARY_VERSIONING "OFF") + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") add_definitions(-DNDK_DEBUG=1) @@ -682,6 +699,7 @@ else(MONOLITHIC_BUILD) foreach(EXPORT_MODULE ${MEXPORTS}) list(APPEND WINPR_PC_LIBS "-lwinpr-${EXPORT_MODULE}") endforeach() + list(APPEND WINPR_PC_LIBS "-lwinpr") string(REPLACE ";" " " WINPR_PC_LIBS "${WINPR_PC_LIBS}") endif(MONOLITHIC_BUILD) diff --git a/channels/audin/server/audin.c b/channels/audin/server/audin.c index 9f7506abb..31b3943f0 100644 --- a/channels/audin/server/audin.c +++ b/channels/audin/server/audin.c @@ -345,24 +345,16 @@ static void* audin_server_thread_func(void* arg) Stream_SetPosition(s, 0); + WTSVirtualChannelRead(audin->audin_channel, 0, NULL, 0, &BytesReturned); + if (BytesReturned < 1) + continue; + Stream_EnsureRemainingCapacity(s, BytesReturned); if (WTSVirtualChannelRead(audin->audin_channel, 0, (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned) == FALSE) { - if (BytesReturned == 0) - break; - - Stream_EnsureRemainingCapacity(s, BytesReturned); - - if (WTSVirtualChannelRead(audin->audin_channel, 0, (PCHAR) Stream_Buffer(s), - Stream_Capacity(s), &BytesReturned) == FALSE) - { - break; - } + break; } - if (BytesReturned < 1) - continue; - Stream_Read_UINT8(s, MessageId); BytesReturned--; diff --git a/channels/client/CMakeLists.txt b/channels/client/CMakeLists.txt index 05cb34697..6b8aaf2c3 100644 --- a/channels/client/CMakeLists.txt +++ b/channels/client/CMakeLists.txt @@ -101,10 +101,8 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-path winpr-file winpr-synch winpr-library winpr-interlocked) + +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} PARENT_SCOPE) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) diff --git a/channels/cliprdr/client/CMakeLists.txt b/channels/cliprdr/client/CMakeLists.txt index 4df74c706..f2f3c32ea 100644 --- a/channels/cliprdr/client/CMakeLists.txt +++ b/channels/cliprdr/client/CMakeLists.txt @@ -32,10 +32,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/cliprdr/server/cliprdr_main.c b/channels/cliprdr/server/cliprdr_main.c index 0e94fabea..1a701e8a1 100644 --- a/channels/cliprdr/server/cliprdr_main.c +++ b/channels/cliprdr/server/cliprdr_main.c @@ -431,15 +431,14 @@ static void* cliprdr_server_thread(void* arg) break; } - if (WTSVirtualChannelRead(context->priv->ChannelHandle, 0, - (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned)) + WTSVirtualChannelRead(context->priv->ChannelHandle, 0, NULL, 0, &BytesReturned); + if (BytesReturned < 1) + continue; + Stream_EnsureRemainingCapacity(s, BytesReturned); + if (!WTSVirtualChannelRead(context->priv->ChannelHandle, 0, + (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned)) { - if (BytesReturned) - Stream_Seek(s, BytesReturned); - } - else - { - Stream_EnsureRemainingCapacity(s, BytesReturned); + break; } if (Stream_GetPosition(s) >= CLIPRDR_HEADER_LENGTH) diff --git a/channels/disp/client/CMakeLists.txt b/channels/disp/client/CMakeLists.txt index 704ce2334..377e65153 100644 --- a/channels/disp/client/CMakeLists.txt +++ b/channels/disp/client/CMakeLists.txt @@ -32,10 +32,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-common freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-sysinfo) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/disp/client/disp_main.c b/channels/disp/client/disp_main.c index e8827366b..3682449fe 100644 --- a/channels/disp/client/disp_main.c +++ b/channels/disp/client/disp_main.c @@ -66,8 +66,8 @@ struct _DISP_PLUGIN DISP_LISTENER_CALLBACK* listener_callback; UINT32 MaxNumMonitors; - UINT32 MaxMonitorWidth; - UINT32 MaxMonitorHeight; + UINT32 MaxMonitorAreaFactorA; + UINT32 MaxMonitorAreaFactorB; }; typedef struct _DISP_PLUGIN DISP_PLUGIN; @@ -110,15 +110,9 @@ int disp_send_display_control_monitor_layout_pdu(DISP_CHANNEL_CALLBACK* callback if (Monitors[index].Width < 200) Monitors[index].Width = 200; - if (Monitors[index].Width > disp->MaxMonitorWidth) - Monitors[index].Width = disp->MaxMonitorWidth; - if (Monitors[index].Height < 200) Monitors[index].Height = 200; - if (Monitors[index].Height > disp->MaxMonitorHeight) - Monitors[index].Height = disp->MaxMonitorHeight; - Stream_Write_UINT32(s, Monitors[index].Flags); /* Flags (4 bytes) */ Stream_Write_UINT32(s, Monitors[index].Left); /* Left (4 bytes) */ Stream_Write_UINT32(s, Monitors[index].Top); /* Top (4 bytes) */ @@ -127,6 +121,8 @@ int disp_send_display_control_monitor_layout_pdu(DISP_CHANNEL_CALLBACK* callback Stream_Write_UINT32(s, Monitors[index].PhysicalWidth); /* PhysicalWidth (4 bytes) */ Stream_Write_UINT32(s, Monitors[index].PhysicalHeight); /* PhysicalHeight (4 bytes) */ Stream_Write_UINT32(s, Monitors[index].Orientation); /* Orientation (4 bytes) */ + Stream_Write_UINT32(s, Monitors[index].DesktopScaleFactor); /* DesktopScaleFactor (4 bytes) */ + Stream_Write_UINT32(s, Monitors[index].DeviceScaleFactor); /* DeviceScaleFactor (4 bytes) */ #if 0 fprintf(stderr, "\t: Flags: 0x%04X\n", Monitors[index].Flags); @@ -138,9 +134,6 @@ int disp_send_display_control_monitor_layout_pdu(DISP_CHANNEL_CALLBACK* callback fprintf(stderr, "\t: PhysicalHeight: %d\n", Monitors[index].PhysicalHeight); fprintf(stderr, "\t: Orientation: %d\n", Monitors[index].Orientation); #endif - - Stream_Write_UINT32(s, Monitors[index].DesktopScaleFactor); /* DesktopScaleFactor (4 bytes) */ - Stream_Write_UINT32(s, Monitors[index].DeviceScaleFactor); /* DeviceScaleFactor (4 bytes) */ } Stream_SealLength(s); @@ -158,12 +151,15 @@ int disp_recv_display_control_caps_pdu(DISP_CHANNEL_CALLBACK* callback, wStream* disp = (DISP_PLUGIN*) callback->plugin; - Stream_Read_UINT32(s, disp->MaxNumMonitors); /* MaxNumMonitors (4 bytes) */ - Stream_Read_UINT32(s, disp->MaxMonitorWidth); /* MaxMonitorWidth (4 bytes) */ - Stream_Read_UINT32(s, disp->MaxMonitorHeight); /* MaxMonitorHeight (4 bytes) */ + if (Stream_GetRemainingLength(s) < 12) + return -1; - //fprintf(stderr, "DisplayControlCapsPdu: MaxNumMonitors: %d MaxMonitorWidth: %d MaxMonitorHeight: %d\n", - // disp->MaxNumMonitors, disp->MaxMonitorWidth, disp->MaxMonitorHeight); + Stream_Read_UINT32(s, disp->MaxNumMonitors); /* MaxNumMonitors (4 bytes) */ + Stream_Read_UINT32(s, disp->MaxMonitorAreaFactorA); /* MaxMonitorAreaFactorA (4 bytes) */ + Stream_Read_UINT32(s, disp->MaxMonitorAreaFactorB); /* MaxMonitorAreaFactorB (4 bytes) */ + + //fprintf(stderr, "DisplayControlCapsPdu: MaxNumMonitors: %d MaxMonitorAreaFactorA: %d MaxMonitorAreaFactorB: %d\n", + // disp->MaxNumMonitors, disp->MaxMonitorAreaFactorA, disp->MaxMonitorAreaFactorB); return 0; } @@ -173,6 +169,9 @@ int disp_recv_pdu(DISP_CHANNEL_CALLBACK* callback, wStream* s) UINT32 type; UINT32 length; + if (Stream_GetRemainingLength(s) < 8) + return -1; + Stream_Read_UINT32(s, type); /* Type (4 bytes) */ Stream_Read_UINT32(s, length); /* Length (4 bytes) */ @@ -220,8 +219,10 @@ static int disp_on_new_channel_connection(IWTSListenerCallback* pListenerCallbac DISP_CHANNEL_CALLBACK* callback; DISP_LISTENER_CALLBACK* listener_callback = (DISP_LISTENER_CALLBACK*) pListenerCallback; - callback = (DISP_CHANNEL_CALLBACK*) malloc(sizeof(DISP_CHANNEL_CALLBACK)); - ZeroMemory(callback, sizeof(DISP_CHANNEL_CALLBACK)); + callback = (DISP_CHANNEL_CALLBACK*) calloc(1, sizeof(DISP_CHANNEL_CALLBACK)); + + if (!callback) + return -1; callback->iface.OnDataReceived = disp_on_data_received; callback->iface.OnClose = disp_on_close; @@ -240,8 +241,10 @@ static int disp_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManager int status; DISP_PLUGIN* disp = (DISP_PLUGIN*) pPlugin; - disp->listener_callback = (DISP_LISTENER_CALLBACK*) malloc(sizeof(DISP_LISTENER_CALLBACK)); - ZeroMemory(disp->listener_callback, sizeof(DISP_LISTENER_CALLBACK)); + disp->listener_callback = (DISP_LISTENER_CALLBACK*) calloc(1, sizeof(DISP_LISTENER_CALLBACK)); + + if (!disp->listener_callback) + return -1; disp->listener_callback->iface.OnNewChannelConnection = disp_on_new_channel_connection; disp->listener_callback->plugin = pPlugin; @@ -281,11 +284,7 @@ int disp_send_monitor_layout(DispClientContext* context, UINT32 NumMonitors, DIS return 1; } -#ifdef STATIC_CHANNELS -#define DVCPluginEntry disp_DVCPluginEntry -#endif - -int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) +int disp_DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) { int error = 0; DISP_PLUGIN* disp; @@ -317,8 +316,8 @@ int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) disp->iface.pInterface = (void*) context; disp->MaxNumMonitors = 16; - disp->MaxMonitorWidth = 8192; - disp->MaxMonitorHeight = 8192; + disp->MaxMonitorAreaFactorA = 8192; + disp->MaxMonitorAreaFactorB = 8192; error = pEntryPoints->RegisterPlugin(pEntryPoints, "disp", (IWTSPlugin*) disp); } diff --git a/channels/disp/client/disp_main.h b/channels/disp/client/disp_main.h index 1851618a0..2cb9156f8 100644 --- a/channels/disp/client/disp_main.h +++ b/channels/disp/client/disp_main.h @@ -31,8 +31,8 @@ #include +#define DISPLAY_CONTROL_PDU_TYPE_CAPS 0x00000005 #define DISPLAY_CONTROL_PDU_TYPE_MONITOR_LAYOUT 0x00000002 -#define DISPLAY_CONTROL_PDU_TYPE_CAPS 0x00000003 #endif /* FREERDP_CHANNEL_DISP_CLIENT_MAIN_H */ diff --git a/channels/drdynvc/client/CMakeLists.txt b/channels/drdynvc/client/CMakeLists.txt index 124397d46..d8e3d02cd 100644 --- a/channels/drdynvc/client/CMakeLists.txt +++ b/channels/drdynvc/client/CMakeLists.txt @@ -33,10 +33,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-synch) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/drdynvc/server/drdynvc_main.c b/channels/drdynvc/server/drdynvc_main.c index b6436c6a5..62cdafd57 100644 --- a/channels/drdynvc/server/drdynvc_main.c +++ b/channels/drdynvc/server/drdynvc_main.c @@ -67,15 +67,14 @@ static void* drdynvc_server_thread(void* arg) break; } - if (WTSVirtualChannelRead(context->priv->ChannelHandle, 0, - (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned)) + WTSVirtualChannelRead(context->priv->ChannelHandle, 0, NULL, 0, &BytesReturned); + if (BytesReturned < 1) + continue; + Stream_EnsureRemainingCapacity(s, BytesReturned); + if (!WTSVirtualChannelRead(context->priv->ChannelHandle, 0, + (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned)) { - if (BytesReturned) - Stream_Seek(s, BytesReturned); - } - else - { - Stream_EnsureRemainingCapacity(s, BytesReturned); + break; } } diff --git a/channels/drive/client/CMakeLists.txt b/channels/drive/client/CMakeLists.txt index b7f0b8d94..82bbc70f7 100644 --- a/channels/drive/client/CMakeLists.txt +++ b/channels/drive/client/CMakeLists.txt @@ -38,10 +38,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-file winpr-synch winpr-thread winpr-interlocked) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/echo/CMakeLists.txt b/channels/echo/CMakeLists.txt index 3044e5ee5..bfa8297c9 100644 --- a/channels/echo/CMakeLists.txt +++ b/channels/echo/CMakeLists.txt @@ -21,3 +21,6 @@ if(WITH_CLIENT_CHANNELS) add_channel_client(${MODULE_PREFIX} ${CHANNEL_NAME}) endif() +if(WITH_SERVER_CHANNELS) + add_channel_server(${MODULE_PREFIX} ${CHANNEL_NAME}) +endif() diff --git a/channels/echo/ChannelOptions.cmake b/channels/echo/ChannelOptions.cmake index 47a7d075e..eb4950a15 100644 --- a/channels/echo/ChannelOptions.cmake +++ b/channels/echo/ChannelOptions.cmake @@ -1,7 +1,7 @@ set(OPTION_DEFAULT OFF) set(OPTION_CLIENT_DEFAULT ON) -set(OPTION_SERVER_DEFAULT OFF) +set(OPTION_SERVER_DEFAULT ON) define_channel_options(NAME "echo" TYPE "dynamic" DESCRIPTION "Echo Virtual Channel Extension" diff --git a/channels/echo/client/echo_main.c b/channels/echo/client/echo_main.c index ef381e21a..f5633dd41 100644 --- a/channels/echo/client/echo_main.c +++ b/channels/echo/client/echo_main.c @@ -26,12 +26,11 @@ #include #include +#include #include #include -#include - #include "echo_main.h" typedef struct _ECHO_LISTENER_CALLBACK ECHO_LISTENER_CALLBACK; @@ -63,47 +62,21 @@ struct _ECHO_PLUGIN static int echo_on_data_received(IWTSVirtualChannelCallback* pChannelCallback, wStream *data) { - int error; + int status; ECHO_CHANNEL_CALLBACK* callback = (ECHO_CHANNEL_CALLBACK*) pChannelCallback; - BYTE *pBuffer = Stream_Pointer(data); - UINT32 cbSize = Stream_GetRemainingLength(data); - -#ifdef WITH_DEBUG_DVC - int i = 0; - char* debug_buffer; - char* p; - - if (cbSize > 0) - { - debug_buffer = (char*) malloc(3 * cbSize); - ZeroMemory(debug_buffer, 3 * cbSize); - - p = debug_buffer; - - for (i = 0; i < (int) (cbSize - 1); i++) - { - sprintf(p, "%02x ", pBuffer[i]); - p += 3; - } - sprintf(p, "%02x", pBuffer[i]); - - DEBUG_DVC("ECHO %d: %s", cbSize, debug_buffer); - free(debug_buffer); - } -#endif + BYTE* pBuffer = Stream_Pointer(data); + UINT32 cbSize = Stream_GetRemainingLength(data); /* echo back what we have received. ECHO does not have any message IDs. */ - error = callback->channel->Write(callback->channel, cbSize, pBuffer, NULL); + status = callback->channel->Write(callback->channel, cbSize, pBuffer, NULL); - return error; + return status; } static int echo_on_close(IWTSVirtualChannelCallback* pChannelCallback) { ECHO_CHANNEL_CALLBACK* callback = (ECHO_CHANNEL_CALLBACK*) pChannelCallback; - DEBUG_DVC(""); - free(callback); return 0; @@ -116,10 +89,10 @@ static int echo_on_new_channel_connection(IWTSListenerCallback* pListenerCallbac ECHO_CHANNEL_CALLBACK* callback; ECHO_LISTENER_CALLBACK* listener_callback = (ECHO_LISTENER_CALLBACK*) pListenerCallback; - DEBUG_DVC(""); + callback = (ECHO_CHANNEL_CALLBACK*) calloc(1, sizeof(ECHO_CHANNEL_CALLBACK)); - callback = (ECHO_CHANNEL_CALLBACK*) malloc(sizeof(ECHO_CHANNEL_CALLBACK)); - ZeroMemory(callback, sizeof(ECHO_CHANNEL_CALLBACK)); + if (!callback) + return -1; callback->iface.OnDataReceived = echo_on_data_received; callback->iface.OnClose = echo_on_close; @@ -136,10 +109,10 @@ static int echo_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManager { ECHO_PLUGIN* echo = (ECHO_PLUGIN*) pPlugin; - DEBUG_DVC(""); + echo->listener_callback = (ECHO_LISTENER_CALLBACK*) calloc(1, sizeof(ECHO_LISTENER_CALLBACK)); - echo->listener_callback = (ECHO_LISTENER_CALLBACK*) malloc(sizeof(ECHO_LISTENER_CALLBACK)); - ZeroMemory(echo->listener_callback, sizeof(ECHO_LISTENER_CALLBACK)); + if (!echo->listener_callback) + return -1; echo->listener_callback->iface.OnNewChannelConnection = echo_on_new_channel_connection; echo->listener_callback->plugin = pPlugin; @@ -153,36 +126,35 @@ static int echo_plugin_terminated(IWTSPlugin* pPlugin) { ECHO_PLUGIN* echo = (ECHO_PLUGIN*) pPlugin; - DEBUG_DVC(""); - - free(echo); + if (echo) + { + free(echo); + } return 0; } -#ifdef STATIC_CHANNELS -#define DVCPluginEntry echo_DVCPluginEntry -#endif - -int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) +int echo_DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) { - int error = 0; + int status = 0; ECHO_PLUGIN* echo; echo = (ECHO_PLUGIN*) pEntryPoints->GetPlugin(pEntryPoints, "echo"); - if (echo == NULL) + if (!echo) { - echo = (ECHO_PLUGIN*) malloc(sizeof(ECHO_PLUGIN)); - ZeroMemory(echo, sizeof(ECHO_PLUGIN)); + echo = (ECHO_PLUGIN*) calloc(1, sizeof(ECHO_PLUGIN)); + + if (!echo) + return -1; echo->iface.Initialize = echo_plugin_initialize; echo->iface.Connected = NULL; echo->iface.Disconnected = NULL; echo->iface.Terminated = echo_plugin_terminated; - error = pEntryPoints->RegisterPlugin(pEntryPoints, "echo", (IWTSPlugin*) echo); + status = pEntryPoints->RegisterPlugin(pEntryPoints, "echo", (IWTSPlugin*) echo); } - return error; + return status; } diff --git a/channels/echo/server/CMakeLists.txt b/channels/echo/server/CMakeLists.txt new file mode 100644 index 000000000..47fb633e6 --- /dev/null +++ b/channels/echo/server/CMakeLists.txt @@ -0,0 +1,36 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# FreeRDP cmake build script +# +# Copyright 2012 Marc-Andre Moreau +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +define_channel_server("echo") + +set(${MODULE_PREFIX}_SRCS + echo_main.c) + +add_channel_server_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE "DVCPluginEntry") + +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") + +set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS + MONOLITHIC ${MONOLITHIC_BUILD} + MODULE freerdp + MODULES freerdp-utils freerdp-core) + +target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) + +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Server") diff --git a/channels/echo/server/echo_main.c b/channels/echo/server/echo_main.c new file mode 100644 index 000000000..37d42cb61 --- /dev/null +++ b/channels/echo/server/echo_main.c @@ -0,0 +1,233 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Echo Virtual Channel Extension + * + * Copyright 2014 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include +#include +#include +#include + +#include + +typedef struct _echo_server +{ + echo_server_context context; + + BOOL opened; + + HANDLE stopEvent; + + HANDLE thread; + void* echo_channel; + + DWORD SessionId; + +} echo_server; + +static BOOL echo_server_open_channel(echo_server* echo) +{ + DWORD Error; + HANDLE hEvent; + DWORD StartTick; + DWORD BytesReturned = 0; + PULONG pSessionId = NULL; + + if (WTSQuerySessionInformationA(echo->context.vcm, WTS_CURRENT_SESSION, + WTSSessionId, (LPSTR*) &pSessionId, &BytesReturned) == FALSE) + { + return FALSE; + } + echo->SessionId = (DWORD) *pSessionId; + WTSFreeMemory(pSessionId); + + hEvent = WTSVirtualChannelManagerGetEventHandle(echo->context.vcm); + StartTick = GetTickCount(); + + while (echo->echo_channel == NULL) + { + WaitForSingleObject(hEvent, 1000); + + echo->echo_channel = WTSVirtualChannelOpenEx(echo->SessionId, + "ECHO", WTS_CHANNEL_OPTION_DYNAMIC); + + if (echo->echo_channel) + break; + + Error = GetLastError(); + if (Error == ERROR_NOT_FOUND) + break; + + if (GetTickCount() - StartTick > 5000) + break; + } + + return echo->echo_channel ? TRUE : FALSE; +} + +static void* echo_server_thread_func(void* arg) +{ + wStream* s; + void* buffer; + DWORD nCount; + HANDLE events[8]; + BOOL ready = FALSE; + HANDLE ChannelEvent; + DWORD BytesReturned = 0; + echo_server* echo = (echo_server*) arg; + + if (echo_server_open_channel(echo) == FALSE) + { + IFCALL(echo->context.OpenResult, &echo->context, ECHO_SERVER_OPEN_RESULT_NOTSUPPORTED); + return NULL; + } + + buffer = NULL; + BytesReturned = 0; + ChannelEvent = NULL; + + if (WTSVirtualChannelQuery(echo->echo_channel, WTSVirtualEventHandle, &buffer, &BytesReturned) == TRUE) + { + if (BytesReturned == sizeof(HANDLE)) + CopyMemory(&ChannelEvent, buffer, sizeof(HANDLE)); + + WTSFreeMemory(buffer); + } + + nCount = 0; + events[nCount++] = echo->stopEvent; + events[nCount++] = ChannelEvent; + + /* Wait for the client to confirm that the Graphics Pipeline dynamic channel is ready */ + + while (1) + { + if (WaitForMultipleObjects(nCount, events, FALSE, 100) == WAIT_OBJECT_0) + { + IFCALL(echo->context.OpenResult, &echo->context, ECHO_SERVER_OPEN_RESULT_CLOSED); + break; + } + + if (WTSVirtualChannelQuery(echo->echo_channel, WTSVirtualChannelReady, &buffer, &BytesReturned) == FALSE) + { + IFCALL(echo->context.OpenResult, &echo->context, ECHO_SERVER_OPEN_RESULT_ERROR); + break; + } + + ready = *((BOOL*) buffer); + + WTSFreeMemory(buffer); + + if (ready) + { + IFCALL(echo->context.OpenResult, &echo->context, ECHO_SERVER_OPEN_RESULT_OK); + break; + } + } + + s = Stream_New(NULL, 4096); + + while (ready) + { + if (WaitForMultipleObjects(nCount, events, FALSE, INFINITE) == WAIT_OBJECT_0) + break; + + Stream_SetPosition(s, 0); + + WTSVirtualChannelRead(echo->echo_channel, 0, NULL, 0, &BytesReturned); + if (BytesReturned < 1) + continue; + Stream_EnsureRemainingCapacity(s, BytesReturned); + if (WTSVirtualChannelRead(echo->echo_channel, 0, (PCHAR) Stream_Buffer(s), + (ULONG) Stream_Capacity(s), &BytesReturned) == FALSE) + { + break; + } + + IFCALL(echo->context.Response, &echo->context, (PCHAR) Stream_Buffer(s), BytesReturned); + } + + Stream_Free(s, TRUE); + WTSVirtualChannelClose(echo->echo_channel); + echo->echo_channel = NULL; + + return NULL; +} + +static void echo_server_open(echo_server_context* context) +{ + echo_server* echo = (echo_server*) context; + + if (echo->thread == NULL) + { + echo->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + echo->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) echo_server_thread_func, (void*) echo, 0, NULL); + } +} + +static void echo_server_close(echo_server_context* context) +{ + echo_server* echo = (echo_server*) context; + + if (echo->thread) + { + SetEvent(echo->stopEvent); + WaitForSingleObject(echo->thread, INFINITE); + CloseHandle(echo->thread); + CloseHandle(echo->stopEvent); + echo->thread = NULL; + echo->stopEvent = NULL; + } +} + +static BOOL echo_server_request(echo_server_context* context, const BYTE* buffer, UINT32 length) +{ + echo_server* echo = (echo_server*) context; + + return WTSVirtualChannelWrite(echo->echo_channel, (PCHAR) buffer, length, NULL); +} + +echo_server_context* echo_server_context_new(HANDLE vcm) +{ + echo_server* echo; + + echo = (echo_server*) calloc(1, sizeof(echo_server)); + + echo->context.vcm = vcm; + echo->context.Open = echo_server_open; + echo->context.Close = echo_server_close; + echo->context.Request = echo_server_request; + + return (echo_server_context*) echo; +} + +void echo_server_context_free(echo_server_context* context) +{ + echo_server* echo = (echo_server*) context; + + echo_server_close(context); + + free(echo); +} diff --git a/channels/encomsp/client/CMakeLists.txt b/channels/encomsp/client/CMakeLists.txt index ffa8435ab..7e96cbd0c 100644 --- a/channels/encomsp/client/CMakeLists.txt +++ b/channels/encomsp/client/CMakeLists.txt @@ -25,10 +25,7 @@ add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/encomsp/server/CMakeLists.txt b/channels/encomsp/server/CMakeLists.txt index 494d7ff99..90c4e8f31 100644 --- a/channels/encomsp/server/CMakeLists.txt +++ b/channels/encomsp/server/CMakeLists.txt @@ -25,10 +25,7 @@ add_channel_server_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/encomsp/server/encomsp_main.c b/channels/encomsp/server/encomsp_main.c index 9d7fc5ae5..5f2ef2c71 100644 --- a/channels/encomsp/server/encomsp_main.c +++ b/channels/encomsp/server/encomsp_main.c @@ -72,15 +72,14 @@ static void* encomsp_server_thread(void* arg) break; } - if (WTSVirtualChannelRead(context->priv->ChannelHandle, 0, - (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned)) + WTSVirtualChannelRead(context->priv->ChannelHandle, 0, NULL, 0, &BytesReturned); + if (BytesReturned < 1) + continue; + Stream_EnsureRemainingCapacity(s, BytesReturned); + if (!WTSVirtualChannelRead(context->priv->ChannelHandle, 0, + (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned)) { - if (BytesReturned) - Stream_Seek(s, BytesReturned); - } - else - { - Stream_EnsureRemainingCapacity(s, BytesReturned); + break; } if (0) diff --git a/channels/parallel/client/CMakeLists.txt b/channels/parallel/client/CMakeLists.txt index e9a87261d..84af28326 100644 --- a/channels/parallel/client/CMakeLists.txt +++ b/channels/parallel/client/CMakeLists.txt @@ -29,10 +29,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-interlocked) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/printer/client/CMakeLists.txt b/channels/printer/client/CMakeLists.txt index 861de097e..5b055b667 100644 --- a/channels/printer/client/CMakeLists.txt +++ b/channels/printer/client/CMakeLists.txt @@ -45,10 +45,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-synch winpr-thread winpr-interlocked) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) if(WITH_CUPS) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${CUPS_LIBRARIES}) diff --git a/channels/rdpdr/client/CMakeLists.txt b/channels/rdpdr/client/CMakeLists.txt index 241849b9f..d96a0eb5d 100644 --- a/channels/rdpdr/client/CMakeLists.txt +++ b/channels/rdpdr/client/CMakeLists.txt @@ -36,10 +36,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-synch winpr-thread winpr-interlocked) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/rdpdr/server/rdpdr_main.c b/channels/rdpdr/server/rdpdr_main.c index 9b67388f0..09d768413 100644 --- a/channels/rdpdr/server/rdpdr_main.c +++ b/channels/rdpdr/server/rdpdr_main.c @@ -598,15 +598,14 @@ static void* rdpdr_server_thread(void* arg) break; } - if (WTSVirtualChannelRead(context->priv->ChannelHandle, 0, (PCHAR) Stream_Pointer(s), - Stream_Capacity(s) - Stream_GetPosition(s), &BytesReturned)) + WTSVirtualChannelRead(context->priv->ChannelHandle, 0, NULL, 0, &BytesReturned); + if (BytesReturned < 1) + continue; + Stream_EnsureRemainingCapacity(s, BytesReturned); + if (!WTSVirtualChannelRead(context->priv->ChannelHandle, 0, + (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned)) { - if (BytesReturned) - Stream_Seek(s, BytesReturned); - } - else - { - Stream_EnsureRemainingCapacity(s, BytesReturned); + break; } if (Stream_GetPosition(s) >= RDPDR_HEADER_LENGTH) diff --git a/channels/rdpei/client/CMakeLists.txt b/channels/rdpei/client/CMakeLists.txt index 2d3adf24c..e248d5f58 100644 --- a/channels/rdpei/client/CMakeLists.txt +++ b/channels/rdpei/client/CMakeLists.txt @@ -34,10 +34,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-common freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-sysinfo) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/rdpgfx/client/CMakeLists.txt b/channels/rdpgfx/client/CMakeLists.txt index dc47804ce..abd8352df 100644 --- a/channels/rdpgfx/client/CMakeLists.txt +++ b/channels/rdpgfx/client/CMakeLists.txt @@ -36,10 +36,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-common freerdp-codec freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-sysinfo) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/rdpgfx/client/rdpgfx_main.c b/channels/rdpgfx/client/rdpgfx_main.c index f778e163b..412236f15 100644 --- a/channels/rdpgfx/client/rdpgfx_main.c +++ b/channels/rdpgfx/client/rdpgfx_main.c @@ -1040,11 +1040,7 @@ void* rdpgfx_get_cache_slot_data(RdpgfxClientContext* context, UINT16 cacheSlot) return pData; } -#ifdef STATIC_CHANNELS -#define DVCPluginEntry rdpgfx_DVCPluginEntry -#endif - -int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) +int rdpgfx_DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) { int status = 0; RDPGFX_PLUGIN* gfx; @@ -1102,6 +1098,9 @@ int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) gfx->zgfx = zgfx_context_new(FALSE); + if (!gfx->zgfx) + return -1; + status = pEntryPoints->RegisterPlugin(pEntryPoints, "rdpgfx", (IWTSPlugin*) gfx); } diff --git a/channels/rdpsnd/client/CMakeLists.txt b/channels/rdpsnd/client/CMakeLists.txt index 64bdb2bff..68b442fce 100644 --- a/channels/rdpsnd/client/CMakeLists.txt +++ b/channels/rdpsnd/client/CMakeLists.txt @@ -30,10 +30,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-codec freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-sysinfo winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/rdpsnd/client/alsa/CMakeLists.txt b/channels/rdpsnd/client/alsa/CMakeLists.txt index d96a0495c..cbe2ca20a 100644 --- a/channels/rdpsnd/client/alsa/CMakeLists.txt +++ b/channels/rdpsnd/client/alsa/CMakeLists.txt @@ -32,10 +32,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-codec freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${ALSA_LIBRARIES}) diff --git a/channels/rdpsnd/client/winmm/CMakeLists.txt b/channels/rdpsnd/client/winmm/CMakeLists.txt index a75d5fe1c..99aaae53f 100644 --- a/channels/rdpsnd/client/winmm/CMakeLists.txt +++ b/channels/rdpsnd/client/winmm/CMakeLists.txt @@ -31,11 +31,8 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-utils) - +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) + set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winmm.lib) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/rdpsnd/server/rdpsnd_main.c b/channels/rdpsnd/server/rdpsnd_main.c index 8ad5cd984..74fe4ec14 100644 --- a/channels/rdpsnd/server/rdpsnd_main.c +++ b/channels/rdpsnd/server/rdpsnd_main.c @@ -626,7 +626,7 @@ BOOL rdpsnd_server_handle_messages(RdpsndServerContext *context) RdpsndServerPrivate *priv = context->priv; wStream *s = priv->input_stream; - if (!WTSVirtualChannelRead(priv->channelEvent, 0, (PCHAR)Stream_Pointer(s), priv->expectedBytes, &bytesReturned)) + if (!WTSVirtualChannelRead(priv->ChannelHandle, 0, (PCHAR)Stream_Pointer(s), priv->expectedBytes, &bytesReturned)) { if (GetLastError() == ERROR_NO_DATA) return TRUE; diff --git a/channels/remdesk/client/CMakeLists.txt b/channels/remdesk/client/CMakeLists.txt index bcc67307b..a3ab1cfd5 100644 --- a/channels/remdesk/client/CMakeLists.txt +++ b/channels/remdesk/client/CMakeLists.txt @@ -30,10 +30,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-common) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/remdesk/server/CMakeLists.txt b/channels/remdesk/server/CMakeLists.txt index 3139058b9..c20bd0618 100644 --- a/channels/remdesk/server/CMakeLists.txt +++ b/channels/remdesk/server/CMakeLists.txt @@ -25,10 +25,7 @@ add_channel_server_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/serial/client/CMakeLists.txt b/channels/serial/client/CMakeLists.txt index 7d0fe8897..8f2532473 100644 --- a/channels/serial/client/CMakeLists.txt +++ b/channels/serial/client/CMakeLists.txt @@ -29,10 +29,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-comm) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/server/CMakeLists.txt b/channels/server/CMakeLists.txt index 9285a6594..63e0f3dc6 100644 --- a/channels/server/CMakeLists.txt +++ b/channels/server/CMakeLists.txt @@ -30,17 +30,18 @@ endforeach() add_library(${MODULE_NAME} STATIC ${${MODULE_PREFIX}_SRCS}) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE freerdp MODULES freerdp-codec freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-synch winpr-interlocked winpr-error winpr-wtsapi) + +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} PARENT_SCOPE) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) diff --git a/channels/server/channels.c b/channels/server/channels.c index 1f470e6e9..cac4243bd 100644 --- a/channels/server/channels.c +++ b/channels/server/channels.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,9 @@ void freerdp_channels_dummy() cliprdr_server_context_new(NULL); cliprdr_server_context_free(NULL); + echo_server_context_new(NULL); + echo_server_context_free(NULL); + rdpdr_server_context_new(NULL); rdpdr_server_context_free(NULL); diff --git a/channels/smartcard/client/CMakeLists.txt b/channels/smartcard/client/CMakeLists.txt index d7aaa8a69..a3e263aee 100644 --- a/channels/smartcard/client/CMakeLists.txt +++ b/channels/smartcard/client/CMakeLists.txt @@ -33,10 +33,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-smartcard winpr-synch winpr-thread winpr-interlocked winpr-environment winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/tsmf/client/CMakeLists.txt b/channels/tsmf/client/CMakeLists.txt index a92ceda1d..87e6dea8c 100644 --- a/channels/tsmf/client/CMakeLists.txt +++ b/channels/tsmf/client/CMakeLists.txt @@ -62,7 +62,7 @@ if(WITH_GSTREAMER_0_10 OR WITH_GSTREAMER_1_0) find_feature(XRandR ${XRANDR_FEATURE_TYPE} ${XRANDR_FEATURE_PURPOSE} ${XRANDR_FEATURE_DESCRIPTION}) if (WITH_XRANDR) add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "gstreamer" "decoder") - else() + else() message(WARNING "Disabling tsmf gstreamer because XRandR wasn't found") endif() endif() diff --git a/channels/urbdrc/client/CMakeLists.txt b/channels/urbdrc/client/CMakeLists.txt index 7af13726c..1dd4ab54c 100644 --- a/channels/urbdrc/client/CMakeLists.txt +++ b/channels/urbdrc/client/CMakeLists.txt @@ -42,10 +42,7 @@ set(${MODULE_PREFIX}_LIBS ${UDEV_LIBRARIES} ${UUID_LIBRARIES}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} diff --git a/channels/urbdrc/client/libusb/CMakeLists.txt b/channels/urbdrc/client/libusb/CMakeLists.txt index 49386f48f..6770be4b7 100644 --- a/channels/urbdrc/client/libusb/CMakeLists.txt +++ b/channels/urbdrc/client/libusb/CMakeLists.txt @@ -39,10 +39,8 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${UUID_LIBRARIES} ${LIBUSB_1_LIBRARIES}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-utils) + +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/client/Android/CMakeLists.txt b/client/Android/CMakeLists.txt index 51521320a..33a84ec1b 100644 --- a/client/Android/CMakeLists.txt +++ b/client/Android/CMakeLists.txt @@ -62,10 +62,21 @@ else() endif() set(APPCOMPAT_DIR "${CMAKE_CURRENT_BINARY_DIR}/appcompat_v7") -add_custom_target(copy_appcompat ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${ANDROID_SDK}/extras/android/support/v7/appcompat ${APPCOMPAT_DIR} - COMMAND ${ANDROID_COMMAND} update lib-project -p ${APPCOMPAT_DIR} -) +set(supportdir "${ANDROID_SDK}/extras/android/support/v7/appcompat") +set(compatibilitydir "${ANDROID_SDK}/extras/android/compatibility/v7/appcompat") +if(EXISTS "${supportdir}" AND IS_DIRECTORY "${supportdir}") + add_custom_target(copy_appcompat ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory "${supportdir}" ${APPCOMPAT_DIR} + COMMAND ${ANDROID_COMMAND} update lib-project -p ${APPCOMPAT_DIR} + ) +elseif(EXISTS "${compatibilitydir}" AND IS_DIRECTORY "${compatibilitydir}") + add_custom_target(copy_appcompat ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory "${compatibilitydir}" ${APPCOMPAT_DIR} + COMMAND ${ANDROID_COMMAND} update lib-project -p ${APPCOMPAT_DIR} + ) +else() + message( FATAL_ERROR "${ANDROID_SDK}/extras/android/{support|compatibility}/v7/appcompat directory not found. Please install a recent version of Android Support Library, CMake will now exit." ) +endif() add_subdirectory(FreeRDPCore) add_subdirectory(aFreeRDP) diff --git a/client/Android/FreeRDPCore/jni/CMakeLists.txt b/client/Android/FreeRDPCore/jni/CMakeLists.txt index 0ca2ff33b..d2ea3b839 100644 --- a/client/Android/FreeRDPCore/jni/CMakeLists.txt +++ b/client/Android/FreeRDPCore/jni/CMakeLists.txt @@ -61,10 +61,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-core freerdp-gdi freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-synch) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} dl) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} log) diff --git a/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_delete.png b/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_delete.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_delete.png b/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_delete.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_return.png b/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_return.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_return.png b/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_return.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_off.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_off.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_on.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_on.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows_black.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow_black.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow_black.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu_black.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow_black.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow_black.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey_black.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/drawable/touch_pointer_active.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_active.png old mode 100755 new mode 100644 diff --git a/client/Android/FreeRDPCore/res/layout/home.xml b/client/Android/FreeRDPCore/res/layout/home.xml index b31e565d6..bc311f573 100644 --- a/client/Android/FreeRDPCore/res/layout/home.xml +++ b/client/Android/FreeRDPCore/res/layout/home.xml @@ -1,5 +1,5 @@ - +--> + android:layout_width="match_parent" + android:layout_height="match_parent" > - - + - + + + + android:dividerHeight="1dp" /> - - - + \ No newline at end of file diff --git a/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HomeActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HomeActivity.java index 2c95a2355..abcf35956 100644 --- a/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HomeActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HomeActivity.java @@ -9,26 +9,12 @@ package com.freerdp.freerdpcore.presentation; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; -import java.util.Locale; - -import com.freerdp.freerdpcore.R; -import com.freerdp.freerdpcore.application.GlobalApp; -import com.freerdp.freerdpcore.application.GlobalSettings; -import com.freerdp.freerdpcore.domain.BookmarkBase; -import com.freerdp.freerdpcore.domain.ConnectionReference; -import com.freerdp.freerdpcore.domain.PlaceholderBookmark; -import com.freerdp.freerdpcore.domain.QuickConnectBookmark; -import com.freerdp.freerdpcore.utils.BookmarkArrayAdapter; -import com.freerdp.freerdpcore.utils.SeparatedListAdapter; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; -import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.text.Editable; @@ -42,8 +28,6 @@ import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; -import android.webkit.WebView; -import android.webkit.WebViewClient; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.Button; @@ -51,6 +35,16 @@ import android.widget.CheckBox; import android.widget.EditText; import android.widget.ListView; +import com.freerdp.freerdpcore.R; +import com.freerdp.freerdpcore.application.GlobalApp; +import com.freerdp.freerdpcore.application.GlobalSettings; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.ConnectionReference; +import com.freerdp.freerdpcore.domain.PlaceholderBookmark; +import com.freerdp.freerdpcore.domain.QuickConnectBookmark; +import com.freerdp.freerdpcore.utils.BookmarkArrayAdapter; +import com.freerdp.freerdpcore.utils.SeparatedListAdapter; + public class HomeActivity extends Activity { private final static String ADD_BOOKMARK_PLACEHOLDER = "add_bookmark"; @@ -108,22 +102,6 @@ public class HomeActivity extends Activity { listViewBookmarks = (ListView) findViewById(R.id.listViewBookmarks); - String filename = ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE) ? "welcome.html" : "welcome_phone.html"; - Locale def = Locale.getDefault(); - String prefix = def.getLanguage().toLowerCase(def); - - String base = "file:///android_asset/"; - String dir = prefix + "_help_page/" - + filename; - try { - InputStream is = getAssets().open(dir); - is.close(); - dir = base + dir; - } catch (IOException e) { - Log.e(TAG, "Missing localized asset " + dir, e); - dir = "file:///android_asset/help_page/" + filename; - } - // set listeners for the list view listViewBookmarks.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) { diff --git a/client/DirectFB/CMakeLists.txt b/client/DirectFB/CMakeLists.txt index 061b05c54..75eafc251 100644 --- a/client/DirectFB/CMakeLists.txt +++ b/client/DirectFB/CMakeLists.txt @@ -38,10 +38,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-core freerdp-gdi freerdp-locale freerdp-codec freerdp-primitives freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-input winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/client/Mac/CMakeLists.txt b/client/Mac/CMakeLists.txt old mode 100755 new mode 100644 index 33c946ee2..91eb01bdb --- a/client/Mac/CMakeLists.txt +++ b/client/Mac/CMakeLists.txt @@ -84,9 +84,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHI MODULE freerdp MODULES freerdp-core freerdp-cache freerdp-gdi freerdp-codec freerdp-primitives freerdp-rail freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-input winpr-crt winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/client/Mac/Credits.rtf b/client/Mac/Credits.rtf old mode 100755 new mode 100644 diff --git a/client/Mac/MRDPView.h b/client/Mac/MRDPView.h old mode 100755 new mode 100644 diff --git a/client/Mac/cli/MainMenu.xib b/client/Mac/cli/MainMenu.xib old mode 100755 new mode 100644 diff --git a/client/Mac/mf_client.h b/client/Mac/mf_client.h old mode 100755 new mode 100644 diff --git a/client/Mac/mf_client.m b/client/Mac/mf_client.m old mode 100755 new mode 100644 diff --git a/client/Windows/CMakeLists.txt b/client/Windows/CMakeLists.txt index fb14eb527..f9bd93a00 100644 --- a/client/Windows/CMakeLists.txt +++ b/client/Windows/CMakeLists.txt @@ -50,7 +50,10 @@ if(WITH_CLIENT_INTERFACE) else() add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) endif() - set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") + if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) + endif() + set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") else() set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} cli/wfreerdp.c cli/wfreerdp.h) add_executable(${MODULE_NAME} WIN32 ${${MODULE_PREFIX}_SRCS}) @@ -58,10 +61,8 @@ endif() set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} freerdp-client) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-credui winpr-utils) + +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} diff --git a/client/X11/CMakeLists.txt b/client/X11/CMakeLists.txt index e57f3a18d..35e3e932e 100644 --- a/client/X11/CMakeLists.txt +++ b/client/X11/CMakeLists.txt @@ -59,7 +59,10 @@ if(WITH_CLIENT_INTERFACE) else() add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) endif() - set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") + if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) + endif() + set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") else() set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} cli/xfreerdp.c cli/xfreerdp.h) add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) @@ -87,9 +90,7 @@ if(WITH_MANPAGES) set(GAD_LIBS freerdp-client) - set_complex_link_libraries(VARIABLE GAD_LIBS MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-utils) + set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set_complex_link_libraries(VARIABLE GAD_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE freerdp diff --git a/client/X11/xf_gfx.c b/client/X11/xf_gfx.c index e1142f6ef..a1a24a9c4 100644 --- a/client/X11/xf_gfx.c +++ b/client/X11/xf_gfx.c @@ -69,6 +69,14 @@ int xf_ResetGraphics(RdpgfxClientContext* context, RDPGFX_RESET_GRAPHICS_PDU* re xfc->h264 = h264_context_new(FALSE); + if (xfc->progressive) + { + progressive_context_free(xfc->progressive); + xfc->progressive = NULL; + } + + xfc->progressive = progressive_context_new(TRUE); + region16_init(&(xfc->invalidRegion)); xfc->graphicsReset = TRUE; @@ -498,6 +506,7 @@ int xf_SurfaceCommand_Alpha(xfContext* xfc, RdpgfxClientContext* context, RDPGFX int xf_SurfaceCommand_Progressive(xfContext* xfc, RdpgfxClientContext* context, RDPGFX_SURFACE_COMMAND* cmd) { int status = 0; + BYTE* DstData = NULL; xfGfxSurface* surface; RECTANGLE_16 invalidRect; @@ -506,6 +515,17 @@ int xf_SurfaceCommand_Progressive(xfContext* xfc, RdpgfxClientContext* context, if (!surface) return -1; + DstData = surface->data; + + status = progressive_decompress(xfc->progressive, cmd->data, cmd->length, &DstData, + PIXEL_FORMAT_XRGB32, surface->scanline, cmd->left, cmd->top, cmd->width, cmd->height); + + if (status < 0) + { + printf("progressive_decompress failure: %d\n", status); + return -1; + } + printf("xf_SurfaceCommand_Progressive: status: %d\n", status); /* fill with blue for now to distinguish from the rest */ diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index d0a8e3cfb..6a4718d35 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -35,6 +35,7 @@ typedef struct xf_context xfContext; #include #include #include +#include #include struct xf_WorkArea @@ -155,6 +156,7 @@ struct xf_context NSC_CONTEXT* nsc; CLEAR_CONTEXT* clear; H264_CONTEXT* h264; + PROGRESSIVE_CONTEXT* progressive; void* xv_context; void* clipboard_context; diff --git a/client/common/CMakeLists.txt b/client/common/CMakeLists.txt index 9724af1d8..0a96bf541 100644 --- a/client/common/CMakeLists.txt +++ b/client/common/CMakeLists.txt @@ -47,7 +47,10 @@ add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) include_directories(${OPENSSL_INCLUDE_DIR}) include_directories(${ZLIB_INCLUDE_DIRS}) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${FREERDP_CHANNELS_CLIENT_LIBS}) @@ -59,9 +62,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHI MODULE freerdp MODULES freerdp-core) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/client/common/client.c b/client/common/client.c index c3fea6fb2..86eed62c5 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -102,6 +102,57 @@ HANDLE freerdp_client_get_thread(rdpContext* context) return ((rdpClientContext*) context)->thread; } +static BOOL freerdp_client_settings_post_process(rdpSettings* settings) +{ + /* Moved GatewayUseSameCredentials logic outside of cmdline.c, so + * that the rdp file also triggers this functionality */ + if (settings->GatewayEnabled) + { + if (settings->GatewayUseSameCredentials) + { + if (settings->Username) + { + settings->GatewayUsername = _strdup(settings->Username); + if (!settings->GatewayUsername) + goto out_error; + } + if (settings->Domain) + { + settings->GatewayDomain = _strdup(settings->Domain); + if (!settings->GatewayDomain) + goto out_error; + } + if (settings->Password) + { + settings->GatewayPassword = _strdup(settings->Password); + if (!settings->GatewayPassword) + goto out_error; + } + } + } + + /* Moved logic for Multimon and Span monitors to force fullscreen, so + * that the rdp file also triggers this functionality */ + if (settings->SpanMonitors) + { + settings->UseMultimon = TRUE; + settings->Fullscreen = TRUE; + } + else if (settings->UseMultimon) + { + settings->Fullscreen = TRUE; + } + + return TRUE; + +out_error: + free(settings->GatewayUsername); + free(settings->GatewayDomain); + free(settings->GatewayPassword); + return FALSE; +} + + int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, char** argv) { int status; @@ -123,6 +174,15 @@ int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, { status = freerdp_client_settings_parse_assistance_file(settings, settings->AssistanceFile); } + + /* Only call post processing if no status/error was returned*/ + if (status < 0) + return status; + + /* This function will call logic that is applicable to the settings + * from command line parsing AND the rdp file parsing */ + if(!freerdp_client_settings_post_process(settings)) + status = -1; return status; } @@ -198,3 +258,4 @@ int freerdp_client_settings_parse_assistance_file(rdpSettings* settings, const c return 0; } + diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 18c180c87..b05864db8 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -127,6 +127,8 @@ COMMAND_LINE_ARGUMENT_A args[] = { "sec-tls", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL, "tls protocol security" }, { "sec-nla", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL, "nla protocol security" }, { "sec-ext", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "nla extended protocol security" }, + { "tls-ciphers", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "List of permitted openssl ciphers - see ciphers(1)" }, + { "tls-ciphers-netmon", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Use tls ciphers that netmon can parse" }, { "cert-name", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "certificate name" }, { "cert-ignore", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "ignore certificate" }, { "pcb", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "Preconnection Blob" }, @@ -1279,8 +1281,6 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, CommandLineSwitchCase(arg, "multimon") { settings->UseMultimon = TRUE; - settings->SpanMonitors = FALSE; - settings->Fullscreen = TRUE; if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) { @@ -1292,9 +1292,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "span") { - settings->UseMultimon = TRUE; settings->SpanMonitors = TRUE; - settings->Fullscreen = TRUE; } CommandLineSwitchCase(arg, "workarea") { @@ -1642,6 +1640,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, CommandLineSwitchCase(arg, "gfx-progressive") { settings->GfxProgressive = arg->Value ? TRUE : FALSE; + settings->GfxThinClient = settings->GfxProgressive ? FALSE : TRUE; settings->SupportGraphicsPipeline = TRUE; } CommandLineSwitchCase(arg, "gfx-h264") @@ -1753,6 +1752,14 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, { settings->ExtSecurity = arg->Value ? TRUE : FALSE; } + CommandLineSwitchCase(arg, "tls-ciphers") + { + settings->PermittedTLSCiphers = _strdup(arg->Value); + } + CommandLineSwitchCase(arg, "tls-ciphers-netmon") + { + settings->PermittedTLSCiphers = arg->Value ? _strdup("ALL:!ECDH") : NULL; + } CommandLineSwitchCase(arg, "cert-name") { settings->CertificateName = _strdup(arg->Value); @@ -1895,21 +1902,6 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, freerdp_performance_flags_make(settings); - if (settings->GatewayEnabled) - { - if (settings->GatewayUseSameCredentials) - { - if (settings->Username) - settings->GatewayUsername = _strdup(settings->Username); - - if (settings->Domain) - settings->GatewayDomain = _strdup(settings->Domain); - - if (settings->Password) - settings->GatewayPassword = _strdup(settings->Password); - } - } - if (settings->SupportGraphicsPipeline) { settings->FastPathOutput = TRUE; diff --git a/client/common/file.c b/client/common/file.c index c4937343a..0642384b0 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -1013,6 +1013,11 @@ BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* freerdp_set_param_bool(settings, FreeRDP_RedirectDrives, TRUE); } + if (~file->KeyboardHook) + { + freerdp_set_param_uint32(settings, FreeRDP_KeyboardHook, file->KeyboardHook); + } + if (file->argc > 1) { char* ConnectionFile = settings->ConnectionFile; diff --git a/client/iOS/CMakeLists.txt b/client/iOS/CMakeLists.txt index b07e73970..52bbc1739 100644 --- a/client/iOS/CMakeLists.txt +++ b/client/iOS/CMakeLists.txt @@ -129,9 +129,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHI MODULE freerdp MODULES freerdp-core freerdp-gdi freerdp-locale freerdp-primitives freerdp-cache freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-input winpr-crt winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/client/iOS/FreeRDP/ios_freerdp_events.h b/client/iOS/FreeRDP/ios_freerdp_events.h old mode 100755 new mode 100644 diff --git a/client/iOS/FreeRDP/ios_freerdp_events.m b/client/iOS/FreeRDP/ios_freerdp_events.m old mode 100755 new mode 100644 diff --git a/client/iOS/Misc/Reachability.h b/client/iOS/Misc/Reachability.h old mode 100755 new mode 100644 diff --git a/client/iOS/Misc/Reachability.m b/client/iOS/Misc/Reachability.m old mode 100755 new mode 100644 diff --git a/client/iOS/Misc/SFHFKeychainUtils.h b/client/iOS/Misc/SFHFKeychainUtils.h old mode 100755 new mode 100644 diff --git a/client/iOS/Misc/SFHFKeychainUtils.m b/client/iOS/Misc/SFHFKeychainUtils.m old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Default-568h@2x.png b/client/iOS/Resources/Default-568h@2x.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Default-Landscape@2x~ipad.png b/client/iOS/Resources/Default-Landscape@2x~ipad.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Default-Landscape~ipad.png b/client/iOS/Resources/Default-Landscape~ipad.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Default-Portrait@2x~ipad.png b/client/iOS/Resources/Default-Portrait@2x~ipad.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Default-Portrait~ipad.png b/client/iOS/Resources/Default-Portrait~ipad.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Default.png b/client/iOS/Resources/Default.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Default@2x.png b/client/iOS/Resources/Default@2x.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Icon-72.png b/client/iOS/Resources/Icon-72.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Icon-72@2x.png b/client/iOS/Resources/Icon-72@2x.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Icon.png b/client/iOS/Resources/Icon.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/Icon@2x.png b/client/iOS/Resources/Icon@2x.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/about_page/FreeRDP_Logo.png b/client/iOS/Resources/about_page/FreeRDP_Logo.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/about_page/about.html b/client/iOS/Resources/about_page/about.html old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/about_page/about_phone.html b/client/iOS/Resources/about_page/about_phone.html old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/about_page/back.jpg b/client/iOS/Resources/about_page/back.jpg old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/about_page/background_transparent.png b/client/iOS/Resources/about_page/background_transparent.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/back.jpg b/client/iOS/Resources/help_page/back.jpg old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/gestures.html b/client/iOS/Resources/help_page/gestures.html old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/gestures.png b/client/iOS/Resources/help_page/gestures.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/gestures_phone.html b/client/iOS/Resources/help_page/gestures_phone.html old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/gestures_phone.png b/client/iOS/Resources/help_page/gestures_phone.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/nav_gestures.png b/client/iOS/Resources/help_page/nav_gestures.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/nav_toolbar.png b/client/iOS/Resources/help_page/nav_toolbar.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/nav_touch_pointer.png b/client/iOS/Resources/help_page/nav_touch_pointer.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/toolbar.html b/client/iOS/Resources/help_page/toolbar.html old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/toolbar.png b/client/iOS/Resources/help_page/toolbar.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/toolbar_phone.html b/client/iOS/Resources/help_page/toolbar_phone.html old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/toolbar_phone.png b/client/iOS/Resources/help_page/toolbar_phone.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/touch_pointer.html b/client/iOS/Resources/help_page/touch_pointer.html old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/touch_pointer.png b/client/iOS/Resources/help_page/touch_pointer.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/touch_pointer_phone.html b/client/iOS/Resources/help_page/touch_pointer_phone.html old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/help_page/touch_pointer_phone.png b/client/iOS/Resources/help_page/touch_pointer_phone.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_accessory_star_off.png b/client/iOS/Resources/icon_accessory_star_off.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_accessory_star_on.png b/client/iOS/Resources/icon_accessory_star_on.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_arrow_down.png b/client/iOS/Resources/icon_key_arrow_down.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_arrow_left.png b/client/iOS/Resources/icon_key_arrow_left.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_arrow_right.png b/client/iOS/Resources/icon_key_arrow_right.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_arrow_up.png b/client/iOS/Resources/icon_key_arrow_up.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_arrows.png b/client/iOS/Resources/icon_key_arrows.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_backspace.png b/client/iOS/Resources/icon_key_backspace.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_menu.png b/client/iOS/Resources/icon_key_menu.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_return.png b/client/iOS/Resources/icon_key_return.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/icon_key_win.png b/client/iOS/Resources/icon_key_win.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/keyboard_button_background.png b/client/iOS/Resources/keyboard_button_background.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/tabbar_icon_about.png b/client/iOS/Resources/tabbar_icon_about.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/tabbar_icon_help.png b/client/iOS/Resources/tabbar_icon_help.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/tabbar_icon_settings.png b/client/iOS/Resources/tabbar_icon_settings.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/toolbar_icon_disconnect.png b/client/iOS/Resources/toolbar_icon_disconnect.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/toolbar_icon_extkeyboad.png b/client/iOS/Resources/toolbar_icon_extkeyboad.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/toolbar_icon_home.png b/client/iOS/Resources/toolbar_icon_home.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/toolbar_icon_keyboard.png b/client/iOS/Resources/toolbar_icon_keyboard.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/toolbar_icon_touchpointer.png b/client/iOS/Resources/toolbar_icon_touchpointer.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/toolbar_icon_win.png b/client/iOS/Resources/toolbar_icon_win.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/touch_pointer_active.png b/client/iOS/Resources/touch_pointer_active.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/touch_pointer_default.png b/client/iOS/Resources/touch_pointer_default.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/touch_pointer_extkeyboard.png b/client/iOS/Resources/touch_pointer_extkeyboard.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/touch_pointer_keyboard.png b/client/iOS/Resources/touch_pointer_keyboard.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/touch_pointer_lclick.png b/client/iOS/Resources/touch_pointer_lclick.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/touch_pointer_rclick.png b/client/iOS/Resources/touch_pointer_rclick.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/touch_pointer_reset.png b/client/iOS/Resources/touch_pointer_reset.png old mode 100755 new mode 100644 diff --git a/client/iOS/Resources/touch_pointer_scroll.png b/client/iOS/Resources/touch_pointer_scroll.png old mode 100755 new mode 100644 diff --git a/client/iOS/Views/BlockAlertView.h b/client/iOS/Views/BlockAlertView.h old mode 100755 new mode 100644 diff --git a/client/iOS/Views/BlockAlertView.m b/client/iOS/Views/BlockAlertView.m old mode 100755 new mode 100644 diff --git a/cmake/AndroidToolchain.cmake b/cmake/AndroidToolchain.cmake index d31eaaccd..26d8ac3e7 100644 --- a/cmake/AndroidToolchain.cmake +++ b/cmake/AndroidToolchain.cmake @@ -1,5 +1,5 @@ # Copyright (c) 2010-2011, Ethan Rublee -# Copyright (c) 2011-2013, Andrey Kamaev +# Copyright (c) 2011-2014, Andrey Kamaev # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -12,9 +12,9 @@ # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # -# 3. The name of the copyright holders may be used to endorse or promote -# products derived from this software without specific prior written -# permission. +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -29,7 +29,7 @@ # POSSIBILITY OF SUCH DAMAGE. # ------------------------------------------------------------------------------ -# Android CMake toolchain file, for use with the Android NDK r5-r8 +# Android CMake toolchain file, for use with the Android NDK r5-r9 # Requires cmake 2.6.3 or newer (2.8.5 or newer is recommended). # See home page: https://github.com/taka-no-me/android-cmake # @@ -87,8 +87,7 @@ # "armeabi-v6 with VFP" - tuned for ARMv6 processors having VFP. # "x86" - matches to the NDK ABI with the same name. # See ${ANDROID_NDK}/docs/CPU-ARCH-ABIS.html for the documentation. -# "mips" - matches to the NDK ABI with the same name -# (It is not tested on real devices by the authos of this toolchain) +# "mips" - matches to the NDK ABI with the same name. # See ${ANDROID_NDK}/docs/CPU-ARCH-ABIS.html for the documentation. # # ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for. @@ -294,6 +293,16 @@ # [~] automatically detect if explicit link to crtbegin_*.o is needed # - June 2013 # [~] fixed stl include path for standalone toolchain made by NDK >= r8c +# - July 2013 +# [+] updated for NDK r9 +# - November 2013 +# [+] updated for NDK r9b +# - December 2013 +# [+] updated for NDK r9c +# - January 2014 +# [~] fix copying of shared STL +# - April 2014 +# [+] updated for NDK r9d # ------------------------------------------------------------------------------ cmake_minimum_required( VERSION 2.6.3 ) @@ -326,7 +335,7 @@ endif() # rpath makes low sence for Android set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." ) -set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" ) +set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r9d -r9c -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" ) if(NOT DEFINED ANDROID_NDK_SEARCH_PATHS) if( CMAKE_HOST_WIN32 ) file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS ) @@ -470,10 +479,9 @@ if( ANDROID_FORBID_SYGWIN ) endif() endif() -# FIXME: properly detect 64-bit host, currently reported as 32-bit # detect current host platform -if( NOT DEFINED ANDROID_NDK_HOST_X64 AND CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64") +if( NOT DEFINED ANDROID_NDK_HOST_X64 AND (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64" OR CMAKE_HOST_APPLE) ) set( ANDROID_NDK_HOST_X64 1 CACHE BOOL "Try to use 64-bit compiler toolchain" ) mark_as_advanced( ANDROID_NDK_HOST_X64 ) endif() @@ -494,7 +502,7 @@ else() endif() if( NOT ANDROID_NDK_HOST_X64 ) - #set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) + set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) endif() # see if we have path to Android NDK @@ -1139,15 +1147,7 @@ endif() # case of shared STL linkage if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl ) string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" ) - if( NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES "[.]so$" ) - get_filename_component( __libstlname "${__libstl}" NAME ) - execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess ) - if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}") - message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" ) - endif() - unset( __fileCopyProcess ) - unset( __libstlname ) - endif() + # TODO: check if .so file exists before the renaming endif() @@ -1512,7 +1512,8 @@ endif() # global includes and link directories include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} ) -link_directories( "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ) +get_filename_component(__android_install_path "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ABSOLUTE) # avoid CMP0015 policy warning +link_directories( "${__android_install_path}" ) # detect if need link crtbegin_so.o explicitly if( NOT DEFINED ANDROID_EXPLICIT_CRT_LINK ) @@ -1564,6 +1565,18 @@ if(NOT _CMAKE_IN_TRY_COMPILE) set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "path for android libs" ) endif() +# copy shaed stl library to build directory +if( NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES "[.]so$" ) + get_filename_component( __libstlname "${__libstl}" NAME ) + execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess ) + if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}") + message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" ) + endif() + unset( __fileCopyProcess ) + unset( __libstlname ) +endif() + + # set these global flags for cmake client scripts to change behavior set( ANDROID True ) set( BUILD_ANDROID True ) @@ -1672,6 +1685,19 @@ if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" ) endif() +# force cmake to produce / instead of \ in build commands for Ninja generator +if( CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_HOST_WIN32 ) + # it is a bad hack after all + # CMake generates Ninja makefiles with UNIX paths only if it thinks that we are going to build with MinGW + set( CMAKE_COMPILER_IS_MINGW TRUE ) # tell CMake that we are MinGW + set( CMAKE_CROSSCOMPILING TRUE ) # stop recursion + enable_language( C ) + enable_language( CXX ) + # unset( CMAKE_COMPILER_IS_MINGW ) # can't unset because CMake does not convert back-slashes in response files without it + unset( MINGW ) +endif() + + # set some obsolete variables for backward compatibility set( ANDROID_SET_OBSOLETE_VARIABLES ON CACHE BOOL "Define obsolete Andrid-specific cmake variables" ) mark_as_advanced( ANDROID_SET_OBSOLETE_VARIABLES ) @@ -1726,7 +1752,7 @@ endif() # BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used # ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform # ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86" or "mips" depending on ANDROID_ABI -# ANDROID_NDK_RELEASE : one of r5, r5b, r5c, r6, r6b, r7, r7b, r7c, r8, r8b, r8c, r8d, r8e; set only for NDK +# ANDROID_NDK_RELEASE : one of r5, r5b, r5c, r6, r6b, r7, r7b, r7c, r8, r8b, r8c, r8d, r8e, r9, r9b, r9c, r9d; set only for NDK # ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI # ANDROID_SYSROOT : path to the compiler sysroot # TOOL_OS_SUFFIX : "" or ".exe" depending on host platform diff --git a/config.h.in b/config.h.in old mode 100755 new mode 100644 diff --git a/cunit/CMakeLists.txt b/cunit/CMakeLists.txt index ca351c5fc..dffd4d329 100644 --- a/cunit/CMakeLists.txt +++ b/cunit/CMakeLists.txt @@ -71,7 +71,7 @@ target_link_libraries(test_freerdp freerdp-utils) target_link_libraries(test_freerdp freerdp-codec) target_link_libraries(test_freerdp freerdp-crypto) -target_link_libraries(test_freerdp winpr-sspi) +target_link_libraries(test_freerdp winpr) add_test(CUnitTests ${CMAKE_SOURCE_DIR}/cunit/test_freerdp) diff --git a/include/freerdp/channels/rdpdr.h b/include/freerdp/channels/rdpdr.h index 8cc455b89..e6e590380 100644 --- a/include/freerdp/channels/rdpdr.h +++ b/include/freerdp/channels/rdpdr.h @@ -212,12 +212,14 @@ enum RDPDR_PRINTER_ANNOUNCE_FLAG /* [MS-FSCC] FSCTL Structures */ +#if !defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) #define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION 0x1400ec #define FSCTL_PIPE_PEEK 0x11400c #define FSCTL_PIPE_TRANSCEIVE 0x11c017 #define FSCTL_PIPE_WAIT 0x110018 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO 0x9013c #define FSCTL_QUERY_SPARING_INFO 0x90138 +#endif #ifndef _WIN32 #define FSCTL_CREATE_OR_GET_OBJECT_ID 0x900c0 @@ -239,8 +241,10 @@ enum RDPDR_PRINTER_ANNOUNCE_FLAG #define FSCTL_WRITE_USN_CLOSE_RECORD 0x900ef #endif +#if !defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) #define FSCTL_SET_DEFECT_MANAGEMENT 0x98134 #define FSCTL_SET_ZERO_ON_DEALLOCATION 0x90194 +#endif /* [MS-FSCC] FileFsAttributeInformation.FileSystemAttributes */ diff --git a/include/freerdp/codec/h264.h b/include/freerdp/codec/h264.h index 8ca83bcc0..3c445d61a 100644 --- a/include/freerdp/codec/h264.h +++ b/include/freerdp/codec/h264.h @@ -23,11 +23,22 @@ #include #include +#ifdef WITH_LIBAVCODEC +#ifdef WITH_OPENH264 +#undef WITH_OPENH264 +#endif +#endif + #ifdef WITH_OPENH264 #include "wels/codec_def.h" #include "wels/codec_api.h" #endif +#ifdef WITH_LIBAVCODEC +#include +#include +#endif + struct _H264_CONTEXT { BOOL Compressor; @@ -41,6 +52,13 @@ struct _H264_CONTEXT #ifdef WITH_OPENH264 ISVCDecoder* pDecoder; #endif + +#ifdef WITH_LIBAVCODEC + AVCodec* codec; + AVCodecContext* codecContext; + AVCodecParserContext* codecParser; + AVFrame* videoFrame; +#endif }; typedef struct _H264_CONTEXT H264_CONTEXT; diff --git a/include/freerdp/codec/progressive.h b/include/freerdp/codec/progressive.h new file mode 100644 index 000000000..8c6327f5d --- /dev/null +++ b/include/freerdp/codec/progressive.h @@ -0,0 +1,242 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Progressive Codec Bitmap Compression + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CODEC_PROGRESSIVE_H +#define FREERDP_CODEC_PROGRESSIVE_H + +#include +#include + +#include +#include + +#define RFX_SUBBAND_DIFFING 0x01 + +#define RFX_TILE_DIFFERENCE 0x01 + +#define RFX_DWT_REDUCE_EXTRAPOLATE 0x01 + +#define PROGRESSIVE_WBT_SYNC 0xCCC0 +#define PROGRESSIVE_WBT_FRAME_BEGIN 0xCCC1 +#define PROGRESSIVE_WBT_FRAME_END 0xCCC2 +#define PROGRESSIVE_WBT_CONTEXT 0xCCC3 +#define PROGRESSIVE_WBT_REGION 0xCCC4 +#define PROGRESSIVE_WBT_TILE_SIMPLE 0xCCC5 +#define PROGRESSIVE_WBT_TILE_FIRST 0xCCC6 +#define PROGRESSIVE_WBT_TILE_UPGRADE 0xCCC7 + +#define PROGRESSIVE_BLOCKS_ALL 0x0001 +#define PROGRESSIVE_BLOCKS_REGION 0x0002 +#define PROGRESSIVE_BLOCKS_TILE 0x0004 + +struct _RFX_PROGRESSIVE_CODEC_QUANT +{ + BYTE quality; + BYTE yQuantValues[5]; + BYTE cbQuantValues[5]; + BYTE crQuantValues[5]; +}; +typedef struct _RFX_PROGRESSIVE_CODEC_QUANT RFX_PROGRESSIVE_CODEC_QUANT; + +struct _RFX_COMPONENT_CODEC_QUANT +{ + BYTE LL3; + BYTE HL3; + BYTE LH3; + BYTE HH3; + BYTE HL2; + BYTE LH2; + BYTE HH2; + BYTE HL1; + BYTE LH1; + BYTE HH1; +}; +typedef struct _RFX_COMPONENT_CODEC_QUANT RFX_COMPONENT_CODEC_QUANT; + +struct _PROGRESSIVE_BLOCK +{ + UINT16 blockType; + UINT32 blockLen; +}; +typedef struct _PROGRESSIVE_BLOCK PROGRESSIVE_BLOCK; + +struct _PROGRESSIVE_BLOCK_SYNC +{ + UINT16 blockType; + UINT32 blockLen; + + UINT32 magic; + UINT16 version; +}; +typedef struct _PROGRESSIVE_BLOCK_SYNC PROGRESSIVE_BLOCK_SYNC; + +struct _PROGRESSIVE_BLOCK_CONTEXT +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE ctxId; + UINT16 tileSize; + BYTE flags; +}; +typedef struct _PROGRESSIVE_BLOCK_CONTEXT PROGRESSIVE_BLOCK_CONTEXT; + +struct _PROGRESSIVE_BLOCK_REGION +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE tileSize; + UINT16 numRects; + BYTE numQuant; + BYTE numProgQuant; + BYTE flags; + UINT16 numTiles; + UINT32 tileDataSize; + RFX_RECT* rects; + RFX_COMPONENT_CODEC_QUANT* quantVals; + RFX_PROGRESSIVE_CODEC_QUANT* quantProgVals; + PROGRESSIVE_BLOCK** tiles; +}; +typedef struct _PROGRESSIVE_BLOCK_REGION PROGRESSIVE_BLOCK_REGION; + +struct _PROGRESSIVE_BLOCK_FRAME_BEGIN +{ + UINT16 blockType; + UINT32 blockLen; + + UINT32 frameIndex; + UINT16 regionCount; + PROGRESSIVE_BLOCK_REGION* regions; +}; +typedef struct _PROGRESSIVE_BLOCK_FRAME_BEGIN PROGRESSIVE_BLOCK_FRAME_BEGIN; + +struct _PROGRESSIVE_BLOCK_FRAME_END +{ + UINT16 blockType; + UINT32 blockLen; +}; +typedef struct _PROGRESSIVE_BLOCK_FRAME_END PROGRESSIVE_BLOCK_FRAME_END; + +struct _PROGRESSIVE_BLOCK_TILE_SIMPLE +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE quantIdxY; + BYTE quantIdxCb; + BYTE quantIdxCr; + UINT16 xIdx; + UINT16 yIdx; + BYTE flags; + UINT16 yLen; + UINT16 cbLen; + UINT16 crLen; + UINT16 tailLen; + BYTE* yData; + BYTE* cbData; + BYTE* crData; + BYTE* tailData; +}; +typedef struct _PROGRESSIVE_BLOCK_TILE_SIMPLE PROGRESSIVE_BLOCK_TILE_SIMPLE; + +struct _PROGRESSIVE_BLOCK_TILE_FIRST +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE quantIdxY; + BYTE quantIdxCb; + BYTE quantIdxCr; + UINT16 xIdx; + UINT16 yIdx; + BYTE flags; + BYTE quality; + UINT16 yLen; + UINT16 cbLen; + UINT16 crLen; + UINT16 tailLen; + BYTE* yData; + BYTE* cbData; + BYTE* crData; + BYTE* tailData; +}; +typedef struct _PROGRESSIVE_BLOCK_TILE_FIRST PROGRESSIVE_BLOCK_TILE_FIRST; + +struct _PROGRESSIVE_BLOCK_TILE_UPGRADE +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE quantIdxY; + BYTE quantIdxCb; + BYTE quantIdxCr; + UINT16 xIdx; + UINT16 yIdx; + BYTE quality; + UINT16 ySrlLen; + UINT16 yRawLen; + UINT16 cbSrlLen; + UINT16 cbRawLen; + UINT16 crSrlLen; + UINT16 crRawLen; + BYTE* ySrlData; + BYTE* yRawData; + BYTE* cbSrlData; + BYTE* cbRawData; + BYTE* crSrlData; + BYTE* crRawData; +}; +typedef struct _PROGRESSIVE_BLOCK_TILE_UPGRADE PROGRESSIVE_BLOCK_TILE_UPGRADE; + +struct _PROGRESSIVE_CONTEXT +{ + BOOL Compressor; + + UINT32 cRects; + RFX_RECT* rects; + + UINT32 cQuant; + RFX_COMPONENT_CODEC_QUANT* quantVals; + + UINT32 cProgQuant; + RFX_PROGRESSIVE_CODEC_QUANT* quantProgVals; +}; +typedef struct _PROGRESSIVE_CONTEXT PROGRESSIVE_CONTEXT; + +#ifdef __cplusplus +extern "C" { +#endif + +FREERDP_API int progressive_compress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize); + +FREERDP_API int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UINT32 SrcSize, + BYTE** ppDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight); + +FREERDP_API void progressive_context_reset(PROGRESSIVE_CONTEXT* progressive); + +FREERDP_API PROGRESSIVE_CONTEXT* progressive_context_new(BOOL Compressor); +FREERDP_API void progressive_context_free(PROGRESSIVE_CONTEXT* progressive); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CODEC_PROGRESSIVE_H */ + diff --git a/include/freerdp/error.h b/include/freerdp/error.h old mode 100755 new mode 100644 diff --git a/include/freerdp/locale/keyboard.h b/include/freerdp/locale/keyboard.h index 147067d8e..6868601ef 100644 --- a/include/freerdp/locale/keyboard.h +++ b/include/freerdp/locale/keyboard.h @@ -116,9 +116,10 @@ typedef struct _RDP_KEYBOARD_LAYOUT RDP_KEYBOARD_LAYOUT; #define KBD_SWEDISH_WITH_SAMI 0x0000083B #define KBD_UZBEK_CYRILLIC 0x00000843 #define KBD_INUKTITUT_LATIN 0x0000085D +#define KBD_CANADIAN_ENGLISH 0x00001009 #define KBD_CANADIAN_FRENCH_LEGACY 0x00000C0C #define KBD_SERBIAN_CYRILLIC 0x00000C1A -#define KBD_CANADIAN_FRENCH 0x00001009 +#define KBD_CANADIAN_FRENCH 0x00000C0C #define KBD_SWISS_FRENCH 0x0000100C #define KBD_BOSNIAN 0x0000141A #define KBD_IRISH 0x00001809 diff --git a/include/freerdp/server/echo.h b/include/freerdp/server/echo.h new file mode 100644 index 000000000..e2a4c4260 --- /dev/null +++ b/include/freerdp/server/echo.h @@ -0,0 +1,85 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Echo Virtual Channel Extension + * + * Copyright 2014 Vic Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_ECHO_SERVER_H +#define FREERDP_CHANNEL_ECHO_SERVER_H + +#include + +typedef enum ECHO_SERVER_OPEN_RESULT +{ + ECHO_SERVER_OPEN_RESULT_OK = 0, + ECHO_SERVER_OPEN_RESULT_CLOSED = 1, + ECHO_SERVER_OPEN_RESULT_NOTSUPPORTED = 2, + ECHO_SERVER_OPEN_RESULT_ERROR = 3 +} ECHO_SERVER_OPEN_RESULT; + +typedef struct _echo_server_context echo_server_context; + +typedef void (*psEchoServerOpen)(echo_server_context* context); +typedef void (*psEchoServerClose)(echo_server_context* context); +typedef BOOL (*psEchoServerRequest)(echo_server_context* context, const BYTE* buffer, UINT32 length); + +typedef void (*psEchoServerOpenResult)(echo_server_context* context, ECHO_SERVER_OPEN_RESULT result); +typedef void (*psEchoServerResponse)(echo_server_context* context, const BYTE* buffer, UINT32 length); + +struct _echo_server_context +{ + HANDLE vcm; + + /* Server self-defined pointer. */ + void* data; + + /*** APIs called by the server. ***/ + /** + * Open the echo channel. + */ + psEchoServerOpen Open; + /** + * Close the echo channel. + */ + psEchoServerClose Close; + /** + * Send echo request PDU. + */ + psEchoServerRequest Request; + + /*** Callbacks registered by the server. ***/ + /** + * Indicate whether the channel is opened successfully. + */ + psEchoServerOpenResult OpenResult; + /** + * Receive echo response PDU. + */ + psEchoServerResponse Response; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +FREERDP_API echo_server_context* echo_server_context_new(HANDLE vcm); +FREERDP_API void echo_server_context_free(echo_server_context* context); + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_CHANNEL_ECHO_SERVER_H */ diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 7fa967525..ba05c81c0 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -222,6 +222,11 @@ #define LB_CLIENT_TSV_URL 0x00001000 #define LB_SERVER_TSV_CAPABLE 0x00002000 +/* Keyboard Hook */ +#define KEYBOARD_HOOK_LOCAL 0 +#define KEYBOARD_HOOK_REMOTE 1 +#define KEYBOARD_HOOK_FULLSCREEN_ONLY 2 + struct _TARGET_NET_ADDRESS { UINT32 Length; @@ -726,6 +731,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_FastPathInput 2630 #define FreeRDP_MultiTouchInput 2631 #define FreeRDP_MultiTouchGestures 2632 +#define FreeRDP_KeyboardHook 2633 #define FreeRDP_BrushSupportLevel 2688 #define FreeRDP_GlyphSupportLevel 2752 #define FreeRDP_GlyphCache 2753 @@ -974,7 +980,8 @@ struct rdp_settings ALIGN64 char* AuthenticationServiceClass; /* 1098 */ ALIGN64 BOOL DisableCredentialsDelegation; /* 1099 */ ALIGN64 BOOL AuthenticationLevel; /* 1100 */ - UINT64 padding1152[1152 - 1101]; /* 1101 */ + ALIGN64 char* PermittedTLSCiphers; /* 1101 */ + UINT64 padding1152[1152 - 1102]; /* 1102 */ /* Connection Cookie */ ALIGN64 BOOL MstscCookieMode; /* 1152 */ @@ -1180,7 +1187,8 @@ struct rdp_settings ALIGN64 BOOL FastPathInput; /* 2630 */ ALIGN64 BOOL MultiTouchInput; /* 2631 */ ALIGN64 BOOL MultiTouchGestures; /* 2632 */ - UINT64 padding2688[2688 - 2633]; /* 2633 */ + ALIGN64 UINT32 KeyboardHook; /* 2633 */ + UINT64 padding2688[2688 - 2634]; /* 2634 */ /* Brush Capabilities */ ALIGN64 UINT32 BrushSupportLevel; /* 2688 */ diff --git a/libfreerdp/CMakeLists.txt b/libfreerdp/CMakeLists.txt index fa3dbf10e..c11458f52 100644 --- a/libfreerdp/CMakeLists.txt +++ b/libfreerdp/CMakeLists.txt @@ -56,7 +56,10 @@ if(MONOLITHIC_BUILD) ${${MODULE_PREFIX}_OBJECTS}) set_target_properties(${MODULE_NAME} PROPERTIES LINKER_LANGUAGE C) - set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") + if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) + endif() + set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") list(APPEND FREERDP_LIBS ${PROFILER_LIBRARIES}) list(REMOVE_DUPLICATES FREERDP_LIBS) diff --git a/libfreerdp/cache/CMakeLists.txt b/libfreerdp/cache/CMakeLists.txt index 82491a2d5..5a52a048b 100644 --- a/libfreerdp/cache/CMakeLists.txt +++ b/libfreerdp/cache/CMakeLists.txt @@ -33,7 +33,10 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" SOURCES ${${MODULE_PREFIX}_SRCS} EXPORT) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL diff --git a/libfreerdp/cache/bitmap.c b/libfreerdp/cache/bitmap.c index c685c365e..ec78af491 100644 --- a/libfreerdp/cache/bitmap.c +++ b/libfreerdp/cache/bitmap.c @@ -136,6 +136,7 @@ void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cach { rdpBitmap* bitmap; rdpBitmap* prevBitmap; + BOOL isCompressed = TRUE; rdpCache* cache = context->cache; BITMAP_DATA_EX* bitmapData = &cacheBitmapV3->bitmapData; @@ -149,9 +150,13 @@ void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cach cacheBitmapV3->bitmapData.bpp = context->instance->settings->ColorDepth; } + /* According to http://msdn.microsoft.com/en-us/library/gg441209.aspx + * CACHE_BITMAP_REV3_ORDER::bitmapData::codecID = 0x00 (uncompressed) */ + isCompressed = (bitmapData->codecID != RDP_CODEC_ID_NONE); + bitmap->Decompress(context, bitmap, bitmapData->data, bitmap->width, bitmap->height, - bitmapData->bpp, bitmapData->length, TRUE, + bitmapData->bpp, bitmapData->length, isCompressed, bitmapData->codecID); bitmap->New(context, bitmap); diff --git a/libfreerdp/codec/CMakeLists.txt b/libfreerdp/codec/CMakeLists.txt index fdef7f6ec..ea20105ff 100644 --- a/libfreerdp/codec/CMakeLists.txt +++ b/libfreerdp/codec/CMakeLists.txt @@ -24,6 +24,7 @@ set(${MODULE_PREFIX}_SRCS audio.c planar.c planar.h + progressive.c bitmap_decode.c bitmap_encode.c rfx_bitstream.h @@ -106,26 +107,35 @@ if(WITH_OPENH264) endif() endif() +if(WITH_LIBAVCODEC) + add_definitions(-DWITH_LIBAVCODEC) + find_library(LIBAVCODEC_LIB avcodec) + find_library(LIBAVUTIL_LIB avutil) + set(FREERDP_LIBAVCODEC_LIBS ${LIBAVCODEC_LIB} ${LIBAVUTIL_LIB}) +endif() + add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" MONOLITHIC ${MONOLITHIC_BUILD} SOURCES ${${MODULE_PREFIX}_SRCS} EXPORT) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set(${MODULE_PREFIX}_LIBS ${FREERDP_JPEG_LIBS} - ${FREERDP_OPENH264_LIBS}) + ${FREERDP_OPENH264_LIBS} + ${FREERDP_LIBAVCODEC_LIBS}) set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL MODULE freerdp MODULES freerdp-primitives freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-pool winpr-registry winpr-sysinfo winpr-utils) + +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) diff --git a/libfreerdp/codec/h264.c b/libfreerdp/codec/h264.c new file mode 100644 index 000000000..c2fbedf10 --- /dev/null +++ b/libfreerdp/codec/h264.c @@ -0,0 +1,739 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * H.264 Bitmap Compression + * + * Copyright 2014 Mike McDonald + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include +#include + +#define USE_GRAY_SCALE 0 +#define USE_UPCONVERT 0 + +static BYTE clip(int x) +{ + if (x < 0) return 0; + if (x > 255) return 255; + return (BYTE)x; +} + +static UINT32 YUV_to_RGB(BYTE Y, BYTE U, BYTE V) +{ + BYTE R, G, B; + +#if USE_GRAY_SCALE + /* + * Displays the Y plane as a gray-scale image. + */ + R = Y; + G = Y; + B = Y; +#else + int C, D, E; + +#if 0 + /* + * Documented colorspace conversion from YUV to RGB. + * See http://msdn.microsoft.com/en-us/library/ms893078.aspx + */ + + C = Y - 16; + D = U - 128; + E = V - 128; + + R = clip(( 298 * C + 409 * E + 128) >> 8); + G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8); + B = clip(( 298 * C + 516 * D + 128) >> 8); +#endif + +#if 0 + /* + * These coefficients produce better results. + * See http://www.microchip.com/forums/m599060.aspx + */ + + C = Y; + D = U - 128; + E = V - 128; + + R = clip(( 256 * C + 359 * E + 128) >> 8); + G = clip(( 256 * C - 88 * D - 183 * E + 128) >> 8); + B = clip(( 256 * C + 454 * D + 128) >> 8); +#endif + +#if 1 + /* + * These coefficients produce excellent results. + */ + + C = Y; + D = U - 128; + E = V - 128; + + R = clip(( 256 * C + 403 * E + 128) >> 8); + G = clip(( 256 * C - 48 * D - 120 * E + 128) >> 8); + B = clip(( 256 * C + 475 * D + 128) >> 8); +#endif + +#endif + + return RGB32(R, G, B); +} + +#if USE_UPCONVERT +static BYTE* h264_convert_420_to_444(BYTE* chroma420, int chroma420Width, int chroma420Height, int chroma420Stride) +{ + BYTE *chroma444, *src, *dst; + int chroma444Width; + int chroma444Height; + int i, j; + + chroma444Width = chroma420Width * 2; + chroma444Height = chroma420Height * 2; + + chroma444 = (BYTE*) malloc(chroma444Width * chroma444Height); + + if (!chroma444) + return NULL; + + /* Upconvert in the horizontal direction. */ + + for (j = 0; j < chroma420Height; j++) + { + src = chroma420 + j * chroma420Stride; + dst = chroma444 + j * chroma444Width; + dst[0] = src[0]; + for (i = 1; i < chroma420Width; i++) + { + dst[2*i-1] = (3 * src[i-1] + src[i] + 2) >> 2; + dst[2*i] = (src[i-1] + 3 * src[i] + 2) >> 2; + } + dst[chroma444Width-1] = src[chroma420Width-1]; + } + + /* Upconvert in the vertical direction (in-place, bottom-up). */ + + for (i = 0; i < chroma444Width; i++) + { + src = chroma444 + i + (chroma420Height-2) * chroma444Width; + dst = chroma444 + i + (2*(chroma420Height-2)+1) * chroma444Width; + dst[2*chroma444Width] = src[chroma444Width]; + for (j = chroma420Height - 2; j >= 0; j--) + { + dst[chroma444Width] = (src[0] + 3 * src[chroma444Width] + 2) >> 2; + dst[0] = (3 * src[0] + src[chroma444Width] + 2) >> 2; + dst -= 2 * chroma444Width; + src -= chroma444Width; + } + } + + return chroma444; +} +#endif + +static int g_H264FrameId = 0; +static BOOL g_H264DumpFrames = FALSE; + +static void h264_dump_h264_data(BYTE* data, int size) +{ + FILE* fp; + char buf[4096]; + + sprintf_s(buf, sizeof(buf), "/tmp/wlog/bs_%d.h264", g_H264FrameId); + fp = fopen(buf, "wb"); + fwrite(data, 1, size, fp); + fflush(fp); + fclose(fp); +} + +void h264_dump_yuv_data(BYTE* yuv[], int width, int height, int stride[]) +{ + FILE* fp; + BYTE* srcp; + char buf[4096]; + int j; + + sprintf_s(buf, sizeof(buf), "/tmp/wlog/H264_%d.ppm", g_H264FrameId); + fp = fopen(buf, "wb"); + fwrite("P5\n", 1, 3, fp); + sprintf_s(buf, sizeof(buf), "%d %d\n", width, height); + fwrite(buf, 1, strlen(buf), fp); + fwrite("255\n", 1, 4, fp); + + srcp = yuv[0]; + + for (j = 0; j < height; j++) + { + fwrite(srcp, 1, width, fp); + srcp += stride[0]; + } + + fflush(fp); + fclose(fp); +} + +int h264_prepare_rgb_buffer(H264_CONTEXT* h264, int width, int height) +{ + UINT32 size; + + h264->width = width; + h264->height = height; + h264->scanline = h264->width * 4; + size = h264->scanline * h264->height; + + if (size > h264->size) + { + h264->size = size; + h264->data = (BYTE*) realloc(h264->data, h264->size); + memset(h264->data, 0, h264->size); + } + + if (!h264->data) + return -1; + + return 1; +} + +int freerdp_image_copy_yuv420p_to_xrgb(BYTE* pDstData, int nDstStep, int nXDst, int nYDst, + int nWidth, int nHeight, BYTE* pSrcData[3], int nSrcStep[2], int nXSrc, int nYSrc) +{ + int x, y; + BYTE* pDstPixel8; + BYTE *pY, *pU, *pV; + int shift = 1; + +#if USE_UPCONVERT + /* Convert 4:2:0 YUV to 4:4:4 YUV. */ + pSrcData[1] = h264_convert_420_to_444(pSrcData[1], nWidth / 2, nHeight / 2, nSrcStep[1]); + pSrcData[2] = h264_convert_420_to_444(pSrcData[2], nWidth / 2, nHeight / 2, nSrcStep[1]); + + nSrcStep[1] = nWidth; + + shift = 0; +#endif + + pY = pSrcData[0] + (nYSrc * nSrcStep[0]) + nXSrc; + + pDstPixel8 = &pDstData[(nYDst * nDstStep) + (nXDst * 4)]; + + for (y = 0; y < nHeight; y++) + { + pU = pSrcData[1] + ((nYSrc + y) >> shift) * nSrcStep[1]; + pV = pSrcData[2] + ((nYSrc + y) >> shift) * nSrcStep[1]; + + for (x = 0; x < nWidth; x++) + { + BYTE Y, U, V; + + Y = *pY; + U = pU[(nXSrc + x) >> shift]; + V = pV[(nXSrc + x) >> shift]; + + *((UINT32*) pDstPixel8) = YUV_to_RGB(Y, U, V); + + pDstPixel8 += 4; + pY++; + } + + pDstPixel8 += (nDstStep - (nWidth * 4)); + pY += (nSrcStep[0] - nWidth); + } + +#if USE_UPCONVERT + free(pSrcData[1]); + free(pSrcData[2]); +#endif + + return 1; +} + +BYTE* h264_strip_nal_unit_au_delimiter(BYTE* pSrcData, UINT32* pSrcSize) +{ + BYTE* data = pSrcData; + UINT32 size = *pSrcSize; + BYTE forbidden_zero_bit = 0; + BYTE nal_ref_idc = 0; + BYTE nal_unit_type = 0; + + /* ITU-T H.264 B.1.1 Byte stream NAL unit syntax */ + + while (size > 0) + { + if (*data) + break; + + data++; + size--; + } + + if (*data != 1) + return pSrcData; + + data++; + size--; + + forbidden_zero_bit = (data[0] >> 7); + nal_ref_idc = (data[0] >> 5); + nal_unit_type = (data[0] & 0x1F); + + if (forbidden_zero_bit) + return pSrcData; /* invalid */ + + if (nal_unit_type == 9) + { + /* NAL Unit AU Delimiter */ + + printf("NAL Unit AU Delimiter: idc: %d\n", nal_ref_idc); + + data += 2; + size -= 2; + + *pSrcSize = size; + return data; + } + + return pSrcData; +} + + + +/************************************************* + * + * OpenH264 Implementation + * + ************************************************/ + +#ifdef WITH_OPENH264 + +static BOOL g_openh264_trace_enabled = FALSE; + +static void openh264_trace_callback(H264_CONTEXT* h264, int level, const char* message) +{ + printf("%d - %s\n", level, message); +} + +static int openh264_decompress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSize, + BYTE* pDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight) +{ + DECODING_STATE state; + SBufferInfo sBufferInfo; + SSysMEMBuffer* pSystemBuffer; + BYTE* pYUVData[3]; + + if (!h264->pDecoder) + return -1; + + /* + * Decompress the image. The RDP host only seems to send I420 format. + */ + + pYUVData[0] = NULL; + pYUVData[1] = NULL; + pYUVData[2] = NULL; + + ZeroMemory(&sBufferInfo, sizeof(sBufferInfo)); + + state = (*h264->pDecoder)->DecodeFrame2( + h264->pDecoder, + pSrcData, + SrcSize, + pYUVData, + &sBufferInfo); + + /** + * Calling DecodeFrame2 twice apparently works around Openh264 issue #1136: + * https://github.com/cisco/openh264/issues/1136 + * + * This is a hack, but it works and it is only necessary for the first frame. + */ + + if (sBufferInfo.iBufferStatus != 1) + state = (*h264->pDecoder)->DecodeFrame2(h264->pDecoder, NULL, 0, pYUVData, &sBufferInfo); + + pSystemBuffer = &sBufferInfo.UsrData.sSystemBuffer; + +#if 1 + printf("h264_decompress: state=%u, pYUVData=[%p,%p,%p], bufferStatus=%d, width=%d, height=%d, format=%d, stride=[%d,%d]\n", + state, pYUVData[0], pYUVData[1], pYUVData[2], sBufferInfo.iBufferStatus, + pSystemBuffer->iWidth, pSystemBuffer->iHeight, pSystemBuffer->iFormat, + pSystemBuffer->iStride[0], pSystemBuffer->iStride[1]); +#endif + + if (state != 0) + return -1; + + if (!pYUVData[0] || !pYUVData[1] || !pYUVData[2]) + return -1; + + if (sBufferInfo.iBufferStatus != 1) + return -1; + + if (pSystemBuffer->iFormat != videoFormatI420) + return -1; + + /* Convert I420 (same as IYUV) to XRGB. */ + + if (g_H264DumpFrames) + { + h264_dump_yuv_data(pYUVData, pSystemBuffer->iWidth, pSystemBuffer->iHeight, pSystemBuffer->iStride); + } + + g_H264FrameId++; + + if (h264_prepare_rgb_buffer(h264, pSystemBuffer->iWidth, pSystemBuffer->iHeight) < 0) + return -1; + + freerdp_image_copy_yuv420p_to_xrgb(h264->data, h264->scanline, 0, 0, + h264->width, h264->height, pYUVData, pSystemBuffer->iStride, 0, 0); + + return 1; +} + +static void openh264_free(H264_CONTEXT* h264) +{ + if (h264->pDecoder) + { + (*h264->pDecoder)->Uninitialize(h264->pDecoder); + WelsDestroyDecoder(h264->pDecoder); + h264->pDecoder = NULL; + } +} + +static BOOL openh264_init(H264_CONTEXT* h264) +{ + static EVideoFormatType videoFormat = videoFormatI420; + + static int traceLevel = WELS_LOG_DEBUG; + static WelsTraceCallback traceCallback = (WelsTraceCallback) openh264_trace_callback; + + SDecodingParam sDecParam; + long status; + + WelsCreateDecoder(&h264->pDecoder); + + if (!h264->pDecoder) + { + printf("Failed to create OpenH264 decoder\n"); + goto EXCEPTION; + } + + ZeroMemory(&sDecParam, sizeof(sDecParam)); + sDecParam.iOutputColorFormat = videoFormatI420; + sDecParam.uiEcActiveFlag = 1; + sDecParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT; + + status = (*h264->pDecoder)->Initialize(h264->pDecoder, &sDecParam); + + if (status != 0) + { + printf("Failed to initialize OpenH264 decoder (status=%ld)\n", status); + goto EXCEPTION; + } + + status = (*h264->pDecoder)->SetOption(h264->pDecoder, DECODER_OPTION_DATAFORMAT, &videoFormat); + + if (status != 0) + { + printf("Failed to set data format option on OpenH264 decoder (status=%ld)\n", status); + } + + if (g_openh264_trace_enabled) + { + status = (*h264->pDecoder)->SetOption(h264->pDecoder, DECODER_OPTION_TRACE_LEVEL, &traceLevel); + if (status != 0) + { + printf("Failed to set trace level option on OpenH264 decoder (status=%ld)\n", status); + } + + status = (*h264->pDecoder)->SetOption(h264->pDecoder, DECODER_OPTION_TRACE_CALLBACK, &traceCallback); + if (status != 0) + { + printf("Failed to set trace callback option on OpenH264 decoder (status=%ld)\n", status); + } + + status = (*h264->pDecoder)->SetOption(h264->pDecoder, DECODER_OPTION_TRACE_CALLBACK_CONTEXT, &h264); + if (status != 0) + { + printf("Failed to set trace callback context option on OpenH264 decoder (status=%ld)\n", status); + } + } + + return TRUE; + +EXCEPTION: + openh264_free(h264); + + return FALSE; +} + +#endif + + + +/************************************************* + * + * libavcodec Implementation + * + ************************************************/ + +#ifdef WITH_LIBAVCODEC + +static int libavcodec_decompress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSize, + BYTE* pDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight) +{ + AVPacket packet; + int gotFrame = 0; + int status; + + av_init_packet(&packet); + + packet.data = pSrcData; + packet.size = SrcSize; + + status = avcodec_decode_video2(h264->codecContext, h264->videoFrame, &gotFrame, &packet); + + if (status < 0) + { + printf("Failed to decode video frame (status=%d)\n", status); + return -1; + } + + printf("libavcodec_decompress: frame decoded (status=%d, gotFrame=%d, width=%d, height=%d, Y=[%p,%d], U=[%p,%d], V=[%p,%d])\n", + status, gotFrame, h264->videoFrame->width, h264->videoFrame->height, + h264->videoFrame->data[0], h264->videoFrame->linesize[0], + h264->videoFrame->data[1], h264->videoFrame->linesize[1], + h264->videoFrame->data[2], h264->videoFrame->linesize[2]); + fflush(stdout); + + if (gotFrame) + { + if (g_H264DumpFrames) + { + h264_dump_yuv_data(h264->videoFrame->data, h264->videoFrame->width, h264->videoFrame->height, h264->videoFrame->linesize); + } + + if (h264_prepare_rgb_buffer(h264, h264->videoFrame->width, h264->videoFrame->height) < 0) + return -1; + + freerdp_image_copy_yuv420p_to_xrgb(h264->data, h264->scanline, 0, 0, + h264->width, h264->height, h264->videoFrame->data, h264->videoFrame->linesize, 0, 0); + } + + return 1; +} + +static void libavcodec_free(H264_CONTEXT* h264) +{ + if (h264->videoFrame) + { + av_free(h264->videoFrame); + } + + if (h264->codecParser) + { + av_parser_close(h264->codecParser); + } + + if (h264->codecContext) + { + avcodec_close(h264->codecContext); + av_free(h264->codecContext); + } +} + +static BOOL libavcodec_init(H264_CONTEXT* h264) +{ + avcodec_register_all(); + + h264->codec = avcodec_find_decoder(CODEC_ID_H264); + if (!h264->codec) + { + printf("Failed to find libav H.264 codec\n"); + goto EXCEPTION; + } + + h264->codecContext = avcodec_alloc_context3(h264->codec); + if (!h264->codecContext) + { + printf("Failed to allocate libav codec context\n"); + goto EXCEPTION; + } + + if (h264->codec->capabilities & CODEC_CAP_TRUNCATED) + { + h264->codecContext->flags |= CODEC_FLAG_TRUNCATED; + } + + if (avcodec_open2(h264->codecContext, h264->codec, NULL) < 0) + { + printf("Failed to open libav codec\n"); + goto EXCEPTION; + } + + h264->codecParser = av_parser_init(CODEC_ID_H264); + if (!h264->codecParser) + { + printf("Failed to initialize libav parser\n"); + goto EXCEPTION; + } + + h264->videoFrame = avcodec_alloc_frame(); + if (!h264->videoFrame) + { + printf("Failed to allocate libav frame\n"); + goto EXCEPTION; + } + + return TRUE; + +EXCEPTION: + libavcodec_free(h264); + + return FALSE; +} + +#endif + + + +int h264_decompress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSize, + BYTE** ppDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight) +{ + UINT32 UncompressedSize; + BYTE* pDstData; + + if (!h264) + return -1; + +#if 0 + pSrcData = h264_strip_nal_unit_au_delimiter(pSrcData, &SrcSize); +#endif + +#if 1 + printf("h264_decompress: pSrcData=%p, SrcSize=%u, pDstData=%p, nDstStep=%d, nXDst=%d, nYDst=%d, nWidth=%d, nHeight=%d)\n", + pSrcData, SrcSize, *ppDstData, nDstStep, nXDst, nYDst, nWidth, nHeight); +#endif + + /* Allocate a destination buffer (if needed). */ + + UncompressedSize = nWidth * nHeight * 4; + + if (UncompressedSize == 0) + return -1; + + pDstData = *ppDstData; + + if (!pDstData) + { + pDstData = (BYTE*) malloc(UncompressedSize); + + if (!pDstData) + return -1; + + *ppDstData = pDstData; + } + + if (g_H264DumpFrames) + { + h264_dump_h264_data(pSrcData, SrcSize); + } + +#ifdef WITH_OPENH264 + return openh264_decompress( + h264, pSrcData, SrcSize, + pDstData, DstFormat, nDstStep, + nXDst, nYDst, nWidth, nHeight); +#endif + +#ifdef WITH_LIBAVCODEC + return libavcodec_decompress( + h264, pSrcData, SrcSize, + pDstData, DstFormat, nDstStep, + nXDst, nYDst, nWidth, nHeight); +#endif + + return 1; +} + +int h264_compress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize) +{ + return 1; +} + +void h264_context_reset(H264_CONTEXT* h264) +{ +} + +H264_CONTEXT* h264_context_new(BOOL Compressor) +{ + H264_CONTEXT* h264; + + h264 = (H264_CONTEXT*) calloc(1, sizeof(H264_CONTEXT)); + + if (h264) + { + h264->Compressor = Compressor; + + if (h264_prepare_rgb_buffer(h264, 256, 256) < 0) + return NULL; + +#ifdef WITH_OPENH264 + if (!openh264_init(h264)) + { + free(h264); + return NULL; + } +#endif + +#ifdef WITH_LIBAVCODEC + if (!libavcodec_init(h264)) + { + free(h264); + return NULL; + } +#endif + + h264_context_reset(h264); + } + + return h264; +} + +void h264_context_free(H264_CONTEXT* h264) +{ + if (h264) + { + free(h264->data); + +#ifdef WITH_OPENH264 + openh264_free(h264); +#endif + +#ifdef WITH_LIBAVCODEC + libavcodec_free(h264); +#endif + + free(h264); + } +} diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c new file mode 100644 index 000000000..a30e85b01 --- /dev/null +++ b/libfreerdp/codec/progressive.c @@ -0,0 +1,574 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Progressive Codec Bitmap Compression + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include +#include + +const char* progressive_get_block_type_string(UINT16 blockType) +{ + switch (blockType) + { + case PROGRESSIVE_WBT_SYNC: + return "PROGRESSIVE_WBT_SYNC"; + break; + + case PROGRESSIVE_WBT_FRAME_BEGIN: + return "PROGRESSIVE_WBT_FRAME_BEGIN"; + break; + + case PROGRESSIVE_WBT_FRAME_END: + return "PROGRESSIVE_WBT_FRAME_END"; + break; + + case PROGRESSIVE_WBT_CONTEXT: + return "PROGRESSIVE_WBT_CONTEXT"; + break; + + case PROGRESSIVE_WBT_REGION: + return "PROGRESSIVE_WBT_REGION"; + break; + + case PROGRESSIVE_WBT_TILE_SIMPLE: + return "PROGRESSIVE_WBT_TILE_SIMPLE"; + break; + + case PROGRESSIVE_WBT_TILE_FIRST: + return "PROGRESSIVE_WBT_TILE_FIRST"; + break; + + case PROGRESSIVE_WBT_TILE_UPGRADE: + return "PROGRESSIVE_WBT_TILE_UPGRADE"; + break; + + default: + return "PROGRESSIVE_WBT_UNKNOWN"; + break; + } + + return "PROGRESSIVE_WBT_UNKNOWN"; +} + +int progressive_process_blocks(PROGRESSIVE_CONTEXT* progressive, BYTE* blocks, UINT32 blocksLen, UINT32 blockCount, UINT32 flags) +{ + int status; + BYTE* block; + UINT16 index; + UINT32 boffset; + UINT16 blockType; + UINT32 blockLen; + UINT32 count = 0; + UINT32 offset = 0; + RFX_RECT* rect = NULL; + PROGRESSIVE_BLOCK_SYNC sync; + PROGRESSIVE_BLOCK_REGION region; + PROGRESSIVE_BLOCK_CONTEXT context; + PROGRESSIVE_BLOCK_FRAME_BEGIN frameBegin; + PROGRESSIVE_BLOCK_FRAME_END frameEnd; + PROGRESSIVE_BLOCK_TILE_SIMPLE simple; + PROGRESSIVE_BLOCK_TILE_FIRST first; + PROGRESSIVE_BLOCK_TILE_UPGRADE upgrade; + RFX_COMPONENT_CODEC_QUANT* quantVal; + RFX_PROGRESSIVE_CODEC_QUANT* quantProgVal; + + while ((blocksLen - offset) >= 6) + { + boffset = 0; + block = &blocks[offset]; + + blockType = *((UINT16*) &block[boffset + 0]); /* blockType (2 bytes) */ + blockLen = *((UINT32*) &block[boffset + 2]); /* blockLen (4 bytes) */ + boffset += 6; + + if (flags & PROGRESSIVE_BLOCKS_REGION) + { + if ((count + 1) > blockCount) + break; + + if (blockType != PROGRESSIVE_WBT_REGION) + return -1001; + } + else if (flags & PROGRESSIVE_BLOCKS_TILE) + { + if ((count + 1) > blockCount) + break; + + if ((blockType != PROGRESSIVE_WBT_TILE_SIMPLE) && + (blockType != PROGRESSIVE_WBT_TILE_FIRST) && + (blockType != PROGRESSIVE_WBT_TILE_UPGRADE)) + { + return -1002; + } + } + + printf("%s\n", progressive_get_block_type_string(blockType)); + + if ((blocksLen - offset) < blockLen) + return -1003; + + switch (blockType) + { + case PROGRESSIVE_WBT_SYNC: + + sync.blockType = blockType; + sync.blockLen = blockLen; + + if ((blockLen - boffset) != 6) + return -1004; + + sync.magic = (UINT32) *((UINT32*) &block[boffset + 0]); /* magic (4 bytes) */ + sync.version = (UINT32) *((UINT16*) &block[boffset + 4]); /* version (2 bytes) */ + boffset += 6; + + if (sync.magic != 0xCACCACCA) + return -1005; + + if (sync.version != 0x0100) + return -1006; + + break; + + case PROGRESSIVE_WBT_FRAME_BEGIN: + + frameBegin.blockType = blockType; + frameBegin.blockLen = blockLen; + + if ((blockLen - boffset) < 6) + return -1007; + + frameBegin.frameIndex = (UINT32) *((UINT32*) &block[boffset + 0]); /* frameIndex (4 bytes) */ + frameBegin.regionCount = (UINT32) *((UINT16*) &block[boffset + 4]); /* regionCount (2 bytes) */ + boffset += 6; + + /** + * If the number of elements specified by the regionCount field is + * larger than the actual number of elements in the regions field, + * the decoder SHOULD ignore this inconsistency. + */ + + if ((blockLen - boffset) > 0) + { + status = progressive_process_blocks(progressive, &block[boffset], + blockLen - boffset, frameBegin.regionCount, PROGRESSIVE_BLOCKS_REGION); + + if (status < 0) + return status; + + boffset += status; + } + + break; + + case PROGRESSIVE_WBT_FRAME_END: + + frameEnd.blockType = blockType; + frameEnd.blockLen = blockLen; + + if ((blockLen - boffset) != 0) + return -1008; + + break; + + case PROGRESSIVE_WBT_CONTEXT: + + context.blockType = blockType; + context.blockLen = blockLen; + + if ((blockLen - boffset) != 4) + return -1009; + + context.ctxId = block[boffset + 0]; /* ctxId (1 byte) */ + context.tileSize = *((UINT16*) &block[boffset + 1]); /* tileSize (2 bytes) */ + context.flags = block[boffset + 3]; /* flags (1 byte) */ + boffset += 4; + + if (context.tileSize != 64) + return -1010; + + break; + + case PROGRESSIVE_WBT_REGION: + + region.blockType = blockType; + region.blockLen = blockLen; + + if ((blockLen - boffset) < 12) + return -1011; + + region.tileSize = block[boffset + 0]; /* tileSize (1 byte) */ + region.numRects = *((UINT16*) &block[boffset + 1]); /* numRects (2 bytes) */ + region.numQuant = block[boffset + 3]; /* numQuant (1 byte) */ + region.numProgQuant = block[boffset + 4]; /* numProgQuant (1 byte) */ + region.flags = block[boffset + 5]; /* flags (1 byte) */ + region.numTiles = *((UINT16*) &block[boffset + 6]); /* numTiles (2 bytes) */ + region.tileDataSize = *((UINT32*) &block[boffset + 8]); /* tileDataSize (4 bytes) */ + boffset += 12; + + if (region.tileSize != 64) + return -1012; + + if (region.numRects < 1) + return -1013; + + if (region.numQuant > 7) + return -1014; + + if ((blockLen - boffset) < (region.numRects * 8)) + return -1015; + + if (region.numRects > progressive->cRects) + { + progressive->rects = (RFX_RECT*) realloc(progressive->rects, region.numRects * sizeof(RFX_RECT)); + progressive->cRects = region.numRects; + } + + region.rects = progressive->rects; + + if (!region.rects) + return -1016; + + for (index = 0; index < region.numRects; index++) + { + rect = &(region.rects[index]); + rect->x = *((UINT16*) &block[boffset + 0]); + rect->y = *((UINT16*) &block[boffset + 2]); + rect->width = *((UINT16*) &block[boffset + 4]); + rect->height = *((UINT16*) &block[boffset + 6]); + boffset += 8; + } + + if ((blockLen - boffset) < (region.numQuant * 5)) + return -1017; + + if (region.numQuant > progressive->cQuant) + { + progressive->quantVals = (RFX_COMPONENT_CODEC_QUANT*) realloc(progressive->quantVals, + region.numQuant * sizeof(RFX_COMPONENT_CODEC_QUANT)); + progressive->cQuant = region.numQuant; + } + + region.quantVals = progressive->quantVals; + + if (!region.quantVals) + return -1018; + + for (index = 0; index < region.numQuant; index++) + { + quantVal = &(region.quantVals[index]); + quantVal->LL3 = block[boffset + 0] & 0x0F; + quantVal->HL3 = block[boffset + 0] >> 4; + quantVal->LH3 = block[boffset + 1] & 0x0F; + quantVal->HH3 = block[boffset + 1] >> 4; + quantVal->HL2 = block[boffset + 2] & 0x0F; + quantVal->LH2 = block[boffset + 2] >> 4; + quantVal->HH2 = block[boffset + 3] & 0x0F; + quantVal->HL1 = block[boffset + 3] >> 4; + quantVal->LH1 = block[boffset + 4] & 0x0F; + quantVal->HH1 = block[boffset + 4] >> 4; + boffset += 5; + } + + if ((blockLen - boffset) < (region.numProgQuant * 16)) + return -1019; + + if (region.numProgQuant > progressive->cProgQuant) + { + progressive->quantProgVals = (RFX_PROGRESSIVE_CODEC_QUANT*) realloc(progressive->quantProgVals, + region.numProgQuant * sizeof(RFX_PROGRESSIVE_CODEC_QUANT)); + progressive->cProgQuant = region.numProgQuant; + } + + region.quantProgVals = progressive->quantProgVals; + + if (!region.quantProgVals) + return -1020; + + for (index = 0; index < region.numProgQuant; index++) + { + quantProgVal = &(region.quantProgVals[index]); + quantProgVal->quality = block[boffset + 0]; + CopyMemory(quantProgVal->yQuantValues, &block[boffset + 1], 5); + CopyMemory(quantProgVal->cbQuantValues, &block[boffset + 6], 5); + CopyMemory(quantProgVal->crQuantValues, &block[boffset + 11], 5); + boffset += 16; + } + + if ((blockLen - boffset) < region.tileDataSize) + return -1021; + + printf("numRects: %d numTiles: %d numQuant: %d numProgQuant: %d\n", + region.numRects, region.numTiles, region.numQuant, region.numProgQuant); + + status = progressive_process_blocks(progressive, &block[boffset], + region.tileDataSize, region.numTiles, PROGRESSIVE_BLOCKS_TILE); + + if (status < 0) + return status; + + boffset += (UINT32) status; + + break; + + case PROGRESSIVE_WBT_TILE_SIMPLE: + + simple.blockType = blockType; + simple.blockLen = blockLen; + + if ((blockLen - boffset) < 16) + return -1022; + + simple.quantIdxY = block[boffset + 0]; /* quantIdxY (1 byte) */ + simple.quantIdxCb = block[boffset + 1]; /* quantIdxCb (1 byte) */ + simple.quantIdxCr = block[boffset + 2]; /* quantIdxCr (1 byte) */ + simple.xIdx = *((UINT16*) &block[boffset + 3]); /* xIdx (2 bytes) */ + simple.yIdx = *((UINT16*) &block[boffset + 5]); /* yIdx (2 bytes) */ + simple.flags = block[boffset + 7]; /* flags (1 byte) */ + simple.yLen = *((UINT16*) &block[boffset + 8]); /* yLen (2 bytes) */ + simple.cbLen = *((UINT16*) &block[boffset + 10]); /* cbLen (2 bytes) */ + simple.crLen = *((UINT16*) &block[boffset + 12]); /* crLen (2 bytes) */ + simple.tailLen = *((UINT16*) &block[boffset + 14]); /* tailLen (2 bytes) */ + boffset += 16; + + if ((blockLen - boffset) < simple.yLen) + return -1023; + + simple.yData = &block[boffset]; + boffset += simple.yLen; + + if ((blockLen - boffset) < simple.cbLen) + return -1024; + + simple.cbData = &block[boffset]; + boffset += simple.cbLen; + + if ((blockLen - boffset) < simple.crLen) + return -1025; + + simple.crData = &block[boffset]; + boffset += simple.crLen; + + if ((blockLen - boffset) < simple.tailLen) + return -1026; + + simple.tailData = &block[boffset]; + boffset += simple.tailLen; + + break; + + case PROGRESSIVE_WBT_TILE_FIRST: + + first.blockType = blockType; + first.blockLen = blockLen; + + if ((blockLen - boffset) < 17) + return -1027; + + first.quantIdxY = block[boffset + 0]; /* quantIdxY (1 byte) */ + first.quantIdxCb = block[boffset + 1]; /* quantIdxCb (1 byte) */ + first.quantIdxCr = block[boffset + 2]; /* quantIdxCr (1 byte) */ + first.xIdx = *((UINT16*) &block[boffset + 3]); /* xIdx (2 bytes) */ + first.yIdx = *((UINT16*) &block[boffset + 5]); /* yIdx (2 bytes) */ + first.flags = block[boffset + 7]; /* flags (1 byte) */ + first.quality = block[boffset + 8]; /* quality (1 byte) */ + first.yLen = *((UINT16*) &block[boffset + 9]); /* yLen (2 bytes) */ + first.cbLen = *((UINT16*) &block[boffset + 11]); /* cbLen (2 bytes) */ + first.crLen = *((UINT16*) &block[boffset + 13]); /* crLen (2 bytes) */ + first.tailLen = *((UINT16*) &block[boffset + 15]); /* tailLen (2 bytes) */ + boffset += 17; + + if ((blockLen - boffset) < first.yLen) + return -1028; + + first.yData = &block[boffset]; + boffset += first.yLen; + + if ((blockLen - boffset) < first.cbLen) + return -1029; + + first.cbData = &block[boffset]; + boffset += first.cbLen; + + if ((blockLen - boffset) < first.crLen) + return -1030; + + first.crData = &block[boffset]; + boffset += first.crLen; + + if ((blockLen - boffset) < first.tailLen) + return -1031; + + first.tailData = &block[boffset]; + boffset += first.tailLen; + + break; + + case PROGRESSIVE_WBT_TILE_UPGRADE: + + upgrade.blockType = blockType; + upgrade.blockLen = blockLen; + + if ((blockLen - boffset) < 20) + return -1032; + + upgrade.quantIdxY = block[boffset + 0]; /* quantIdxY (1 byte) */ + upgrade.quantIdxCb = block[boffset + 1]; /* quantIdxCb (1 byte) */ + upgrade.quantIdxCr = block[boffset + 2]; /* quantIdxCr (1 byte) */ + upgrade.xIdx = *((UINT16*) &block[boffset + 3]); /* xIdx (2 bytes) */ + upgrade.yIdx = *((UINT16*) &block[boffset + 5]); /* yIdx (2 bytes) */ + upgrade.quality = block[boffset + 7]; /* quality (1 byte) */ + upgrade.ySrlLen = *((UINT16*) &block[boffset + 8]); /* ySrlLen (2 bytes) */ + upgrade.yRawLen = *((UINT16*) &block[boffset + 10]); /* yRawLen (2 bytes) */ + upgrade.cbSrlLen = *((UINT16*) &block[boffset + 12]); /* cbSrlLen (2 bytes) */ + upgrade.cbRawLen = *((UINT16*) &block[boffset + 14]); /* cbRawLen (2 bytes) */ + upgrade.crSrlLen = *((UINT16*) &block[boffset + 16]); /* crSrlLen (2 bytes) */ + upgrade.crRawLen = *((UINT16*) &block[boffset + 18]); /* crRawLen (2 bytes) */ + boffset += 20; + + if ((blockLen - boffset) < upgrade.ySrlLen) + return -1033; + + upgrade.ySrlData = &block[boffset]; + boffset += upgrade.ySrlLen; + + if ((blockLen - boffset) < upgrade.yRawLen) + return -1034; + + upgrade.yRawData = &block[boffset]; + boffset += upgrade.yRawLen; + + if ((blockLen - boffset) < upgrade.cbSrlLen) + return -1035; + + upgrade.cbSrlData = &block[boffset]; + boffset += upgrade.cbSrlLen; + + if ((blockLen - boffset) < upgrade.cbRawLen) + return -1036; + + upgrade.cbRawData = &block[boffset]; + boffset += upgrade.cbRawLen; + + if ((blockLen - boffset) < upgrade.crSrlLen) + return -1037; + + upgrade.crSrlData = &block[boffset]; + boffset += upgrade.crSrlLen; + + if ((blockLen - boffset) < upgrade.crRawLen) + return -1038; + + upgrade.crRawData = &block[boffset]; + boffset += upgrade.crRawLen; + + break; + + default: + return -1039; + break; + } + + if (boffset != blockLen) + return -1040; + + offset += blockLen; + count++; + } + + if (offset != blocksLen) + return -1041; + + return (int) offset; +} + +int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UINT32 SrcSize, + BYTE** ppDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight) +{ + int status; + + status = progressive_process_blocks(progressive, pSrcData, SrcSize, 0, PROGRESSIVE_BLOCKS_ALL); + + if (status >= 0) + status = 1; + + return status; +} + +int progressive_compress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize) +{ + return 1; +} + +void progressive_context_reset(PROGRESSIVE_CONTEXT* progressive) +{ + +} + +PROGRESSIVE_CONTEXT* progressive_context_new(BOOL Compressor) +{ + PROGRESSIVE_CONTEXT* progressive; + + progressive = (PROGRESSIVE_CONTEXT*) calloc(1, sizeof(PROGRESSIVE_CONTEXT)); + + if (progressive) + { + progressive->Compressor = Compressor; + + progressive->cRects = 64; + progressive->rects = (RFX_RECT*) malloc(progressive->cRects * sizeof(RFX_RECT)); + + if (!progressive->rects) + return NULL; + + progressive->cQuant = 8; + progressive->quantVals = (RFX_COMPONENT_CODEC_QUANT*) malloc(progressive->cQuant * sizeof(RFX_COMPONENT_CODEC_QUANT)); + + if (!progressive->quantVals) + return NULL; + + progressive->cProgQuant = 8; + progressive->quantProgVals = (RFX_PROGRESSIVE_CODEC_QUANT*) malloc(progressive->cProgQuant * sizeof(RFX_PROGRESSIVE_CODEC_QUANT)); + + if (!progressive->quantProgVals) + return NULL; + + progressive_context_reset(progressive); + } + + return progressive; +} + +void progressive_context_free(PROGRESSIVE_CONTEXT* progressive) +{ + if (!progressive) + return; + + free(progressive->rects); + free(progressive->quantVals); + free(progressive->quantProgVals); + + free(progressive); +} + diff --git a/libfreerdp/codec/test/CMakeLists.txt b/libfreerdp/codec/test/CMakeLists.txt index ba158560c..6ce9c65c2 100644 --- a/libfreerdp/codec/test/CMakeLists.txt +++ b/libfreerdp/codec/test/CMakeLists.txt @@ -12,6 +12,7 @@ set(${MODULE_PREFIX}_TESTS TestFreeRDPCodecZGfx.c TestFreeRDPCodecPlanar.c TestFreeRDPCodecClear.c + TestFreeRDPCodecProgressive.c TestFreeRDPCodecRemoteFX.c) create_test_sourcelist(${MODULE_PREFIX}_SRCS diff --git a/libfreerdp/codec/test/TestFreeRDPCodecProgressive.c b/libfreerdp/codec/test/TestFreeRDPCodecProgressive.c new file mode 100644 index 000000000..320329300 --- /dev/null +++ b/libfreerdp/codec/test/TestFreeRDPCodecProgressive.c @@ -0,0 +1,10 @@ +#include +#include + +#include + +int TestFreeRDPCodecProgressive(int argc, char* argv[]) +{ + return 0; +} + diff --git a/libfreerdp/common/CMakeLists.txt b/libfreerdp/common/CMakeLists.txt index bbdaa70bb..2bdca84a3 100644 --- a/libfreerdp/common/CMakeLists.txt +++ b/libfreerdp/common/CMakeLists.txt @@ -30,19 +30,20 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" include_directories(${OPENSSL_INCLUDE_DIR}) include_directories(${ZLIB_INCLUDE_DIRS}) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib") + +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARIES}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-path winpr-file winpr-library winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() +else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index 776a55757..a69eba7f1 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -1920,6 +1920,10 @@ UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id) return settings->KeyboardFunctionKey; break; + case FreeRDP_KeyboardHook: + return settings->KeyboardHook; + break; + case FreeRDP_BrushSupportLevel: return settings->BrushSupportLevel; break; @@ -2229,6 +2233,10 @@ int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param) settings->KeyboardFunctionKey = param; break; + case FreeRDP_KeyboardHook: + settings->KeyboardHook = param; + break; + case FreeRDP_BrushSupportLevel: settings->BrushSupportLevel = param; break; diff --git a/libfreerdp/core/CMakeLists.txt b/libfreerdp/core/CMakeLists.txt index 4f0f72bdc..6504599d8 100644 --- a/libfreerdp/core/CMakeLists.txt +++ b/libfreerdp/core/CMakeLists.txt @@ -130,7 +130,10 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" SOURCES ${${MODULE_PREFIX}_SRCS} EXPORT) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") if(WIN32) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ws2_32) @@ -145,10 +148,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-crypto freerdp-codec freerdp-locale freerdp-common freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-registry winpr-utils winpr-interlocked winpr-dsparse winpr-sspi winpr-rpc winpr-wtsapi winpr-handle winpr-winsock winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index b4e2fca57..c3725353d 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -22,6 +22,7 @@ #endif #include "capabilities.h" +#include "fastpath.h" #include #include @@ -2287,6 +2288,17 @@ BOOL rdp_read_multifragment_update_capability_set(wStream* s, UINT16 length, rdp if (settings->ServerMode) { + /* + * Special case: The client announces multifragment update support but sets the maximum request size + * to something smaller than maximum size for *one* fast-path PDU. + * In this case behave like no multifragment updates were supported and make sure no + * fragmentation happens by setting FASTPATH_FRAGMENT_SAFE_SIZE. + * + * This behaviour was observed with some windows ce rdp clients. + */ + if (multifragMaxRequestSize < FASTPATH_MAX_PACKET_SIZE) + multifragMaxRequestSize = FASTPATH_FRAGMENT_SAFE_SIZE; + if (settings->RemoteFxCodec) { /** @@ -3669,7 +3681,8 @@ BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s) if (!settings->ReceivedCapabilities[CAPSET_TYPE_MULTI_FRAGMENT_UPDATE]) { - /* client does not support multi fragment updates */ + /* client does not support multi fragment updates - make sure packages are not fragmented */ + settings->MultifragMaxRequestSize = FASTPATH_FRAGMENT_SAFE_SIZE; } if (!settings->ReceivedCapabilities[CAPSET_TYPE_LARGE_POINTER]) diff --git a/libfreerdp/core/fastpath.c b/libfreerdp/core/fastpath.c index c88e5c762..417770cdc 100644 --- a/libfreerdp/core/fastpath.c +++ b/libfreerdp/core/fastpath.c @@ -48,7 +48,6 @@ * two less significant bits of the first byte. */ -#define FASTPATH_MAX_PACKET_SIZE 0x3FFF #ifdef WITH_DEBUG_RDP static const char* const FASTPATH_UPDATETYPE_STRINGS[] = diff --git a/libfreerdp/core/fastpath.h b/libfreerdp/core/fastpath.h index af570f7b6..7f1c59cab 100644 --- a/libfreerdp/core/fastpath.h +++ b/libfreerdp/core/fastpath.h @@ -20,6 +20,22 @@ #ifndef __FASTPATH_H #define __FASTPATH_H +/* + * Fast-Path has 15 bits available for length information which would lead to a + * maximal pdu size of 0x8000. However in practice only 14 bits are used + * this isn't documented anywhere but it looks like most implementations will + * fail if fast-path packages > 0x3FFF arrive. + */ +#define FASTPATH_MAX_PACKET_SIZE 0x3FFF + +/* + * The following size guarantees that no fast-path PDU fragmentation occurs. + * It was calculated by subtracting 128 from FASTPATH_MAX_PACKET_SIZE. + * 128 was chosen because it includes all required and optional headers as well as + * possible paddings and some extra bytes for safety. + */ +#define FASTPATH_FRAGMENT_SAFE_SIZE 0x3F80 + typedef struct rdp_fastpath rdpFastPath; #include "rdp.h" diff --git a/libfreerdp/core/info.c b/libfreerdp/core/info.c index f68dff17b..c5bc9173e 100644 --- a/libfreerdp/core/info.c +++ b/libfreerdp/core/info.c @@ -431,6 +431,9 @@ void rdp_write_info_packet(wStream* s, rdpSettings* settings) if (settings->RemoteConsoleAudio) flags |= INFO_REMOTECONSOLEAUDIO; + if (settings->HiDefRemoteApp) + flags |= INFO_HIDEF_RAIL_SUPPORTED; + if (settings->CompressionEnabled) { flags |= INFO_COMPRESSION; diff --git a/libfreerdp/core/info.h b/libfreerdp/core/info.h index 3d2758a29..0e98dde3c 100644 --- a/libfreerdp/core/info.h +++ b/libfreerdp/core/info.h @@ -49,6 +49,7 @@ #define INFO_USING_SAVED_CREDS 0x00100000 #define INFO_AUDIOCAPTURE 0x00200000 #define INFO_VIDEO_DISABLE 0x00400000 +#define INFO_HIDEF_RAIL_SUPPORTED 0x02000000 /* Logon Information Types */ #define INFO_TYPE_LOGON 0x00000000 diff --git a/libfreerdp/core/nego.c b/libfreerdp/core/nego.c index c250b4be9..09d63065a 100644 --- a/libfreerdp/core/nego.c +++ b/libfreerdp/core/nego.c @@ -503,7 +503,7 @@ BOOL nego_recv_response(rdpNego* nego) if (!s) return FALSE; - status = transport_read(nego->transport, s); + status = transport_read_pdu(nego->transport, s); if (status < 0) { Stream_Free(s, TRUE); diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index f1573a5a0..5b7a77a18 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -1198,8 +1198,7 @@ int credssp_recv(rdpCredssp* credssp) s = Stream_New(NULL, 4096); - status = transport_read(credssp->transport, s); - Stream_Length(s) = status; + status = transport_read_pdu(credssp->transport, s); if (status < 0) { diff --git a/libfreerdp/core/server.c b/libfreerdp/core/server.c index 4e4e520e5..5f128de83 100644 --- a/libfreerdp/core/server.c +++ b/libfreerdp/core/server.c @@ -42,6 +42,15 @@ #define DEBUG_DVC(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__) #endif +struct _wtsChannelMessage +{ + UINT16 channelId; + UINT16 reserved; + UINT32 length; + UINT32 offset; +}; +typedef struct _wtsChannelMessage wtsChannelMessage; + static DWORD g_SessionId = 1; static wHashTable* g_ServerHandles = NULL; @@ -75,15 +84,16 @@ static rdpPeerChannel* wts_get_dvc_channel_by_id(WTSVirtualChannelManager* vcm, static void wts_queue_receive_data(rdpPeerChannel* channel, const BYTE* Buffer, UINT32 Length) { BYTE* buffer; - UINT32 length; - UINT16 channelId; + wtsChannelMessage* messageCtx; - length = Length; - buffer = (BYTE*) malloc(length); - CopyMemory(buffer, Buffer, length); - channelId = channel->channelId; + messageCtx = (wtsChannelMessage*) malloc(sizeof(wtsChannelMessage) + Length); + messageCtx->channelId = channel->channelId; + messageCtx->length = Length; + messageCtx->offset = 0; + buffer = (BYTE*) (messageCtx + 1); + CopyMemory(buffer, Buffer, Length); - MessageQueue_Post(channel->queue, (void*) (UINT_PTR) channelId, 0, (void*) buffer, (void*) (UINT_PTR) length); + MessageQueue_Post(channel->queue, messageCtx, 0, NULL, NULL); } static void wts_queue_send_item(rdpPeerChannel* channel, BYTE* Buffer, UINT32 Length) @@ -1027,28 +1037,35 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelClose(HANDLE hChannelHandle) BOOL WINAPI FreeRDP_WTSVirtualChannelRead(HANDLE hChannelHandle, ULONG TimeOut, PCHAR Buffer, ULONG BufferSize, PULONG pBytesRead) { BYTE* buffer; - UINT32 length; - UINT16 channelId; wMessage message; + wtsChannelMessage* messageCtx; rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle; - if (!MessageQueue_Peek(channel->queue, &message, TRUE)) + if (!MessageQueue_Peek(channel->queue, &message, FALSE)) { + SetLastError(ERROR_NO_DATA); *pBytesRead = 0; - return TRUE; + return FALSE; } - channelId = (UINT16) (UINT_PTR) message.context; - buffer = (BYTE*) message.wParam; - length = (UINT32) (UINT_PTR) message.lParam; + messageCtx = (wtsChannelMessage*) (UINT_PTR) message.context; + buffer = (BYTE*) (messageCtx + 1); - *pBytesRead = length; + *pBytesRead = messageCtx->length - messageCtx->offset; + if (Buffer == NULL || BufferSize == 0) + { + return TRUE; + } + if (*pBytesRead > BufferSize) + *pBytesRead = BufferSize; - if (length > BufferSize) - return FALSE; - - CopyMemory(Buffer, buffer, length); - free(buffer); + CopyMemory(Buffer, buffer + messageCtx->offset, *pBytesRead); + messageCtx->offset += *pBytesRead; + if (messageCtx->offset >= messageCtx->length) + { + MessageQueue_Peek(channel->queue, &message, TRUE); + free(messageCtx); + } return TRUE; } diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 04f92caa9..f112ad452 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -563,6 +563,7 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings) _settings->KeyboardType = settings->KeyboardType; /* 2625 */ _settings->KeyboardSubType = settings->KeyboardSubType; /* 2626 */ _settings->KeyboardFunctionKey = settings->KeyboardFunctionKey; /* 2627 */ + _settings->KeyboardHook = settings->KeyboardHook; /* 2633 */ _settings->BrushSupportLevel = settings->BrushSupportLevel; /* 2688 */ _settings->GlyphSupportLevel = settings->GlyphSupportLevel; /* 2752 */ _settings->OffscreenSupportLevel = settings->OffscreenSupportLevel; /* 2816 */ @@ -825,6 +826,7 @@ void freerdp_settings_free(rdpSettings* settings) free(settings->MonitorDefArray); free(settings->ClientAddress); free(settings->ClientDir); + free(settings->PermittedTLSCiphers); free(settings->CertificateFile); free(settings->PrivateKeyFile); free(settings->ConnectionFile); diff --git a/libfreerdp/core/tcp.c b/libfreerdp/core/tcp.c index 245d3b1b9..21a875150 100644 --- a/libfreerdp/core/tcp.c +++ b/libfreerdp/core/tcp.c @@ -122,23 +122,28 @@ static int transport_bio_simple_read(BIO* bio, char* buf, int size) BIO_clear_flags(bio, BIO_FLAGS_READ); status = _recv((SOCKET) bio->num, buf, size, 0); + if (status > 0) + return status; - if (status <= 0) + if (status == 0) { - error = WSAGetLastError(); - - if ((error == WSAEWOULDBLOCK) || (error == WSAEINTR) || - (error == WSAEINPROGRESS) || (error == WSAEALREADY)) - { - BIO_set_flags(bio, (BIO_FLAGS_READ | BIO_FLAGS_SHOULD_RETRY)); - } - else - { - BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); - } + BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); + return 0; } - return status; + error = WSAGetLastError(); + + if ((error == WSAEWOULDBLOCK) || (error == WSAEINTR) || + (error == WSAEINPROGRESS) || (error == WSAEALREADY)) + { + BIO_set_flags(bio, (BIO_FLAGS_READ | BIO_FLAGS_SHOULD_RETRY)); + } + else + { + BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); + } + + return -1; } static int transport_bio_simple_puts(BIO* bio, const char* str) @@ -327,7 +332,6 @@ static int transport_bio_buffered_read(BIO* bio, char* buf, int size) if (!BIO_should_retry(bio->next_bio)) { BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); - status = -1; goto out; } @@ -505,8 +509,12 @@ BOOL tcp_connect(rdpTcp* tcp, const char* hostname, int port, int timeout) } else { +#ifdef HAVE_POLL_H + struct pollfd pollfds; +#else fd_set cfds; struct timeval tv; +#endif tcp->socketBio = BIO_new(BIO_s_connect()); @@ -530,14 +538,24 @@ BOOL tcp_connect(rdpTcp* tcp, const char* hostname, int port, int timeout) if (status <= 0) { +#ifdef HAVE_POLL_H + pollfds.fd = tcp->sockfd; + pollfds.events = POLLOUT; + pollfds.revents = 0; + do + { + status = poll(&pollfds, 1, timeout * 1000); + } + while ((status < 0) && (errno == EINTR)); +#else FD_ZERO(&cfds); FD_SET(tcp->sockfd, &cfds); tv.tv_sec = timeout; tv.tv_usec = 0; - status = select(tcp->sockfd + 1, NULL, &cfds, NULL, &tv); - + status = _select(tcp->sockfd + 1, NULL, &cfds, NULL, &tv); +#endif if (status == 0) { return FALSE; /* timeout */ diff --git a/libfreerdp/core/tpdu.c b/libfreerdp/core/tpdu.c index e9b3ba35b..310c35f52 100644 --- a/libfreerdp/core/tpdu.c +++ b/libfreerdp/core/tpdu.c @@ -157,6 +157,11 @@ void tpdu_write_connection_request(wStream* s, UINT16 length) BOOL tpdu_read_connection_confirm(wStream* s, BYTE* li) { BYTE code; + int position; + int bytes_read = 0; + + /* save the position to determine the number of bytes read */ + position = Stream_GetPosition(s); if (!tpdu_read_header(s, &code, li)) return FALSE; @@ -166,8 +171,16 @@ BOOL tpdu_read_connection_confirm(wStream* s, BYTE* li) fprintf(stderr, "Error: expected X224_TPDU_CONNECTION_CONFIRM\n"); return FALSE; } + /* + * To ensure that there are enough bytes remaining for processing + * check against the length indicator (li). Already read bytes need + * to be taken into account. + * The -1 is because li was read but isn't included in the TPDU size. + * For reference see ITU-T Rec. X.224 - 13.2.1 + */ + bytes_read = (Stream_GetPosition(s) - position) - 1; - return (Stream_GetRemainingLength(s) >= *li); + return (Stream_GetRemainingLength(s) >= (*li - bytes_read)); } /** diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 04d89902a..bacf194d5 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -576,68 +576,6 @@ BOOL transport_accept_nla(rdpTransport* transport) return TRUE; } -BOOL nla_verify_header(wStream* s) -{ - if ((Stream_Pointer(s)[0] == 0x30) && (Stream_Pointer(s)[1] & 0x80)) - return TRUE; - - return FALSE; -} - -UINT32 nla_read_header(wStream* s) -{ - UINT32 length = 0; - - if (Stream_Pointer(s)[1] & 0x80) - { - if ((Stream_Pointer(s)[1] & ~(0x80)) == 1) - { - length = Stream_Pointer(s)[2]; - length += 3; - Stream_Seek(s, 3); - } - else if ((Stream_Pointer(s)[1] & ~(0x80)) == 2) - { - length = (Stream_Pointer(s)[2] << 8) | Stream_Pointer(s)[3]; - length += 4; - Stream_Seek(s, 4); - } - else - { - fprintf(stderr, "Error reading TSRequest!\n"); - } - } - else - { - length = Stream_Pointer(s)[1]; - length += 2; - Stream_Seek(s, 2); - } - - return length; -} - -UINT32 nla_header_length(wStream* s) -{ - UINT32 length = 0; - - if (Stream_Pointer(s)[1] & 0x80) - { - if ((Stream_Pointer(s)[1] & ~(0x80)) == 1) - length = 3; - else if ((Stream_Pointer(s)[1] & ~(0x80)) == 2) - length = 4; - else - fprintf(stderr, "Error reading TSRequest!\n"); - } - else - { - length = 2; - } - - return length; -} - static int transport_wait_for_read(rdpTransport* transport) { rdpTcp *tcpIn = transport->TcpIn; @@ -721,17 +659,53 @@ int transport_read_layer(rdpTransport* transport, BYTE* data, int bytes) return read; } -int transport_read(rdpTransport* transport, wStream* s) + +/** + * @brief Tries to read toRead bytes from the specified transport + * + * Try to read toRead bytes from the transport to the stream. + * In case it was not possible to read toRead bytes 0 is returned. The stream is always advanced by the + * number of bytes read. + * + * The function assumes that the stream has enough capacity to hold the data. + * + * @param[in] transport rdpTransport + * @param[in] s wStream + * @param[in] toRead number of bytes to read + * @return < 0 on error; 0 if not enough data is available (non blocking mode); 1 toRead bytes read + */ +static int transport_read_layer_bytes(rdpTransport* transport, wStream* s, unsigned int toRead) +{ + int status; + status = transport_read_layer(transport, Stream_Pointer(s), toRead); + if (status <= 0) + return status; + + Stream_Seek(s, status); + return status == toRead ? 1 : 0; +} + +/** + * @brief Try to read a complete PDU (NLA, fast-path or tpkt) from the underlying transport. + * + * If possible a complete PDU is read, in case of non blocking transport this might not succeed. + * Except in case of an error the passed stream will point to the last byte read (correct + * position). When the pdu read is completed the stream is sealed and the pointer set to 0 + * + * @param[in] transport rdpTransport + * @param[in] s wStream + * @return < 0 on error; 0 if not enough data is available (non blocking mode); > 0 number of + * bytes of the *complete* pdu read + */ +int transport_read_pdu(rdpTransport* transport, wStream* s) { int status; int position; int pduLength; BYTE *header; - int transport_status; position = 0; pduLength = 0; - transport_status = 0; if (!transport) return -1; @@ -739,43 +713,44 @@ int transport_read(rdpTransport* transport, wStream* s) if (!s) return -1; - /* first check if we have header */ position = Stream_GetPosition(s); - if (position < 4) + /* Make sure there is enough space for the longest header within the stream */ + Stream_EnsureCapacity(s, 4); + + /* Make sure at least two bytes are read for futher processing */ + if (position < 2 && (status = transport_read_layer_bytes(transport, s, 2 - position)) != 1) { - status = transport_read_layer(transport, Stream_Buffer(s) + position, 4 - position); - - if (status < 0) - return status; - - transport_status += status; - - if ((status + position) < 4) - return transport_status; - - position += status; + /* No data available at the moment */ + return status; } header = Stream_Buffer(s); - /* if header is present, read exactly one PDU */ - if (transport->NlaMode) { + /* + * In case NlaMode is set TSRequest package(s) are expected + * 0x30 = DER encoded data with these bits set: + * bit 6 P/C constructed + * bit 5 tag number - sequence + */ if (header[0] == 0x30) { /* TSRequest (NLA) */ - if (header[1] & 0x80) { if ((header[1] & ~(0x80)) == 1) { + if ((status = transport_read_layer_bytes(transport, s, 1)) != 1) + return status; pduLength = header[2]; pduLength += 3; } else if ((header[1] & ~(0x80)) == 2) { + if ((status = transport_read_layer_bytes(transport, s, 2)) != 1) + return status; pduLength = (header[2] << 8) | header[3]; pduLength += 4; } @@ -797,56 +772,66 @@ int transport_read(rdpTransport* transport, wStream* s) if (header[0] == 0x03) { /* TPKT header */ + if ((status = transport_read_layer_bytes(transport, s, 2)) != 1) + return status; pduLength = (header[2] << 8) | header[3]; + + /* min and max values according to ITU-T Rec. T.123 (01/2007) section 8 */ + if (pduLength < 7 || pduLength > 0xFFFF) + { + fprintf(stderr, "%s: tpkt - invalid pduLength: %d\n", __FUNCTION__, pduLength); + return -1; + } } else { /* Fast-Path Header */ - if (header[1] & 0x80) + { + if ((status = transport_read_layer_bytes(transport, s, 1)) != 1) + return status; pduLength = ((header[1] & 0x7F) << 8) | header[2]; + } else pduLength = header[1]; + + /* + * fast-path has 7 bits for length so the maximum size, including headers is 0x8000 + * The theoretical minimum fast-path PDU consists only of two header bytes plus one + * byte for data (e.g. fast-path input synchronize pdu) + */ + if (pduLength < 3 || pduLength > 0x8000) + { + fprintf(stderr, "%s: fast path - invalid pduLength: %d\n", __FUNCTION__, pduLength); + return -1; + } } } - status = transport_read_layer(transport, Stream_Buffer(s) + position, pduLength - position); - if (status < 0) + Stream_EnsureCapacity(s, Stream_GetPosition(s) + pduLength); + + status = transport_read_layer_bytes(transport, s, pduLength - Stream_GetPosition(s)); + + if (status != 1) return status; - transport_status += status; - #ifdef WITH_DEBUG_TRANSPORT /* dump when whole PDU is read */ - if (position + status >= pduLength) + if (Stream_GetPosition(s) >= pduLength) { fprintf(stderr, "Local < Remote\n"); winpr_HexDump(Stream_Buffer(s), pduLength); } #endif - if (position + status >= pduLength) - { + if (Stream_GetPosition(s) >= pduLength) WLog_Packet(transport->log, WLOG_TRACE, Stream_Buffer(s), pduLength, WLOG_PACKET_INBOUND); - } - return transport_status; -} - -static int transport_read_nonblocking(rdpTransport* transport) -{ - int status; - - status = transport_read(transport, transport->ReceiveBuffer); - - if (status <= 0) - return status; - - Stream_Seek(transport->ReceiveBuffer, status); - - return status; + Stream_SealLength(s); + Stream_SetPosition(s, 0); + return Stream_Length(s); } BOOL transport_bio_buffered_drain(BIO *bio); @@ -1040,9 +1025,7 @@ int tranport_drain_output_buffer(rdpTransport* transport) int transport_check_fds(rdpTransport* transport) { - int pos; int status; - int length; int recv_status; wStream* received; @@ -1064,105 +1047,22 @@ int transport_check_fds(rdpTransport* transport) for (;;) { /** - * Note: transport_read_nonblocking() reads max 1 additional PDU from - * the layer. Also note that transport_read_nonblocking() is also called - * outside of this function in transport_write()! This means that when - * entering transport_check_fds it is possible that the stream position - * of transport->ReceiveBuffer position is > 0. We must process this data - * even if transport_read_nonblocking() returns 0. + * Note: transport_read_pdu tries to read one PDU from + * the transport layer. + * The ReceiveBuffer might have a position > 0 in case of a non blocking + * transport. If transport_read_pdu returns 0 the pdu couldn't be read at + * this point. * Note that transport->ReceiveBuffer is replaced after each iteration * of this loop with a fresh stream instance from a pool. */ - if ((status = transport_read_nonblocking(transport)) < 0) + if ((status = transport_read_pdu(transport, transport->ReceiveBuffer)) <= 0) + { return status; - - if ((pos = Stream_GetPosition(transport->ReceiveBuffer)) < 2) - return 0; - - Stream_SetPosition(transport->ReceiveBuffer, 0); - length = 0; - - if (transport->NlaMode) - { - if (nla_verify_header(transport->ReceiveBuffer)) - { - /* TSRequest */ - - /* Ensure the TSRequest header is available. */ - if (pos <= 4) - { - Stream_SetPosition(transport->ReceiveBuffer, pos); - return 0; - } - - /* TSRequest header can be 2, 3 or 4 bytes long */ - length = nla_header_length(transport->ReceiveBuffer); - - if (pos < length) - { - Stream_SetPosition(transport->ReceiveBuffer, pos); - return 0; - } - - length = nla_read_header(transport->ReceiveBuffer); - } - } - else - { - if (tpkt_verify_header(transport->ReceiveBuffer)) /* TPKT */ - { - /* Ensure the TPKT header is available. */ - if (pos <= 4) - { - Stream_SetPosition(transport->ReceiveBuffer, pos); - return 0; - } - - length = tpkt_read_header(transport->ReceiveBuffer); - } - else /* Fast Path */ - { - /* Ensure the Fast Path header is available. */ - if (pos <= 2) - { - Stream_SetPosition(transport->ReceiveBuffer, pos); - return 0; - } - - /* Fastpath header can be two or three bytes long. */ - length = fastpath_header_length(transport->ReceiveBuffer); - - if (pos < length) - { - Stream_SetPosition(transport->ReceiveBuffer, pos); - return 0; - } - - length = fastpath_read_header(NULL, transport->ReceiveBuffer); - } - } - - if (length == 0) - { - fprintf(stderr, "transport_check_fds: protocol error, not a TPKT or Fast Path header.\n"); - winpr_HexDump(Stream_Buffer(transport->ReceiveBuffer), pos); - return -1; - } - - if (pos < length) - { - Stream_SetPosition(transport->ReceiveBuffer, pos); - return 0; /* Packet is not yet completely received. */ } received = transport->ReceiveBuffer; transport->ReceiveBuffer = StreamPool_Take(transport->ReceivePool, 0); - - Stream_SetPosition(received, length); - Stream_SealLength(received); - Stream_SetPosition(received, 0); - /** * status: * -1: error diff --git a/libfreerdp/core/transport.h b/libfreerdp/core/transport.h index 3a4a41753..142d350f3 100644 --- a/libfreerdp/core/transport.h +++ b/libfreerdp/core/transport.h @@ -96,7 +96,7 @@ BOOL transport_accept_rdp(rdpTransport* transport); BOOL transport_accept_tls(rdpTransport* transport); BOOL transport_accept_nla(rdpTransport* transport); void transport_stop(rdpTransport* transport); -int transport_read(rdpTransport* transport, wStream* s); +int transport_read_pdu(rdpTransport* transport, wStream* s); int transport_write(rdpTransport* transport, wStream* s); void transport_get_fds(rdpTransport* transport, void** rfds, int* rcount); int transport_check_fds(rdpTransport* transport); diff --git a/libfreerdp/core/update.c b/libfreerdp/core/update.c index 6a243aad0..9f8343d56 100644 --- a/libfreerdp/core/update.c +++ b/libfreerdp/core/update.c @@ -936,6 +936,20 @@ static void update_send_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap Stream_Release(s); } +static void update_send_play_sound(rdpContext* context, PLAY_SOUND_UPDATE* play_sound) +{ + wStream* s; + rdpRdp* rdp = context->rdp; + + if (!rdp->settings->ReceivedCapabilities[CAPSET_TYPE_SOUND]) { + return; + } + s = rdp_data_pdu_init(rdp); + Stream_Write_UINT32(s, play_sound->duration); + Stream_Write_UINT32(s, play_sound->frequency); + rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_PLAY_SOUND, rdp->mcs->userId); + Stream_Release(s); +} /** * Primary Drawing Orders */ @@ -1448,7 +1462,7 @@ static void update_send_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDAT updateCode = FASTPATH_UPDATETYPE_PTR_NULL; else updateCode = FASTPATH_UPDATETYPE_PTR_DEFAULT; - + fastpath_send_update_pdu(rdp->fastpath, updateCode, s); Stream_Release(s); } @@ -1467,10 +1481,10 @@ static void update_write_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer if (pointer_color->lengthXorMask > 0) Stream_Write(s, pointer_color->xorMaskData, pointer_color->lengthXorMask); - + if (pointer_color->lengthAndMask > 0) Stream_Write(s, pointer_color->andMaskData, pointer_color->lengthAndMask); - + Stream_Write_UINT8(s, 0); /* pad (1 byte) */ } @@ -1570,6 +1584,7 @@ void update_register_server_callbacks(rdpUpdate* update) update->SurfaceBits = update_send_surface_bits; update->SurfaceFrameMarker = update_send_surface_frame_marker; update->SurfaceCommand = update_send_surface_command; + update->PlaySound = update_send_play_sound; update->primary->DstBlt = update_send_dstblt; update->primary->PatBlt = update_send_patblt; update->primary->ScrBlt = update_send_scrblt; diff --git a/libfreerdp/crypto/CMakeLists.txt b/libfreerdp/crypto/CMakeLists.txt index e33200bec..b307cb3a6 100644 --- a/libfreerdp/crypto/CMakeLists.txt +++ b/libfreerdp/crypto/CMakeLists.txt @@ -36,16 +36,15 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" include_directories(${OPENSSL_INCLUDE_DIR}) include_directories(${ZLIB_INCLUDE_DIRS}) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set(${MODULE_PREFIX}_LIBS ${OPENSSL_LIBRARIES}) -if(MONOLITHIC_BUILD) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) -else() - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr-sspi winpr-library winpr-path winpr-file) -endif() +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) if(WIN32) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ws2_32) @@ -58,11 +57,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-library) - if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 9075f1e59..fd857b9b0 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -51,6 +52,7 @@ long bio_rdp_tls_callback(BIO* bio, int mode, const char* argp, int argi, long a static int bio_rdp_tls_write(BIO* bio, const char* buf, int size) { + int error; int status; BIO_RDP_TLS* tls = (BIO_RDP_TLS*) bio->ptr; @@ -70,11 +72,11 @@ static int bio_rdp_tls_write(BIO* bio, const char* buf, int size) break; case SSL_ERROR_WANT_WRITE: - BIO_set_flags(bio, BIO_FLAGS_WRITE); + BIO_set_flags(bio, BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY); break; case SSL_ERROR_WANT_READ: - BIO_set_flags(bio, BIO_FLAGS_READ); + BIO_set_flags(bio, BIO_FLAGS_READ | BIO_FLAGS_SHOULD_RETRY); break; case SSL_ERROR_WANT_X509_LOOKUP: @@ -88,7 +90,16 @@ static int bio_rdp_tls_write(BIO* bio, const char* buf, int size) break; case SSL_ERROR_SYSCALL: - BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); + error = WSAGetLastError(); + if ((error == WSAEWOULDBLOCK) || (error == WSAEINTR) || + (error == WSAEINPROGRESS) || (error == WSAEALREADY)) + { + BIO_set_flags(bio, (BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY)); + } + else + { + BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); + } break; case SSL_ERROR_SSL: @@ -102,6 +113,7 @@ static int bio_rdp_tls_write(BIO* bio, const char* buf, int size) static int bio_rdp_tls_read(BIO* bio, char* buf, int size) { + int error; int status; BIO_RDP_TLS* tls = (BIO_RDP_TLS*) bio->ptr; @@ -121,11 +133,11 @@ static int bio_rdp_tls_read(BIO* bio, char* buf, int size) break; case SSL_ERROR_WANT_READ: - BIO_set_flags(bio, BIO_FLAGS_READ); + BIO_set_flags(bio, BIO_FLAGS_READ | BIO_FLAGS_SHOULD_RETRY); break; case SSL_ERROR_WANT_WRITE: - BIO_set_flags(bio, BIO_FLAGS_WRITE); + BIO_set_flags(bio, BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY); break; case SSL_ERROR_WANT_X509_LOOKUP: @@ -152,7 +164,16 @@ static int bio_rdp_tls_read(BIO* bio, char* buf, int size) break; case SSL_ERROR_SYSCALL: - status = 0; + error = WSAGetLastError(); + if ((error == WSAEWOULDBLOCK) || (error == WSAEINTR) || + (error == WSAEINPROGRESS) || (error == WSAEALREADY)) + { + BIO_set_flags(bio, (BIO_FLAGS_READ | BIO_FLAGS_SHOULD_RETRY)); + } + else + { + BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); + } break; } } @@ -571,6 +592,13 @@ BOOL tls_prepare(rdpTls* tls, BIO *underlying, const SSL_METHOD *method, int opt SSL_CTX_set_options(tls->ctx, options); SSL_CTX_set_read_ahead(tls->ctx, 1); + if (tls->settings->PermittedTLSCiphers) { + if(!SSL_CTX_set_cipher_list(tls->ctx, tls->settings->PermittedTLSCiphers)) { + fprintf(stderr, "SSL_CTX_set_cipher_list %s failed\n", tls->settings->PermittedTLSCiphers); + return FALSE; + } + } + tls->bio = BIO_new_rdp_tls(tls->ctx, clientMode); if (BIO_get_ssl(tls->bio, &tls->ssl) < 0) @@ -1316,8 +1344,7 @@ rdpTls* tls_new(rdpSettings* settings) if (!tls) return NULL; - SSL_load_error_strings(); - SSL_library_init(); + winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT); tls->settings = settings; tls->certificate_store = certificate_store_new(settings); diff --git a/libfreerdp/gdi/CMakeLists.txt b/libfreerdp/gdi/CMakeLists.txt index 6b182fe1e..c831bbd04 100644 --- a/libfreerdp/gdi/CMakeLists.txt +++ b/libfreerdp/gdi/CMakeLists.txt @@ -44,7 +44,10 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" SOURCES ${${MODULE_PREFIX}_SRCS} EXPORT) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL diff --git a/libfreerdp/gdi/test/CMakeLists.txt b/libfreerdp/gdi/test/CMakeLists.txt index 48e5a9125..4a2ba50fc 100644 --- a/libfreerdp/gdi/test/CMakeLists.txt +++ b/libfreerdp/gdi/test/CMakeLists.txt @@ -28,10 +28,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-gdi) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-utils) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/libfreerdp/locale/CMakeLists.txt b/libfreerdp/locale/CMakeLists.txt index a3a844876..67f2145c1 100644 --- a/libfreerdp/locale/CMakeLists.txt +++ b/libfreerdp/locale/CMakeLists.txt @@ -75,17 +75,17 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" SOURCES ${${MODULE_PREFIX}_SRCS} EXPORT) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL MODULE freerdp MODULES freerdp-utils) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-input winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) diff --git a/libfreerdp/locale/keyboard_layout.c b/libfreerdp/locale/keyboard_layout.c index 3869358cc..df902bef6 100644 --- a/libfreerdp/locale/keyboard_layout.c +++ b/libfreerdp/locale/keyboard_layout.c @@ -120,6 +120,7 @@ static const RDP_KEYBOARD_LAYOUT RDP_KEYBOARD_LAYOUT_TABLE[] = { KBD_CANADIAN_FRENCH_LEGACY, "Canadian French (legacy)" }, { KBD_SERBIAN_CYRILLIC, "Serbian (Cyrillic)" }, { KBD_CANADIAN_FRENCH, "Canadian French" }, + { KBD_CANADIAN_ENGLISH, "Canadian English" }, { KBD_SWISS_FRENCH, "Swiss French" }, { KBD_BOSNIAN, "Bosnian" }, { KBD_IRISH, "Irish" }, diff --git a/libfreerdp/locale/xkb_layout_ids.c b/libfreerdp/locale/xkb_layout_ids.c index 75ae0419b..fc67b2707 100644 --- a/libfreerdp/locale/xkb_layout_ids.c +++ b/libfreerdp/locale/xkb_layout_ids.c @@ -208,15 +208,16 @@ static const XKB_VARIANT ma_variants[] = /* Canada */ static const XKB_VARIANT ca_variants[] = { + { "fr", KBD_CANADIAN_FRENCH }, /* French Dvorak */ { "fr-dvorak", KBD_UNITED_STATES_DVORAK }, /* French Dvorak */ - { "fr-legacy", KBD_CANADIAN_FRENCH }, /* French (legacy) */ + { "fr-legacy", KBD_CANADIAN_FRENCH_LEGACY }, /* French (legacy) */ { "multix", KBD_CANADIAN_MULTILINGUAL_STANDARD }, /* Multilingual */ { "multi", KBD_CANADIAN_MULTILINGUAL_STANDARD }, /* Multilingual, first part */ { "multi-2gr", KBD_CANADIAN_MULTILINGUAL_STANDARD }, /* Multilingual, second part */ { "ike", KBD_INUKTITUT_LATIN }, /* Inuktitut */ { "shs", 0 }, /* Secwepemctsin */ { "kut", 0 }, /* Ktunaxa */ - { "eng", KBD_US }, /* English */ + { "eng", KBD_CANADIAN_ENGLISH }, /* English */ { "", 0 }, }; diff --git a/libfreerdp/primitives/CMakeLists.txt b/libfreerdp/primitives/CMakeLists.txt index a075072d2..f544b350e 100644 --- a/libfreerdp/primitives/CMakeLists.txt +++ b/libfreerdp/primitives/CMakeLists.txt @@ -76,7 +76,10 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" SOURCES ${${MODULE_PREFIX}_SRCS} EXPORT) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") if(IPP_FOUND) include_directories(${IPP_INCLUDE_DIRS}) @@ -85,10 +88,7 @@ if(IPP_FOUND) endforeach() endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-sysinfo) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) diff --git a/libfreerdp/rail/CMakeLists.txt b/libfreerdp/rail/CMakeLists.txt index fe0f5741d..504f7b303 100644 --- a/libfreerdp/rail/CMakeLists.txt +++ b/libfreerdp/rail/CMakeLists.txt @@ -30,7 +30,10 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" SOURCES ${${MODULE_PREFIX}_SRCS} EXPORT) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL diff --git a/libfreerdp/utils/CMakeLists.txt b/libfreerdp/utils/CMakeLists.txt index c2a679ede..1db46f1a0 100644 --- a/libfreerdp/utils/CMakeLists.txt +++ b/libfreerdp/utils/CMakeLists.txt @@ -42,7 +42,10 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" SOURCES ${${MODULE_PREFIX}_SRCS} EXPORT) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set(${MODULE_PREFIX}_LIBS ${CMAKE_THREAD_LIBS_INIT} @@ -56,10 +59,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES SunOS) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} rt) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-synch winpr-thread winpr-utils winpr-path winpr-winsock) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) diff --git a/libfreerdp/utils/test/CMakeLists.txt b/libfreerdp/utils/test/CMakeLists.txt index e6ab6134c..ace2867c6 100644 --- a/libfreerdp/utils/test/CMakeLists.txt +++ b/libfreerdp/utils/test/CMakeLists.txt @@ -13,10 +13,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-thread winpr-synch winpr-file winpr-utils winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} diff --git a/scripts/android_setup_build_env.sh b/scripts/android_setup_build_env.sh index d8d6e8d68..9d0fd2749 100755 --- a/scripts/android_setup_build_env.sh +++ b/scripts/android_setup_build_env.sh @@ -45,7 +45,7 @@ echo "Preparing OpenSSL..." OPENSSL_SRC=$ROOT/openssl-build if [ -d $OPENSSL_SRC ]; then cd $OPENSSL_SRC - git pull + git fetch RETVAL=$? else git clone $OPENSSL_SCM $OPENSSL_SRC @@ -64,9 +64,7 @@ make clean # The makefile has a bug, which aborts during # first compilation. Rerun make to build the whole lib. make -make -make -RETVAL=0 # TODO: Check, why 2 is returned. +RETVAL=$? if [ $RETVAL -ne 0 ]; then echo "Failed to execute make command [$RETVAL]" exit -4 diff --git a/server/Mac/CMakeLists.txt b/server/Mac/CMakeLists.txt index 50cfc1fc1..bedd69ec8 100644 --- a/server/Mac/CMakeLists.txt +++ b/server/Mac/CMakeLists.txt @@ -72,10 +72,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-core freerdp-utils freerdp-codec freerdp-primitives) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/server/Sample/CMakeLists.txt b/server/Sample/CMakeLists.txt index 638a5fef0..1252e3f7f 100644 --- a/server/Sample/CMakeLists.txt +++ b/server/Sample/CMakeLists.txt @@ -37,10 +37,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-core freerdp-utils freerdp-codec freerdp-primitives) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/server/Windows/CMakeLists.txt b/server/Windows/CMakeLists.txt index b817e8121..ae9ed7c92 100644 --- a/server/Windows/CMakeLists.txt +++ b/server/Windows/CMakeLists.txt @@ -60,7 +60,10 @@ endif() if(WITH_SERVER_INTERFACE) add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) - set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") + if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) + endif() + set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") else() set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} cli/wfreerdp.c cli/wfreerdp.h) add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) diff --git a/server/Windows/wf_rdpsnd.c b/server/Windows/wf_rdpsnd.c index 0a4362d43..c37ab0570 100644 --- a/server/Windows/wf_rdpsnd.c +++ b/server/Windows/wf_rdpsnd.c @@ -160,7 +160,7 @@ BOOL wf_peer_rdpsnd_init(wfPeerContext* context) context->rdpsnd->Activated = wf_peer_rdpsnd_activated; - context->rdpsnd->Initialize(context->rdpsnd); + context->rdpsnd->Initialize(context->rdpsnd, TRUE); wf_rdpsnd_set_latest_peer(context); diff --git a/server/X11/CMakeLists.txt b/server/X11/CMakeLists.txt index 2af6f8f2e..d60ac3162 100644 --- a/server/X11/CMakeLists.txt +++ b/server/X11/CMakeLists.txt @@ -44,7 +44,10 @@ if(WITH_SERVER_INTERFACE) else() add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) endif() - set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") + if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) + endif() + set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") else() set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} cli/xfreerdp.c) add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) @@ -147,10 +150,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-core freerdp-common freerdp-codec freerdp-primitives freerdp-utils freerdp-gdi freerdp-crypto freerdp-locale) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-sspi winpr-crt winpr-utils winpr-input winpr-sysinfo) +set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr-makecert-tool) diff --git a/server/common/CMakeLists.txt b/server/common/CMakeLists.txt index 22869430d..90ac794bd 100644 --- a/server/common/CMakeLists.txt +++ b/server/common/CMakeLists.txt @@ -32,7 +32,10 @@ endif() add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION} PREFIX "lib") +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${FREERDP_CHANNELS_SERVER_LIBS}) diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index d53744418..99a6d413c 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -38,7 +38,6 @@ set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/) # Check for cmake compatibility (enable/disable features) include(CheckCmakeCompat) include(FindFeature) -include(ComplexLibrary) include(AutoVersioning) include(ConfigOptions) include(CheckCCompilerFlag) @@ -51,6 +50,7 @@ set(WINPR_VERSION_MINOR "1") set(WINPR_VERSION_REVISION "0") set(WINPR_VERSION "${WINPR_VERSION_MAJOR}.${WINPR_VERSION_MINOR}") set(WINPR_VERSION_FULL "${WINPR_VERSION}.${WINPR_VERSION_REVISION}") +set(WINPR_VERSION_FULL ${WINPR_VERSION_FULL} PARENT_SCOPE) # Default to release build type if(NOT CMAKE_BUILD_TYPE) @@ -84,7 +84,8 @@ if(${CMAKE_VERSION} VERSION_GREATER "2.8.10") set(WINPR_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/WinPR") set(WINPR_INCLUDE_DIR "include") - set(WINPR_MONOLITHIC_BUILD ${MONOLITHIC_BUILD}) + # Keep this for legacy builds + set(WINPR_MONOLITHIC_BUILD OFF) configure_package_config_file(WinPRConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake INSTALL_DESTINATION ${WINPR_CMAKE_INSTALL_DIR} diff --git a/winpr/include/winpr/interlocked.h b/winpr/include/winpr/interlocked.h index e96a2b62f..83c462568 100644 --- a/winpr/include/winpr/interlocked.h +++ b/winpr/include/winpr/interlocked.h @@ -154,10 +154,20 @@ WINPR_API LONG InterlockedExchangeAdd(LONG volatile *Addend, LONG Value); WINPR_API LONG InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand); +WINPR_API PVOID InterlockedCompareExchangePointer(PVOID volatile *Destination, PVOID Exchange, PVOID Comperand); + #endif /* _WIN32 */ +#if (!defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0502))) +#define WINPR_INTERLOCKED_COMPARE_EXCHANGE64 1 +#endif + +#ifdef WINPR_INTERLOCKED_COMPARE_EXCHANGE64 + WINPR_API LONGLONG InterlockedCompareExchange64(LONGLONG volatile *Destination, LONGLONG Exchange, LONGLONG Comperand); +#endif + /* Doubly-Linked List */ WINPR_API VOID InitializeListHead(PLIST_ENTRY ListHead); diff --git a/winpr/include/winpr/pool.h b/winpr/include/winpr/pool.h index 8ff2ff855..8dc335084 100644 --- a/winpr/include/winpr/pool.h +++ b/winpr/include/winpr/pool.h @@ -81,7 +81,6 @@ typedef struct _TP_CALLBACK_ENVIRON_V1 /* Non-Windows and pre Windows 7 */ #if ((!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0601))) -//#if !defined(_WIN32_WINNT_VISTA) typedef struct _TP_CALLBACK_ENVIRON_V3 { @@ -121,7 +120,9 @@ typedef struct _TP_WAIT TP_WAIT, *PTP_WAIT; typedef struct _TP_IO TP_IO, *PTP_IO; +#if !defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0601)) typedef TP_CALLBACK_ENVIRON_V1 TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON; +#endif #ifndef _WIN32 @@ -152,13 +153,18 @@ typedef VOID (*PTP_WIN32_IO_CALLBACK)(PTP_CALLBACK_INSTANCE Instance, PVOID Cont #endif +#if (!defined(_WIN32) || ((defined(_WIN32) && (_WIN32_WINNT < 0x0601)))) +#define WINPR_THREAD_POOL 1 +#endif + #ifdef __cplusplus extern "C" { #endif - /* Synch */ +#ifdef WINPR_THREAD_POOL + WINPR_API PTP_WAIT CreateThreadpoolWait(PTP_WAIT_CALLBACK pfnwa, PVOID pv, PTP_CALLBACK_ENVIRON pcbe); WINPR_API VOID CloseThreadpoolWait(PTP_WAIT pwa); WINPR_API VOID SetThreadpoolWait(PTP_WAIT pwa, HANDLE h, PFILETIME pftTimeout); @@ -225,6 +231,8 @@ WINPR_API VOID LeaveCriticalSectionWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci WINPR_API VOID FreeLibraryWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HMODULE mod); WINPR_API VOID DisassociateCurrentThreadFromCallback(PTP_CALLBACK_INSTANCE pci); +#endif + /* Dummy */ WINPR_API void winpr_pool_dummy(void); diff --git a/winpr/include/winpr/ssl.h b/winpr/include/winpr/ssl.h new file mode 100644 index 000000000..647c0e478 --- /dev/null +++ b/winpr/include/winpr/ssl.h @@ -0,0 +1,45 @@ +/** + * WinPR: Windows Portable Runtime + * OpenSSL Library Initialization + * + * Copyright 2014 Thincast Technologies GmbH + * Copyright 2014 Norbert Federa + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WINPR_SSL_H +#define WINPR_SSL_H + +#include + +#define WINPR_SSL_INIT_DEFAULT 0x00 +#define WINPR_SSL_INIT_ALREADY_INITIALIZED 0x01 +#define WINPR_SSL_INIT_ENABLE_LOCKING 0x2 + +#define WINPR_SSL_CLEANUP_GLOBAL 0x01 +#define WINPR_SSL_CLEANUP_THREAD 0x02 + +#ifdef __cplusplus +extern "C" { +#endif + +WINPR_API BOOL winpr_InitializeSSL(DWORD flags); +WINPR_API BOOL winpr_CleanupSSL(DWORD flags); + +#ifdef __cplusplus +} +#endif + +#endif /* WINPR_SSL_H */ + diff --git a/winpr/include/winpr/synch.h b/winpr/include/winpr/synch.h index 00b979a69..04f4268e4 100644 --- a/winpr/include/winpr/synch.h +++ b/winpr/include/winpr/synch.h @@ -3,6 +3,8 @@ * Synchronization Functions * * Copyright 2012 Marc-Andre Moreau + * Copyright 2014 Thincast Technologies GmbH + * Copyright 2014 Norbert Federa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -102,22 +104,6 @@ WINPR_API BOOL ResetEvent(HANDLE hEvent); #define OpenEvent OpenEventA #endif -/* One-Time Initialization */ - -typedef union _RTL_RUN_ONCE -{ - PVOID Ptr; -} RTL_RUN_ONCE, *PRTL_RUN_ONCE; - -typedef PRTL_RUN_ONCE PINIT_ONCE; -typedef PRTL_RUN_ONCE LPINIT_ONCE; -typedef BOOL CALLBACK (*PINIT_ONCE_FN) (PINIT_ONCE InitOnce, PVOID Parameter, PVOID* Context); - -WINPR_API BOOL InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID* lpContext); -WINPR_API BOOL InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext); -WINPR_API BOOL InitOnceExecuteOnce(PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn, PVOID Parameter, LPVOID* Context); -WINPR_API VOID InitOnceInitialize(PINIT_ONCE InitOnce); - /* Slim Reader/Writer (SRW) Lock */ typedef PVOID RTL_SRWLOCK; @@ -297,12 +283,36 @@ WINPR_API BOOL DeleteTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, HANDLE Com #endif -#if ((defined _WIN32) && (_WIN32_WINNT < 0x0403)) +#if (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) WINPR_API BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags); #endif +#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) + +/* One-Time Initialization */ + +typedef struct _RTL_RUN_ONCE +{ + PVOID Ptr; +} RTL_RUN_ONCE, *PRTL_RUN_ONCE; + +#define RTL_RUN_ONCE_INIT { 0 } +#define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT + +typedef RTL_RUN_ONCE INIT_ONCE; +typedef PRTL_RUN_ONCE PINIT_ONCE; +typedef PRTL_RUN_ONCE LPINIT_ONCE; +typedef BOOL CALLBACK (*PINIT_ONCE_FN) (PINIT_ONCE InitOnce, PVOID Parameter, PVOID* Context); + +WINPR_API BOOL InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID* lpContext); +WINPR_API BOOL InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext); +WINPR_API BOOL InitOnceExecuteOnce(PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn, PVOID Parameter, LPVOID* Context); +WINPR_API VOID InitOnceInitialize(PINIT_ONCE InitOnce); + +#endif + /* Extended API */ WINPR_API VOID USleep(DWORD dwMicroseconds); diff --git a/winpr/libwinpr/CMakeLists.txt b/winpr/libwinpr/CMakeLists.txt index c2eabedda..0b3c5d7dc 100644 --- a/winpr/libwinpr/CMakeLists.txt +++ b/winpr/libwinpr/CMakeLists.txt @@ -15,48 +15,92 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr") -set(MODULE_PREFIX "WINPR") - if (APPLE) # flat_namespace should be avoided, but is required for -undefined warning. Since WinPR currently has # a lot of undefined symbols in use, use this hack until they're filled out. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-flat_namespace,-undefined,warning") endif() -if(MONOLITHIC_BUILD) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) -endif() +set(WINPR_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(WINPR_SRCS "") +set(WINPR_LIBS "") +set(WINPR_INCLUDES "") +set(WINPR_DEFINITIONS "") -set(FILENAME "ModuleOptions.cmake") -file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}") +macro (winpr_module_add) + file (RELATIVE_PATH _relPath "${WINPR_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") + foreach (_src ${ARGN}) + if (_relPath) + list (APPEND WINPR_SRCS "${_relPath}/${_src}") + else() + list (APPEND WINPR_SRCS "${_src}") + endif() + endforeach() + if (_relPath) + set (WINPR_SRCS ${WINPR_SRCS} PARENT_SCOPE) + endif() +endmacro() -foreach(FILEPATH ${FILEPATHS}) - if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}") - string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" ${MODULE_PREFIX}_SUBMODULE ${FILEPATH}) - set(${MODULE_PREFIX}_SUBMODULES ${${MODULE_PREFIX}_SUBMODULES} ${${MODULE_PREFIX}_SUBMODULE}) - endif() -endforeach(FILEPATH) +macro (winpr_include_directory_add) + file (RELATIVE_PATH _relPath "${WINPR_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") + foreach (_inc ${ARGN}) + if (IS_ABSOLUTE ${_inc}) + list (APPEND WINPR_INCLUDES "${_inc}") + else() + if (_relPath) + list (APPEND WINPR_INCLUDES "${_relPath}/${_inc}") + else() + list (APPEND WINPR_INCLUDES "${_inc}") + endif() + endif() + endforeach() + if (_relPath) + set (WINPR_INCLUDES ${WINPR_INCLUDES} PARENT_SCOPE) + endif() +endmacro() -foreach(${MODULE_PREFIX}_SUBMODULE ${${MODULE_PREFIX}_SUBMODULES}) - add_subdirectory(${${MODULE_PREFIX}_SUBMODULE}) +macro (winpr_library_add) + foreach (_lib ${ARGN}) + list (APPEND WINPR_LIBS "${_lib}") + endforeach() + set (WINPR_LIBS ${WINPR_LIBS} PARENT_SCOPE) +endmacro() + +macro (winpr_definition_add) + foreach (_define ${ARGN}) + list (APPEND WINPR_DEFINITIONS "${_define}") + endforeach() + set (WINPR_DEFINITIONS ${WINPR_DEFINITIONS} PARENT_SCOPE) +endmacro() + +# Level "1" API as defined for MinCore.lib +set(WINPR_CORE synch locale library file comm pipe interlocked security + environment crypto registry credentials path io memory input + heap utils error com timezone sysinfo pool handle thread) + +foreach(DIR ${WINPR_CORE}) + add_subdirectory(${DIR}) endforeach() -if(MONOLITHIC_BUILD) +set(WINPR_LEVEL2 winsock sspi winhttp asn1 sspicli crt bcrypt rpc credui + wtsapi dsparse wnd smartcard nt) - foreach(${MODULE_PREFIX}_SUBMODULE ${${MODULE_PREFIX}_SUBMODULES}) - set(${MODULE_PREFIX}_OBJECTS ${${MODULE_PREFIX}_OBJECTS} "$") - endforeach() +foreach(DIR ${WINPR_LEVEL2}) + add_subdirectory(${DIR}) +endforeach() - add_library(${MODULE_NAME} dummy.c ${${MODULE_PREFIX}_OBJECTS}) - - set_target_properties(${MODULE_NAME} PROPERTIES LINKER_LANGUAGE C) - set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - - list(REMOVE_DUPLICATES WINPR_LIBS) - target_link_libraries(${MODULE_NAME} ${WINPR_LIBS}) - - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT WinPRTargets) - - set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/libwinpr") +set(MODULE_NAME winpr) +list(REMOVE_DUPLICATES WINPR_DEFINITIONS) +list(REMOVE_DUPLICATES WINPR_LIBS) +list(REMOVE_DUPLICATES WINPR_INCLUDES) +include_directories(${WINPR_INCLUDES}) +add_library(${MODULE_NAME} ${WINPR_SRCS}) +set_target_properties(${MODULE_NAME} PROPERTIES LINKER_LANGUAGE C) +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION}) endif() +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "lib") +add_definitions(${WINPR_DEFINITIONS}) +target_link_libraries(${MODULE_NAME} ${WINPR_LIBS}) +install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT WinPRTargets) +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/libwinpr") diff --git a/winpr/libwinpr/asn1/CMakeLists.txt b/winpr/libwinpr/asn1/CMakeLists.txt index 920e8001c..214f52801 100644 --- a/winpr/libwinpr/asn1/CMakeLists.txt +++ b/winpr/libwinpr/asn1/CMakeLists.txt @@ -15,30 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-asn1") -set(MODULE_PREFIX "WINPR_ASN1") - -set(${MODULE_PREFIX}_SRCS - asn1.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(MONOLITHIC_BUILD) - -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(asn1.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/asn1/test/CMakeLists.txt b/winpr/libwinpr/asn1/test/CMakeLists.txt index 60e967906..22b8eb50f 100644 --- a/winpr/libwinpr/asn1/test/CMakeLists.txt +++ b/winpr/libwinpr/asn1/test/CMakeLists.txt @@ -24,12 +24,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-asn1) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/bcrypt/CMakeLists.txt b/winpr/libwinpr/bcrypt/CMakeLists.txt index b70d9bf85..24c2206c4 100644 --- a/winpr/libwinpr/bcrypt/CMakeLists.txt +++ b/winpr/libwinpr/bcrypt/CMakeLists.txt @@ -15,35 +15,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-bcrypt") -set(MODULE_PREFIX "WINPR_BCRYPT") +winpr_module_add(bcrypt.c) -set(${MODULE_PREFIX}_SRCS - bcrypt.c) +winpr_include_directory_add( + ${OPENSSL_INCLUDE_DIR} + ${ZLIB_INCLUDE_DIRS}) -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -include_directories(${OPENSSL_INCLUDE_DIR}) -include_directories(${ZLIB_INCLUDE_DIRS}) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS - ${ZLIB_LIBRARIES}) - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-utils) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_library_add(${ZLIB_LIBRARIES}) diff --git a/winpr/libwinpr/com/CMakeLists.txt b/winpr/libwinpr/com/CMakeLists.txt index f00507be4..1b82dbc69 100644 --- a/winpr/libwinpr/com/CMakeLists.txt +++ b/winpr/libwinpr/com/CMakeLists.txt @@ -15,35 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-com") -set(MODULE_PREFIX "WINPR_COM") - -set(${MODULE_PREFIX}_SRCS - com.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} credui) -endif() - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(com.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/com/test/CMakeLists.txt b/winpr/libwinpr/com/test/CMakeLists.txt index 94e42c352..ac6c1c008 100644 --- a/winpr/libwinpr/com/test/CMakeLists.txt +++ b/winpr/libwinpr/com/test/CMakeLists.txt @@ -1,4 +1,3 @@ - set(MODULE_NAME "TestCom") set(MODULE_PREFIX "TEST_COM") @@ -13,13 +12,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-com) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") foreach(test ${${MODULE_PREFIX}_TESTS}) @@ -28,4 +21,3 @@ foreach(test ${${MODULE_PREFIX}_TESTS}) endforeach() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/Test") - diff --git a/winpr/libwinpr/comm/CMakeLists.txt b/winpr/libwinpr/comm/CMakeLists.txt index c37af7268..58ff2fe1d 100644 --- a/winpr/libwinpr/comm/CMakeLists.txt +++ b/winpr/libwinpr/comm/CMakeLists.txt @@ -31,31 +31,8 @@ set(${MODULE_PREFIX}_SRCS comm_sercx2_sys.c comm_sercx2_sys.h) -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() +winpr_module_add(${${MODULE_PREFIX}_SRCS}) -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS}) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-file winpr-utils) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - -if(BUILD_TESTING) +if(BUILD_TESTING AND UNIX AND NOT WIN32) add_subdirectory(test) endif() - diff --git a/winpr/libwinpr/comm/module.def b/winpr/libwinpr/comm/module.def index fc26e7287..44feb6f4e 100644 --- a/winpr/libwinpr/comm/module.def +++ b/winpr/libwinpr/comm/module.def @@ -1,3 +1,3 @@ -LIBRARY "libwinpr-comm" +LIBRARY "libwinpr" EXPORTS diff --git a/winpr/libwinpr/comm/test/CMakeLists.txt b/winpr/libwinpr/comm/test/CMakeLists.txt index dcf737f3a..8b9c07c88 100644 --- a/winpr/libwinpr/comm/test/CMakeLists.txt +++ b/winpr/libwinpr/comm/test/CMakeLists.txt @@ -21,12 +21,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-comm winpr-crt winpr-file) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/comm/test/TestGetCommState.c b/winpr/libwinpr/comm/test/TestGetCommState.c index b5cc30423..3c9da67b5 100644 --- a/winpr/libwinpr/comm/test/TestGetCommState.c +++ b/winpr/libwinpr/comm/test/TestGetCommState.c @@ -90,9 +90,10 @@ int TestGetCommState(int argc, char* argv[]) return EXIT_FAILURE; } - hComm = CreateFile("COM1", + hComm = CreateFileA("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + if (hComm == INVALID_HANDLE_VALUE) { printf("CreateFileA failure: 0x%x\n", GetLastError()); diff --git a/winpr/libwinpr/comm/test/TestHandflow.c b/winpr/libwinpr/comm/test/TestHandflow.c index 1e536e7a2..6cdbfb673 100644 --- a/winpr/libwinpr/comm/test/TestHandflow.c +++ b/winpr/libwinpr/comm/test/TestHandflow.c @@ -19,7 +19,10 @@ #include #include + +#ifndef _WIN32 #include +#endif #include #include diff --git a/winpr/libwinpr/comm/test/TestSerialChars.c b/winpr/libwinpr/comm/test/TestSerialChars.c index 8cd3dc953..d1a75c9c5 100644 --- a/winpr/libwinpr/comm/test/TestSerialChars.c +++ b/winpr/libwinpr/comm/test/TestSerialChars.c @@ -19,7 +19,10 @@ #include #include + +#ifndef _WIN32 #include +#endif #include #include diff --git a/winpr/libwinpr/comm/test/TestTimeouts.c b/winpr/libwinpr/comm/test/TestTimeouts.c index c7d4c226b..652bd47be 100644 --- a/winpr/libwinpr/comm/test/TestTimeouts.c +++ b/winpr/libwinpr/comm/test/TestTimeouts.c @@ -19,7 +19,10 @@ #include #include + +#ifndef _WIN32 #include +#endif #include #include diff --git a/winpr/libwinpr/credentials/CMakeLists.txt b/winpr/libwinpr/credentials/CMakeLists.txt index 588f28c98..80140c42b 100644 --- a/winpr/libwinpr/credentials/CMakeLists.txt +++ b/winpr/libwinpr/credentials/CMakeLists.txt @@ -15,28 +15,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-credentials") -set(MODULE_PREFIX "WINPR_CREDENTIALS") - -set(${MODULE_PREFIX}_SRCS - credentials.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(MONOLITHIC_BUILD) - -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(credentials.c) diff --git a/winpr/libwinpr/credui/CMakeLists.txt b/winpr/libwinpr/credui/CMakeLists.txt index cb5a86ba5..b1a06638f 100644 --- a/winpr/libwinpr/credui/CMakeLists.txt +++ b/winpr/libwinpr/credui/CMakeLists.txt @@ -15,41 +15,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-credui") -set(MODULE_PREFIX "WINPR_CREDUI") - -set(${MODULE_PREFIX}_SRCS - credui.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") +winpr_module_add(credui.c) if(WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} credui) + winpr_library_add(credui) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-utils) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/credui/test/CMakeLists.txt b/winpr/libwinpr/credui/test/CMakeLists.txt index 95a2462ab..e615e3a32 100644 --- a/winpr/libwinpr/credui/test/CMakeLists.txt +++ b/winpr/libwinpr/credui/test/CMakeLists.txt @@ -16,12 +16,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-credui) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/crt/CMakeLists.txt b/winpr/libwinpr/crt/CMakeLists.txt index 6acb1c303..3fd7e0511 100644 --- a/winpr/libwinpr/crt/CMakeLists.txt +++ b/winpr/libwinpr/crt/CMakeLists.txt @@ -15,10 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-crt") -set(MODULE_PREFIX "WINPR_CRT") - -set(${MODULE_PREFIX}_SRCS +winpr_module_add( alignment.c conversion.c buffer.c @@ -28,30 +25,6 @@ set(${MODULE_PREFIX}_SRCS utf.c utf.h) -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-error) - -if(MONOLITHIC_BUILD) - -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/crt/alignment.c b/winpr/libwinpr/crt/alignment.c index 3a514a5dd..47bb88e89 100644 --- a/winpr/libwinpr/crt/alignment.c +++ b/winpr/libwinpr/crt/alignment.c @@ -27,7 +27,10 @@ #ifndef _WIN32 -#define WINPR_ALIGNED_MALLOC_SIGNATURE 0x0BA0BAB +#define WINPR_ALIGNED_MEM_SIGNATURE 0x0BA0BAB + +#define WINPR_ALIGNED_MEM_STRUCT_FROM_PTR(_memptr) \ + (WINPR_ALIGNED_MEM*) (((size_t)(((BYTE*) _memptr) - sizeof(WINPR_ALIGNED_MEM)))); #include @@ -39,12 +42,13 @@ #include #endif -struct _aligned_meminfo +struct winpr_aligned_mem { UINT32 sig; size_t size; void* base_addr; }; +typedef struct winpr_aligned_mem WINPR_ALIGNED_MEM; void* _aligned_malloc(size_t size, size_t alignment) { @@ -58,13 +62,14 @@ void* _aligned_realloc(void* memblock, size_t size, size_t alignment) void* _aligned_recalloc(void* memblock, size_t num, size_t size, size_t alignment) { - return NULL; + return _aligned_offset_recalloc(memblock, num, size, alignment, 0); } void* _aligned_offset_malloc(size_t size, size_t alignment, size_t offset) { - void* memptr, *tmpptr; - struct _aligned_meminfo *ameminfo; + void* base; + void* memblock; + WINPR_ALIGNED_MEM* pMem; /* alignment must be a power of 2 */ if (alignment % 2 == 1) @@ -79,25 +84,27 @@ void* _aligned_offset_malloc(size_t size, size_t alignment, size_t offset) alignment = sizeof(void*); /* malloc size + alignment to make sure we can align afterwards */ - tmpptr = malloc(size + alignment + sizeof(struct _aligned_meminfo)); + base = malloc(size + alignment + sizeof(WINPR_ALIGNED_MEM)); - if (!tmpptr) + if (!base) return NULL; - memptr = (void *)((((size_t)((PBYTE)tmpptr + alignment + offset + sizeof(struct _aligned_meminfo)) & ~(alignment - 1)) - offset)); + memblock = (void*)((((size_t)(((BYTE*) base) + alignment + offset + sizeof(WINPR_ALIGNED_MEM)) & ~(alignment - 1)) - offset)); - ameminfo = (struct _aligned_meminfo*) (((size_t)((PBYTE)memptr - sizeof(struct _aligned_meminfo)))); - ameminfo->sig = WINPR_ALIGNED_MALLOC_SIGNATURE; - ameminfo->base_addr = tmpptr; - ameminfo->size = size; + pMem = WINPR_ALIGNED_MEM_STRUCT_FROM_PTR(memblock); + pMem->sig = WINPR_ALIGNED_MEM_SIGNATURE; + pMem->base_addr = base; + pMem->size = size; - return memptr; + return memblock; } void* _aligned_offset_realloc(void* memblock, size_t size, size_t alignment, size_t offset) { - void* newmem; - struct _aligned_meminfo* ameminfo; + size_t copySize; + void* newMemblock; + WINPR_ALIGNED_MEM* pMem; + WINPR_ALIGNED_MEM* pNewMem; if (!memblock) return _aligned_offset_malloc(size, alignment, offset); @@ -108,52 +115,98 @@ void* _aligned_offset_realloc(void* memblock, size_t size, size_t alignment, siz return NULL; } - /* The following is not very performant but a simple and working solution */ - newmem = _aligned_offset_malloc(size, alignment, offset); + newMemblock = _aligned_offset_malloc(size, alignment, offset); - if (!newmem) + if (!newMemblock) return NULL; - ameminfo = (struct _aligned_meminfo*) (((size_t)((PBYTE)memblock - sizeof(struct _aligned_meminfo)))); + pMem = WINPR_ALIGNED_MEM_STRUCT_FROM_PTR(memblock); + pNewMem = WINPR_ALIGNED_MEM_STRUCT_FROM_PTR(newMemblock); - if (ameminfo->sig != WINPR_ALIGNED_MALLOC_SIGNATURE) + if (pMem->sig != WINPR_ALIGNED_MEM_SIGNATURE) { fprintf(stderr, "_aligned_offset_realloc: memory block was not allocated by _aligned_malloc!\n"); return NULL; } - CopyMemory(newmem, memblock, ameminfo->size); + copySize = (pNewMem->size < pMem->size) ? pNewMem->size : pMem->size; + + CopyMemory(newMemblock, memblock, copySize); _aligned_free(memblock); - return newmem; + return newMemblock; } void* _aligned_offset_recalloc(void* memblock, size_t num, size_t size, size_t alignment, size_t offset) { - return NULL; + size_t copySize; + void* newMemblock; + WINPR_ALIGNED_MEM* pMem; + WINPR_ALIGNED_MEM* pNewMem; + + if (!memblock) + return _aligned_offset_malloc(size, alignment, offset); + + if (size == 0) + { + _aligned_free(memblock); + return NULL; + } + + newMemblock = _aligned_offset_malloc(size, alignment, offset); + + if (!newMemblock) + return NULL; + + pMem = WINPR_ALIGNED_MEM_STRUCT_FROM_PTR(memblock); + pNewMem = WINPR_ALIGNED_MEM_STRUCT_FROM_PTR(newMemblock); + + if (pMem->sig != WINPR_ALIGNED_MEM_SIGNATURE) + { + fprintf(stderr, "_aligned_offset_recalloc: memory block was not allocated by _aligned_malloc!\n"); + return NULL; + } + + ZeroMemory(newMemblock, pNewMem->size); + _aligned_free(memblock); + + return newMemblock; } size_t _aligned_msize(void* memblock, size_t alignment, size_t offset) { - return 0; + WINPR_ALIGNED_MEM* pMem; + + if (!memblock) + return 0; + + pMem = WINPR_ALIGNED_MEM_STRUCT_FROM_PTR(memblock); + + if (pMem->sig != WINPR_ALIGNED_MEM_SIGNATURE) + { + fprintf(stderr, "_aligned_msize: memory block was not allocated by _aligned_malloc!\n"); + return 0; + } + + return pMem->size; } void _aligned_free(void* memblock) { - struct _aligned_meminfo* ameminfo; + WINPR_ALIGNED_MEM* pMem; if (!memblock) return; - ameminfo = (struct _aligned_meminfo*) (((size_t)((PBYTE)memblock - sizeof(struct _aligned_meminfo)))); + pMem = WINPR_ALIGNED_MEM_STRUCT_FROM_PTR(memblock); - if (ameminfo->sig != WINPR_ALIGNED_MALLOC_SIGNATURE) + if (pMem->sig != WINPR_ALIGNED_MEM_SIGNATURE) { fprintf(stderr, "_aligned_free: memory block was not allocated by _aligned_malloc!\n"); return; } - free(ameminfo->base_addr); + free(pMem->base_addr); } #endif diff --git a/winpr/libwinpr/crt/test/CMakeLists.txt b/winpr/libwinpr/crt/test/CMakeLists.txt index acb6b98d9..4f1f9d3fd 100644 --- a/winpr/libwinpr/crt/test/CMakeLists.txt +++ b/winpr/libwinpr/crt/test/CMakeLists.txt @@ -16,12 +16,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-error) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/crypto/CMakeLists.txt b/winpr/libwinpr/crypto/CMakeLists.txt index 0c7cca6aa..c81b8f657 100644 --- a/winpr/libwinpr/crypto/CMakeLists.txt +++ b/winpr/libwinpr/crypto/CMakeLists.txt @@ -15,49 +15,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-crypto") -set(MODULE_PREFIX "WINPR_CRYPTO") - -set(${MODULE_PREFIX}_SRCS +winpr_module_add( crypto.c crypto.h cert.c) -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -include_directories(${ZLIB_INCLUDE_DIRS}) -include_directories(${OPENSSL_INCLUDE_DIR}) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS - ${ZLIB_LIBRARIES} - ${OPENSSL_LIBRARIES}) - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-utils) - if(WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} crypt32) + winpr_library_add(crypt32) endif() -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/crypto/test/CMakeLists.txt b/winpr/libwinpr/crypto/test/CMakeLists.txt index 58a29cdb7..382831d1a 100644 --- a/winpr/libwinpr/crypto/test/CMakeLists.txt +++ b/winpr/libwinpr/crypto/test/CMakeLists.txt @@ -19,12 +19,7 @@ if(WIN32) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} secur32 crypt32 cryptui) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-crypto winpr-utils) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") @@ -34,4 +29,3 @@ foreach(test ${${MODULE_PREFIX}_TESTS}) endforeach() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/Test") - diff --git a/winpr/libwinpr/dsparse/CMakeLists.txt b/winpr/libwinpr/dsparse/CMakeLists.txt index 1567d82fc..0703523a7 100644 --- a/winpr/libwinpr/dsparse/CMakeLists.txt +++ b/winpr/libwinpr/dsparse/CMakeLists.txt @@ -15,36 +15,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-dsparse") -set(MODULE_PREFIX "WINPR_DSPARSE") - -set(${MODULE_PREFIX}_SRCS - dsparse.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") +winpr_module_add(dsparse.c) if(WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ntdsapi) + winpr_library_add(ntdsapi) endif() -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/dsparse/test/CMakeLists.txt b/winpr/libwinpr/dsparse/test/CMakeLists.txt index e7efe6513..eb7699d87 100644 --- a/winpr/libwinpr/dsparse/test/CMakeLists.txt +++ b/winpr/libwinpr/dsparse/test/CMakeLists.txt @@ -14,12 +14,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-dsparse) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/environment/CMakeLists.txt b/winpr/libwinpr/environment/CMakeLists.txt index 66c1c1b4b..53c28181a 100644 --- a/winpr/libwinpr/environment/CMakeLists.txt +++ b/winpr/libwinpr/environment/CMakeLists.txt @@ -15,36 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-environment") -set(MODULE_PREFIX "WINPR_ENVIRONMENT") - -set(${MODULE_PREFIX}_SRCS - environment.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-error) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(environment.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/environment/test/CMakeLists.txt b/winpr/libwinpr/environment/test/CMakeLists.txt index aee38e777..459d42528 100644 --- a/winpr/libwinpr/environment/test/CMakeLists.txt +++ b/winpr/libwinpr/environment/test/CMakeLists.txt @@ -16,12 +16,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-environment) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/error/CMakeLists.txt b/winpr/libwinpr/error/CMakeLists.txt index 795240802..a2401310d 100644 --- a/winpr/libwinpr/error/CMakeLists.txt +++ b/winpr/libwinpr/error/CMakeLists.txt @@ -15,36 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-error") -set(MODULE_PREFIX "WINPR_ERROR") - -set(${MODULE_PREFIX}_SRCS - error.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-nt) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(error.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/error/test/CMakeLists.txt b/winpr/libwinpr/error/test/CMakeLists.txt index ecec7093f..83b16e163 100644 --- a/winpr/libwinpr/error/test/CMakeLists.txt +++ b/winpr/libwinpr/error/test/CMakeLists.txt @@ -13,12 +13,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-synch winpr-thread winpr-error) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/file/CMakeLists.txt b/winpr/libwinpr/file/CMakeLists.txt index d374cab99..034d5c1c0 100644 --- a/winpr/libwinpr/file/CMakeLists.txt +++ b/winpr/libwinpr/file/CMakeLists.txt @@ -15,33 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-file") -set(MODULE_PREFIX "WINPR_FILE") - -set(${MODULE_PREFIX}_SRCS - file.c - pattern.c) - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-handle winpr-path winpr-error winpr-synch) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(file.c pattern.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/file/test/CMakeLists.txt b/winpr/libwinpr/file/test/CMakeLists.txt index 3b88b7e71..f23bde6e9 100644 --- a/winpr/libwinpr/file/test/CMakeLists.txt +++ b/winpr/libwinpr/file/test/CMakeLists.txt @@ -20,12 +20,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-file winpr-path) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/handle/CMakeLists.txt b/winpr/libwinpr/handle/CMakeLists.txt index 93d112bcd..d58ff5a37 100644 --- a/winpr/libwinpr/handle/CMakeLists.txt +++ b/winpr/libwinpr/handle/CMakeLists.txt @@ -15,37 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-handle") -set(MODULE_PREFIX "WINPR_HANDLE") - -set(${MODULE_PREFIX}_SRCS - handle.c - handle.h) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS - ${CMAKE_THREAD_LIBS_INIT} - ${CMAKE_DL_LIBS}) +winpr_module_add(handle.c handle.h) if(${CMAKE_SYSTEM_NAME} MATCHES SunOS) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} rt) + winpr_library_add(rt) endif() - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/handle/handle.c b/winpr/libwinpr/handle/handle.c index b51622160..9314ed2f2 100644 --- a/winpr/libwinpr/handle/handle.c +++ b/winpr/libwinpr/handle/handle.c @@ -139,6 +139,9 @@ BOOL CloseHandle(HANDLE hObject) WINPR_THREAD* thread; thread = (WINPR_THREAD*) Object; + if (thread->started) { + pthread_detach(thread->thread); + } free(thread); return TRUE; diff --git a/winpr/libwinpr/heap/CMakeLists.txt b/winpr/libwinpr/heap/CMakeLists.txt index 40d69e2c0..4c44bab22 100644 --- a/winpr/libwinpr/heap/CMakeLists.txt +++ b/winpr/libwinpr/heap/CMakeLists.txt @@ -15,27 +15,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-heap") -set(MODULE_PREFIX "WINPR_HEAP") - -set(${MODULE_PREFIX}_SRCS - heap.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(MONOLITHIC_BUILD) - -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(heap.c) diff --git a/winpr/libwinpr/input/CMakeLists.txt b/winpr/libwinpr/input/CMakeLists.txt index 5913c29a1..b23754a60 100644 --- a/winpr/libwinpr/input/CMakeLists.txt +++ b/winpr/libwinpr/input/CMakeLists.txt @@ -15,32 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-input") -set(MODULE_PREFIX "WINPR_INPUT") - -set(${MODULE_PREFIX}_SRCS +winpr_module_add( virtualkey.c scancode.c keycode.c) - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - diff --git a/winpr/libwinpr/interlocked/CMakeLists.txt b/winpr/libwinpr/interlocked/CMakeLists.txt index aa8a2948a..7f164151c 100644 --- a/winpr/libwinpr/interlocked/CMakeLists.txt +++ b/winpr/libwinpr/interlocked/CMakeLists.txt @@ -15,40 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-interlocked") -set(MODULE_PREFIX "WINPR_INTERLOCKED") - -set(${MODULE_PREFIX}_SRCS - interlocked.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - if (${CMAKE_SYSTEM_VERSION} GREATER "5.1") - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) - else() - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module_5.1.def) - endif() -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-handle) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(interlocked.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/interlocked/interlocked.c b/winpr/libwinpr/interlocked/interlocked.c index 044c36684..0b8c0d45a 100644 --- a/winpr/libwinpr/interlocked/interlocked.c +++ b/winpr/libwinpr/interlocked/interlocked.c @@ -234,13 +234,22 @@ LONG InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG #endif } +PVOID InterlockedCompareExchangePointer(PVOID volatile *Destination, PVOID Exchange, PVOID Comperand) +{ +#ifdef __GNUC__ + return __sync_val_compare_and_swap(Destination, Comperand, Exchange); +#else + return 0; +#endif +} + #endif /* _WIN32 */ -#if defined(_WIN64) +#if defined(_WIN32) && !defined(WINPR_INTERLOCKED_COMPARE_EXCHANGE64) /* InterlockedCompareExchange64 already defined */ -#elif (_WIN32 && (_WIN32_WINNT < 0x0502)) +#elif defined(_WIN32) && defined(WINPR_INTERLOCKED_COMPARE_EXCHANGE64) static volatile HANDLE mutex = NULL; @@ -249,7 +258,7 @@ int static_mutex_lock(volatile HANDLE* static_mutex) if (*static_mutex == NULL) { HANDLE handle = CreateMutex(NULL, FALSE, NULL); - + if (InterlockedCompareExchangePointer((PVOID*) static_mutex, (PVOID) handle, NULL) != NULL) CloseHandle(handle); } @@ -257,8 +266,6 @@ int static_mutex_lock(volatile HANDLE* static_mutex) return (WaitForSingleObject(*static_mutex, INFINITE) == WAIT_FAILED); } -/* Not available in XP */ - LONGLONG InterlockedCompareExchange64(LONGLONG volatile *Destination, LONGLONG Exchange, LONGLONG Comperand) { LONGLONG previousValue = 0; diff --git a/winpr/libwinpr/interlocked/test/CMakeLists.txt b/winpr/libwinpr/interlocked/test/CMakeLists.txt index e9b36d3f2..116641080 100644 --- a/winpr/libwinpr/interlocked/test/CMakeLists.txt +++ b/winpr/libwinpr/interlocked/test/CMakeLists.txt @@ -15,12 +15,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-interlocked winpr-synch) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/io/CMakeLists.txt b/winpr/libwinpr/io/CMakeLists.txt index 1100af791..c7050d4a3 100644 --- a/winpr/libwinpr/io/CMakeLists.txt +++ b/winpr/libwinpr/io/CMakeLists.txt @@ -15,38 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-io") -set(MODULE_PREFIX "WINPR_IO") - -set(${MODULE_PREFIX}_SRCS - device.c - io.c - io.h) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-path) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(device.c io.c io.h) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/io/test/CMakeLists.txt b/winpr/libwinpr/io/test/CMakeLists.txt index 2de6e7ef7..96c484820 100644 --- a/winpr/libwinpr/io/test/CMakeLists.txt +++ b/winpr/libwinpr/io/test/CMakeLists.txt @@ -14,12 +14,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-io winpr-nt) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/library/CMakeLists.txt b/winpr/libwinpr/library/CMakeLists.txt index cebaa144d..9db7d0d13 100644 --- a/winpr/libwinpr/library/CMakeLists.txt +++ b/winpr/libwinpr/library/CMakeLists.txt @@ -15,33 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-library") -set(MODULE_PREFIX "WINPR_LIBRARY") - -set(${MODULE_PREFIX}_SRCS - library.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${CMAKE_DL_LIBS}) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(library.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/library/test/CMakeLists.txt b/winpr/libwinpr/library/test/CMakeLists.txt index f49956c98..2962663c2 100644 --- a/winpr/libwinpr/library/test/CMakeLists.txt +++ b/winpr/libwinpr/library/test/CMakeLists.txt @@ -19,12 +19,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-library winpr-path) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/locale/CMakeLists.txt b/winpr/libwinpr/locale/CMakeLists.txt index 6b1ee22fd..826ea68c9 100644 --- a/winpr/libwinpr/locale/CMakeLists.txt +++ b/winpr/libwinpr/locale/CMakeLists.txt @@ -15,36 +15,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-locale") -set(MODULE_PREFIX "WINPR_LOCALE") - -set(${MODULE_PREFIX}_SRCS - locale.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") +winpr_module_add(locale.c) if(WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ntdsapi) + winpr_library_add(ntdsapi) endif() -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/locale/test/CMakeLists.txt b/winpr/libwinpr/locale/test/CMakeLists.txt index 33025b56b..47b94f5e2 100644 --- a/winpr/libwinpr/locale/test/CMakeLists.txt +++ b/winpr/libwinpr/locale/test/CMakeLists.txt @@ -13,12 +13,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-locale) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/memory/CMakeLists.txt b/winpr/libwinpr/memory/CMakeLists.txt index 02139b575..5e28d3c1e 100644 --- a/winpr/libwinpr/memory/CMakeLists.txt +++ b/winpr/libwinpr/memory/CMakeLists.txt @@ -15,37 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-memory") -set(MODULE_PREFIX "WINPR_MEMORY") - -set(${MODULE_PREFIX}_SRCS - memory.c - memory.h) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(memory.c memory.h) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/memory/test/CMakeLists.txt b/winpr/libwinpr/memory/test/CMakeLists.txt index b143d3f82..861ef6c03 100644 --- a/winpr/libwinpr/memory/test/CMakeLists.txt +++ b/winpr/libwinpr/memory/test/CMakeLists.txt @@ -13,12 +13,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/nt/CMakeLists.txt b/winpr/libwinpr/nt/CMakeLists.txt index 89698ab31..e2988cf42 100644 --- a/winpr/libwinpr/nt/CMakeLists.txt +++ b/winpr/libwinpr/nt/CMakeLists.txt @@ -15,45 +15,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-nt") -set(MODULE_PREFIX "WINPR_NT") +winpr_module_add(nt.c) -set(${MODULE_PREFIX}_SRCS - nt.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS +winpr_library_add( ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS}) if(${CMAKE_SYSTEM_NAME} MATCHES SunOS) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} rt) + winpr_library_add(rt) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/nt/test/CMakeLists.txt b/winpr/libwinpr/nt/test/CMakeLists.txt index b3fcb8bab..6e26faea3 100644 --- a/winpr/libwinpr/nt/test/CMakeLists.txt +++ b/winpr/libwinpr/nt/test/CMakeLists.txt @@ -14,12 +14,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-nt) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/path/CMakeLists.txt b/winpr/libwinpr/path/CMakeLists.txt index 9342f4d54..dd8393ae6 100644 --- a/winpr/libwinpr/path/CMakeLists.txt +++ b/winpr/libwinpr/path/CMakeLists.txt @@ -15,33 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-path") -set(MODULE_PREFIX "WINPR_PATH") - -set(${MODULE_PREFIX}_SRCS - path.c - shell.c) - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-heap winpr-environment) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(path.c shell.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/path/test/CMakeLists.txt b/winpr/libwinpr/path/test/CMakeLists.txt index 6f9120af3..8d0bc0ac9 100644 --- a/winpr/libwinpr/path/test/CMakeLists.txt +++ b/winpr/libwinpr/path/test/CMakeLists.txt @@ -35,12 +35,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-path) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/pipe/CMakeLists.txt b/winpr/libwinpr/pipe/CMakeLists.txt index 4b2f53263..a78b98af3 100644 --- a/winpr/libwinpr/pipe/CMakeLists.txt +++ b/winpr/libwinpr/pipe/CMakeLists.txt @@ -15,37 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-pipe") -set(MODULE_PREFIX "WINPR_PIPE") - -set(${MODULE_PREFIX}_SRCS - pipe.c - pipe.h) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-synch winpr-handle winpr-file) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(pipe.c pipe.h) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/pipe/test/CMakeLists.txt b/winpr/libwinpr/pipe/test/CMakeLists.txt index c7b9b5a3d..b9bf68560 100644 --- a/winpr/libwinpr/pipe/test/CMakeLists.txt +++ b/winpr/libwinpr/pipe/test/CMakeLists.txt @@ -15,12 +15,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-pipe winpr-io winpr-synch winpr-thread winpr-error winpr-utils) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/pool/CMakeLists.txt b/winpr/libwinpr/pool/CMakeLists.txt index 8044c89e7..fd70d7301 100644 --- a/winpr/libwinpr/pool/CMakeLists.txt +++ b/winpr/libwinpr/pool/CMakeLists.txt @@ -15,10 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-pool") -set(MODULE_PREFIX "WINPR_POOL") - -set(${MODULE_PREFIX}_SRCS +winpr_module_add( synch.c work.c timer.c @@ -30,39 +27,14 @@ set(${MODULE_PREFIX}_SRCS callback.c callback_cleanup.c) -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS +winpr_library_add( ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS}) if(${CMAKE_SYSTEM_NAME} MATCHES SunOS) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} rt) + winpr_library_add(rt) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-thread winpr-synch winpr-utils) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/pool/callback.c b/winpr/libwinpr/pool/callback.c index f9a600fa8..da959f30b 100644 --- a/winpr/libwinpr/pool/callback.c +++ b/winpr/libwinpr/pool/callback.c @@ -50,6 +50,8 @@ static void module_init() #endif +#ifdef WINPR_THREAD_POOL + BOOL CallbackMayRunLong(PTP_CALLBACK_INSTANCE pci) { #ifdef _WIN32 @@ -61,3 +63,5 @@ BOOL CallbackMayRunLong(PTP_CALLBACK_INSTANCE pci) #endif return FALSE; } + +#endif diff --git a/winpr/libwinpr/pool/callback_cleanup.c b/winpr/libwinpr/pool/callback_cleanup.c index f0653ae98..268b87de5 100644 --- a/winpr/libwinpr/pool/callback_cleanup.c +++ b/winpr/libwinpr/pool/callback_cleanup.c @@ -62,6 +62,8 @@ static void module_init() #endif +#ifdef WINPR_THREAD_POOL + VOID SetEventWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci, HANDLE evt) { #ifdef _WIN32 @@ -128,5 +130,5 @@ VOID DisassociateCurrentThreadFromCallback(PTP_CALLBACK_INSTANCE pci) #endif } - +#endif diff --git a/winpr/libwinpr/pool/callback_environment.c b/winpr/libwinpr/pool/callback_environment.c index 93d981777..00ea7898b 100644 --- a/winpr/libwinpr/pool/callback_environment.c +++ b/winpr/libwinpr/pool/callback_environment.c @@ -26,6 +26,8 @@ #include "pool.h" +#ifdef WINPR_THREAD_POOL + VOID InitializeCallbackEnvironment_V1(TP_CALLBACK_ENVIRON_V1* pcbe) { pcbe->Version = 1; @@ -55,6 +57,8 @@ VOID InitializeCallbackEnvironment_V3(TP_CALLBACK_ENVIRON_V3* pcbe) pcbe->Size = sizeof(TP_CALLBACK_ENVIRON); } +#endif + #ifdef _WIN32 static BOOL module_initialized = FALSE; @@ -116,6 +120,8 @@ PTP_CALLBACK_ENVIRON GetDefaultThreadpoolEnvironment() #endif +#ifdef WINPR_THREAD_POOL + VOID InitializeThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe) { if (pcbe->Version == 3) @@ -193,3 +199,5 @@ VOID SetThreadpoolCallbackPriority(PTP_CALLBACK_ENVIRON pcbe, TP_CALLBACK_PRIORI #else #endif } + +#endif diff --git a/winpr/libwinpr/pool/cleanup_group.c b/winpr/libwinpr/pool/cleanup_group.c index bd8676df6..db7655701 100644 --- a/winpr/libwinpr/pool/cleanup_group.c +++ b/winpr/libwinpr/pool/cleanup_group.c @@ -56,6 +56,8 @@ static void module_init() #endif +#if WINPR_THREAD_POOL + PTP_CLEANUP_GROUP CreateThreadpoolCleanupGroup() { PTP_CLEANUP_GROUP cleanupGroup = NULL; @@ -94,4 +96,5 @@ VOID CloseThreadpoolCleanupGroup(PTP_CLEANUP_GROUP ptpcg) #endif } +#endif diff --git a/winpr/libwinpr/pool/io.c b/winpr/libwinpr/pool/io.c index 5327148d9..577d2fb95 100644 --- a/winpr/libwinpr/pool/io.c +++ b/winpr/libwinpr/pool/io.c @@ -24,6 +24,8 @@ #include #include +#ifdef WINPR_THREAD_POOL + PTP_IO CreateThreadpoolIo(HANDLE fl, PTP_WIN32_IO_CALLBACK pfnio, PVOID pv, PTP_CALLBACK_ENVIRON pcbe) { return NULL; @@ -49,3 +51,4 @@ VOID WaitForThreadpoolIoCallbacks(PTP_IO pio, BOOL fCancelPendingCallbacks) } +#endif \ No newline at end of file diff --git a/winpr/libwinpr/pool/pool.c b/winpr/libwinpr/pool/pool.c index 2030646c8..e7c099e39 100644 --- a/winpr/libwinpr/pool/pool.c +++ b/winpr/libwinpr/pool/pool.c @@ -150,6 +150,8 @@ PTP_POOL GetDefaultThreadpool() #endif +#ifdef WINPR_THREAD_POOL + PTP_POOL CreateThreadpool(PVOID reserved) { PTP_POOL pool = NULL; @@ -236,6 +238,8 @@ VOID SetThreadpoolThreadMaximum(PTP_POOL ptpp, DWORD cthrdMost) #endif } +#endif + /* dummy */ void winpr_pool_dummy() diff --git a/winpr/libwinpr/pool/synch.c b/winpr/libwinpr/pool/synch.c index 5f87c78ff..057c5ee96 100644 --- a/winpr/libwinpr/pool/synch.c +++ b/winpr/libwinpr/pool/synch.c @@ -24,6 +24,8 @@ #include #include +#ifdef WINPR_THREAD_POOL + PTP_WAIT CreateThreadpoolWait(PTP_WAIT_CALLBACK pfnwa, PVOID pv, PTP_CALLBACK_ENVIRON pcbe) { return NULL; @@ -44,4 +46,4 @@ VOID WaitForThreadpoolWaitCallbacks(PTP_WAIT pwa, BOOL fCancelPendingCallbacks) } - +#endif diff --git a/winpr/libwinpr/pool/test/CMakeLists.txt b/winpr/libwinpr/pool/test/CMakeLists.txt index eb03c0b6f..9758fff05 100644 --- a/winpr/libwinpr/pool/test/CMakeLists.txt +++ b/winpr/libwinpr/pool/test/CMakeLists.txt @@ -17,12 +17,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-pool winpr-interlocked) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/pool/timer.c b/winpr/libwinpr/pool/timer.c index 9867941a6..7ee9f30f6 100644 --- a/winpr/libwinpr/pool/timer.c +++ b/winpr/libwinpr/pool/timer.c @@ -24,6 +24,8 @@ #include #include +#ifdef WINPR_THREAD_POOL + PTP_TIMER CreateThreadpoolTimer(PTP_TIMER_CALLBACK pfnti, PVOID pv, PTP_CALLBACK_ENVIRON pcbe) { return NULL; @@ -49,4 +51,4 @@ VOID WaitForThreadpoolTimerCallbacks(PTP_TIMER pti, BOOL fCancelPendingCallbacks } - +#endif \ No newline at end of file diff --git a/winpr/libwinpr/pool/work.c b/winpr/libwinpr/pool/work.c index 62581650b..1aa846b73 100644 --- a/winpr/libwinpr/pool/work.c +++ b/winpr/libwinpr/pool/work.c @@ -60,6 +60,8 @@ static void module_init() #endif +#ifdef WINPR_THREAD_POOL + PTP_WORK CreateThreadpoolWork(PTP_WORK_CALLBACK pfnwk, PVOID pv, PTP_CALLBACK_ENVIRON pcbe) { PTP_WORK work = NULL; @@ -153,3 +155,5 @@ VOID WaitForThreadpoolWorkCallbacks(PTP_WORK pwk, BOOL fCancelPendingCallbacks) printf("WaitForThreadpoolWorkCallbacks: error waiting on work completion\n"); #endif } + +#endif diff --git a/winpr/libwinpr/registry/CMakeLists.txt b/winpr/libwinpr/registry/CMakeLists.txt index 3d04e40c9..4400afdd5 100644 --- a/winpr/libwinpr/registry/CMakeLists.txt +++ b/winpr/libwinpr/registry/CMakeLists.txt @@ -15,30 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-registry") -set(MODULE_PREFIX "WINPR_REGISTRY") - -set(${MODULE_PREFIX}_SRCS +winpr_module_add( registry_reg.c registry_reg.h registry.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} winpr-utils) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/rpc/CMakeLists.txt b/winpr/libwinpr/rpc/CMakeLists.txt index 758a44fca..a9c7c9acd 100644 --- a/winpr/libwinpr/rpc/CMakeLists.txt +++ b/winpr/libwinpr/rpc/CMakeLists.txt @@ -15,10 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-rpc") -set(MODULE_PREFIX "WINPR_RPC") - -set(${MODULE_PREFIX}_SRCS +winpr_module_add( rpc.c ndr.c ndr_array.c @@ -41,35 +38,13 @@ set(${MODULE_PREFIX}_SRCS ndr_union.h midl.c) -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() +winpr_include_directory_add(${OPENSSL_INCLUDE_DIR} + ${ZLIB_INCLUDE_DIRS}) -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -include_directories(${OPENSSL_INCLUDE_DIR}) -include_directories(${ZLIB_INCLUDE_DIRS}) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS - ${OPENSSL_LIBRARIES}) +winpr_library_add(${OPENSSL_LIBRARIES}) if(WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ws2_32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} rpcrt4) + winpr_library_add(ws2_32 rpcrt4) else() - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${ZLIB_LIBRARIES}) + winpr_library_add(${ZLIB_LIBRARIES}) endif() - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/security/CMakeLists.txt b/winpr/libwinpr/security/CMakeLists.txt index 0630beea1..98141e1a0 100644 --- a/winpr/libwinpr/security/CMakeLists.txt +++ b/winpr/libwinpr/security/CMakeLists.txt @@ -15,30 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-security") -set(MODULE_PREFIX "WINPR_SECURITY") - -set(${MODULE_PREFIX}_SRCS - security.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(MONOLITHIC_BUILD) - -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(security.c) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/security/test/CMakeLists.txt b/winpr/libwinpr/security/test/CMakeLists.txt index 9365b1c66..d9aacb160 100644 --- a/winpr/libwinpr/security/test/CMakeLists.txt +++ b/winpr/libwinpr/security/test/CMakeLists.txt @@ -13,12 +13,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-security) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/smartcard/CMakeLists.txt b/winpr/libwinpr/smartcard/CMakeLists.txt index ec1948d53..3f59e7392 100644 --- a/winpr/libwinpr/smartcard/CMakeLists.txt +++ b/winpr/libwinpr/smartcard/CMakeLists.txt @@ -15,15 +15,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-smartcard") set(MODULE_PREFIX "WINPR_SMARTCARD") if(PCSC_WINPR_FOUND) - add_definitions(-DWITH_WINPR_PCSC) + winpr_definition_add(-DWITH_WINPR_PCSC) endif() if(WITH_SMARTCARD_INSPECT) - add_definitions(-DWITH_SMARTCARD_INSPECT) + winpr_definition_add(-DWITH_SMARTCARD_INSPECT) endif() set(${MODULE_PREFIX}_SRCS @@ -41,35 +40,12 @@ if(WIN32) smartcard_winscard.h) endif() -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-library winpr-environment winpr-utils) +winpr_module_add(${${MODULE_PREFIX}_SRCS}) if(PCSC_WINPR_FOUND) - list(APPEND ${MODULE_PREFIX}_LIBS ${PCSC_WINPR_LIBRARY}) + winpr_library_add(${PCSC_WINPR_LIBRARY}) endif() -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/smartcard/test/CMakeLists.txt b/winpr/libwinpr/smartcard/test/CMakeLists.txt index e42f291e6..4d8e1074a 100644 --- a/winpr/libwinpr/smartcard/test/CMakeLists.txt +++ b/winpr/libwinpr/smartcard/test/CMakeLists.txt @@ -13,12 +13,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-smartcard winpr-crt) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/sspi/CMakeLists.txt b/winpr/libwinpr/sspi/CMakeLists.txt index ce8152766..e3e09072e 100644 --- a/winpr/libwinpr/sspi/CMakeLists.txt +++ b/winpr/libwinpr/sspi/CMakeLists.txt @@ -15,7 +15,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-sspi") set(MODULE_PREFIX "WINPR_SSPI") set(${MODULE_PREFIX}_NTLM_SRCS @@ -49,49 +48,22 @@ set(${MODULE_PREFIX}_SRCS sspi.c sspi.h) -set(${MODULE_PREFIX}_SRCS - ${${MODULE_PREFIX}_NTLM_SRCS} +winpr_module_add(${${MODULE_PREFIX}_NTLM_SRCS} ${${MODULE_PREFIX}_KERBEROS_SRCS} ${${MODULE_PREFIX}_NEGOTIATE_SRCS} ${${MODULE_PREFIX}_SCHANNEL_SRCS} ${${MODULE_PREFIX}_SRCS}) -if(MSVC AND (NOT MONOLITHIC_BUILD)) - #set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() +winpr_include_directory_add(${ZLIB_INCLUDE_DIRS} + ${OPENSSL_INCLUDE_DIR}) -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -include_directories(${ZLIB_INCLUDE_DIRS}) -include_directories(${OPENSSL_INCLUDE_DIR}) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS - ${ZLIB_LIBRARIES} +winpr_library_add(${ZLIB_LIBRARIES} ${OPENSSL_LIBRARIES}) if(WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ws2_32) + winpr_library_add(ws2_32) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-sysinfo winpr-registry winpr-crypto winpr-library winpr-utils) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/sspi/Schannel/schannel_openssl.c b/winpr/libwinpr/sspi/Schannel/schannel_openssl.c index 5ad6e600e..6f7abe806 100644 --- a/winpr/libwinpr/sspi/Schannel/schannel_openssl.c +++ b/winpr/libwinpr/sspi/Schannel/schannel_openssl.c @@ -23,6 +23,7 @@ #include #include +#include #include #include "schannel_openssl.h" @@ -456,10 +457,7 @@ SCHANNEL_OPENSSL* schannel_openssl_new() if (context != NULL) { ZeroMemory(context, sizeof(SCHANNEL_OPENSSL)); - - SSL_load_error_strings(); - SSL_library_init(); - + winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT); context->connected = FALSE; } diff --git a/winpr/libwinpr/sspi/sspi_winpr.c b/winpr/libwinpr/sspi/sspi_winpr.c index dee803b6b..dcfb4e2b2 100644 --- a/winpr/libwinpr/sspi/sspi_winpr.c +++ b/winpr/libwinpr/sspi/sspi_winpr.c @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -463,8 +464,7 @@ void sspi_GlobalInit() { if (!sspi_initialized) { - SSL_load_error_strings(); - SSL_library_init(); + winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT); sspi_ContextBufferAllocTableNew(); sspi_initialized = TRUE; diff --git a/winpr/libwinpr/sspi/test/CMakeLists.txt b/winpr/libwinpr/sspi/test/CMakeLists.txt index afe93c408..60e8e09fd 100644 --- a/winpr/libwinpr/sspi/test/CMakeLists.txt +++ b/winpr/libwinpr/sspi/test/CMakeLists.txt @@ -30,12 +30,7 @@ if(WIN32) set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} secur32 crypt32) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-sspi winpr-thread winpr-pipe winpr-file winpr-crypto winpr-utils) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/sspicli/CMakeLists.txt b/winpr/libwinpr/sspicli/CMakeLists.txt index 651978b11..f50585e3d 100644 --- a/winpr/libwinpr/sspicli/CMakeLists.txt +++ b/winpr/libwinpr/sspicli/CMakeLists.txt @@ -15,23 +15,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-sspicli") -set(MODULE_PREFIX "WINPR_SSPICLI") - -set(${MODULE_PREFIX}_SRCS - sspicli.c) - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(MONOLITHIC_BUILD) - -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(sspicli.c) diff --git a/winpr/libwinpr/synch/CMakeLists.txt b/winpr/libwinpr/synch/CMakeLists.txt index 66ce56a53..4de39733c 100644 --- a/winpr/libwinpr/synch/CMakeLists.txt +++ b/winpr/libwinpr/synch/CMakeLists.txt @@ -15,16 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-synch") -set(MODULE_PREFIX "WINPR_SYNCH") - -if(HAVE_PTHREAD_GNU_EXT) - add_definitions(-D_GNU_SOURCE) -endif(HAVE_PTHREAD_GNU_EXT) - -include_directories(../thread) - -set(${MODULE_PREFIX}_SRCS +winpr_module_add( address.c barrier.c condition.c @@ -39,35 +30,10 @@ set(${MODULE_PREFIX}_SRCS timer.c wait.c) -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS - ${CMAKE_THREAD_LIBS_INIT} - ${CMAKE_DL_LIBS}) - if((NOT WIN32) AND (NOT APPLE) AND (NOT ANDROID)) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} rt) + winpr_library_add(rt) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-handle winpr-error winpr-interlocked winpr-thread winpr-sysinfo) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/synch/critical.c b/winpr/libwinpr/synch/critical.c index bfe43292d..f67c373a3 100644 --- a/winpr/libwinpr/synch/critical.c +++ b/winpr/libwinpr/synch/critical.c @@ -235,7 +235,7 @@ VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection) #endif -#if ((_WIN32) && (_WIN32_WINNT < 0x0403)) +#if (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) typedef BOOL (WINAPI * PINITIALIZE_CRITICAL_SECTION_EX_FN)(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags); diff --git a/winpr/libwinpr/synch/init.c b/winpr/libwinpr/synch/init.c index 88d32c27c..5f81cf802 100644 --- a/winpr/libwinpr/synch/init.c +++ b/winpr/libwinpr/synch/init.c @@ -3,6 +3,8 @@ * Synchronization Functions * * Copyright 2012 Marc-Andre Moreau + * Copyright 2014 Thincast Technologies GmbH + * Copyright 2014 Norbert Federa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,27 +24,68 @@ #endif #include +#include -#ifndef _WIN32 +#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) BOOL InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID* lpContext) { - return TRUE; + fprintf(stderr, "%s: not implemented\n", __FUNCTION__); + return FALSE; } BOOL InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext) { - return TRUE; -} - -BOOL InitOnceExecuteOnce(PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn, PVOID Parameter, LPVOID* Context) -{ - return TRUE; + fprintf(stderr, "%s: not implemented\n", __FUNCTION__); + return FALSE; } VOID InitOnceInitialize(PINIT_ONCE InitOnce) { + fprintf(stderr, "%s: not implemented\n", __FUNCTION__); +} +BOOL InitOnceExecuteOnce(PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn, PVOID Parameter, LPVOID* Context) +{ + for (;;) + { + switch((ULONG_PTR)InitOnce->Ptr & 3) + { + case 2: + /* already completed successfully */ + return TRUE; + + case 0: + /* first time */ + if (InterlockedCompareExchangePointer(&InitOnce->Ptr, (PVOID)1, (PVOID)0) != (PVOID)0) + { + /* some other thread was faster */ + break; + } + + /* it's our job to call the init function */ + if (InitFn(InitOnce, Parameter, Context)) + { + /* success */ + InitOnce->Ptr = (PVOID)2; + return TRUE; + } + + /* the init function returned an error, reset the status */ + InitOnce->Ptr = (PVOID)0; + return FALSE; + + case 1: + /* in progress */ + break; + + default: + fprintf(stderr, "%s: internal error\n", __FUNCTION__); + return FALSE; + } + + Sleep(5); + } } #endif diff --git a/winpr/libwinpr/synch/test/CMakeLists.txt b/winpr/libwinpr/synch/test/CMakeLists.txt index 7805d1798..0309fb910 100644 --- a/winpr/libwinpr/synch/test/CMakeLists.txt +++ b/winpr/libwinpr/synch/test/CMakeLists.txt @@ -5,6 +5,7 @@ set(MODULE_PREFIX "TEST_SYNCH") set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c) set(${MODULE_PREFIX}_TESTS + TestSynchInit.c TestSynchEvent.c TestSynchMutex.c TestSynchCritical.c @@ -20,12 +21,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-synch winpr-sysinfo winpr-error) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/synch/test/TestSynchInit.c b/winpr/libwinpr/synch/test/TestSynchInit.c new file mode 100644 index 000000000..efcd9c3af --- /dev/null +++ b/winpr/libwinpr/synch/test/TestSynchInit.c @@ -0,0 +1,146 @@ +#include +#include +#include +#include +#include + +#define TEST_NUM_THREADS 100 +#define TEST_NUM_FAILURES 10 + +INIT_ONCE initOnceTest = INIT_ONCE_STATIC_INIT; + +HANDLE hStartEvent = NULL; +LONG *pErrors = NULL; +LONG *pTestThreadFunctionCalls = NULL; +LONG *pTestOnceFunctionCalls = NULL; +LONG *pInitOnceExecuteOnceCalls = NULL; + + +BOOL CALLBACK TestOnceFunction(PINIT_ONCE once, PVOID param, PVOID *context) +{ + LONG calls = InterlockedIncrement(pTestOnceFunctionCalls) - 1; + + /* simulate execution time */ + Sleep(100 + rand() % 400); + + if (calls < TEST_NUM_FAILURES) + { + /* simulated error */ + return FALSE; + } + if (calls == TEST_NUM_FAILURES) + { + return TRUE; + } + fprintf(stderr, "%s: error: called again after success\n", __FUNCTION__); + InterlockedIncrement(pErrors); + return FALSE; +} + +DWORD WINAPI TestThreadFunction(LPVOID lpParam) +{ + LONG calls; + BOOL ok; + InterlockedIncrement(pTestThreadFunctionCalls); + if (WaitForSingleObject(hStartEvent, INFINITE) != WAIT_OBJECT_0) + { + fprintf(stderr, "%s: error: failed to wait for start event\n", __FUNCTION__); + InterlockedIncrement(pErrors); + return 0; + } + + ok = InitOnceExecuteOnce(&initOnceTest, TestOnceFunction, NULL, NULL); + calls = InterlockedIncrement(pInitOnceExecuteOnceCalls); + if (!ok && calls > TEST_NUM_FAILURES) + { + fprintf(stderr, "%s: InitOnceExecuteOnce failed unexpectedly\n", __FUNCTION__); + InterlockedIncrement(pErrors); + } + return 0; +} + +int TestSynchInit(int argc, char* argv[]) +{ + HANDLE hThreads[TEST_NUM_THREADS]; + DWORD dwCreatedThreads = 0; + DWORD i; + BOOL result = FALSE; + + pErrors = _aligned_malloc(sizeof(LONG), sizeof(LONG)); + pTestThreadFunctionCalls = _aligned_malloc(sizeof(LONG), sizeof(LONG)); + pTestOnceFunctionCalls = _aligned_malloc(sizeof(LONG), sizeof(LONG)); + pInitOnceExecuteOnceCalls = _aligned_malloc(sizeof(LONG), sizeof(LONG)); + + if (!pErrors || !pTestThreadFunctionCalls || !pTestOnceFunctionCalls || !pInitOnceExecuteOnceCalls) + { + fprintf(stderr, "error: _aligned_malloc failed\n"); + goto out; + } + + *pErrors = 0; + *pTestThreadFunctionCalls = 0; + *pTestOnceFunctionCalls = 0; + *pInitOnceExecuteOnceCalls = 0; + + if (!(hStartEvent = CreateEvent(NULL, TRUE, FALSE, NULL))) + { + fprintf(stderr, "error creating start event\n"); + InterlockedIncrement(pErrors); + goto out; + } + + for (i = 0; i < TEST_NUM_THREADS; i++) + { + if (!(hThreads[i] = CreateThread(NULL, 0, TestThreadFunction, NULL, 0, NULL))) + { + fprintf(stderr, "error creating thread #%d\n", i); + InterlockedIncrement(pErrors); + goto out; + } + dwCreatedThreads++; + } + + Sleep(100); + SetEvent(hStartEvent); + + for (i = 0; i < dwCreatedThreads; i++) + { + if (WaitForSingleObject(hThreads[i], INFINITE) != WAIT_OBJECT_0) + { + fprintf(stderr, "error: error waiting for thread #%d\n", i); + InterlockedIncrement(pErrors); + goto out; + } + } + + if (*pErrors == 0 && + *pTestThreadFunctionCalls == TEST_NUM_THREADS && + *pInitOnceExecuteOnceCalls == TEST_NUM_THREADS && + *pTestOnceFunctionCalls == TEST_NUM_FAILURES + 1) + { + result = TRUE; + } + +out: + fprintf(stderr, "Test result: %s\n", result ? "OK" : "ERROR"); + fprintf(stderr, "Error count: %d\n", pErrors ? *pErrors : -1); + fprintf(stderr, "Threads created: %u\n", dwCreatedThreads); + fprintf(stderr, "TestThreadFunctionCalls: %d\n", pTestThreadFunctionCalls ? *pTestThreadFunctionCalls : -1); + fprintf(stderr, "InitOnceExecuteOnceCalls: %d\n", pInitOnceExecuteOnceCalls ? *pInitOnceExecuteOnceCalls : -1); + fprintf(stderr, "TestOnceFunctionCalls: %d\n", pTestOnceFunctionCalls ? *pTestOnceFunctionCalls : -1); + + _aligned_free(pErrors); + _aligned_free(pTestThreadFunctionCalls); + _aligned_free(pTestOnceFunctionCalls); + _aligned_free(pInitOnceExecuteOnceCalls); + + CloseHandle(hStartEvent); + + + for (i = 0; i < dwCreatedThreads; i++) + { + CloseHandle(hThreads[i]); + } + + return (result ? 0 : 1); +} diff --git a/winpr/libwinpr/synch/wait.c b/winpr/libwinpr/synch/wait.c index 5300b6b08..e55365398 100644 --- a/winpr/libwinpr/synch/wait.c +++ b/winpr/libwinpr/synch/wait.c @@ -22,6 +22,10 @@ #include "config.h" #endif +#ifdef HAVE_PTHREAD_GNU_EXT +#define _GNU_SOURCE +#endif + #ifdef HAVE_UNISTD_H #include #endif @@ -255,6 +259,8 @@ DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) else status = pthread_join(thread->thread, &thread_status); + thread->started = FALSE; + if (status != 0) { fprintf(stderr, "WaitForSingleObject: pthread_join failure: [%d] %s\n", diff --git a/winpr/libwinpr/sysinfo/CMakeLists.txt b/winpr/libwinpr/sysinfo/CMakeLists.txt index 31006f0da..bc64f8751 100644 --- a/winpr/libwinpr/sysinfo/CMakeLists.txt +++ b/winpr/libwinpr/sysinfo/CMakeLists.txt @@ -15,36 +15,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-sysinfo") -set(MODULE_PREFIX "WINPR_SYSINFO") - -set(${MODULE_PREFIX}_SRCS - sysinfo.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") +winpr_module_add(sysinfo.c) if((NOT WIN32) AND (NOT APPLE) AND (NOT ANDROID)) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} rt) + winpr_library_add(rt) endif() -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/sysinfo/test/CMakeLists.txt b/winpr/libwinpr/sysinfo/test/CMakeLists.txt index b757b273c..b76bbf6af 100644 --- a/winpr/libwinpr/sysinfo/test/CMakeLists.txt +++ b/winpr/libwinpr/sysinfo/test/CMakeLists.txt @@ -16,12 +16,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-sysinfo) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/thread/CMakeLists.txt b/winpr/libwinpr/thread/CMakeLists.txt index e8d4c01d1..9897d767a 100644 --- a/winpr/libwinpr/thread/CMakeLists.txt +++ b/winpr/libwinpr/thread/CMakeLists.txt @@ -15,10 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-thread") -set(MODULE_PREFIX "WINPR_THREAD") - -set(${MODULE_PREFIX}_SRCS +winpr_module_add( argv.c process.c processor.c @@ -26,39 +23,10 @@ set(${MODULE_PREFIX}_SRCS thread.h tls.c) -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS - ${CMAKE_THREAD_LIBS_INIT} - ${CMAKE_DL_LIBS}) - if(${CMAKE_SYSTEM_NAME} MATCHES SunOS) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} rt) + winpr_library_add(rt) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-path winpr-handle) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/thread/test/CMakeLists.txt b/winpr/libwinpr/thread/test/CMakeLists.txt index 258704857..b078c0664 100644 --- a/winpr/libwinpr/thread/test/CMakeLists.txt +++ b/winpr/libwinpr/thread/test/CMakeLists.txt @@ -14,12 +14,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-thread winpr-heap winpr-environment winpr-synch) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/thread/thread.c b/winpr/libwinpr/thread/thread.c index 3d69f1700..51b775b7d 100644 --- a/winpr/libwinpr/thread/thread.c +++ b/winpr/libwinpr/thread/thread.c @@ -71,7 +71,6 @@ #include #if defined(__linux__) && !defined(__ANDROID__) -#define _GNU_SOURCE #include #include #include diff --git a/winpr/libwinpr/timezone/CMakeLists.txt b/winpr/libwinpr/timezone/CMakeLists.txt index b9fece024..49ae25418 100644 --- a/winpr/libwinpr/timezone/CMakeLists.txt +++ b/winpr/libwinpr/timezone/CMakeLists.txt @@ -15,23 +15,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-timezone") -set(MODULE_PREFIX "WINPR_TIMEZONE") - -set(${MODULE_PREFIX}_SRCS - timezone.c) - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(MONOLITHIC_BUILD) - -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(timezone.c) diff --git a/winpr/libwinpr/utils/CMakeLists.txt b/winpr/libwinpr/utils/CMakeLists.txt index dbf7f4cd1..d8b758bbe 100644 --- a/winpr/libwinpr/utils/CMakeLists.txt +++ b/winpr/libwinpr/utils/CMakeLists.txt @@ -15,9 +15,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-utils") -set(MODULE_PREFIX "WINPR_UTILS") - set(CMAKE_INCLUDE_CURRENT_DIR ON) set(${MODULE_PREFIX}_COLLECTIONS_SRCS @@ -80,46 +77,28 @@ set(${MODULE_PREFIX}_SRCS ntlm.c print.c stream.c - cmdline.c) + cmdline.c + ssl.c) -set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} +winpr_module_add(${${MODULE_PREFIX}_SRCS} ${${MODULE_PREFIX}_COLLECTIONS_SRCS} ${${MODULE_PREFIX}_TRIO_SRCS} ${${MODULE_PREFIX}_WLOG_SRCS}) -include_directories("trio") -include_directories(${ZLIB_INCLUDE_DIRS}) -include_directories(${OPENSSL_INCLUDE_DIR}) +winpr_include_directory_add( + "trio" + "." + ${ZLIB_INCLUDE_DIRS} + ${OPENSSL_INCLUDE_DIR}) -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set(${MODULE_PREFIX}_LIBS +winpr_library_add( ${ZLIB_LIBRARIES} ${OPENSSL_LIBRARIES}) if(UNIX) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} m) + winpr_library_add(m) endif() -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-file winpr-path winpr-synch winpr-sysinfo) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/utils/ssl.c b/winpr/libwinpr/utils/ssl.c new file mode 100644 index 000000000..2a0463977 --- /dev/null +++ b/winpr/libwinpr/utils/ssl.c @@ -0,0 +1,275 @@ +/** + * WinPR: Windows Portable Runtime + * OpenSSL Library Initialization + * + * Copyright 2014 Thincast Technologies GmbH + * Copyright 2014 Norbert Federa + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include +#include + +static int g_winpr_openssl_num_locks = 0; +static HANDLE* g_winpr_openssl_locks = NULL; +static BOOL g_winpr_openssl_initialized_by_winpr = FALSE; + +struct CRYPTO_dynlock_value +{ + HANDLE mutex; +}; + + +#if (OPENSSL_VERSION_NUMBER < 0x10000000L) +static unsigned long _winpr_openssl_id() +{ + return (unsigned long)GetCurrentThreadId(); +} +#endif + +static void _winpr_openssl_locking(int mode, int type, const char *file, int line) +{ + if (mode & CRYPTO_LOCK) + { + WaitForSingleObject(g_winpr_openssl_locks[type], INFINITE); + } + else + { + ReleaseMutex(g_winpr_openssl_locks[type]); + } +} + +static struct CRYPTO_dynlock_value *_winpr_openssl_dynlock_create(const char *file, int line) +{ + struct CRYPTO_dynlock_value *dynlock = (struct CRYPTO_dynlock_value *) + malloc(sizeof(struct CRYPTO_dynlock_value)); + + if (dynlock) { + dynlock->mutex = CreateMutex(NULL, FALSE, NULL); + } + + return dynlock; +} + +static void _winpr_openssl_dynlock_lock(int mode, struct CRYPTO_dynlock_value *dynlock, const char *file, int line) +{ + if (mode & CRYPTO_LOCK) + { + WaitForSingleObject(dynlock->mutex, INFINITE); + } + else + { + ReleaseMutex(dynlock->mutex); + } +} + +static void _winpr_openssl_dynlock_destroy(struct CRYPTO_dynlock_value *dynlock, const char *file, int line) +{ + CloseHandle(dynlock->mutex); + free(dynlock); +} + +static BOOL _winpr_openssl_initialize_locking() +{ + int i, count; + + /* OpenSSL static locking */ + + if (CRYPTO_get_locking_callback()) + { + fprintf(stderr, "%s: warning: OpenSSL static locking callback is already set\n", __FUNCTION__); + } + else + { + if ((count = CRYPTO_num_locks()) > 0) + { + HANDLE *locks; + if (!(locks = calloc(count, sizeof(HANDLE)))) + { + fprintf(stderr, "%s: error allocating lock table\n", __FUNCTION__); + return FALSE; + } + + for (i = 0; i < count; i++) + { + if (!(locks[i] = CreateMutex(NULL, FALSE, NULL))) + { + fprintf(stderr, "%s: error creating lock #%d\n", __FUNCTION__, i); + while (i--) + { + CloseHandle(g_winpr_openssl_locks[i]); + } + free(locks); + return FALSE; + } + } + + g_winpr_openssl_locks = locks; + g_winpr_openssl_num_locks = count; + + CRYPTO_set_locking_callback(_winpr_openssl_locking); + } + } + + + /* OpenSSL dynamic locking */ + + if (CRYPTO_get_dynlock_create_callback() || + CRYPTO_get_dynlock_lock_callback() || + CRYPTO_get_dynlock_destroy_callback()) + { + fprintf(stderr, "%s: warning: dynamic locking callbacks are already set\n", __FUNCTION__); + } + else + { + CRYPTO_set_dynlock_create_callback(_winpr_openssl_dynlock_create); + CRYPTO_set_dynlock_lock_callback(_winpr_openssl_dynlock_lock); + CRYPTO_set_dynlock_destroy_callback(_winpr_openssl_dynlock_destroy); + } + + + /* Use the deprecated CRYPTO_get_id_callback() if building against OpenSSL < 1.0.0 */ + +#if (OPENSSL_VERSION_NUMBER < 0x10000000L) + if (CRYPTO_get_id_callback()) + { + fprintf(stderr, "%s: warning OpenSSL id_callback is already set\n", __FUNCTION__); + } + else + { + CRYPTO_set_id_callback(_winpr_openssl_id); + } +#endif + + return TRUE; +} + +static BOOL _winpr_openssl_cleanup_locking() +{ + /* undo our static locking modifications */ + + if (CRYPTO_get_locking_callback() == _winpr_openssl_locking) + { + int i; + + CRYPTO_set_locking_callback(NULL); + + for (i = 0; i < g_winpr_openssl_num_locks; i++) + { + CloseHandle(g_winpr_openssl_locks[i]); + } + + g_winpr_openssl_num_locks = 0; + free(g_winpr_openssl_locks); + g_winpr_openssl_locks = NULL; + } + + + /* unset our dynamic locking callbacks */ + + if (CRYPTO_get_dynlock_create_callback() == _winpr_openssl_dynlock_create) + { + CRYPTO_set_dynlock_create_callback(NULL); + } + + if (CRYPTO_get_dynlock_lock_callback() == _winpr_openssl_dynlock_lock) + { + CRYPTO_set_dynlock_lock_callback(NULL); + } + + if (CRYPTO_get_dynlock_destroy_callback() == _winpr_openssl_dynlock_destroy) + { + CRYPTO_set_dynlock_destroy_callback(NULL); + } + + +#if (OPENSSL_VERSION_NUMBER < 0x10000000L) + if (CRYPTO_get_id_callback() == _winpr_openssl_id) + { + CRYPTO_set_id_callback(NULL); + } +#endif + + return TRUE; +} + +static BOOL CALLBACK _winpr_openssl_initialize(PINIT_ONCE once, PVOID param, PVOID *context) +{ + DWORD flags = param ? *(PDWORD)param : WINPR_SSL_INIT_DEFAULT; + + if (flags & WINPR_SSL_INIT_ALREADY_INITIALIZED) + { + return TRUE; + } + + if (flags & WINPR_SSL_INIT_ENABLE_LOCKING) + { + if (!_winpr_openssl_initialize_locking(FALSE)) + { + return FALSE; + } + } + + /* SSL_load_error_strings() is void */ + SSL_load_error_strings(); + + /* SSL_library_init() always returns "1" */ + SSL_library_init(); + + g_winpr_openssl_initialized_by_winpr = TRUE; + + return TRUE; +} + + +/* exported functions */ + +BOOL winpr_InitializeSSL(DWORD flags) +{ + static INIT_ONCE once = INIT_ONCE_STATIC_INIT; + return InitOnceExecuteOnce(&once, _winpr_openssl_initialize, &flags, NULL); +} + +BOOL winpr_CleanupSSL(DWORD flags) +{ + if (flags & WINPR_SSL_CLEANUP_GLOBAL) + { + if (!g_winpr_openssl_initialized_by_winpr) + { + fprintf(stderr, "%s: warning: ssl was not initialized by winpr\n", __FUNCTION__); + return FALSE; + } + g_winpr_openssl_initialized_by_winpr = FALSE; + _winpr_openssl_cleanup_locking(); + CRYPTO_cleanup_all_ex_data(); + ERR_free_strings(); + EVP_cleanup(); + flags |= WINPR_SSL_CLEANUP_THREAD; + } + + if (flags & WINPR_SSL_CLEANUP_THREAD) + { +#if (OPENSSL_VERSION_NUMBER < 0x10000000L) + ERR_remove_state(0); +#else + ERR_remove_thread_state(NULL); +#endif + } + + return TRUE; +} diff --git a/winpr/libwinpr/utils/test/CMakeLists.txt b/winpr/libwinpr/utils/test/CMakeLists.txt index c217cd587..a663d0640 100644 --- a/winpr/libwinpr/utils/test/CMakeLists.txt +++ b/winpr/libwinpr/utils/test/CMakeLists.txt @@ -27,12 +27,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-path winpr-thread winpr-utils) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/winhttp/CMakeLists.txt b/winpr/libwinpr/winhttp/CMakeLists.txt index 62088e7c3..57576c6f9 100644 --- a/winpr/libwinpr/winhttp/CMakeLists.txt +++ b/winpr/libwinpr/winhttp/CMakeLists.txt @@ -15,23 +15,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-winhttp") -set(MODULE_PREFIX "WINPR_WINHTTP") - -set(${MODULE_PREFIX}_SRCS - winhttp.c) - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -if(MONOLITHIC_BUILD) - -else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +winpr_module_add(winhttp.c) diff --git a/winpr/libwinpr/winsock/CMakeLists.txt b/winpr/libwinpr/winsock/CMakeLists.txt index c4369c535..1d2e1159a 100644 --- a/winpr/libwinpr/winsock/CMakeLists.txt +++ b/winpr/libwinpr/winsock/CMakeLists.txt @@ -15,32 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-winsock") -set(MODULE_PREFIX "WINPR_WINSOCK") - -set(${MODULE_PREFIX}_SRCS - winsock.c) - -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") +winpr_module_add(winsock.c) if(WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ws2_32) + winpr_library_add(ws2_32) endif() - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/wnd/CMakeLists.txt b/winpr/libwinpr/wnd/CMakeLists.txt index 37a779407..f3897cde5 100644 --- a/winpr/libwinpr/wnd/CMakeLists.txt +++ b/winpr/libwinpr/wnd/CMakeLists.txt @@ -15,37 +15,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-wnd") -set(MODULE_PREFIX "WINPR_WND") - -set(${MODULE_PREFIX}_SRCS - wnd.c +winpr_module_add(wnd.c wnd.h) -if(MSVC AND (NOT MONOLITHIC_BUILD)) - set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) -endif() - -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS}) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-crt winpr-utils) - -if(MONOLITHIC_BUILD) - -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/wnd/test/CMakeLists.txt b/winpr/libwinpr/wnd/test/CMakeLists.txt index c233ad235..8882d4c44 100644 --- a/winpr/libwinpr/wnd/test/CMakeLists.txt +++ b/winpr/libwinpr/wnd/test/CMakeLists.txt @@ -14,12 +14,7 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-wnd winpr-library) - -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/wtsapi/CMakeLists.txt b/winpr/libwinpr/wtsapi/CMakeLists.txt index 20da3086c..718166d9b 100644 --- a/winpr/libwinpr/wtsapi/CMakeLists.txt +++ b/winpr/libwinpr/wtsapi/CMakeLists.txt @@ -15,34 +15,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(MODULE_NAME "winpr-wtsapi") -set(MODULE_PREFIX "WINPR_WTSAPI") - -set(${MODULE_PREFIX}_SRCS - wtsapi.c +winpr_module_add(wtsapi.c wtsapi.h) -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) - -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL - MODULE winpr - MODULES winpr-nt winpr-io winpr-synch winpr-file winpr-error winpr-library winpr-environment winpr-utils) - -if(MONOLITHIC_BUILD) - set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) -else() - target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) -endif() - -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/winpr/libwinpr/wtsapi/test/CMakeLists.txt b/winpr/libwinpr/wtsapi/test/CMakeLists.txt index 67fd5a1c4..b26197ee0 100644 --- a/winpr/libwinpr/wtsapi/test/CMakeLists.txt +++ b/winpr/libwinpr/wtsapi/test/CMakeLists.txt @@ -20,12 +20,8 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-library winpr-wtsapi winpr-utils) -target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +target_link_libraries(${MODULE_NAME} winpr) set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}") diff --git a/winpr/libwinpr/wtsapi/wtsapi.c b/winpr/libwinpr/wtsapi/wtsapi.c index 02cf985cb..144927cde 100644 --- a/winpr/libwinpr/wtsapi/wtsapi.c +++ b/winpr/libwinpr/wtsapi/wtsapi.c @@ -44,6 +44,161 @@ static HMODULE g_WtsApiModule = NULL; static PWtsApiFunctionTable g_WtsApi = NULL; +static HMODULE g_WtsApi32Module = NULL; + +static WtsApiFunctionTable WtsApi32_WtsApiFunctionTable = +{ + 0, /* dwVersion */ + 0, /* dwFlags */ + + NULL, /* StopRemoteControlSession */ + NULL, /* StartRemoteControlSessionW */ + NULL, /* StartRemoteControlSessionA */ + NULL, /* ConnectSessionW */ + NULL, /* ConnectSessionA */ + NULL, /* EnumerateServersW */ + NULL, /* EnumerateServersA */ + NULL, /* OpenServerW */ + NULL, /* OpenServerA */ + NULL, /* OpenServerExW */ + NULL, /* OpenServerExA */ + NULL, /* CloseServer */ + NULL, /* EnumerateSessionsW */ + NULL, /* EnumerateSessionsA */ + NULL, /* EnumerateSessionsExW */ + NULL, /* EnumerateSessionsExA */ + NULL, /* EnumerateProcessesW */ + NULL, /* EnumerateProcessesA */ + NULL, /* TerminateProcess */ + NULL, /* QuerySessionInformationW */ + NULL, /* QuerySessionInformationA */ + NULL, /* QueryUserConfigW */ + NULL, /* QueryUserConfigA */ + NULL, /* SetUserConfigW */ + NULL, /* SetUserConfigA */ + NULL, /* SendMessageW */ + NULL, /* SendMessageA */ + NULL, /* DisconnectSession */ + NULL, /* LogoffSession */ + NULL, /* ShutdownSystem */ + NULL, /* WaitSystemEvent */ + NULL, /* VirtualChannelOpen */ + NULL, /* VirtualChannelOpenEx */ + NULL, /* VirtualChannelClose */ + NULL, /* VirtualChannelRead */ + NULL, /* VirtualChannelWrite */ + NULL, /* VirtualChannelPurgeInput */ + NULL, /* VirtualChannelPurgeOutput */ + NULL, /* VirtualChannelQuery */ + NULL, /* FreeMemory */ + NULL, /* RegisterSessionNotification */ + NULL, /* UnRegisterSessionNotification */ + NULL, /* RegisterSessionNotificationEx */ + NULL, /* UnRegisterSessionNotificationEx */ + NULL, /* QueryUserToken */ + NULL, /* FreeMemoryExW */ + NULL, /* FreeMemoryExA */ + NULL, /* EnumerateProcessesExW */ + NULL, /* EnumerateProcessesExA */ + NULL, /* EnumerateListenersW */ + NULL, /* EnumerateListenersA */ + NULL, /* QueryListenerConfigW */ + NULL, /* QueryListenerConfigA */ + NULL, /* CreateListenerW */ + NULL, /* CreateListenerA */ + NULL, /* SetListenerSecurityW */ + NULL, /* SetListenerSecurityA */ + NULL, /* GetListenerSecurityW */ + NULL, /* GetListenerSecurityA */ + NULL, /* EnableChildSessions */ + NULL, /* IsChildSessionsEnabled */ + NULL, /* GetChildSessionId */ + NULL /* GetActiveConsoleSessionId */ +}; + +#define WTSAPI32_LOAD_PROC(_name, _type) \ + WtsApi32_WtsApiFunctionTable.p ## _name = (## _type) GetProcAddress(g_WtsApi32Module, "WTS" #_name); + +int WtsApi32_InitializeWtsApi(void) +{ + g_WtsApi32Module = LoadLibraryA("wtsapi32.dll"); + + if (!g_WtsApi32Module) + return -1; + +#ifdef _WIN32 + WTSAPI32_LOAD_PROC(StopRemoteControlSession, WTS_STOP_REMOTE_CONTROL_SESSION_FN); + WTSAPI32_LOAD_PROC(StartRemoteControlSessionW, WTS_START_REMOTE_CONTROL_SESSION_FN_W); + WTSAPI32_LOAD_PROC(StartRemoteControlSessionA, WTS_START_REMOTE_CONTROL_SESSION_FN_A); + WTSAPI32_LOAD_PROC(ConnectSessionW, WTS_CONNECT_SESSION_FN_W); + WTSAPI32_LOAD_PROC(ConnectSessionA, WTS_CONNECT_SESSION_FN_A); + WTSAPI32_LOAD_PROC(EnumerateServersW, WTS_ENUMERATE_SERVERS_FN_W); + WTSAPI32_LOAD_PROC(EnumerateServersA, WTS_ENUMERATE_SERVERS_FN_A); + WTSAPI32_LOAD_PROC(OpenServerW, WTS_OPEN_SERVER_FN_W); + WTSAPI32_LOAD_PROC(OpenServerA, WTS_OPEN_SERVER_FN_A); + WTSAPI32_LOAD_PROC(OpenServerExW, WTS_OPEN_SERVER_EX_FN_W); + WTSAPI32_LOAD_PROC(OpenServerExA, WTS_OPEN_SERVER_EX_FN_A); + WTSAPI32_LOAD_PROC(CloseServer, WTS_CLOSE_SERVER_FN); + WTSAPI32_LOAD_PROC(EnumerateSessionsW, WTS_ENUMERATE_SESSIONS_FN_W); + WTSAPI32_LOAD_PROC(EnumerateSessionsA, WTS_ENUMERATE_SESSIONS_FN_A); + WTSAPI32_LOAD_PROC(EnumerateSessionsExW, WTS_ENUMERATE_SESSIONS_EX_FN_W); + WTSAPI32_LOAD_PROC(EnumerateSessionsExA, WTS_ENUMERATE_SESSIONS_EX_FN_A); + WTSAPI32_LOAD_PROC(EnumerateProcessesW, WTS_ENUMERATE_PROCESSES_FN_W); + WTSAPI32_LOAD_PROC(EnumerateProcessesA, WTS_ENUMERATE_PROCESSES_FN_A); + WTSAPI32_LOAD_PROC(TerminateProcess, WTS_TERMINATE_PROCESS_FN); + WTSAPI32_LOAD_PROC(QuerySessionInformationW, WTS_QUERY_SESSION_INFORMATION_FN_W); + WTSAPI32_LOAD_PROC(QuerySessionInformationA, WTS_QUERY_SESSION_INFORMATION_FN_A); + WTSAPI32_LOAD_PROC(QueryUserConfigW, WTS_QUERY_USER_CONFIG_FN_W); + WTSAPI32_LOAD_PROC(QueryUserConfigA, WTS_QUERY_USER_CONFIG_FN_A); + WTSAPI32_LOAD_PROC(SetUserConfigW, WTS_SET_USER_CONFIG_FN_W); + WTSAPI32_LOAD_PROC(SetUserConfigA, WTS_SET_USER_CONFIG_FN_A); + WTSAPI32_LOAD_PROC(SendMessageW, WTS_SEND_MESSAGE_FN_W); + WTSAPI32_LOAD_PROC(SendMessageA, WTS_SEND_MESSAGE_FN_A); + WTSAPI32_LOAD_PROC(DisconnectSession, WTS_DISCONNECT_SESSION_FN); + WTSAPI32_LOAD_PROC(LogoffSession, WTS_LOGOFF_SESSION_FN); + WTSAPI32_LOAD_PROC(ShutdownSystem, WTS_SHUTDOWN_SYSTEM_FN); + WTSAPI32_LOAD_PROC(WaitSystemEvent, WTS_WAIT_SYSTEM_EVENT_FN); + WTSAPI32_LOAD_PROC(VirtualChannelOpen, WTS_VIRTUAL_CHANNEL_OPEN_FN); + WTSAPI32_LOAD_PROC(VirtualChannelOpenEx, WTS_VIRTUAL_CHANNEL_OPEN_EX_FN); + WTSAPI32_LOAD_PROC(VirtualChannelClose, WTS_VIRTUAL_CHANNEL_CLOSE_FN); + WTSAPI32_LOAD_PROC(VirtualChannelRead, WTS_VIRTUAL_CHANNEL_READ_FN); + WTSAPI32_LOAD_PROC(VirtualChannelWrite, WTS_VIRTUAL_CHANNEL_WRITE_FN); + WTSAPI32_LOAD_PROC(VirtualChannelPurgeInput, WTS_VIRTUAL_CHANNEL_PURGE_INPUT_FN); + WTSAPI32_LOAD_PROC(VirtualChannelPurgeOutput, WTS_VIRTUAL_CHANNEL_PURGE_OUTPUT_FN); + WTSAPI32_LOAD_PROC(VirtualChannelQuery, WTS_VIRTUAL_CHANNEL_QUERY_FN); + WTSAPI32_LOAD_PROC(FreeMemory, WTS_FREE_MEMORY_FN); + WTSAPI32_LOAD_PROC(RegisterSessionNotification, WTS_REGISTER_SESSION_NOTIFICATION_FN); + WTSAPI32_LOAD_PROC(UnRegisterSessionNotification, WTS_UNREGISTER_SESSION_NOTIFICATION_FN); + WTSAPI32_LOAD_PROC(RegisterSessionNotificationEx, WTS_REGISTER_SESSION_NOTIFICATION_EX_FN); + WTSAPI32_LOAD_PROC(UnRegisterSessionNotificationEx, WTS_UNREGISTER_SESSION_NOTIFICATION_EX_FN); + WTSAPI32_LOAD_PROC(QueryUserToken, WTS_QUERY_USER_TOKEN_FN); + WTSAPI32_LOAD_PROC(FreeMemoryExW, WTS_FREE_MEMORY_EX_FN_W); + WTSAPI32_LOAD_PROC(FreeMemoryExA, WTS_FREE_MEMORY_EX_FN_A); + WTSAPI32_LOAD_PROC(EnumerateProcessesExW, WTS_ENUMERATE_PROCESSES_EX_FN_W); + WTSAPI32_LOAD_PROC(EnumerateProcessesExA, WTS_ENUMERATE_PROCESSES_EX_FN_A); + WTSAPI32_LOAD_PROC(EnumerateListenersW, WTS_ENUMERATE_LISTENERS_FN_W); + WTSAPI32_LOAD_PROC(EnumerateListenersA, WTS_ENUMERATE_LISTENERS_FN_A); + WTSAPI32_LOAD_PROC(QueryListenerConfigW, WTS_QUERY_LISTENER_CONFIG_FN_W); + WTSAPI32_LOAD_PROC(QueryListenerConfigA, WTS_QUERY_LISTENER_CONFIG_FN_A); + WTSAPI32_LOAD_PROC(CreateListenerW, WTS_CREATE_LISTENER_FN_W); + WTSAPI32_LOAD_PROC(CreateListenerA, WTS_CREATE_LISTENER_FN_A); + WTSAPI32_LOAD_PROC(SetListenerSecurityW, WTS_SET_LISTENER_SECURITY_FN_W); + WTSAPI32_LOAD_PROC(SetListenerSecurityA, WTS_SET_LISTENER_SECURITY_FN_A); + WTSAPI32_LOAD_PROC(GetListenerSecurityW, WTS_GET_LISTENER_SECURITY_FN_W); + WTSAPI32_LOAD_PROC(GetListenerSecurityA, WTS_GET_LISTENER_SECURITY_FN_A); + WTSAPI32_LOAD_PROC(EnableChildSessions, WTS_ENABLE_CHILD_SESSIONS_FN); + WTSAPI32_LOAD_PROC(IsChildSessionsEnabled, WTS_IS_CHILD_SESSIONS_ENABLED_FN); + WTSAPI32_LOAD_PROC(GetChildSessionId, WTS_GET_CHILD_SESSION_ID_FN); + WTSAPI32_LOAD_PROC(GetActiveConsoleSessionId, WTS_GET_ACTIVE_CONSOLE_SESSION_ID_FN); +#endif + + g_WtsApi = &WtsApi32_WtsApiFunctionTable; + + return 1; +} + +/* WtsApi Functions */ + BOOL WINAPI WTSStartRemoteControlSessionW(LPWSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers) { WTSAPI_STUB_CALL_BOOL(StartRemoteControlSessionW, pTargetServerName, TargetLogonId, HotkeyVk, HotkeyModifiers); @@ -432,11 +587,13 @@ void InitializeWtsApiStubs_Env() env = (LPSTR) malloc(nSize); nSize = GetEnvironmentVariableA("WTSAPI_LIBRARY", env, nSize); + if (env) LoadAndInitialize(env); } #define FREERDS_LIBRARY_NAME "libfreerds-fdsapi.so" + void InitializeWtsApiStubs_FreeRDS() { char* prefix; @@ -489,7 +646,11 @@ void InitializeWtsApiStubs(void) g_Initialized = TRUE; InitializeWtsApiStubs_Env(); - + +#ifdef _WIN32 + WtsApi32_InitializeWtsApi(); +#endif + if (!g_WtsApi) InitializeWtsApiStubs_FreeRDS(); diff --git a/winpr/tools/hash/CMakeLists.txt b/winpr/tools/hash/CMakeLists.txt index e9b307173..702ec184a 100644 --- a/winpr/tools/hash/CMakeLists.txt +++ b/winpr/tools/hash/CMakeLists.txt @@ -28,12 +28,8 @@ add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) set(${MODULE_PREFIX}_LIBS ${ZLIB_LIBRARIES} - ${OPENSSL_LIBRARIES}) - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-utils) + ${OPENSSL_LIBRARIES} + winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/winpr/tools/makecert/CMakeLists.txt b/winpr/tools/makecert/CMakeLists.txt index afd925610..6afa33613 100644 --- a/winpr/tools/makecert/CMakeLists.txt +++ b/winpr/tools/makecert/CMakeLists.txt @@ -27,12 +27,8 @@ add_library(${MODULE_NAME} STATIC ${${MODULE_PREFIX}_SRCS}) set(${MODULE_PREFIX}_LIBS ${ZLIB_LIBRARIES} - ${OPENSSL_LIBRARIES}) - -set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS - MONOLITHIC ${MONOLITHIC_BUILD} - MODULE winpr - MODULES winpr-crt winpr-utils winpr-sysinfo winpr-file winpr-path) + ${OPENSSL_LIBRARIES} + winpr) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/winpr/tools/makecert/makecert.c b/winpr/tools/makecert/makecert.c index ce775891c..9c31c18c6 100644 --- a/winpr/tools/makecert/makecert.c +++ b/winpr/tools/makecert/makecert.c @@ -27,8 +27,10 @@ #include #include -#include #include +#include +#include +#include #include #include @@ -42,12 +44,24 @@ struct _MAKECERT_CONTEXT RSA* rsa; X509* x509; EVP_PKEY* pkey; + PKCS12* pkcs12; BOOL live; BOOL silent; + BOOL crtFormat; + BOOL pemFormat; + BOOL pfxFormat; + + char* password; + char* output_file; + char* output_path; char* default_name; + char* common_name; + + int duration_years; + int duration_months; }; COMMAND_LINE_ARGUMENT_A args[] = @@ -63,6 +77,15 @@ COMMAND_LINE_ARGUMENT_A args[] = { "live", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Generate certificate live in memory when used as a library." }, + { "format", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, + "Specify certificate file format" + }, + { "path", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, + "Specify certificate file output path" + }, + { "p", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, + "Specify certificate export password" + }, /* Basic Options */ @@ -154,6 +177,9 @@ COMMAND_LINE_ARGUMENT_A args[] = { "m", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "Specifies the duration, in months, of the certificate validity period." }, + { "y", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, + "Specifies the duration, in years, of the certificate validity period." + }, { "nscp", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Includes the Netscape client-authorization extension." }, @@ -346,6 +372,65 @@ int makecert_context_parse_arguments(MAKECERT_CONTEXT* context, int argc, char** { context->live = TRUE; } + CommandLineSwitchCase(arg, "format") + { + if (!(arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) + continue; + + if (strcmp(arg->Value, "crt") == 0) + { + context->crtFormat = TRUE; + context->pemFormat = FALSE; + context->pfxFormat = FALSE; + } + else if (strcmp(arg->Value, "pem") == 0) + { + context->crtFormat = FALSE; + context->pemFormat = TRUE; + context->pfxFormat = FALSE; + } + else if (strcmp(arg->Value, "pfx") == 0) + { + context->crtFormat = FALSE; + context->pemFormat = FALSE; + context->pfxFormat = TRUE; + } + } + CommandLineSwitchCase(arg, "path") + { + if (!(arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) + continue; + + context->output_path = _strdup(arg->Value); + } + CommandLineSwitchCase(arg, "p") + { + if (!(arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) + continue; + + context->password = _strdup(arg->Value); + } + CommandLineSwitchCase(arg, "n") + { + if (!(arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) + continue; + + context->common_name = _strdup(arg->Value); + } + CommandLineSwitchCase(arg, "y") + { + if (!(arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) + continue; + + context->duration_years = atoi(arg->Value); + } + CommandLineSwitchCase(arg, "m") + { + if (!(arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) + continue; + + context->duration_months = atoi(arg->Value); + } CommandLineSwitchDefault(arg) { @@ -374,7 +459,7 @@ int makecert_context_output_certificate_file(MAKECERT_CONTEXT* context, char* pa char* fullpath; if (!context->output_file) - context->output_file = context->default_name; + context->output_file = _strdup(context->default_name); /* * Output Certificate File @@ -383,7 +468,13 @@ int makecert_context_output_certificate_file(MAKECERT_CONTEXT* context, char* pa length = strlen(context->output_file); filename = malloc(length + 8); strcpy(filename, context->output_file); - strcpy(&filename[length], ".crt"); + + if (context->crtFormat) + strcpy(&filename[length], ".crt"); + else if (context->pemFormat) + strcpy(&filename[length], ".pem"); + else if (context->pfxFormat) + strcpy(&filename[length], ".pfx"); if (path) fullpath = GetCombinedPath(path, filename); @@ -394,7 +485,31 @@ int makecert_context_output_certificate_file(MAKECERT_CONTEXT* context, char* pa if (fp) { - PEM_write_X509(fp, context->x509); + if (context->pfxFormat) + { + if (!context->password) + { + context->password = _strdup("password"); + printf("Using default export password \"password\"\n"); + } + + OpenSSL_add_all_algorithms(); + OpenSSL_add_all_ciphers(); + OpenSSL_add_all_digests(); + + context->pkcs12 = PKCS12_create(context->password, context->default_name, context->pkey, + context->x509, NULL, 0, 0, 0, 0, 0); + + i2d_PKCS12_fp(fp, context->pkcs12); + } + else + { + PEM_write_X509(fp, context->x509); + + if (context->pemFormat) + PEM_write_PrivateKey(fp, context->pkey, NULL, NULL, 0, NULL, NULL); + } + fclose(fp); } @@ -411,6 +526,9 @@ int makecert_context_output_private_key_file(MAKECERT_CONTEXT* context, char* pa char* filename; char* fullpath; + if (!context->crtFormat) + return 1; + if (!context->output_file) context->output_file = context->default_name; @@ -456,7 +574,13 @@ int makecert_context_process(MAKECERT_CONTEXT* context, int argc, char** argv) if (makecert_context_parse_arguments(context, argc, argv) < 1) return 0; - context->default_name = x509_get_default_name(); + if (!context->default_name && !context->common_name) + context->default_name = x509_get_default_name(); + else + context->default_name = _strdup(context->common_name); + + if (!context->common_name) + context->common_name = _strdup(context->default_name); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); context->bio = BIO_new_fp(stderr, BIO_NOCLOSE); @@ -501,7 +625,16 @@ int makecert_context_process(MAKECERT_CONTEXT* context, int argc, char** argv) ASN1_INTEGER_set(X509_get_serialNumber(context->x509), serial); X509_gmtime_adj(X509_get_notBefore(context->x509), 0); - X509_gmtime_adj(X509_get_notAfter(context->x509), (long) 60 * 60 * 24 * 365); + + if (context->duration_months) + { + X509_gmtime_adj(X509_get_notAfter(context->x509), (long) (60 * 60 * 24 * 31 * context->duration_months)); + } + else if (context->duration_years) + { + X509_gmtime_adj(X509_get_notAfter(context->x509), (long) (60 * 60 * 24 * 365 * context->duration_years)); + } + X509_set_pubkey(context->x509, context->pkey); name = X509_get_subject_name(context->x509); @@ -535,19 +668,14 @@ int makecert_context_process(MAKECERT_CONTEXT* context, int argc, char** argv) if (entry) X509_NAME_add_entry_by_txt(name, "OU", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); - entry = x509_name_parse(arg->Value, "CN", &length); - - if (!entry) - { - entry = context->default_name; - length = strlen(entry); - } + entry = context->common_name; + length = strlen(entry); X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); } else { - entry = context->default_name; + entry = context->common_name; length = strlen(entry); X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); @@ -592,8 +720,10 @@ int makecert_context_process(MAKECERT_CONTEXT* context, int argc, char** argv) if (!context->live) { - makecert_context_output_certificate_file(context, NULL); - makecert_context_output_private_key_file(context, NULL); + makecert_context_output_certificate_file(context, context->output_path); + + if (context->crtFormat) + makecert_context_output_private_key_file(context, context->output_path); } return 0; @@ -603,11 +733,12 @@ MAKECERT_CONTEXT* makecert_context_new() { MAKECERT_CONTEXT* context = NULL; - context = (MAKECERT_CONTEXT*) malloc(sizeof(MAKECERT_CONTEXT)); + context = (MAKECERT_CONTEXT*) calloc(1, sizeof(MAKECERT_CONTEXT)); if (context) { - ZeroMemory(context, sizeof(MAKECERT_CONTEXT)); + context->crtFormat = TRUE; + context->duration_years = 1; } return context; @@ -617,6 +748,8 @@ void makecert_context_free(MAKECERT_CONTEXT* context) { if (context) { + free(context->password); + X509_free(context->x509); EVP_PKEY_free(context->pkey);