From 5bbba65bbb0403c539494963f97582f36916a99f Mon Sep 17 00:00:00 2001 From: SBoyNumber1 Date: Fri, 20 Jun 2014 19:33:30 +0300 Subject: [PATCH 01/55] Added detect of uncompressed data in CACHE_BITMAP_REV3_ORDER. According to example from http://msdn.microsoft.com/en-us/library/gg441209.aspx. --- libfreerdp/cache/bitmap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libfreerdp/cache/bitmap.c b/libfreerdp/cache/bitmap.c index 18e8b76d8..996b07883 100644 --- a/libfreerdp/cache/bitmap.c +++ b/libfreerdp/cache/bitmap.c @@ -149,9 +149,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) + BOOL 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); From d0fc5227a0cd6f82983ff67fa10b936422f74640 Mon Sep 17 00:00:00 2001 From: SBoyNumber1 Date: Sat, 21 Jun 2014 15:23:24 +0300 Subject: [PATCH 02/55] Update bitmap.c --- libfreerdp/cache/bitmap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libfreerdp/cache/bitmap.c b/libfreerdp/cache/bitmap.c index 996b07883..64e3749cc 100644 --- a/libfreerdp/cache/bitmap.c +++ b/libfreerdp/cache/bitmap.c @@ -151,7 +151,11 @@ void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cach // According to http://msdn.microsoft.com/en-us/library/gg441209.aspx // CACHE_BITMAP_REV3_ORDER::bitmapData::codecID = 0x00 (uncompressed) - BOOL isCompressed = (bitmapData->codecID != RDP_CODEC_ID_NONE); + BOOL isCompressed = TRUE; + if (bitmapData->codecID == RDP_CODEC_ID_NONE) + { + isCompressed = FALSE; + } bitmap->Decompress(context, bitmap, bitmapData->data, bitmap->width, bitmap->height, From 473e6cd90a08f701720f7502fd03934b4082cfcf Mon Sep 17 00:00:00 2001 From: SBoyNumber1 Date: Mon, 23 Jun 2014 12:02:41 +0300 Subject: [PATCH 03/55] Update bitmap.c Third try to make Windows build. --- libfreerdp/cache/bitmap.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libfreerdp/cache/bitmap.c b/libfreerdp/cache/bitmap.c index 64e3749cc..d5387035f 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,13 +150,9 @@ 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) - BOOL isCompressed = TRUE; - if (bitmapData->codecID == RDP_CODEC_ID_NONE) - { - isCompressed = FALSE; - } + /* 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, From 84d008940192f612506b62837f561fc20e5f8423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benoi=CC=82t=20LeBlanc?= Date: Tue, 8 Jul 2014 16:32:28 -0400 Subject: [PATCH 04/55] Added KeyboardHook to settings --- client/common/file.c | 5 +++++ include/freerdp/settings.h | 9 ++++++++- libfreerdp/common/settings.c | 8 ++++++++ libfreerdp/core/settings.c | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) 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/include/freerdp/settings.h b/include/freerdp/settings.h index 07fc0d354..dbc09f9fc 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; @@ -725,6 +730,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 @@ -1174,7 +1180,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/common/settings.c b/libfreerdp/common/settings.c index 97df29b15..e07bde9cf 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -1870,6 +1870,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; @@ -2179,6 +2183,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/settings.c b/libfreerdp/core/settings.c index fc40a0633..c58245fb1 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -557,6 +557,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 */ From 00b01f1b4e1e5be1ccaaa34ff7b6c6325cc66309 Mon Sep 17 00:00:00 2001 From: Justin DeFields Date: Tue, 8 Jul 2014 16:51:50 -0400 Subject: [PATCH 05/55] I am making several changes to cleanup French Canadian, with the end result being: ca,fr -> Canadian French ca,fr-legacy -> Canadian English ca,eng -> Canadian English. Currently ca,fr isn't defined, ca,fr-legacy thinks it's Canadian French and it isn't anyway because the value is wrong for that definition, and ca,eng is US. --- include/freerdp/locale/keyboard.h | 5 +++-- libfreerdp/locale/keyboard_layout.c | 1 + libfreerdp/locale/xkb_layout_ids.c | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/freerdp/locale/keyboard.h b/include/freerdp/locale/keyboard.h index 147067d8e..e188092cd 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_FRENCH_LEGACY 0x00000C0C +#define KBD_CANADIAN_ENGLISH 0x00001009 +#define KBD_CANADIAN_FRENCH_LEGACY 0x00001009 #define KBD_SERBIAN_CYRILLIC 0x00000C1A -#define KBD_CANADIAN_FRENCH 0x00001009 +#define KBD_CANADIAN_FRENCH 0x000000C0C #define KBD_SWISS_FRENCH 0x0000100C #define KBD_BOSNIAN 0x0000141A #define KBD_IRISH 0x00001809 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 }, }; From 622346055732cc544fa8a0eff15394aa1bfaeebd Mon Sep 17 00:00:00 2001 From: Hardening Date: Wed, 9 Jul 2014 11:28:41 +0200 Subject: [PATCH 06/55] kill the last remaining select() in libfreerdp --- libfreerdp/core/tcp.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/libfreerdp/core/tcp.c b/libfreerdp/core/tcp.c index 245d3b1b9..bda0b0d14 100644 --- a/libfreerdp/core/tcp.c +++ b/libfreerdp/core/tcp.c @@ -505,8 +505,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 +534,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 */ From eeeaa1f4dfb4768958f9de10f67eae088f9efdf0 Mon Sep 17 00:00:00 2001 From: Justin DeFields Date: Wed, 9 Jul 2014 10:09:43 -0400 Subject: [PATCH 07/55] Fixed typo and changed Canadian French (legacy) to 0x00000c0c which most online docs support. --- include/freerdp/locale/keyboard.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/freerdp/locale/keyboard.h b/include/freerdp/locale/keyboard.h index e188092cd..6868601ef 100644 --- a/include/freerdp/locale/keyboard.h +++ b/include/freerdp/locale/keyboard.h @@ -117,9 +117,9 @@ typedef struct _RDP_KEYBOARD_LAYOUT RDP_KEYBOARD_LAYOUT; #define KBD_UZBEK_CYRILLIC 0x00000843 #define KBD_INUKTITUT_LATIN 0x0000085D #define KBD_CANADIAN_ENGLISH 0x00001009 -#define KBD_CANADIAN_FRENCH_LEGACY 0x00001009 +#define KBD_CANADIAN_FRENCH_LEGACY 0x00000C0C #define KBD_SERBIAN_CYRILLIC 0x00000C1A -#define KBD_CANADIAN_FRENCH 0x000000C0C +#define KBD_CANADIAN_FRENCH 0x00000C0C #define KBD_SWISS_FRENCH 0x0000100C #define KBD_BOSNIAN 0x0000141A #define KBD_IRISH 0x00001809 From 1087b50e92758d582b94e00867be16ac1215a73b Mon Sep 17 00:00:00 2001 From: Mike McDonald Date: Wed, 9 Jul 2014 19:56:05 -0400 Subject: [PATCH 08/55] Added use of U/V planes to freerdp_image_copy_yuv420p_to_xrgb function. --- libfreerdp/codec/h264.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/libfreerdp/codec/h264.c b/libfreerdp/codec/h264.c index 4b0d1de68..c1a2be91c 100644 --- a/libfreerdp/codec/h264.c +++ b/libfreerdp/codec/h264.c @@ -28,8 +28,8 @@ #include #include -#define USE_GRAY_SCALE 1 -#define USE_UPCONVERT 0 +#define USE_GRAY_SCALE 0 +#define USE_UPCONVERT 0 #define USE_TRACE 1 static BYTE clip(int x) @@ -191,17 +191,25 @@ int freerdp_image_copy_yuv420p_to_xrgb(BYTE* pDstData, int nDstStep, int nXDst, BYTE* pDstPixel8; BYTE *pY, *pU, *pV; - pY = pSrcData[0]; - pU = pSrcData[1]; - pV = pSrcData[0]; + pY = pSrcData[0] + (nYSrc * nSrcStep[0]) + nXSrc; pDstPixel8 = &pDstData[(nYDst * nDstStep) + (nXDst * 4)]; for (y = 0; y < nHeight; y++) { + pU = pSrcData[1] + ((nYSrc + y) >> 1) * nSrcStep[1]; + pV = pSrcData[2] + ((nYSrc + y) >> 1) * nSrcStep[1]; + for (x = 0; x < nWidth; x++) { - *((UINT32*) pDstPixel8) = RGB32(*pY, *pY, *pY); + BYTE Y, U, V; + + Y = *pY; + U = pU[(nXSrc + x) >> 1]; + V = pV[(nXSrc + x) >> 1]; + + *((UINT32*) pDstPixel8) = YUV_to_RGB(Y, U, V); + pDstPixel8 += 4; pY++; } From 2e1f6b0c6df9a42e51be16f5656a00fc52ede6d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 9 Jul 2014 20:10:33 -0400 Subject: [PATCH 09/55] libwinpr-crt: fix realloc to smaller size --- winpr/libwinpr/crt/alignment.c | 109 ++++++++++++++++++++++++--------- 1 file changed, 81 insertions(+), 28 deletions(-) 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 From 6a49bcfe40bfb6cb03fba5daa27567f2052de3ec Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Thu, 10 Jul 2014 00:03:20 +0200 Subject: [PATCH 10/55] winpr: always build "monolitic" winpr is now always build as single library. The build option MONOLITHIC_BUILD doesn't influence this behavior anymore. The only exception is winpr-makecert-tool which is still build as extra library. This obsoletes complex_libraries for winpr. --- CMakeLists.txt | 1 + channels/client/CMakeLists.txt | 6 +- channels/cliprdr/client/CMakeLists.txt | 5 +- channels/disp/client/CMakeLists.txt | 5 +- channels/drdynvc/client/CMakeLists.txt | 5 +- channels/drive/client/CMakeLists.txt | 5 +- channels/encomsp/client/CMakeLists.txt | 5 +- channels/encomsp/server/CMakeLists.txt | 5 +- channels/parallel/client/CMakeLists.txt | 5 +- channels/printer/client/CMakeLists.txt | 5 +- channels/rdpdr/client/CMakeLists.txt | 5 +- channels/rdpei/client/CMakeLists.txt | 5 +- channels/rdpgfx/client/CMakeLists.txt | 5 +- channels/rdpsnd/client/CMakeLists.txt | 5 +- channels/rdpsnd/client/alsa/CMakeLists.txt | 5 +- channels/rdpsnd/client/winmm/CMakeLists.txt | 7 +- channels/remdesk/client/CMakeLists.txt | 5 +- channels/remdesk/server/CMakeLists.txt | 5 +- channels/serial/client/CMakeLists.txt | 5 +- channels/server/CMakeLists.txt | 6 +- channels/smartcard/client/CMakeLists.txt | 5 +- channels/urbdrc/client/CMakeLists.txt | 5 +- channels/urbdrc/client/libusb/CMakeLists.txt | 6 +- client/Android/FreeRDPCore/jni/CMakeLists.txt | 5 +- client/DirectFB/CMakeLists.txt | 5 +- client/Mac/CMakeLists.txt | 4 +- client/Windows/CMakeLists.txt | 6 +- client/X11/CMakeLists.txt | 4 +- client/common/CMakeLists.txt | 4 +- client/iOS/CMakeLists.txt | 4 +- cunit/CMakeLists.txt | 2 +- libfreerdp/codec/CMakeLists.txt | 6 +- libfreerdp/common/CMakeLists.txt | 4 +- libfreerdp/core/CMakeLists.txt | 5 +- libfreerdp/crypto/CMakeLists.txt | 11 +- libfreerdp/gdi/test/CMakeLists.txt | 5 +- libfreerdp/locale/CMakeLists.txt | 5 +- libfreerdp/primitives/CMakeLists.txt | 5 +- libfreerdp/utils/CMakeLists.txt | 5 +- libfreerdp/utils/test/CMakeLists.txt | 5 +- server/Mac/CMakeLists.txt | 5 +- server/Sample/CMakeLists.txt | 5 +- server/X11/CMakeLists.txt | 5 +- winpr/CMakeLists.txt | 5 +- winpr/libwinpr/CMakeLists.txt | 101 ++++++++++++------ winpr/libwinpr/asn1/CMakeLists.txt | 25 +---- winpr/libwinpr/asn1/test/CMakeLists.txt | 7 +- winpr/libwinpr/bcrypt/CMakeLists.txt | 35 +----- winpr/libwinpr/com/CMakeLists.txt | 30 +----- winpr/libwinpr/com/test/CMakeLists.txt | 10 +- winpr/libwinpr/comm/CMakeLists.txt | 25 +---- winpr/libwinpr/comm/module.def | 2 +- winpr/libwinpr/comm/test/CMakeLists.txt | 7 +- winpr/libwinpr/credentials/CMakeLists.txt | 26 +---- winpr/libwinpr/credui/CMakeLists.txt | 33 +----- winpr/libwinpr/credui/test/CMakeLists.txt | 7 +- winpr/libwinpr/crt/CMakeLists.txt | 29 +---- winpr/libwinpr/crt/test/CMakeLists.txt | 7 +- winpr/libwinpr/crypto/CMakeLists.txt | 42 +------- winpr/libwinpr/crypto/test/CMakeLists.txt | 8 +- winpr/libwinpr/dsparse/CMakeLists.txt | 28 +---- winpr/libwinpr/dsparse/test/CMakeLists.txt | 7 +- winpr/libwinpr/environment/CMakeLists.txt | 31 +----- .../libwinpr/environment/test/CMakeLists.txt | 7 +- winpr/libwinpr/error/CMakeLists.txt | 31 +----- winpr/libwinpr/error/test/CMakeLists.txt | 7 +- winpr/libwinpr/file/CMakeLists.txt | 28 +---- winpr/libwinpr/file/test/CMakeLists.txt | 7 +- winpr/libwinpr/handle/CMakeLists.txt | 34 +----- winpr/libwinpr/heap/CMakeLists.txt | 25 +---- winpr/libwinpr/input/CMakeLists.txt | 27 +---- winpr/libwinpr/interlocked/CMakeLists.txt | 35 +----- .../libwinpr/interlocked/test/CMakeLists.txt | 7 +- winpr/libwinpr/io/CMakeLists.txt | 33 +----- winpr/libwinpr/io/test/CMakeLists.txt | 7 +- winpr/libwinpr/library/CMakeLists.txt | 28 +---- winpr/libwinpr/library/test/CMakeLists.txt | 7 +- winpr/libwinpr/locale/CMakeLists.txt | 28 +---- winpr/libwinpr/locale/test/CMakeLists.txt | 7 +- winpr/libwinpr/memory/CMakeLists.txt | 32 +----- winpr/libwinpr/memory/test/CMakeLists.txt | 7 +- winpr/libwinpr/nt/CMakeLists.txt | 35 +----- winpr/libwinpr/nt/test/CMakeLists.txt | 7 +- winpr/libwinpr/path/CMakeLists.txt | 28 +---- winpr/libwinpr/path/test/CMakeLists.txt | 7 +- winpr/libwinpr/pipe/CMakeLists.txt | 32 +----- winpr/libwinpr/pipe/test/CMakeLists.txt | 7 +- winpr/libwinpr/pool/CMakeLists.txt | 35 +----- winpr/libwinpr/pool/test/CMakeLists.txt | 7 +- winpr/libwinpr/registry/CMakeLists.txt | 25 +---- winpr/libwinpr/rpc/CMakeLists.txt | 37 ++----- winpr/libwinpr/security/CMakeLists.txt | 25 +---- winpr/libwinpr/security/test/CMakeLists.txt | 7 +- winpr/libwinpr/smartcard/CMakeLists.txt | 33 +----- winpr/libwinpr/smartcard/test/CMakeLists.txt | 7 +- winpr/libwinpr/sspi/CMakeLists.txt | 36 +------ winpr/libwinpr/sspi/test/CMakeLists.txt | 7 +- winpr/libwinpr/sspicli/CMakeLists.txt | 21 +--- winpr/libwinpr/synch/CMakeLists.txt | 38 +------ winpr/libwinpr/synch/test/CMakeLists.txt | 7 +- winpr/libwinpr/synch/wait.c | 4 + winpr/libwinpr/sysinfo/CMakeLists.txt | 29 +---- winpr/libwinpr/sysinfo/test/CMakeLists.txt | 7 +- winpr/libwinpr/thread/CMakeLists.txt | 36 +------ winpr/libwinpr/thread/test/CMakeLists.txt | 7 +- winpr/libwinpr/thread/thread.c | 1 - winpr/libwinpr/timezone/CMakeLists.txt | 21 +--- winpr/libwinpr/utils/CMakeLists.txt | 39 ++----- winpr/libwinpr/utils/test/CMakeLists.txt | 7 +- winpr/libwinpr/winhttp/CMakeLists.txt | 21 +--- winpr/libwinpr/winsock/CMakeLists.txt | 28 +---- winpr/libwinpr/wnd/CMakeLists.txt | 30 +----- winpr/libwinpr/wnd/test/CMakeLists.txt | 7 +- winpr/libwinpr/wtsapi/CMakeLists.txt | 27 +---- winpr/libwinpr/wtsapi/test/CMakeLists.txt | 6 +- winpr/tools/hash/CMakeLists.txt | 8 +- winpr/tools/makecert/CMakeLists.txt | 8 +- 117 files changed, 233 insertions(+), 1492 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6034689b..9f58e27d9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -682,6 +682,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/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/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/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/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/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/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/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/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/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..67a2c4cca 100644 --- a/channels/server/CMakeLists.txt +++ b/channels/server/CMakeLists.txt @@ -37,10 +37,8 @@ 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-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/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/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/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/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 index 33c946ee2..91eb01bdb 100755 --- 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/Windows/CMakeLists.txt b/client/Windows/CMakeLists.txt index fb14eb527..e1bc74773 100644 --- a/client/Windows/CMakeLists.txt +++ b/client/Windows/CMakeLists.txt @@ -58,10 +58,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..d33e90ccb 100644 --- a/client/X11/CMakeLists.txt +++ b/client/X11/CMakeLists.txt @@ -87,9 +87,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/common/CMakeLists.txt b/client/common/CMakeLists.txt index 9724af1d8..47bb460f8 100644 --- a/client/common/CMakeLists.txt +++ b/client/common/CMakeLists.txt @@ -59,9 +59,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/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/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/libfreerdp/codec/CMakeLists.txt b/libfreerdp/codec/CMakeLists.txt index 17f23d99f..ee2c7c4b3 100644 --- a/libfreerdp/codec/CMakeLists.txt +++ b/libfreerdp/codec/CMakeLists.txt @@ -109,10 +109,8 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS 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/common/CMakeLists.txt b/libfreerdp/common/CMakeLists.txt index bbdaa70bb..2b0c40498 100644 --- a/libfreerdp/common/CMakeLists.txt +++ b/libfreerdp/common/CMakeLists.txt @@ -36,9 +36,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION_FULL} 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) diff --git a/libfreerdp/core/CMakeLists.txt b/libfreerdp/core/CMakeLists.txt index 4f0f72bdc..de23cee38 100644 --- a/libfreerdp/core/CMakeLists.txt +++ b/libfreerdp/core/CMakeLists.txt @@ -145,10 +145,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/crypto/CMakeLists.txt b/libfreerdp/crypto/CMakeLists.txt index e33200bec..a22cc5880 100644 --- a/libfreerdp/crypto/CMakeLists.txt +++ b/libfreerdp/crypto/CMakeLists.txt @@ -41,11 +41,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVER 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 +54,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/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..8cbb33dfb 100644 --- a/libfreerdp/locale/CMakeLists.txt +++ b/libfreerdp/locale/CMakeLists.txt @@ -82,10 +82,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-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/primitives/CMakeLists.txt b/libfreerdp/primitives/CMakeLists.txt index a075072d2..95868ca61 100644 --- a/libfreerdp/primitives/CMakeLists.txt +++ b/libfreerdp/primitives/CMakeLists.txt @@ -85,10 +85,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/utils/CMakeLists.txt b/libfreerdp/utils/CMakeLists.txt index c2a679ede..0728452e5 100644 --- a/libfreerdp/utils/CMakeLists.txt +++ b/libfreerdp/utils/CMakeLists.txt @@ -56,10 +56,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/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/X11/CMakeLists.txt b/server/X11/CMakeLists.txt index 2af6f8f2e..5aeb9ec9d 100644 --- a/server/X11/CMakeLists.txt +++ b/server/X11/CMakeLists.txt @@ -147,10 +147,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/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/libwinpr/CMakeLists.txt b/winpr/libwinpr/CMakeLists.txt index c2eabedda..6eb03f341 100644 --- a/winpr/libwinpr/CMakeLists.txt +++ b/winpr/libwinpr/CMakeLists.txt @@ -15,48 +15,85 @@ # 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 (_src ${ARGN}) + if (_relPath) + list (APPEND WINPR_INCLUDES "${_relPath}/${_src}") + else() + list (APPEND WINPR_INCLUDES "${_src}") + 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") -endif() +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) +set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} 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..ffcc8112d 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() - -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") +winpr_module_add(${${MODULE_PREFIX}_SRCS}) if(BUILD_TESTING) 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/credentials/CMakeLists.txt b/winpr/libwinpr/credentials/CMakeLists.txt index 588f28c98..d8ad94942 100644 --- a/winpr/libwinpr/credentials/CMakeLists.txt +++ b/winpr/libwinpr/credentials/CMakeLists.txt @@ -15,28 +15,4 @@ # 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/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..a927909cc 100644 --- a/winpr/libwinpr/crypto/CMakeLists.txt +++ b/winpr/libwinpr/crypto/CMakeLists.txt @@ -15,49 +15,11 @@ # 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 - crypto.c +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) -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..c2322174e 100644 --- a/winpr/libwinpr/handle/CMakeLists.txt +++ b/winpr/libwinpr/handle/CMakeLists.txt @@ -14,38 +14,8 @@ # 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. +winpr_module_add(handle.c handle.h) -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}) - 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/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/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..d4eff4080 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,41 +27,15 @@ 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/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/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..00bf37491 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,36 +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..40b8da011 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,24 @@ 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() -add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" - MONOLITHIC ${MONOLITHIC_BUILD} - SOURCES ${${MODULE_PREFIX}_SRCS} - EXPORT) +winpr_include_directory_add(${ZLIB_INCLUDE_DIRS} + ${OPENSSL_INCLUDE_DIR}) -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/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/test/CMakeLists.txt b/winpr/libwinpr/synch/test/CMakeLists.txt index 7805d1798..34d7d3a68 100644 --- a/winpr/libwinpr/synch/test/CMakeLists.txt +++ b/winpr/libwinpr/synch/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-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/wait.c b/winpr/libwinpr/synch/wait.c index 5300b6b08..7b277117b 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 diff --git a/winpr/libwinpr/sysinfo/CMakeLists.txt b/winpr/libwinpr/sysinfo/CMakeLists.txt index 31006f0da..8f4e79bd0 100644 --- a/winpr/libwinpr/sysinfo/CMakeLists.txt +++ b/winpr/libwinpr/sysinfo/CMakeLists.txt @@ -15,37 +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..21cddb632 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 @@ -82,45 +79,25 @@ set(${MODULE_PREFIX}_SRCS stream.c cmdline.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/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/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}) From c206a35c1259a2051971456dc6bd87d31e6140e5 Mon Sep 17 00:00:00 2001 From: Norbert Federa Date: Thu, 10 Jul 2014 12:09:48 +0200 Subject: [PATCH 11/55] transport_read: ensure stream buf size >= pdu size Without this check a simple nc < /dev/urandom server:3389 could kill the server instantly. --- libfreerdp/core/transport.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 04d89902a..3f214e5ad 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -744,6 +744,7 @@ int transport_read(rdpTransport* transport, wStream* s) if (position < 4) { + Stream_EnsureCapacity(s, 4); status = transport_read_layer(transport, Stream_Buffer(s) + position, 4 - position); if (status < 0) @@ -811,6 +812,13 @@ int transport_read(rdpTransport* transport, wStream* s) } } + if (pduLength < 0 || pduLength > 0xFFFF) + { + fprintf(stderr, "%s: invalid pduLength: %d\n", __FUNCTION__, pduLength); + return -1; + } + + Stream_EnsureCapacity(s, pduLength); status = transport_read_layer(transport, Stream_Buffer(s) + position, pduLength - position); if (status < 0) From aac57e7e72a90c0d67afde5e206b1e3adcca5be8 Mon Sep 17 00:00:00 2001 From: Norbert Federa Date: Thu, 10 Jul 2014 12:28:35 +0200 Subject: [PATCH 12/55] winpr: CloseHandle did not release the thread TCB This resulted in huge memory leaks - 8MB per thread, depending on the system's default stack size. The leak happend even if CloseHandle() was correctly used to "detach" the thread but WaitForSingleObject was never called. --- winpr/libwinpr/handle/handle.c | 3 +++ winpr/libwinpr/synch/wait.c | 2 ++ 2 files changed, 5 insertions(+) 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/synch/wait.c b/winpr/libwinpr/synch/wait.c index 5300b6b08..d6c818677 100644 --- a/winpr/libwinpr/synch/wait.c +++ b/winpr/libwinpr/synch/wait.c @@ -255,6 +255,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", From 7b450f4012ff6b88361ab7d4cd0002b2cf3b42b7 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Thu, 10 Jul 2014 17:40:27 +0200 Subject: [PATCH 13/55] winpr: fix handling of absolute include paths Don't prefix include paths if it is absolute --- winpr/libwinpr/CMakeLists.txt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/winpr/libwinpr/CMakeLists.txt b/winpr/libwinpr/CMakeLists.txt index 6eb03f341..ef41607b1 100644 --- a/winpr/libwinpr/CMakeLists.txt +++ b/winpr/libwinpr/CMakeLists.txt @@ -43,12 +43,16 @@ endmacro() macro (winpr_include_directory_add) file (RELATIVE_PATH _relPath "${WINPR_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") - foreach (_src ${ARGN}) - if (_relPath) - list (APPEND WINPR_INCLUDES "${_relPath}/${_src}") - else() - list (APPEND WINPR_INCLUDES "${_src}") - endif() + 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) From 3fce288c6624383d58ccf82bfb38e4beb262a333 Mon Sep 17 00:00:00 2001 From: Hardening Date: Thu, 10 Jul 2014 23:35:11 +0200 Subject: [PATCH 14/55] Fix unclean SSL disconnection This patch prevent an infinite loop when the remote peer disconnect the socket without cleanly closing the SSL connection. --- libfreerdp/core/tcp.c | 32 ++++++++++++++++++-------------- libfreerdp/crypto/tls.c | 3 ++- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/libfreerdp/core/tcp.c b/libfreerdp/core/tcp.c index 245d3b1b9..314704928 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; } diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 9075f1e59..da0a0cc93 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -152,7 +152,8 @@ static int bio_rdp_tls_read(BIO* bio, char* buf, int size) break; case SSL_ERROR_SYSCALL: - status = 0; + BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); + status = -1; break; } } From ad3255354d0f523e1cc4338ff002b1db0b6afb07 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 29 Apr 2014 09:42:18 +0200 Subject: [PATCH 15/55] Added WITH_LIBRARY_VERSIONING, allowing to build shared libraries without SOVERSION information. (required by Android) --- CMakeLists.txt | 3 +++ channels/server/CMakeLists.txt | 5 ++++- channels/tsmf/client/CMakeLists.txt | 2 +- client/Windows/CMakeLists.txt | 5 ++++- client/X11/CMakeLists.txt | 5 ++++- client/common/CMakeLists.txt | 5 ++++- libfreerdp/CMakeLists.txt | 5 ++++- libfreerdp/cache/CMakeLists.txt | 5 ++++- libfreerdp/codec/CMakeLists.txt | 5 ++++- libfreerdp/common/CMakeLists.txt | 9 ++++++--- libfreerdp/core/CMakeLists.txt | 5 ++++- libfreerdp/crypto/CMakeLists.txt | 5 ++++- libfreerdp/gdi/CMakeLists.txt | 5 ++++- libfreerdp/locale/CMakeLists.txt | 5 ++++- libfreerdp/primitives/CMakeLists.txt | 5 ++++- libfreerdp/rail/CMakeLists.txt | 5 ++++- libfreerdp/utils/CMakeLists.txt | 5 ++++- server/Windows/CMakeLists.txt | 5 ++++- server/X11/CMakeLists.txt | 5 ++++- server/common/CMakeLists.txt | 5 ++++- winpr/libwinpr/CMakeLists.txt | 5 ++++- winpr/libwinpr/credentials/CMakeLists.txt | 1 + winpr/libwinpr/crypto/CMakeLists.txt | 2 +- winpr/libwinpr/handle/CMakeLists.txt | 3 ++- winpr/libwinpr/pool/CMakeLists.txt | 1 + winpr/libwinpr/smartcard/CMakeLists.txt | 1 + winpr/libwinpr/sspi/CMakeLists.txt | 2 -- winpr/libwinpr/sysinfo/CMakeLists.txt | 1 + winpr/libwinpr/utils/CMakeLists.txt | 1 + 29 files changed, 90 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f58e27d9..a8ffdf796 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,7 @@ include(GNUInstallDirsWrapper) include(CMakePackageConfigHelpers) # Soname versioning +set(WITH_LIBRARY_VERSIONING "1") set(FREERDP_VERSION_MAJOR "1") set(FREERDP_VERSION_MINOR "2") set(FREERDP_VERSION_REVISION "0") @@ -301,6 +302,8 @@ endif(APPLE) # Android if(ANDROID) + set(WITH_LIBRARY_VERSIONING "") + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") add_definitions(-DNDK_DEBUG=1) diff --git a/channels/server/CMakeLists.txt b/channels/server/CMakeLists.txt index 67a2c4cca..63e0f3dc6 100644 --- a/channels/server/CMakeLists.txt +++ b/channels/server/CMakeLists.txt @@ -30,7 +30,10 @@ 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} 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/client/Windows/CMakeLists.txt b/client/Windows/CMakeLists.txt index e1bc74773..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}) diff --git a/client/X11/CMakeLists.txt b/client/X11/CMakeLists.txt index d33e90ccb..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}) diff --git a/client/common/CMakeLists.txt b/client/common/CMakeLists.txt index 47bb460f8..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}) 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/codec/CMakeLists.txt b/libfreerdp/codec/CMakeLists.txt index ee2c7c4b3..c29d394b9 100644 --- a/libfreerdp/codec/CMakeLists.txt +++ b/libfreerdp/codec/CMakeLists.txt @@ -98,7 +98,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 ${FREERDP_JPEG_LIBS} diff --git a/libfreerdp/common/CMakeLists.txt b/libfreerdp/common/CMakeLists.txt index 2b0c40498..2bdca84a3 100644 --- a/libfreerdp/common/CMakeLists.txt +++ b/libfreerdp/common/CMakeLists.txt @@ -30,8 +30,11 @@ 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}) @@ -40,7 +43,7 @@ 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/core/CMakeLists.txt b/libfreerdp/core/CMakeLists.txt index de23cee38..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) diff --git a/libfreerdp/crypto/CMakeLists.txt b/libfreerdp/crypto/CMakeLists.txt index a22cc5880..b307cb3a6 100644 --- a/libfreerdp/crypto/CMakeLists.txt +++ b/libfreerdp/crypto/CMakeLists.txt @@ -36,7 +36,10 @@ 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}) 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/locale/CMakeLists.txt b/libfreerdp/locale/CMakeLists.txt index 8cbb33dfb..67f2145c1 100644 --- a/libfreerdp/locale/CMakeLists.txt +++ b/libfreerdp/locale/CMakeLists.txt @@ -75,7 +75,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/primitives/CMakeLists.txt b/libfreerdp/primitives/CMakeLists.txt index 95868ca61..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}) 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 0728452e5..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} 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/X11/CMakeLists.txt b/server/X11/CMakeLists.txt index 5aeb9ec9d..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}) 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/libwinpr/CMakeLists.txt b/winpr/libwinpr/CMakeLists.txt index ef41607b1..0b3c5d7dc 100644 --- a/winpr/libwinpr/CMakeLists.txt +++ b/winpr/libwinpr/CMakeLists.txt @@ -96,7 +96,10 @@ list(REMOVE_DUPLICATES WINPR_INCLUDES) include_directories(${WINPR_INCLUDES}) add_library(${MODULE_NAME} ${WINPR_SRCS}) set_target_properties(${MODULE_NAME} PROPERTIES LINKER_LANGUAGE C) -set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") +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) diff --git a/winpr/libwinpr/credentials/CMakeLists.txt b/winpr/libwinpr/credentials/CMakeLists.txt index d8ad94942..80140c42b 100644 --- a/winpr/libwinpr/credentials/CMakeLists.txt +++ b/winpr/libwinpr/credentials/CMakeLists.txt @@ -16,3 +16,4 @@ # limitations under the License. winpr_module_add(credentials.c) + diff --git a/winpr/libwinpr/crypto/CMakeLists.txt b/winpr/libwinpr/crypto/CMakeLists.txt index a927909cc..f2ee2418b 100644 --- a/winpr/libwinpr/crypto/CMakeLists.txt +++ b/winpr/libwinpr/crypto/CMakeLists.txt @@ -16,7 +16,7 @@ # limitations under the License. winpr_module_add( - crypto.c + crypto.c crypto.h cert.c) diff --git a/winpr/libwinpr/handle/CMakeLists.txt b/winpr/libwinpr/handle/CMakeLists.txt index c2322174e..d58ff5a37 100644 --- a/winpr/libwinpr/handle/CMakeLists.txt +++ b/winpr/libwinpr/handle/CMakeLists.txt @@ -14,8 +14,9 @@ # 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. -winpr_module_add(handle.c handle.h) +winpr_module_add(handle.c handle.h) + if(${CMAKE_SYSTEM_NAME} MATCHES SunOS) winpr_library_add(rt) endif() diff --git a/winpr/libwinpr/pool/CMakeLists.txt b/winpr/libwinpr/pool/CMakeLists.txt index d4eff4080..fd70d7301 100644 --- a/winpr/libwinpr/pool/CMakeLists.txt +++ b/winpr/libwinpr/pool/CMakeLists.txt @@ -39,3 +39,4 @@ if(BUILD_TESTING) add_subdirectory(test) endif() + diff --git a/winpr/libwinpr/smartcard/CMakeLists.txt b/winpr/libwinpr/smartcard/CMakeLists.txt index 00bf37491..3f59e7392 100644 --- a/winpr/libwinpr/smartcard/CMakeLists.txt +++ b/winpr/libwinpr/smartcard/CMakeLists.txt @@ -49,3 +49,4 @@ endif() if(BUILD_TESTING) add_subdirectory(test) endif() + diff --git a/winpr/libwinpr/sspi/CMakeLists.txt b/winpr/libwinpr/sspi/CMakeLists.txt index 40b8da011..e3e09072e 100644 --- a/winpr/libwinpr/sspi/CMakeLists.txt +++ b/winpr/libwinpr/sspi/CMakeLists.txt @@ -54,11 +54,9 @@ winpr_module_add(${${MODULE_PREFIX}_NTLM_SRCS} ${${MODULE_PREFIX}_SCHANNEL_SRCS} ${${MODULE_PREFIX}_SRCS}) - winpr_include_directory_add(${ZLIB_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR}) - winpr_library_add(${ZLIB_LIBRARIES} ${OPENSSL_LIBRARIES}) diff --git a/winpr/libwinpr/sysinfo/CMakeLists.txt b/winpr/libwinpr/sysinfo/CMakeLists.txt index 8f4e79bd0..bc64f8751 100644 --- a/winpr/libwinpr/sysinfo/CMakeLists.txt +++ b/winpr/libwinpr/sysinfo/CMakeLists.txt @@ -24,3 +24,4 @@ endif() if(BUILD_TESTING) add_subdirectory(test) endif() + diff --git a/winpr/libwinpr/utils/CMakeLists.txt b/winpr/libwinpr/utils/CMakeLists.txt index 21cddb632..9756a61f4 100644 --- a/winpr/libwinpr/utils/CMakeLists.txt +++ b/winpr/libwinpr/utils/CMakeLists.txt @@ -101,3 +101,4 @@ endif() if(BUILD_TESTING) add_subdirectory(test) endif() + From f05e872009d8340d8aedbabce4e8bef1fd6175d0 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Fri, 11 Jul 2014 13:07:36 +0200 Subject: [PATCH 16/55] Now usin ON/OFF to set library versioning. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a8ffdf796..ecd8a7c11 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,7 +59,7 @@ include(GNUInstallDirsWrapper) include(CMakePackageConfigHelpers) # Soname versioning -set(WITH_LIBRARY_VERSIONING "1") +set(WITH_LIBRARY_VERSIONING "ON") set(FREERDP_VERSION_MAJOR "1") set(FREERDP_VERSION_MINOR "2") set(FREERDP_VERSION_REVISION "0") @@ -302,7 +302,7 @@ endif(APPLE) # Android if(ANDROID) - set(WITH_LIBRARY_VERSIONING "") + set(WITH_LIBRARY_VERSIONING "OFF") if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") add_definitions(-DNDK_DEBUG=1) From f00a3d95d9edd5727c218cabe52e7f1485e49566 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Fri, 11 Jul 2014 18:49:20 +0200 Subject: [PATCH 17/55] Fixed wrong visibility setting of bookmark list view --- .../Android/FreeRDPCore/res/layout/home.xml | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) 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 From ba296e5f92ea3ffd2b3206dba6699d6c7db4ed74 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Fri, 11 Jul 2014 18:49:40 +0200 Subject: [PATCH 18/55] Removed unused code. --- .../presentation/HomeActivity.java | 42 +++++-------------- 1 file changed, 10 insertions(+), 32 deletions(-) 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) { From 0e61cd296c6005d25cdf702211bb96beda6484cb Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Sun, 13 Jul 2014 13:35:11 +0200 Subject: [PATCH 19/55] * Fixed android setup script, if run as update. (git fetch instead of git pull) * Checking return of openssl build now and inform about build errors. --- scripts/android_setup_build_env.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 From a640428905728e91eb3fee2ef69f841f55e12404 Mon Sep 17 00:00:00 2001 From: Gerry Reno Date: Sun, 13 Jul 2014 08:34:48 -0400 Subject: [PATCH 20/55] cmake: android toolchain update to latest upstream AndroidToolchain.cmake: updated from https://github.com/taka-no-me/android-cmake/raw/master/android.toolchain.cmake --- cmake/AndroidToolchain.cmake | 78 ++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/cmake/AndroidToolchain.cmake b/cmake/AndroidToolchain.cmake index d31eaaccd..dfbd1218c 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 ) @@ -317,16 +326,10 @@ set( CMAKE_SYSTEM_NAME Linux ) # this one not so much set( CMAKE_SYSTEM_VERSION 1 ) -# Android SDK - -if (NOT DEFINED ANDROID_SDK) - set(ANDROID_SDK "$ENV{ANDROID_SDK}") -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 ) @@ -344,7 +347,7 @@ set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armea set( ANDROID_SUPPORTED_ABIS_x86 "x86" ) set( ANDROID_SUPPORTED_ABIS_mipsel "mips" ) -set( ANDROID_DEFAULT_NDK_API_LEVEL 9 ) +set( ANDROID_DEFAULT_NDK_API_LEVEL 8 ) set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 9 ) set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 9 ) @@ -470,10 +473,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 +496,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 +1141,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 +1506,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 +1559,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 +1679,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 +1746,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 From 9fa451428b77ce47301efd170b4a7ec760185e41 Mon Sep 17 00:00:00 2001 From: Gerry Reno Date: Sun, 13 Jul 2014 08:40:58 -0400 Subject: [PATCH 21/55] cmake: android toolchain set ANDROID_DEFAULT_NDK_API_LEVEL 9 --- cmake/AndroidToolchain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/AndroidToolchain.cmake b/cmake/AndroidToolchain.cmake index dfbd1218c..516f23f4b 100644 --- a/cmake/AndroidToolchain.cmake +++ b/cmake/AndroidToolchain.cmake @@ -347,7 +347,7 @@ set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armea set( ANDROID_SUPPORTED_ABIS_x86 "x86" ) set( ANDROID_SUPPORTED_ABIS_mipsel "mips" ) -set( ANDROID_DEFAULT_NDK_API_LEVEL 8 ) +set( ANDROID_DEFAULT_NDK_API_LEVEL 9 ) set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 9 ) set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 9 ) From d06ed2fa2f659e88967ee24e440c6a1d50faad65 Mon Sep 17 00:00:00 2001 From: Gerry Reno Date: Sun, 13 Jul 2014 14:54:48 -0400 Subject: [PATCH 22/55] android CMakeLists.txt: added support for both 'support' and 'compatibility' in support library path for v7 appcompat supports path styles: $ANDROID_SDK/extras/android/support/v7/appcompat $ANDROID_SDK/extras/android/compatibility/v7/appcompat --- client/Android/CMakeLists.txt | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/client/Android/CMakeLists.txt b/client/Android/CMakeLists.txt index 51521320a..94a29d036 100644 --- a/client/Android/CMakeLists.txt +++ b/client/Android/CMakeLists.txt @@ -62,10 +62,19 @@ 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} + ) +endif() add_subdirectory(FreeRDPCore) add_subdirectory(aFreeRDP) From 6ecb8131a4f5f6fd77b544075dc43c55515633e8 Mon Sep 17 00:00:00 2001 From: Gerry Reno Date: Mon, 14 Jul 2014 07:58:32 -0400 Subject: [PATCH 23/55] android toolchain: add back setting of ANDROID_SDK --- cmake/AndroidToolchain.cmake | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmake/AndroidToolchain.cmake b/cmake/AndroidToolchain.cmake index 516f23f4b..26d8ac3e7 100644 --- a/cmake/AndroidToolchain.cmake +++ b/cmake/AndroidToolchain.cmake @@ -326,6 +326,12 @@ set( CMAKE_SYSTEM_NAME Linux ) # this one not so much set( CMAKE_SYSTEM_VERSION 1 ) +# Android SDK + +if (NOT DEFINED ANDROID_SDK) + set(ANDROID_SDK "$ENV{ANDROID_SDK}") +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." ) From 29cb8680ce7bd378d3a73041a0eb1bcb1c720ac3 Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Mon, 14 Jul 2014 20:00:38 +0800 Subject: [PATCH 24/55] server: allow partial channel read (fix rdpsnd). --- channels/audin/server/audin.c | 18 +++----- channels/cliprdr/server/cliprdr_main.c | 15 ++++--- channels/drdynvc/server/drdynvc_main.c | 15 ++++--- channels/encomsp/server/encomsp_main.c | 15 ++++--- channels/rdpdr/server/rdpdr_main.c | 15 ++++--- channels/rdpsnd/server/rdpsnd_main.c | 2 +- libfreerdp/core/server.c | 57 +++++++++++++++++--------- server/Windows/wf_rdpsnd.c | 2 +- 8 files changed, 72 insertions(+), 67 deletions(-) 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/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/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/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/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/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/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/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); From 3bd1f4898d65af033253319d427c8ef32be4cec3 Mon Sep 17 00:00:00 2001 From: Gerry Reno Date: Mon, 14 Jul 2014 08:53:20 -0400 Subject: [PATCH 25/55] android CMakeLists.txt: added else clause to test for v7 appcompat --- client/Android/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/Android/CMakeLists.txt b/client/Android/CMakeLists.txt index 94a29d036..33a84ec1b 100644 --- a/client/Android/CMakeLists.txt +++ b/client/Android/CMakeLists.txt @@ -74,6 +74,8 @@ elseif(EXISTS "${compatibilitydir}" AND IS_DIRECTORY "${compatibilitydir}") 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) From 4370c26e0d06d1d51a5ac6ec992360270f03cf04 Mon Sep 17 00:00:00 2001 From: Mike McDonald Date: Mon, 14 Jul 2014 09:59:57 -0400 Subject: [PATCH 26/55] Added the ability to decode H.264 frames using libavcodec and refactored code to make it a little cleaner. --- include/freerdp/codec/h264.h | 18 ++ libfreerdp/codec/CMakeLists.txt | 10 +- libfreerdp/codec/h264.c | 535 +++++++++++++++++++++----------- 3 files changed, 376 insertions(+), 187 deletions(-) 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/libfreerdp/codec/CMakeLists.txt b/libfreerdp/codec/CMakeLists.txt index 17f23d99f..36bcbc041 100644 --- a/libfreerdp/codec/CMakeLists.txt +++ b/libfreerdp/codec/CMakeLists.txt @@ -93,6 +93,13 @@ if(WITH_OPENH264) set(FREERDP_OPENH264_LIBS ${OPENH264_LIBRARIES}) 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} @@ -102,7 +109,8 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVER 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 diff --git a/libfreerdp/codec/h264.c b/libfreerdp/codec/h264.c index c1a2be91c..c407b6238 100644 --- a/libfreerdp/codec/h264.c +++ b/libfreerdp/codec/h264.c @@ -30,7 +30,6 @@ #define USE_GRAY_SCALE 0 #define USE_UPCONVERT 0 -#define USE_TRACE 1 static BYTE clip(int x) { @@ -103,7 +102,7 @@ static UINT32 YUV_to_RGB(BYTE Y, BYTE U, BYTE V) } #if USE_UPCONVERT -static BYTE* convert_420_to_444(BYTE* chroma420, int chroma420Width, int chroma420Height, int chroma420Stride) +static BYTE* h264_convert_420_to_444(BYTE* chroma420, int chroma420Width, int chroma420Height, int chroma420Stride) { BYTE *chroma444, *src, *dst; int chroma444Width; @@ -153,16 +152,47 @@ static BYTE* convert_420_to_444(BYTE* chroma420, int chroma420Width, int chroma4 } #endif -#if USE_TRACE -static void trace_callback(H264_CONTEXT* h264, int level, const char* message) -{ - printf("%d - %s\n", level, message); -} -#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]; + + snprintf(buf, sizeof(buf), "/tmp/wlog/bs_%d.h264", g_H264FrameId); + fp = fopen(buf, "wb"); + fwrite(data, 1, size, fp); + fflush(fp); + fclose(fp); +} + +static void h264_dump_yuv_data(BYTE* yuv[], int width, int height, int stride[]) +{ + FILE* fp; + BYTE* srcp; + char buf[4096]; + int j; + + snprintf(buf, sizeof(buf), "/tmp/wlog/H264_%d.ppm", g_H264FrameId); + fp = fopen(buf, "wb"); + fwrite("P5\n", 1, 3, fp); + snprintf(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; @@ -176,6 +206,7 @@ int h264_prepare_rgb_buffer(H264_CONTEXT* h264, int width, int height) { h264->size = size; h264->data = (BYTE*) realloc(h264->data, h264->size); + memset(h264->data, 0, h264->size); } if (!h264->data) @@ -190,6 +221,17 @@ int freerdp_image_copy_yuv420p_to_xrgb(BYTE* pDstData, int nDstStep, int nXDst, 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; @@ -197,16 +239,16 @@ int freerdp_image_copy_yuv420p_to_xrgb(BYTE* pDstData, int nDstStep, int nXDst, for (y = 0; y < nHeight; y++) { - pU = pSrcData[1] + ((nYSrc + y) >> 1) * nSrcStep[1]; - pV = pSrcData[2] + ((nYSrc + y) >> 1) * nSrcStep[1]; + 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) >> 1]; - V = pV[(nXSrc + x) >> 1]; + U = pU[(nXSrc + x) >> shift]; + V = pV[(nXSrc + x) >> shift]; *((UINT32*) pDstPixel8) = YUV_to_RGB(Y, U, V); @@ -218,6 +260,11 @@ int freerdp_image_copy_yuv420p_to_xrgb(BYTE* pDstData, int nDstStep, int nXDst, pY += (nSrcStep[0] - nWidth); } +#if USE_UPCONVERT + free(pSrcData[1]); + free(pSrcData[2]); +#endif + return 1; } @@ -269,63 +316,34 @@ BYTE* h264_strip_nal_unit_au_delimiter(BYTE* pSrcData, UINT32* pSrcSize) return pSrcData; } -int h264_decompress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSize, - BYTE** ppDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight) -{ + + +/************************************************* + * + * OpenH264 Implementation + * + ************************************************/ + #ifdef WITH_OPENH264 + +static BOOL g_openh264_trace_enabled = TRUE; + +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; - UINT32 UncompressedSize; - BYTE* pDstData; BYTE* pYUVData[3]; - BYTE* pY; - BYTE* pU; - BYTE* pV; - int Y, U, V; - int i, j; - if (!h264 || !h264->pDecoder) + if (!h264->pDecoder) return -1; - pSrcData = h264_strip_nal_unit_au_delimiter(pSrcData, &SrcSize); - -#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) - { - FILE* fp; - char buf[4096]; - - snprintf(buf, sizeof(buf), "/tmp/wlog/bs_%d.h264", g_H264FrameId); - fp = fopen(buf, "wb"); - fwrite(pSrcData, 1, SrcSize, fp); - fflush(fp); - fclose(fp); - } - /* * Decompress the image. The RDP host only seems to send I420 format. */ @@ -366,33 +384,9 @@ int h264_decompress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSize, /* Convert I420 (same as IYUV) to XRGB. */ - pY = pYUVData[0]; - pU = pYUVData[1]; - pV = pYUVData[2]; - if (g_H264DumpFrames) { - FILE* fp; - BYTE* srcp; - char buf[4096]; - - snprintf(buf, sizeof(buf), "/tmp/wlog/H264_%d.ppm", g_H264FrameId); - fp = fopen(buf, "wb"); - fwrite("P5\n", 1, 3, fp); - snprintf(buf, sizeof(buf), "%d %d\n", pSystemBuffer->iWidth, pSystemBuffer->iHeight); - fwrite(buf, 1, strlen(buf), fp); - fwrite("255\n", 1, 4, fp); - - srcp = pY; - - for (j = 0; j < pSystemBuffer->iHeight; j++) - { - fwrite(srcp, 1, pSystemBuffer->iWidth, fp); - srcp += pSystemBuffer->iStride[0]; - } - - fflush(fp); - fclose(fp); + h264_dump_yuv_data(pYUVData, pSystemBuffer->iWidth, pSystemBuffer->iHeight, pSystemBuffer->iStride); } g_H264FrameId++; @@ -404,41 +398,269 @@ int h264_decompress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSize, h264->width, h264->height, pYUVData, pSystemBuffer->iStride, 0, 0); return 1; +} -#if USE_UPCONVERT - /* Convert 4:2:0 YUV to 4:4:4 YUV. */ - pU = convert_420_to_444(pU, pSystemBuffer->iWidth / 2, pSystemBuffer->iHeight / 2, pSystemBuffer->iStride[1]); - pV = convert_420_to_444(pV, pSystemBuffer->iWidth / 2, pSystemBuffer->iHeight / 2, pSystemBuffer->iStride[1]); -#endif - - for (j = 0; j < nHeight; j++) +static void openh264_free(H264_CONTEXT* h264) +{ + if (h264->pDecoder) { - BYTE *pXRGB = pDstData + ((nYDst + j) * nDstStep) + (nXDst * 4); - int y = nYDst + j; + (*h264->pDecoder)->Uninitialize(h264->pDecoder); + WelsDestroyDecoder(h264->pDecoder); + h264->pDecoder = NULL; + } +} - for (i = 0; i < nWidth; i++) +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) { - int x = nXDst + i; + printf("Failed to set trace level option on OpenH264 decoder (status=%ld)\n", status); + } - Y = pY[(y * pSystemBuffer->iStride[0]) + x]; -#if USE_UPCONVERT - U = pU[(y * pSystemBuffer->iWidth) + x]; - V = pV[(y * pSystemBuffer->iWidth) + x]; -#else - U = pU[(y/2) * pSystemBuffer->iStride[1] + (x/2)]; - V = pV[(y/2) * pSystemBuffer->iStride[1] + (x/2)]; -#endif + 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); + } - *(UINT32*)pXRGB = YUV_to_RGB(Y, U, V); - - pXRGB += 4; + 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); } } -#if USE_UPCONVERT - free(pU); - free(pV); + 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; @@ -451,7 +673,6 @@ int h264_compress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppD void h264_context_reset(H264_CONTEXT* h264) { - } H264_CONTEXT* h264_context_new(BOOL Compressor) @@ -468,64 +689,18 @@ H264_CONTEXT* h264_context_new(BOOL Compressor) return NULL; #ifdef WITH_OPENH264 + if (!openh264_init(h264)) { - static EVideoFormatType videoFormat = videoFormatI420; - -#if USE_TRACE - static int traceLevel = WELS_LOG_DEBUG; - static WelsTraceCallback traceCallback = (WelsTraceCallback) trace_callback; + free(h264); + return NULL; + } #endif - 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 USE_TRACE - 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); - } -#endif +#ifdef WITH_LIBAVCODEC + if (!libavcodec_init(h264)) + { + free(h264); + return NULL; } #endif @@ -533,18 +708,6 @@ H264_CONTEXT* h264_context_new(BOOL Compressor) } return h264; - -EXCEPTION: -#ifdef WITH_OPENH264 - if (h264->pDecoder) - { - WelsDestroyDecoder(h264->pDecoder); - } -#endif - - free(h264); - - return NULL; } void h264_context_free(H264_CONTEXT* h264) @@ -554,11 +717,11 @@ void h264_context_free(H264_CONTEXT* h264) free(h264->data); #ifdef WITH_OPENH264 - if (h264->pDecoder) - { - (*h264->pDecoder)->Uninitialize(h264->pDecoder); - WelsDestroyDecoder(h264->pDecoder); - } + openh264_free(h264); +#endif + +#ifdef WITH_LIBAVCODEC + libavcodec_free(h264); #endif free(h264); From 8df60ecbe4551996c9908b67eb2443a441d17a12 Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Tue, 15 Jul 2014 11:36:35 +0800 Subject: [PATCH 27/55] tls: fix some error handling. --- libfreerdp/crypto/tls.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index da0a0cc93..967bf1586 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -51,6 +51,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 +71,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 +89,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 +112,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 +132,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,8 +163,16 @@ static int bio_rdp_tls_read(BIO* bio, char* buf, int size) break; case SSL_ERROR_SYSCALL: - BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); - status = -1; + 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; } } From 0ba59c842dce43ea547d4c6078a8b7f3d181fb24 Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Tue, 15 Jul 2014 11:42:12 +0800 Subject: [PATCH 28/55] echo: add server echo channel api. --- channels/echo/CMakeLists.txt | 3 + channels/echo/ChannelOptions.cmake | 2 +- channels/echo/server/CMakeLists.txt | 36 +++++ channels/echo/server/echo_main.c | 233 ++++++++++++++++++++++++++++ channels/server/channels.c | 4 + include/freerdp/server/echo.h | 85 ++++++++++ 6 files changed, 362 insertions(+), 1 deletion(-) create mode 100644 channels/echo/server/CMakeLists.txt create mode 100644 channels/echo/server/echo_main.c create mode 100644 include/freerdp/server/echo.h 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/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/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/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 */ From 8482eed323bf92e674159fc3db4bcc4ded9466da Mon Sep 17 00:00:00 2001 From: Norbert Federa Date: Wed, 16 Jul 2014 15:38:10 +0200 Subject: [PATCH 29/55] core: addd missing PlaySound server callback --- libfreerdp/core/update.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) 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; From 0fb3bf1dfd5da5deee33ea952566bee6ff667074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 16 Jul 2014 17:13:02 -0400 Subject: [PATCH 30/55] winpr/tools/makecert: add pfx support --- winpr/tools/makecert/makecert.c | 95 ++++++++++++++++++++++++++++++--- 1 file changed, 89 insertions(+), 6 deletions(-) diff --git a/winpr/tools/makecert/makecert.c b/winpr/tools/makecert/makecert.c index ce775891c..b38570740 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,10 +44,17 @@ 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* default_name; }; @@ -63,6 +72,12 @@ 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" + }, + { "p", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, + "Specify certificate export password" + }, /* Basic Options */ @@ -346,6 +361,37 @@ 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, "p") + { + if (!(arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT)) + continue; + + context->password = _strdup(arg->Value); + } CommandLineSwitchDefault(arg) { @@ -383,7 +429,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 +446,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 +487,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; @@ -593,7 +672,9 @@ 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); + + if (context->crtFormat) + makecert_context_output_private_key_file(context, NULL); } return 0; @@ -603,11 +684,11 @@ 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; } return context; @@ -617,6 +698,8 @@ void makecert_context_free(MAKECERT_CONTEXT* context) { if (context) { + free(context->password); + X509_free(context->x509); EVP_PKEY_free(context->pkey); From 625f7c3c22bb94e0908cd96a12974ec0f67685a5 Mon Sep 17 00:00:00 2001 From: Daniel Bungert Date: Thu, 17 Jul 2014 06:59:06 -0600 Subject: [PATCH 31/55] Add arguments for managing tls ciphers & netmon This adds 2 arguments: /tls-ciphers List of permitted openssl ciphers - see ciphers(1) /tls-ciphers-netmon Use tls ciphers that netmon can parse With KB2919355, client/server negotiate the use of TLS cipher TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, which works fine except that netmon can't parse it. By adding commandline /tls-ciphers-netmon, we restrict the available ciphers to a list that netmon can deal with. Also adds /tls-ciphers, which accepts a string arg, for further customization. --- client/common/cmdline.c | 10 ++++++++++ include/freerdp/settings.h | 3 ++- libfreerdp/core/settings.c | 1 + libfreerdp/crypto/tls.c | 7 +++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 18c180c87..44c153779 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" }, @@ -1753,6 +1755,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); diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 7fa967525..dd4b49d93 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -974,7 +974,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 */ diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 04f92caa9..124c6d2a0 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -825,6 +825,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/crypto/tls.c b/libfreerdp/crypto/tls.c index 967bf1586..b22e94a0e 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -591,6 +591,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) From 4f4603133e4bc8f2d94943990f825d70186a5459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 17 Jul 2014 12:02:47 -0400 Subject: [PATCH 32/55] winpr: fix build on Windows with unit tests --- winpr/libwinpr/comm/CMakeLists.txt | 2 +- winpr/libwinpr/comm/test/TestGetCommState.c | 3 ++- winpr/libwinpr/comm/test/TestHandflow.c | 3 +++ winpr/libwinpr/comm/test/TestSerialChars.c | 3 +++ winpr/libwinpr/comm/test/TestTimeouts.c | 3 +++ winpr/libwinpr/crypto/CMakeLists.txt | 4 ++++ 6 files changed, 16 insertions(+), 2 deletions(-) diff --git a/winpr/libwinpr/comm/CMakeLists.txt b/winpr/libwinpr/comm/CMakeLists.txt index ffcc8112d..58ff2fe1d 100644 --- a/winpr/libwinpr/comm/CMakeLists.txt +++ b/winpr/libwinpr/comm/CMakeLists.txt @@ -33,6 +33,6 @@ set(${MODULE_PREFIX}_SRCS winpr_module_add(${${MODULE_PREFIX}_SRCS}) -if(BUILD_TESTING) +if(BUILD_TESTING AND UNIX AND NOT WIN32) add_subdirectory(test) endif() 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/crypto/CMakeLists.txt b/winpr/libwinpr/crypto/CMakeLists.txt index f2ee2418b..c81b8f657 100644 --- a/winpr/libwinpr/crypto/CMakeLists.txt +++ b/winpr/libwinpr/crypto/CMakeLists.txt @@ -20,6 +20,10 @@ winpr_module_add( crypto.h cert.c) +if(WIN32) + winpr_library_add(crypt32) +endif() + if(BUILD_TESTING) add_subdirectory(test) endif() From e6f4754ed350053ed200dcd3374b9c071c953113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 17 Jul 2014 15:11:04 -0400 Subject: [PATCH 33/55] winpr: improve windows builds across visual studio versions and toolsets --- CMakeLists.txt | 16 +++++++++++++++- include/freerdp/channels/rdpdr.h | 4 ++++ winpr/include/winpr/interlocked.h | 8 ++++++++ winpr/include/winpr/pool.h | 12 ++++++++++-- winpr/include/winpr/synch.h | 2 +- winpr/libwinpr/interlocked/interlocked.c | 6 ++---- winpr/libwinpr/pool/callback.c | 4 ++++ winpr/libwinpr/pool/callback_cleanup.c | 4 +++- winpr/libwinpr/pool/callback_environment.c | 8 ++++++++ winpr/libwinpr/pool/cleanup_group.c | 3 +++ winpr/libwinpr/pool/io.c | 3 +++ winpr/libwinpr/pool/pool.c | 4 ++++ winpr/libwinpr/pool/synch.c | 4 +++- winpr/libwinpr/pool/timer.c | 4 +++- winpr/libwinpr/pool/work.c | 4 ++++ winpr/libwinpr/synch/critical.c | 2 +- 16 files changed, 76 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ecd8a7c11..1a19ad718 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -233,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) 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/winpr/include/winpr/interlocked.h b/winpr/include/winpr/interlocked.h index e96a2b62f..8e27f83cc 100644 --- a/winpr/include/winpr/interlocked.h +++ b/winpr/include/winpr/interlocked.h @@ -156,8 +156,16 @@ WINPR_API LONG InterlockedCompareExchange(LONG volatile *Destination, LONG Excha #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..c9b1727b3 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) && (_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/synch.h b/winpr/include/winpr/synch.h index 00b979a69..75213a8fe 100644 --- a/winpr/include/winpr/synch.h +++ b/winpr/include/winpr/synch.h @@ -297,7 +297,7 @@ 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); diff --git a/winpr/libwinpr/interlocked/interlocked.c b/winpr/libwinpr/interlocked/interlocked.c index 044c36684..13b597f8b 100644 --- a/winpr/libwinpr/interlocked/interlocked.c +++ b/winpr/libwinpr/interlocked/interlocked.c @@ -236,11 +236,11 @@ LONG InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG #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; @@ -257,8 +257,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/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/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/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); From a23d5ea527cd31876e57f104697d5fb10e75a757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 17 Jul 2014 16:47:29 -0400 Subject: [PATCH 34/55] winpr/makecert: improve command line options --- winpr/tools/makecert/makecert.c | 76 +++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/winpr/tools/makecert/makecert.c b/winpr/tools/makecert/makecert.c index b38570740..9c31c18c6 100644 --- a/winpr/tools/makecert/makecert.c +++ b/winpr/tools/makecert/makecert.c @@ -56,7 +56,12 @@ struct _MAKECERT_CONTEXT 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[] = @@ -75,6 +80,9 @@ COMMAND_LINE_ARGUMENT_A args[] = { "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" }, @@ -169,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." }, @@ -385,6 +396,13 @@ int makecert_context_parse_arguments(MAKECERT_CONTEXT* context, int argc, char** 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)) @@ -392,6 +410,27 @@ int makecert_context_parse_arguments(MAKECERT_CONTEXT* context, int argc, char** 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) { @@ -420,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 @@ -535,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); @@ -580,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); @@ -614,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); @@ -671,10 +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_certificate_file(context, context->output_path); if (context->crtFormat) - makecert_context_output_private_key_file(context, NULL); + makecert_context_output_private_key_file(context, context->output_path); } return 0; @@ -689,6 +738,7 @@ MAKECERT_CONTEXT* makecert_context_new() if (context) { context->crtFormat = TRUE; + context->duration_years = 1; } return context; From 19c25cf2b49e4a8c24017b35d004cf337ce0f9f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 17 Jul 2014 17:34:51 -0400 Subject: [PATCH 35/55] winpr-pool: fix header on non-Windows --- winpr/include/winpr/pool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winpr/include/winpr/pool.h b/winpr/include/winpr/pool.h index c9b1727b3..8dc335084 100644 --- a/winpr/include/winpr/pool.h +++ b/winpr/include/winpr/pool.h @@ -120,7 +120,7 @@ typedef struct _TP_WAIT TP_WAIT, *PTP_WAIT; typedef struct _TP_IO TP_IO, *PTP_IO; -#if (defined(_WIN32) && (_WIN32_WINNT < 0x0601)) +#if !defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0601)) typedef TP_CALLBACK_ENVIRON_V1 TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON; #endif From ae1fdf6153bcd194194fcc1ea74c43afe866e9c0 Mon Sep 17 00:00:00 2001 From: Mike Gilbert Date: Sun, 20 Jul 2014 00:52:35 -0400 Subject: [PATCH 36/55] Remove execute bit from many files --- .gitignore | 0 CMakeLists.txt | 0 .../res/drawable-hdpi/sym_keyboard_delete.png | Bin .../drawable-hdpi/sym_keyboard_feedback_delete.png | Bin .../drawable-hdpi/sym_keyboard_feedback_return.png | Bin .../res/drawable-hdpi/sym_keyboard_return.png | Bin .../FreeRDPCore/res/drawable-mdpi/icon_star_off.png | Bin .../FreeRDPCore/res/drawable-mdpi/icon_star_on.png | Bin .../res/drawable/sym_keyboard_arrows.png | Bin .../res/drawable/sym_keyboard_arrows_black.png | Bin .../res/drawable/sym_keyboard_down_arrow.png | Bin .../res/drawable/sym_keyboard_down_arrow_black.png | Bin .../res/drawable/sym_keyboard_left_arrow.png | Bin .../res/drawable/sym_keyboard_left_arrow_black.png | Bin .../FreeRDPCore/res/drawable/sym_keyboard_menu.png | Bin .../res/drawable/sym_keyboard_menu_black.png | Bin .../res/drawable/sym_keyboard_right_arrow.png | Bin .../res/drawable/sym_keyboard_right_arrow_black.png | Bin .../res/drawable/sym_keyboard_up_arrow.png | Bin .../res/drawable/sym_keyboard_up_arrow_black.png | Bin .../res/drawable/sym_keyboard_winkey.png | Bin .../res/drawable/sym_keyboard_winkey_black.png | Bin .../res/drawable/touch_pointer_active.png | Bin client/Mac/CMakeLists.txt | 0 client/Mac/Credits.rtf | 0 client/Mac/MRDPView.h | 0 client/Mac/cli/MainMenu.xib | 0 client/Mac/mf_client.h | 0 client/Mac/mf_client.m | 0 client/iOS/FreeRDP/ios_freerdp_events.h | 0 client/iOS/FreeRDP/ios_freerdp_events.m | 0 client/iOS/Misc/Reachability.h | 0 client/iOS/Misc/Reachability.m | 0 client/iOS/Misc/SFHFKeychainUtils.h | 0 client/iOS/Misc/SFHFKeychainUtils.m | 0 client/iOS/Resources/Default-568h@2x.png | Bin client/iOS/Resources/Default-Landscape@2x~ipad.png | Bin client/iOS/Resources/Default-Landscape~ipad.png | Bin client/iOS/Resources/Default-Portrait@2x~ipad.png | Bin client/iOS/Resources/Default-Portrait~ipad.png | Bin client/iOS/Resources/Default.png | Bin client/iOS/Resources/Default@2x.png | Bin client/iOS/Resources/Icon-72.png | Bin client/iOS/Resources/Icon-72@2x.png | Bin client/iOS/Resources/Icon.png | Bin client/iOS/Resources/Icon@2x.png | Bin client/iOS/Resources/about_page/FreeRDP_Logo.png | Bin client/iOS/Resources/about_page/about.html | 0 client/iOS/Resources/about_page/about_phone.html | 0 client/iOS/Resources/about_page/back.jpg | Bin .../Resources/about_page/background_transparent.png | Bin client/iOS/Resources/help_page/back.jpg | Bin client/iOS/Resources/help_page/gestures.html | 0 client/iOS/Resources/help_page/gestures.png | Bin client/iOS/Resources/help_page/gestures_phone.html | 0 client/iOS/Resources/help_page/gestures_phone.png | Bin client/iOS/Resources/help_page/nav_gestures.png | Bin client/iOS/Resources/help_page/nav_toolbar.png | Bin .../iOS/Resources/help_page/nav_touch_pointer.png | Bin client/iOS/Resources/help_page/toolbar.html | 0 client/iOS/Resources/help_page/toolbar.png | Bin client/iOS/Resources/help_page/toolbar_phone.html | 0 client/iOS/Resources/help_page/toolbar_phone.png | Bin client/iOS/Resources/help_page/touch_pointer.html | 0 client/iOS/Resources/help_page/touch_pointer.png | Bin .../Resources/help_page/touch_pointer_phone.html | 0 .../iOS/Resources/help_page/touch_pointer_phone.png | Bin client/iOS/Resources/icon_accessory_star_off.png | Bin client/iOS/Resources/icon_accessory_star_on.png | Bin client/iOS/Resources/icon_key_arrow_down.png | Bin client/iOS/Resources/icon_key_arrow_left.png | Bin client/iOS/Resources/icon_key_arrow_right.png | Bin client/iOS/Resources/icon_key_arrow_up.png | Bin client/iOS/Resources/icon_key_arrows.png | Bin client/iOS/Resources/icon_key_backspace.png | Bin client/iOS/Resources/icon_key_menu.png | Bin client/iOS/Resources/icon_key_return.png | Bin client/iOS/Resources/icon_key_win.png | Bin client/iOS/Resources/keyboard_button_background.png | Bin client/iOS/Resources/tabbar_icon_about.png | Bin client/iOS/Resources/tabbar_icon_help.png | Bin client/iOS/Resources/tabbar_icon_settings.png | Bin client/iOS/Resources/toolbar_icon_disconnect.png | Bin client/iOS/Resources/toolbar_icon_extkeyboad.png | Bin client/iOS/Resources/toolbar_icon_home.png | Bin client/iOS/Resources/toolbar_icon_keyboard.png | Bin client/iOS/Resources/toolbar_icon_touchpointer.png | Bin client/iOS/Resources/toolbar_icon_win.png | Bin client/iOS/Resources/touch_pointer_active.png | Bin client/iOS/Resources/touch_pointer_default.png | Bin client/iOS/Resources/touch_pointer_extkeyboard.png | Bin client/iOS/Resources/touch_pointer_keyboard.png | Bin client/iOS/Resources/touch_pointer_lclick.png | Bin client/iOS/Resources/touch_pointer_rclick.png | Bin client/iOS/Resources/touch_pointer_reset.png | Bin client/iOS/Resources/touch_pointer_scroll.png | Bin client/iOS/Views/BlockAlertView.h | 0 client/iOS/Views/BlockAlertView.m | 0 config.h.in | 0 include/freerdp/error.h | 0 100 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 .gitignore mode change 100755 => 100644 CMakeLists.txt mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_delete.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_delete.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_return.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_return.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_off.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_on.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows_black.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow_black.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow_black.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu_black.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow_black.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow_black.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey_black.png mode change 100755 => 100644 client/Android/FreeRDPCore/res/drawable/touch_pointer_active.png mode change 100755 => 100644 client/Mac/CMakeLists.txt mode change 100755 => 100644 client/Mac/Credits.rtf mode change 100755 => 100644 client/Mac/MRDPView.h mode change 100755 => 100644 client/Mac/cli/MainMenu.xib mode change 100755 => 100644 client/Mac/mf_client.h mode change 100755 => 100644 client/Mac/mf_client.m mode change 100755 => 100644 client/iOS/FreeRDP/ios_freerdp_events.h mode change 100755 => 100644 client/iOS/FreeRDP/ios_freerdp_events.m mode change 100755 => 100644 client/iOS/Misc/Reachability.h mode change 100755 => 100644 client/iOS/Misc/Reachability.m mode change 100755 => 100644 client/iOS/Misc/SFHFKeychainUtils.h mode change 100755 => 100644 client/iOS/Misc/SFHFKeychainUtils.m mode change 100755 => 100644 client/iOS/Resources/Default-568h@2x.png mode change 100755 => 100644 client/iOS/Resources/Default-Landscape@2x~ipad.png mode change 100755 => 100644 client/iOS/Resources/Default-Landscape~ipad.png mode change 100755 => 100644 client/iOS/Resources/Default-Portrait@2x~ipad.png mode change 100755 => 100644 client/iOS/Resources/Default-Portrait~ipad.png mode change 100755 => 100644 client/iOS/Resources/Default.png mode change 100755 => 100644 client/iOS/Resources/Default@2x.png mode change 100755 => 100644 client/iOS/Resources/Icon-72.png mode change 100755 => 100644 client/iOS/Resources/Icon-72@2x.png mode change 100755 => 100644 client/iOS/Resources/Icon.png mode change 100755 => 100644 client/iOS/Resources/Icon@2x.png mode change 100755 => 100644 client/iOS/Resources/about_page/FreeRDP_Logo.png mode change 100755 => 100644 client/iOS/Resources/about_page/about.html mode change 100755 => 100644 client/iOS/Resources/about_page/about_phone.html mode change 100755 => 100644 client/iOS/Resources/about_page/back.jpg mode change 100755 => 100644 client/iOS/Resources/about_page/background_transparent.png mode change 100755 => 100644 client/iOS/Resources/help_page/back.jpg mode change 100755 => 100644 client/iOS/Resources/help_page/gestures.html mode change 100755 => 100644 client/iOS/Resources/help_page/gestures.png mode change 100755 => 100644 client/iOS/Resources/help_page/gestures_phone.html mode change 100755 => 100644 client/iOS/Resources/help_page/gestures_phone.png mode change 100755 => 100644 client/iOS/Resources/help_page/nav_gestures.png mode change 100755 => 100644 client/iOS/Resources/help_page/nav_toolbar.png mode change 100755 => 100644 client/iOS/Resources/help_page/nav_touch_pointer.png mode change 100755 => 100644 client/iOS/Resources/help_page/toolbar.html mode change 100755 => 100644 client/iOS/Resources/help_page/toolbar.png mode change 100755 => 100644 client/iOS/Resources/help_page/toolbar_phone.html mode change 100755 => 100644 client/iOS/Resources/help_page/toolbar_phone.png mode change 100755 => 100644 client/iOS/Resources/help_page/touch_pointer.html mode change 100755 => 100644 client/iOS/Resources/help_page/touch_pointer.png mode change 100755 => 100644 client/iOS/Resources/help_page/touch_pointer_phone.html mode change 100755 => 100644 client/iOS/Resources/help_page/touch_pointer_phone.png mode change 100755 => 100644 client/iOS/Resources/icon_accessory_star_off.png mode change 100755 => 100644 client/iOS/Resources/icon_accessory_star_on.png mode change 100755 => 100644 client/iOS/Resources/icon_key_arrow_down.png mode change 100755 => 100644 client/iOS/Resources/icon_key_arrow_left.png mode change 100755 => 100644 client/iOS/Resources/icon_key_arrow_right.png mode change 100755 => 100644 client/iOS/Resources/icon_key_arrow_up.png mode change 100755 => 100644 client/iOS/Resources/icon_key_arrows.png mode change 100755 => 100644 client/iOS/Resources/icon_key_backspace.png mode change 100755 => 100644 client/iOS/Resources/icon_key_menu.png mode change 100755 => 100644 client/iOS/Resources/icon_key_return.png mode change 100755 => 100644 client/iOS/Resources/icon_key_win.png mode change 100755 => 100644 client/iOS/Resources/keyboard_button_background.png mode change 100755 => 100644 client/iOS/Resources/tabbar_icon_about.png mode change 100755 => 100644 client/iOS/Resources/tabbar_icon_help.png mode change 100755 => 100644 client/iOS/Resources/tabbar_icon_settings.png mode change 100755 => 100644 client/iOS/Resources/toolbar_icon_disconnect.png mode change 100755 => 100644 client/iOS/Resources/toolbar_icon_extkeyboad.png mode change 100755 => 100644 client/iOS/Resources/toolbar_icon_home.png mode change 100755 => 100644 client/iOS/Resources/toolbar_icon_keyboard.png mode change 100755 => 100644 client/iOS/Resources/toolbar_icon_touchpointer.png mode change 100755 => 100644 client/iOS/Resources/toolbar_icon_win.png mode change 100755 => 100644 client/iOS/Resources/touch_pointer_active.png mode change 100755 => 100644 client/iOS/Resources/touch_pointer_default.png mode change 100755 => 100644 client/iOS/Resources/touch_pointer_extkeyboard.png mode change 100755 => 100644 client/iOS/Resources/touch_pointer_keyboard.png mode change 100755 => 100644 client/iOS/Resources/touch_pointer_lclick.png mode change 100755 => 100644 client/iOS/Resources/touch_pointer_rclick.png mode change 100755 => 100644 client/iOS/Resources/touch_pointer_reset.png mode change 100755 => 100644 client/iOS/Resources/touch_pointer_scroll.png mode change 100755 => 100644 client/iOS/Views/BlockAlertView.h mode change 100755 => 100644 client/iOS/Views/BlockAlertView.m mode change 100755 => 100644 config.h.in mode change 100755 => 100644 include/freerdp/error.h 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 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/Mac/CMakeLists.txt b/client/Mac/CMakeLists.txt old mode 100755 new mode 100644 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/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/config.h.in b/config.h.in old mode 100755 new mode 100644 diff --git a/include/freerdp/error.h b/include/freerdp/error.h old mode 100755 new mode 100644 From 2bb0659fb487c8e78146542a8f8f0f94cf53efb4 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Thu, 24 Jul 2014 16:29:46 +0200 Subject: [PATCH 37/55] core: improve fast-path multifragment handling * make sure fast-path packages are not fragmented if no multifragment support was announced * handle special server side case where the multifragment size received from the client is smaller than one maximum fast-path PDU size --- libfreerdp/core/capabilities.c | 15 ++++++++++++++- libfreerdp/core/fastpath.c | 1 - libfreerdp/core/fastpath.h | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) 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" From 47dd22ba87a0e1807c8f72d6e61c14b1d4ae1c2d Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Tue, 22 Jul 2014 11:19:38 +0200 Subject: [PATCH 38/55] transport refactor rename transport_read to transport_read_pdu. This name is more descriptive what the function actually does. --- libfreerdp/core/nego.c | 2 +- libfreerdp/core/nla.c | 2 +- libfreerdp/core/transport.c | 4 ++-- libfreerdp/core/transport.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) 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..22df71edb 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -1198,7 +1198,7 @@ int credssp_recv(rdpCredssp* credssp) s = Stream_New(NULL, 4096); - status = transport_read(credssp->transport, s); + status = transport_read_pdu(credssp->transport, s); Stream_Length(s) = status; if (status < 0) diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 3f214e5ad..476930c8b 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -721,7 +721,7 @@ int transport_read_layer(rdpTransport* transport, BYTE* data, int bytes) return read; } -int transport_read(rdpTransport* transport, wStream* s) +int transport_read_pdu(rdpTransport* transport, wStream* s) { int status; int position; @@ -847,7 +847,7 @@ static int transport_read_nonblocking(rdpTransport* transport) { int status; - status = transport_read(transport, transport->ReceiveBuffer); + status = transport_read_pdu(transport, transport->ReceiveBuffer); if (status <= 0) return status; 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); From bdad9524dc5822be8a09e5fd161c05ef1bb6425e Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Tue, 22 Jul 2014 19:14:43 +0200 Subject: [PATCH 39/55] refactor transport_read_pdu and check_fds transport_check_fds and transport_read_pdu had almost the same functionality: reading and validating one pdu at a time. Now transport_read_pdu reads one pdu from the transport layer and verifies that the pdu data is valid - as before. transport_read_pdu also ensures that the stream is sealed and rewound when the pdu is received completely. transport_check_fds just uses transport_read_pdu and does *not* do the verification a second time based on the stream. Besides the clean up this fixes the following problems: * transport_read always read 4 bytes. Fast-path input synchronize pdus are only 3 bytes long. In this case on byte got lost in the stream buffer which lead to "de-synchronization" of server and client. * Size check in tpdu_read_connection_confirm - already read bytes weren't taken into account. --- libfreerdp/core/nla.c | 1 - libfreerdp/core/tpdu.c | 15 +- libfreerdp/core/transport.c | 297 ++++++++++++------------------------ 3 files changed, 109 insertions(+), 204 deletions(-) diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index 22df71edb..5b7a77a18 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -1199,7 +1199,6 @@ int credssp_recv(rdpCredssp* credssp) s = Stream_New(NULL, 4096); status = transport_read_pdu(credssp->transport, s); - Stream_Length(s) = status; if (status < 0) { 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 476930c8b..9ab96288a 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; } + +/** + * @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 enought capacity to hold the dat.a + * + * @param[in] transport rdpTransport + * @param[in] s wStream + * @param[in] toRead number of bytes to read + * @return < 0 on error; 0 if not enought 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 underlaying 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 enought 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,44 +713,44 @@ int transport_read_pdu(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 enought 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) { - Stream_EnsureCapacity(s, 4); - 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 we 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; } @@ -798,63 +772,67 @@ int transport_read_pdu(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 (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; + } } } - if (pduLength < 0 || pduLength > 0xFFFF) - { - fprintf(stderr, "%s: invalid pduLength: %d\n", __FUNCTION__, pduLength); - return -1; - } - Stream_EnsureCapacity(s, pduLength); - status = transport_read_layer(transport, Stream_Buffer(s) + position, pduLength - position); + Stream_EnsureCapacity(s, Stream_GetPosition(s) + pduLength); - if (status < 0) + 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 >= 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_pdu(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); @@ -1048,9 +1026,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; @@ -1072,105 +1048,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 mit 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 From fae8f6fbf2dabef83091f82df0134c26182bdd1b Mon Sep 17 00:00:00 2001 From: Norbert Federa Date: Thu, 24 Jul 2014 21:07:44 +0200 Subject: [PATCH 40/55] winpr/sync: Added InitOnceExecuteOnce plus CTest --- winpr/include/winpr/interlocked.h | 2 + winpr/include/winpr/synch.h | 42 ++++--- winpr/libwinpr/interlocked/interlocked.c | 11 +- winpr/libwinpr/synch/init.c | 59 +++++++-- winpr/libwinpr/synch/test/CMakeLists.txt | 1 + winpr/libwinpr/synch/test/TestSynchInit.c | 146 ++++++++++++++++++++++ 6 files changed, 236 insertions(+), 25 deletions(-) create mode 100644 winpr/libwinpr/synch/test/TestSynchInit.c diff --git a/winpr/include/winpr/interlocked.h b/winpr/include/winpr/interlocked.h index 8e27f83cc..83c462568 100644 --- a/winpr/include/winpr/interlocked.h +++ b/winpr/include/winpr/interlocked.h @@ -154,6 +154,8 @@ 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))) diff --git a/winpr/include/winpr/synch.h b/winpr/include/winpr/synch.h index 75213a8fe..fce97e9a5 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; @@ -303,6 +289,30 @@ WINPR_API BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, #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/interlocked/interlocked.c b/winpr/libwinpr/interlocked/interlocked.c index 13b597f8b..0b8c0d45a 100644 --- a/winpr/libwinpr/interlocked/interlocked.c +++ b/winpr/libwinpr/interlocked/interlocked.c @@ -234,6 +234,15 @@ 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(_WIN32) && !defined(WINPR_INTERLOCKED_COMPARE_EXCHANGE64) @@ -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); } diff --git a/winpr/libwinpr/synch/init.c b/winpr/libwinpr/synch/init.c index 88d32c27c..89c6427aa 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 34d7d3a68..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 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); +} From 2e859a5d142e33bb29928c229a8c37f1f8f4ad4e Mon Sep 17 00:00:00 2001 From: Justin DeFields Date: Thu, 24 Jul 2014 16:07:14 -0400 Subject: [PATCH 41/55] Removed GatewayUseSameCredentials logic from cmdline.c, and placed it after both cmdline and rpd file have been parsed. This provides proper GatewayUseSameCredentials support for the rdp file --- client/common/client.c | 26 ++++++++++++++++++++++++++ client/common/cmdline.c | 15 --------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/client/common/client.c b/client/common/client.c index c3fea6fb2..532d0ddb3 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -123,10 +123,36 @@ int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, { status = freerdp_client_settings_parse_assistance_file(settings, settings->AssistanceFile); } + + /* This function will call logic that is applicable to the settings + * from command line parsing AND the rdp file parsing */ + status = freerdp_client_combined_logic(settings); return status; } +int freerdp_client_combined_logic(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->Domain) + settings->GatewayDomain = _strdup(settings->Domain); + + if (settings->Password) + settings->GatewayPassword = _strdup(settings->Password); + } + } + + return 0; +} + int freerdp_client_settings_parse_connection_file(rdpSettings* settings, const char* filename) { rdpFile* file; diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 44c153779..bd8e909f9 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -1905,21 +1905,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; From 2036b443ebdbfa76686e2ebcefdd98af74a03a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sat, 26 Jul 2014 15:23:39 -0400 Subject: [PATCH 42/55] libwinpr-wtsapi: fix WtsApi32.dll dynamic loading on Windows --- client/common/client.c | 44 ++++----- winpr/libwinpr/wtsapi/wtsapi.c | 161 ++++++++++++++++++++++++++++++++- 2 files changed, 182 insertions(+), 23 deletions(-) diff --git a/client/common/client.c b/client/common/client.c index 532d0ddb3..68d051d52 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -102,6 +102,28 @@ HANDLE freerdp_client_get_thread(rdpContext* context) return ((rdpClientContext*) context)->thread; } +int freerdp_client_combined_logic(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->Domain) + settings->GatewayDomain = _strdup(settings->Domain); + + if (settings->Password) + settings->GatewayPassword = _strdup(settings->Password); + } + } + + return 0; +} + int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, char** argv) { int status; @@ -131,28 +153,6 @@ int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, return status; } -int freerdp_client_combined_logic(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->Domain) - settings->GatewayDomain = _strdup(settings->Domain); - - if (settings->Password) - settings->GatewayPassword = _strdup(settings->Password); - } - } - - return 0; -} - int freerdp_client_settings_parse_connection_file(rdpSettings* settings, const char* filename) { rdpFile* file; diff --git a/winpr/libwinpr/wtsapi/wtsapi.c b/winpr/libwinpr/wtsapi/wtsapi.c index 02cf985cb..4fdb1f75b 100644 --- a/winpr/libwinpr/wtsapi/wtsapi.c +++ b/winpr/libwinpr/wtsapi/wtsapi.c @@ -44,6 +44,159 @@ 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; + + 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); + + 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 +585,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 +644,11 @@ void InitializeWtsApiStubs(void) g_Initialized = TRUE; InitializeWtsApiStubs_Env(); - + +#ifdef _WIN32 + WtsApi32_InitializeWtsApi(); +#endif + if (!g_WtsApi) InitializeWtsApiStubs_FreeRDS(); From b17045ddd851b19d893d6a1ab79a5ec3b1d106a2 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Mon, 28 Jul 2014 13:12:01 +0200 Subject: [PATCH 43/55] fix: typos and formating --- libfreerdp/core/transport.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 9ab96288a..bacf194d5 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -667,12 +667,12 @@ int transport_read_layer(rdpTransport* transport, BYTE* data, int bytes) * 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 enought capacity to hold the dat.a + * 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 enought data is available (non blocking mode); 1 toRead bytes 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) { @@ -686,7 +686,7 @@ static int transport_read_layer_bytes(rdpTransport* transport, wStream* s, unsig } /** - * @brief Try to read a complete PDU (NLA, fast-path or tpkt) from the underlaying transport. + * @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 @@ -694,7 +694,7 @@ static int transport_read_layer_bytes(rdpTransport* transport, wStream* s, unsig * * @param[in] transport rdpTransport * @param[in] s wStream - * @return < 0 on error; 0 if not enought data is available (non blocking mode); > 0 number of + * @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) @@ -715,7 +715,7 @@ int transport_read_pdu(rdpTransport* transport, wStream* s) position = Stream_GetPosition(s); - /* Make sure there is enought space for the longest header within the stream */ + /* 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 */ @@ -730,7 +730,7 @@ int transport_read_pdu(rdpTransport* transport, wStream* s) if (transport->NlaMode) { /* - * In case NlaMode is set we TSRequest package(s) are expected + * 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 @@ -787,7 +787,8 @@ int transport_read_pdu(rdpTransport* transport, wStream* s) else { /* Fast-Path Header */ - if (header[1] & 0x80) { + if (header[1] & 0x80) + { if ((status = transport_read_layer_bytes(transport, s, 1)) != 1) return status; pduLength = ((header[1] & 0x7F) << 8) | header[2]; @@ -818,7 +819,7 @@ int transport_read_pdu(rdpTransport* transport, wStream* s) #ifdef WITH_DEBUG_TRANSPORT /* dump when whole PDU is read */ - if (Stream_GetPosition >= pduLength) + if (Stream_GetPosition(s) >= pduLength) { fprintf(stderr, "Local < Remote\n"); winpr_HexDump(Stream_Buffer(s), pduLength); @@ -826,9 +827,7 @@ int transport_read_pdu(rdpTransport* transport, wStream* s) #endif if (Stream_GetPosition(s) >= pduLength) - { WLog_Packet(transport->log, WLOG_TRACE, Stream_Buffer(s), pduLength, WLOG_PACKET_INBOUND); - } Stream_SealLength(s); Stream_SetPosition(s, 0); @@ -1050,7 +1049,7 @@ int transport_check_fds(rdpTransport* transport) /** * Note: transport_read_pdu tries to read one PDU from * the transport layer. - * The ReceiveBuffer mit have a position > 0 in case of a non blocking + * 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 From f06490b426d221781b82aaaeda40975a2c0a636e Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Mon, 28 Jul 2014 17:52:40 +0200 Subject: [PATCH 44/55] fix freerdp_client_settings_post_processing --- client/common/client.c | 61 ++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/client/common/client.c b/client/common/client.c index 532d0ddb3..94d5d2ab7 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -102,6 +102,38 @@ 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) + return FALSE; + } + if (settings->Domain) + { + settings->GatewayDomain = _strdup(settings->Domain); + if (!settings->GatewayDomain) + return FALSE; + } + if (settings->Password) + { + settings->GatewayPassword = _strdup(settings->Password); + if (!settings->GatewayPassword) + return FALSE; + } + } + } + return TRUE; +} + + int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, char** argv) { int status; @@ -124,35 +156,18 @@ 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 */ - status = freerdp_client_combined_logic(settings); + if(!freerdp_client_settings_post_process(settings)) + return -1; return status; } -int freerdp_client_combined_logic(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->Domain) - settings->GatewayDomain = _strdup(settings->Domain); - - if (settings->Password) - settings->GatewayPassword = _strdup(settings->Password); - } - } - - return 0; -} - int freerdp_client_settings_parse_connection_file(rdpSettings* settings, const char* filename) { rdpFile* file; From 32bb18152a5cb60b810ae5c927fa1aa0053a0ab8 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Mon, 28 Jul 2014 17:57:51 +0200 Subject: [PATCH 45/55] cmdline post: cleanup in case of oom --- client/common/client.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/client/common/client.c b/client/common/client.c index 94d5d2ab7..baa6d5b89 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -114,23 +114,29 @@ static BOOL freerdp_client_settings_post_process(rdpSettings* settings) { settings->GatewayUsername = _strdup(settings->Username); if (!settings->GatewayUsername) - return FALSE; + goto out_error; } if (settings->Domain) { settings->GatewayDomain = _strdup(settings->Domain); if (!settings->GatewayDomain) - return FALSE; + goto out_error; } if (settings->Password) { settings->GatewayPassword = _strdup(settings->Password); if (!settings->GatewayPassword) - return FALSE; + goto out_error; } } } return TRUE; + +out_error: + free(settings->GatewayUsername); + free(settings->GatewayDomain); + free(settings->GatewayPassword); + return FALSE; } From ff26a904899f05ffaeab0f063cf6a35b2d4be27f Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Mon, 28 Jul 2014 18:49:18 +0200 Subject: [PATCH 46/55] return status instead of returning directly --- client/common/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/common/client.c b/client/common/client.c index baa6d5b89..3f2da9a88 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -169,7 +169,7 @@ int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, /* 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)) - return -1; + status = -1; return status; } From 65aab2569d23bb9cc636cb04deb0987596cd5bcd Mon Sep 17 00:00:00 2001 From: Justin DeFields Date: Mon, 28 Jul 2014 15:24:48 -0400 Subject: [PATCH 47/55] Move multimon/span logic from cmdline.c to client.c post processing --- client/common/client.c | 13 +++++++++++++ client/common/cmdline.c | 4 ---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/client/common/client.c b/client/common/client.c index 3f2da9a88..35fedb8dc 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -130,6 +130,19 @@ static BOOL freerdp_client_settings_post_process(rdpSettings* settings) } } } + + /* 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: diff --git a/client/common/cmdline.c b/client/common/cmdline.c index bd8e909f9..480f9f21b 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -1281,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) { @@ -1294,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") { From cdcdec99bcd64bb4ba45168c8fd859252e7f42f9 Mon Sep 17 00:00:00 2001 From: Norbert Federa Date: Mon, 28 Jul 2014 21:55:57 +0200 Subject: [PATCH 48/55] OpenSSL thread safety freerdp/winpr had the following issues: * The non reentrant SSL_library_init() was called concurrently (crash) * Missing code/api to set the eventually required OpenSSL static and dynamic locking callbacks * Missing code/api to free the application-global or thread-local OpenSSL data and tables This commit creates two new winpr functions: BOOL winpr_InitializeSSL(DWORD flags): Use the flag WINPR_SSL_INIT_ALREADY_INITIALIZED if you want to tell winpr that your application has already initialized OpenSSL. If required use the flag WINPR_SSL_INIT_ENABLE_LOCKING to tell winpr that it should set the OpenSSL static and dynamic locking callbacks. Otherwise just call it with the flag WINPR_SSL_INIT_DEFAULT. The recommended way is that your application calls this function once before any threads are created. However, in order to support lazy OpenSSL library initialization winpr_InitializeSSL() can also safely be called multiple times and concurrently because it uses the new InitOnceExecuteOnce() function to guarantee that the initialization is only performed successfully once during the life time of the calling process. BOOL winpr_CleanupSSL(DWORD flags): If you create a thread that uses SSL you should call this function before the thread returns using the flag WINPR_SSL_CLEANUP_THREAD in order to clean up the thread-local OpenSSL data and tables. Call the function with the flag WINPR_SSL_CLEANUP_GLOBAL before terminating your application. Note: This commit only replaced the current occurences of the SSL_load_error_strings(); SSL_library_init(); pairs in the freerdp source with winpr_InitializeSSL(). None of the server or client applications has been changed according to the recommended usage described above (TBDL). --- libfreerdp/crypto/tls.c | 4 +- winpr/include/winpr/ssl.h | 45 +++ winpr/include/winpr/synch.h | 2 +- .../libwinpr/sspi/Schannel/schannel_openssl.c | 6 +- winpr/libwinpr/sspi/sspi_winpr.c | 4 +- winpr/libwinpr/synch/init.c | 2 +- winpr/libwinpr/utils/CMakeLists.txt | 3 +- winpr/libwinpr/utils/ssl.c | 275 ++++++++++++++++++ 8 files changed, 330 insertions(+), 11 deletions(-) create mode 100644 winpr/include/winpr/ssl.h create mode 100644 winpr/libwinpr/utils/ssl.c diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index b22e94a0e..fd857b9b0 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -1343,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/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 fce97e9a5..04f4268e4 100644 --- a/winpr/include/winpr/synch.h +++ b/winpr/include/winpr/synch.h @@ -3,7 +3,7 @@ * Synchronization Functions * * Copyright 2012 Marc-Andre Moreau - * Copyright 2014 Thincast Technologies GmbH + * Copyright 2014 Thincast Technologies GmbH * Copyright 2014 Norbert Federa * * Licensed under the Apache License, Version 2.0 (the "License"); 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/synch/init.c b/winpr/libwinpr/synch/init.c index 89c6427aa..5f81cf802 100644 --- a/winpr/libwinpr/synch/init.c +++ b/winpr/libwinpr/synch/init.c @@ -3,7 +3,7 @@ * Synchronization Functions * * Copyright 2012 Marc-Andre Moreau - * Copyright 2014 Thincast Technologies GmbH + * Copyright 2014 Thincast Technologies GmbH * Copyright 2014 Norbert Federa * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/winpr/libwinpr/utils/CMakeLists.txt b/winpr/libwinpr/utils/CMakeLists.txt index 9756a61f4..d8b758bbe 100644 --- a/winpr/libwinpr/utils/CMakeLists.txt +++ b/winpr/libwinpr/utils/CMakeLists.txt @@ -77,7 +77,8 @@ set(${MODULE_PREFIX}_SRCS ntlm.c print.c stream.c - cmdline.c) + cmdline.c + ssl.c) winpr_module_add(${${MODULE_PREFIX}_SRCS} ${${MODULE_PREFIX}_COLLECTIONS_SRCS} 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; +} From e303c3bd4c8f0553b7b51ec0a85885d9d563a60f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 28 Jul 2014 16:47:42 -0400 Subject: [PATCH 49/55] channels: cleanup RDP8 virtual channels --- channels/disp/client/disp_main.c | 53 ++++++++++--------- channels/disp/client/disp_main.h | 2 +- channels/echo/client/echo_main.c | 78 +++++++++------------------- channels/rdpgfx/client/rdpgfx_main.c | 9 ++-- libfreerdp/core/info.c | 3 ++ libfreerdp/core/info.h | 1 + 6 files changed, 60 insertions(+), 86 deletions(-) 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/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/rdpgfx/client/rdpgfx_main.c b/channels/rdpgfx/client/rdpgfx_main.c index f50010f93..e214f2145 100644 --- a/channels/rdpgfx/client/rdpgfx_main.c +++ b/channels/rdpgfx/client/rdpgfx_main.c @@ -1033,11 +1033,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; @@ -1095,6 +1091,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/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 From 8321d7ffadd23e0eaf469f4f593b3bd938fbd01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 28 Jul 2014 17:22:02 -0400 Subject: [PATCH 50/55] libfreerdp-codec: fix OpenH264 usage thanks to @erbth's hack --- libfreerdp/codec/h264.c | 14 ++++++++++++-- winpr/libwinpr/wtsapi/wtsapi.c | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libfreerdp/codec/h264.c b/libfreerdp/codec/h264.c index c407b6238..c0672df68 100644 --- a/libfreerdp/codec/h264.c +++ b/libfreerdp/codec/h264.c @@ -167,7 +167,7 @@ static void h264_dump_h264_data(BYTE* data, int size) fclose(fp); } -static void h264_dump_yuv_data(BYTE* yuv[], int width, int height, int stride[]) +void h264_dump_yuv_data(BYTE* yuv[], int width, int height, int stride[]) { FILE* fp; BYTE* srcp; @@ -326,7 +326,7 @@ BYTE* h264_strip_nal_unit_au_delimiter(BYTE* pSrcData, UINT32* pSrcSize) #ifdef WITH_OPENH264 -static BOOL g_openh264_trace_enabled = TRUE; +static BOOL g_openh264_trace_enabled = FALSE; static void openh264_trace_callback(H264_CONTEXT* h264, int level, const char* message) { @@ -361,6 +361,16 @@ static int openh264_decompress(H264_CONTEXT* h264, BYTE* pSrcData, UINT32 SrcSiz 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 diff --git a/winpr/libwinpr/wtsapi/wtsapi.c b/winpr/libwinpr/wtsapi/wtsapi.c index 4fdb1f75b..144927cde 100644 --- a/winpr/libwinpr/wtsapi/wtsapi.c +++ b/winpr/libwinpr/wtsapi/wtsapi.c @@ -126,6 +126,7 @@ int WtsApi32_InitializeWtsApi(void) 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); @@ -189,6 +190,7 @@ int WtsApi32_InitializeWtsApi(void) 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; From 0c408c213c557859d5903ce95ff209632a703a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 28 Jul 2014 17:42:23 -0400 Subject: [PATCH 51/55] libfreerdp-codec: stub progressive codec decompressor --- include/freerdp/codec/progressive.h | 53 +++++++++++++++ libfreerdp/codec/CMakeLists.txt | 1 + libfreerdp/codec/progressive.c | 68 +++++++++++++++++++ libfreerdp/codec/test/CMakeLists.txt | 1 + .../codec/test/TestFreeRDPCodecProgressive.c | 10 +++ 5 files changed, 133 insertions(+) create mode 100644 include/freerdp/codec/progressive.h create mode 100644 libfreerdp/codec/progressive.c create mode 100644 libfreerdp/codec/test/TestFreeRDPCodecProgressive.c diff --git a/include/freerdp/codec/progressive.h b/include/freerdp/codec/progressive.h new file mode 100644 index 000000000..016bc7412 --- /dev/null +++ b/include/freerdp/codec/progressive.h @@ -0,0 +1,53 @@ +/** + * 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 + +struct _PROGRESSIVE_CONTEXT +{ + BOOL Compressor; +}; +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/libfreerdp/codec/CMakeLists.txt b/libfreerdp/codec/CMakeLists.txt index 5fd04894f..a99b2f21e 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 diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c new file mode 100644 index 000000000..4b798065c --- /dev/null +++ b/libfreerdp/codec/progressive.c @@ -0,0 +1,68 @@ +/** + * 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 + +int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UINT32 SrcSize, + BYTE** ppDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight) +{ + return 1; +} + +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; + } + + return progressive; +} + +void progressive_context_free(PROGRESSIVE_CONTEXT* progressive) +{ + if (!progressive) + return; + + 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; +} + From a3de93d867db3695dc196e86a73779eecc884851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 28 Jul 2014 23:41:16 -0400 Subject: [PATCH 52/55] libfreerdp-codec: start parsing progressive codec --- client/X11/xf_gfx.c | 20 +++ client/X11/xfreerdp.h | 2 + include/freerdp/codec/progressive.h | 127 +++++++++++++++++++ libfreerdp/codec/progressive.c | 181 ++++++++++++++++++++++++++++ 4 files changed, 330 insertions(+) diff --git a/client/X11/xf_gfx.c b/client/X11/xf_gfx.c index bf04042f6..b99fd5e37 100644 --- a/client/X11/xf_gfx.c +++ b/client/X11/xf_gfx.c @@ -67,6 +67,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; @@ -470,6 +478,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; @@ -478,6 +487,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/include/freerdp/codec/progressive.h b/include/freerdp/codec/progressive.h index 016bc7412..be063aadd 100644 --- a/include/freerdp/codec/progressive.h +++ b/include/freerdp/codec/progressive.h @@ -23,8 +23,135 @@ #include #include +#include #include +#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_PROGRESSIVE_FIRST 0xCCC6 +#define PROGRESSIVE_WBT_TILE_PROGRESSIVE_UPGRADE 0xCCC7 + +struct _PROGRESSIVE_SYNC +{ + UINT16 blockType; + UINT32 blockLen; + + UINT32 magic; + UINT16 version; +}; +typedef struct _PROGRESSIVE_SYNC PROGRESSIVE_SYNC; + +struct _PROGRESSIVE_REGION +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE tileSize; + UINT16 numRects; + BYTE numQuant; + BYTE numProgQuant; + BYTE flags; + UINT16 numTiles; + UINT32 tileDataSize; + RFX_RECT* rects; + UINT32* quantVals; + UINT32* quantProgVals; +}; +typedef struct _PROGRESSIVE_REGION PROGRESSIVE_REGION; + +struct _PROGRESSIVE_FRAME_BEGIN +{ + UINT16 blockType; + UINT32 blockLen; + + UINT32 frameIndex; + UINT16 regionCount; + PROGRESSIVE_REGION* regions; +}; +typedef struct _PROGRESSIVE_FRAME_BEGIN PROGRESSIVE_FRAME_BEGIN; + +struct _PROGRESSIVE_FRAME_END +{ + UINT16 blockType; + UINT32 blockLen; +}; +typedef struct _PROGRESSIVE_FRAME_END PROGRESSIVE_FRAME_END; + +struct _PROGRESSIVE_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_TILE_SIMPLE PROGRESSIVE_TILE_SIMPLE; + +struct _PROGRESSIVE_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_TILE_FIRST PROGRESSIVE_TILE_FIRST; + +struct _PROGRESSIVE_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_TILE_UPGRADE PROGRESSIVE_TILE_UPGRADE; + struct _PROGRESSIVE_CONTEXT { BOOL Compressor; diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c index 4b798065c..2dfee8460 100644 --- a/libfreerdp/codec/progressive.c +++ b/libfreerdp/codec/progressive.c @@ -31,6 +31,187 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight) { + BYTE* block; + UINT32 boffset; + UINT32 ctxId; + UINT32 flags; + UINT32 tileSize; + UINT32 magic; + UINT32 version; + UINT16 blockType; + UINT32 blockLen; + UINT32 offset = 0; + UINT32 frameIndex; + UINT32 regionCount; + PROGRESSIVE_REGION region; + PROGRESSIVE_TILE_SIMPLE simple; + PROGRESSIVE_TILE_FIRST first; + PROGRESSIVE_TILE_UPGRADE upgrade; + + printf("ProgressiveDecompress\n"); + + while ((SrcSize - offset) > 6) + { + boffset = 0; + block = &pSrcData[offset]; + + blockType = *((UINT16*) &block[boffset]); /* blockType (2 bytes) */ + blockLen = *((UINT32*) &block[boffset + 2]); /* blockLen (4 bytes) */ + boffset += 6; + + switch (blockType) + { + case PROGRESSIVE_WBT_SYNC: + + if (blockLen != 12) + return -1; + + magic = (UINT32) *((UINT32*) &block[boffset]); /* magic (4 bytes) */ + version = (UINT32) *((UINT16*) &block[boffset + 4]); /* version (2 bytes) */ + boffset += 6; + + break; + + case PROGRESSIVE_WBT_FRAME_BEGIN: + + frameIndex = (UINT32) *((UINT32*) &block[boffset]); /* frameIndex (4 bytes) */ + regionCount = (UINT32) *((UINT16*) &block[boffset + 4]); /* regionCount (2 bytes) */ + boffset += 6; + + break; + + case PROGRESSIVE_WBT_FRAME_END: + + if (blockLen != 6) + return -1; + + break; + + case PROGRESSIVE_WBT_CONTEXT: + + if (blockLen != 10) + return -1; + + ctxId = (UINT32) block[boffset]; /* ctxId (1 byte) */ + tileSize = (UINT32) *((UINT16*) &block[boffset + 1]); /* tileSize (2 bytes) */ + flags = (UINT32) block[boffset + 3]; /* flags (1 byte) */ + boffset += 4; + + if (tileSize != 64) + return -1; + + break; + + case PROGRESSIVE_WBT_REGION: + + region.tileSize = block[boffset]; /* 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; + + break; + + case PROGRESSIVE_WBT_TILE_SIMPLE: + + simple.quantIdxY = block[boffset]; /* 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; + + simple.yData = &block[boffset]; + boffset += simple.yLen; + + simple.cbData = &block[boffset]; + boffset += simple.cbLen; + + simple.crData = &block[boffset]; + boffset += simple.crLen; + + simple.tailData = &block[boffset]; + boffset += simple.tailLen; + + break; + + case PROGRESSIVE_WBT_TILE_PROGRESSIVE_FIRST: + + first.quantIdxY = block[boffset]; /* 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; + + first.yData = &block[boffset]; + boffset += first.yLen; + + first.cbData = &block[boffset]; + boffset += first.cbLen; + + first.crData = &block[boffset]; + boffset += first.crLen; + + first.tailData = &block[boffset]; + boffset += first.tailLen; + + break; + + case PROGRESSIVE_WBT_TILE_PROGRESSIVE_UPGRADE: + + upgrade.quantIdxY = block[boffset]; /* 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 += 18; + + upgrade.ySrlData = &block[boffset]; + boffset += upgrade.ySrlLen; + + upgrade.yRawData = &block[boffset]; + boffset += upgrade.yRawLen; + + upgrade.cbSrlData = &block[boffset]; + boffset += upgrade.cbSrlLen; + + upgrade.cbRawData = &block[boffset]; + boffset += upgrade.cbRawLen; + + upgrade.crSrlData = &block[boffset]; + boffset += upgrade.crSrlLen; + + upgrade.crRawData = &block[boffset]; + boffset += upgrade.crRawLen; + + break; + } + + offset += blockLen; + } + return 1; } From 2b3cd390265a001f21d8064690698882423694eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 29 Jul 2014 12:38:29 -0400 Subject: [PATCH 53/55] libfreerdp-codec: more parsing of progressive data blocks --- include/freerdp/codec/progressive.h | 81 ++++++-- libfreerdp/codec/progressive.c | 295 ++++++++++++++++++++++++---- 2 files changed, 324 insertions(+), 52 deletions(-) diff --git a/include/freerdp/codec/progressive.h b/include/freerdp/codec/progressive.h index be063aadd..603d1efe4 100644 --- a/include/freerdp/codec/progressive.h +++ b/include/freerdp/codec/progressive.h @@ -32,10 +32,41 @@ #define PROGRESSIVE_WBT_CONTEXT 0xCCC3 #define PROGRESSIVE_WBT_REGION 0xCCC4 #define PROGRESSIVE_WBT_TILE_SIMPLE 0xCCC5 -#define PROGRESSIVE_WBT_TILE_PROGRESSIVE_FIRST 0xCCC6 -#define PROGRESSIVE_WBT_TILE_PROGRESSIVE_UPGRADE 0xCCC7 +#define PROGRESSIVE_WBT_TILE_FIRST 0xCCC6 +#define PROGRESSIVE_WBT_TILE_UPGRADE 0xCCC7 -struct _PROGRESSIVE_SYNC +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; @@ -43,9 +74,20 @@ struct _PROGRESSIVE_SYNC UINT32 magic; UINT16 version; }; -typedef struct _PROGRESSIVE_SYNC PROGRESSIVE_SYNC; +typedef struct _PROGRESSIVE_BLOCK_SYNC PROGRESSIVE_BLOCK_SYNC; -struct _PROGRESSIVE_REGION +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; @@ -58,30 +100,31 @@ struct _PROGRESSIVE_REGION UINT16 numTiles; UINT32 tileDataSize; RFX_RECT* rects; - UINT32* quantVals; - UINT32* quantProgVals; + RFX_COMPONENT_CODEC_QUANT* quantVals; + RFX_PROGRESSIVE_CODEC_QUANT* quantProgVals; + PROGRESSIVE_BLOCK** tiles; }; -typedef struct _PROGRESSIVE_REGION PROGRESSIVE_REGION; +typedef struct _PROGRESSIVE_BLOCK_REGION PROGRESSIVE_BLOCK_REGION; -struct _PROGRESSIVE_FRAME_BEGIN +struct _PROGRESSIVE_BLOCK_FRAME_BEGIN { UINT16 blockType; UINT32 blockLen; UINT32 frameIndex; UINT16 regionCount; - PROGRESSIVE_REGION* regions; + PROGRESSIVE_BLOCK_REGION* regions; }; -typedef struct _PROGRESSIVE_FRAME_BEGIN PROGRESSIVE_FRAME_BEGIN; +typedef struct _PROGRESSIVE_BLOCK_FRAME_BEGIN PROGRESSIVE_BLOCK_FRAME_BEGIN; -struct _PROGRESSIVE_FRAME_END +struct _PROGRESSIVE_BLOCK_FRAME_END { UINT16 blockType; UINT32 blockLen; }; -typedef struct _PROGRESSIVE_FRAME_END PROGRESSIVE_FRAME_END; +typedef struct _PROGRESSIVE_BLOCK_FRAME_END PROGRESSIVE_BLOCK_FRAME_END; -struct _PROGRESSIVE_TILE_SIMPLE +struct _PROGRESSIVE_BLOCK_TILE_SIMPLE { UINT16 blockType; UINT32 blockLen; @@ -101,9 +144,9 @@ struct _PROGRESSIVE_TILE_SIMPLE BYTE* crData; BYTE* tailData; }; -typedef struct _PROGRESSIVE_TILE_SIMPLE PROGRESSIVE_TILE_SIMPLE; +typedef struct _PROGRESSIVE_BLOCK_TILE_SIMPLE PROGRESSIVE_BLOCK_TILE_SIMPLE; -struct _PROGRESSIVE_TILE_FIRST +struct _PROGRESSIVE_BLOCK_TILE_FIRST { UINT16 blockType; UINT32 blockLen; @@ -124,9 +167,9 @@ struct _PROGRESSIVE_TILE_FIRST BYTE* crData; BYTE* tailData; }; -typedef struct _PROGRESSIVE_TILE_FIRST PROGRESSIVE_TILE_FIRST; +typedef struct _PROGRESSIVE_BLOCK_TILE_FIRST PROGRESSIVE_BLOCK_TILE_FIRST; -struct _PROGRESSIVE_TILE_UPGRADE +struct _PROGRESSIVE_BLOCK_TILE_UPGRADE { UINT16 blockType; UINT32 blockLen; @@ -150,7 +193,7 @@ struct _PROGRESSIVE_TILE_UPGRADE BYTE* crSrlData; BYTE* crRawData; }; -typedef struct _PROGRESSIVE_TILE_UPGRADE PROGRESSIVE_TILE_UPGRADE; +typedef struct _PROGRESSIVE_BLOCK_TILE_UPGRADE PROGRESSIVE_BLOCK_TILE_UPGRADE; struct _PROGRESSIVE_CONTEXT { diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c index 2dfee8460..1cd1ce76d 100644 --- a/libfreerdp/codec/progressive.c +++ b/libfreerdp/codec/progressive.c @@ -28,83 +28,171 @@ #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_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, DWORD DstFormat, int nDstStep, int nXDst, int nYDst, int nWidth, int nHeight) { BYTE* block; + UINT16 index; UINT32 boffset; - UINT32 ctxId; - UINT32 flags; - UINT32 tileSize; - UINT32 magic; - UINT32 version; UINT16 blockType; UINT32 blockLen; + RFX_RECT* rect; UINT32 offset = 0; - UINT32 frameIndex; - UINT32 regionCount; - PROGRESSIVE_REGION region; - PROGRESSIVE_TILE_SIMPLE simple; - PROGRESSIVE_TILE_FIRST first; - PROGRESSIVE_TILE_UPGRADE upgrade; + 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; printf("ProgressiveDecompress\n"); - while ((SrcSize - offset) > 6) + if (SrcSize < 6) + return -1001; + + while ((SrcSize - offset) >= 6) { boffset = 0; block = &pSrcData[offset]; - blockType = *((UINT16*) &block[boffset]); /* blockType (2 bytes) */ + blockType = *((UINT16*) &block[boffset + 0]); /* blockType (2 bytes) */ blockLen = *((UINT32*) &block[boffset + 2]); /* blockLen (4 bytes) */ boffset += 6; + if ((SrcSize - offset) < blockLen) + return -1002; + switch (blockType) { case PROGRESSIVE_WBT_SYNC: - if (blockLen != 12) - return -1; + sync.blockType = blockType; + sync.blockLen = blockLen; - magic = (UINT32) *((UINT32*) &block[boffset]); /* magic (4 bytes) */ - version = (UINT32) *((UINT16*) &block[boffset + 4]); /* version (2 bytes) */ + if (blockLen != 12) + return -1003; + + sync.magic = (UINT32) *((UINT32*) &block[boffset + 0]); /* magic (4 bytes) */ + sync.version = (UINT32) *((UINT16*) &block[boffset + 4]); /* version (2 bytes) */ boffset += 6; + /* magic SHOULD be set to 0xCACCACCA, but the decoder SHOULD ignore it */ + /* version SHOULD be set to 0x0100, but the decoder SHOULD ignore it */ + break; case PROGRESSIVE_WBT_FRAME_BEGIN: - frameIndex = (UINT32) *((UINT32*) &block[boffset]); /* frameIndex (4 bytes) */ - regionCount = (UINT32) *((UINT16*) &block[boffset + 4]); /* regionCount (2 bytes) */ + frameBegin.blockType = blockType; + frameBegin.blockLen = blockLen; + + if ((blockLen - boffset) < 6) + return -1004; + + 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) > 6) + { + fprintf(stderr, "warning: regions present in frame begin block are ignored\n"); + } + + boffset = blockLen; + break; case PROGRESSIVE_WBT_FRAME_END: + frameEnd.blockType = blockType; + frameEnd.blockLen = blockLen; + if (blockLen != 6) - return -1; + return -1005; break; case PROGRESSIVE_WBT_CONTEXT: - if (blockLen != 10) - return -1; + context.blockType = blockType; + context.blockLen = blockLen; - ctxId = (UINT32) block[boffset]; /* ctxId (1 byte) */ - tileSize = (UINT32) *((UINT16*) &block[boffset + 1]); /* tileSize (2 bytes) */ - flags = (UINT32) block[boffset + 3]; /* flags (1 byte) */ + if (blockLen != 10) + return -1006; + + 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 (tileSize != 64) - return -1; + if (context.tileSize != 64) + return -1007; break; case PROGRESSIVE_WBT_REGION: - region.tileSize = block[boffset]; /* tileSize (1 byte) */ + region.blockType = blockType; + region.blockLen = blockLen; + + if ((blockLen - boffset) < 12) + return -1008; + + 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) */ @@ -113,11 +201,97 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN region.tileDataSize = *((UINT32*) &block[boffset + 8]); /* tileDataSize (4 bytes) */ boffset += 12; + if (region.tileSize != 64) + return -1; + + if (region.numRects < 1) + return -1; + + if (region.numQuant > 7) + return -1; + + if ((blockLen - boffset) < (region.numRects * 8)) + return -1; + + region.rects = (RFX_RECT*) malloc(region.numRects * sizeof(RFX_RECT)); + + if (!region.rects) + return -1; + + 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 (region.numQuant > 0) + { + if ((blockLen - boffset) < (region.numQuant * 5)) + return -1; + + region.quantVals = (RFX_COMPONENT_CODEC_QUANT*) malloc(region.numQuant * sizeof(RFX_COMPONENT_CODEC_QUANT)); + + if (!region.quantVals) + return -1; + + 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 (region.numProgQuant > 0) + { + if ((blockLen - boffset) < (region.numProgQuant * 16)) + return -1; + + region.quantProgVals = (RFX_PROGRESSIVE_CODEC_QUANT*) malloc(region.numProgQuant * sizeof(RFX_PROGRESSIVE_CODEC_QUANT)); + + if (!region.quantVals) + return -1; + + 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; + } + } + + printf("numTiles: %d tileDataSize: %d numQuant: %d numProgQuant: %d\n", + region.numTiles, region.tileDataSize, region.numQuant, region.numProgQuant); + + boffset += region.tileDataSize; /* skip for now */ + break; case PROGRESSIVE_WBT_TILE_SIMPLE: - simple.quantIdxY = block[boffset]; /* quantIdxY (1 byte) */ + simple.blockType = blockType; + simple.blockLen = blockLen; + + if ((blockLen - boffset) < 16) + return -1009; + + 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) */ @@ -143,9 +317,15 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN break; - case PROGRESSIVE_WBT_TILE_PROGRESSIVE_FIRST: + case PROGRESSIVE_WBT_TILE_FIRST: - first.quantIdxY = block[boffset]; /* quantIdxY (1 byte) */ + first.blockType = blockType; + first.blockLen = blockLen; + + if ((blockLen - boffset) < 17) + return -1010; + + 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) */ @@ -158,23 +338,41 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN first.tailLen = *((UINT16*) &block[boffset + 15]); /* tailLen (2 bytes) */ boffset += 17; + if ((blockLen - boffset) < first.yLen) + return -1011; + first.yData = &block[boffset]; boffset += first.yLen; + if ((blockLen - boffset) < first.cbLen) + return -1012; + first.cbData = &block[boffset]; boffset += first.cbLen; + if ((blockLen - boffset) < first.crLen) + return -1013; + first.crData = &block[boffset]; boffset += first.crLen; + if ((blockLen - boffset) < first.tailLen) + return -1014; + first.tailData = &block[boffset]; boffset += first.tailLen; break; - case PROGRESSIVE_WBT_TILE_PROGRESSIVE_UPGRADE: + case PROGRESSIVE_WBT_TILE_UPGRADE: - upgrade.quantIdxY = block[boffset]; /* quantIdxY (1 byte) */ + upgrade.blockType = blockType; + upgrade.blockLen = blockLen; + + if ((blockLen - boffset) < 18) + return -1015; + + 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) */ @@ -188,30 +386,61 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN upgrade.crRawLen = *((UINT16*) &block[boffset + 18]); /* crRawLen (2 bytes) */ boffset += 18; + if ((blockLen - boffset) < upgrade.ySrlLen) + return -1016; + upgrade.ySrlData = &block[boffset]; boffset += upgrade.ySrlLen; + if ((blockLen - boffset) < upgrade.yRawLen) + return -1017; + upgrade.yRawData = &block[boffset]; boffset += upgrade.yRawLen; + if ((blockLen - boffset) < upgrade.cbSrlLen) + return -1018; + upgrade.cbSrlData = &block[boffset]; boffset += upgrade.cbSrlLen; + if ((blockLen - boffset) < upgrade.cbRawLen) + return -1019; + upgrade.cbRawData = &block[boffset]; boffset += upgrade.cbRawLen; + if ((blockLen - boffset) < upgrade.crSrlLen) + return -1020; + upgrade.crSrlData = &block[boffset]; boffset += upgrade.crSrlLen; + if ((blockLen - boffset) < upgrade.crRawLen) + return -1021; + upgrade.crRawData = &block[boffset]; boffset += upgrade.crRawLen; break; + + default: + return -1022; + break; + } + + if (boffset != blockLen) + { + printf("failure %s\n", progressive_get_block_type_string(blockType)); + return -1023; } offset += blockLen; } + if (offset != SrcSize) + return -1024; + return 1; } From c060fb07a2dd1927277eb0645434e00ca9689dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 29 Jul 2014 13:41:21 -0400 Subject: [PATCH 54/55] libfreerdp-codec: fix build on Windows --- libfreerdp/codec/h264.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libfreerdp/codec/h264.c b/libfreerdp/codec/h264.c index c0672df68..c2fbedf10 100644 --- a/libfreerdp/codec/h264.c +++ b/libfreerdp/codec/h264.c @@ -160,7 +160,7 @@ static void h264_dump_h264_data(BYTE* data, int size) FILE* fp; char buf[4096]; - snprintf(buf, sizeof(buf), "/tmp/wlog/bs_%d.h264", g_H264FrameId); + sprintf_s(buf, sizeof(buf), "/tmp/wlog/bs_%d.h264", g_H264FrameId); fp = fopen(buf, "wb"); fwrite(data, 1, size, fp); fflush(fp); @@ -174,10 +174,10 @@ void h264_dump_yuv_data(BYTE* yuv[], int width, int height, int stride[]) char buf[4096]; int j; - snprintf(buf, sizeof(buf), "/tmp/wlog/H264_%d.ppm", g_H264FrameId); + sprintf_s(buf, sizeof(buf), "/tmp/wlog/H264_%d.ppm", g_H264FrameId); fp = fopen(buf, "wb"); fwrite("P5\n", 1, 3, fp); - snprintf(buf, sizeof(buf), "%d %d\n", width, height); + sprintf_s(buf, sizeof(buf), "%d %d\n", width, height); fwrite(buf, 1, strlen(buf), fp); fwrite("255\n", 1, 4, fp); From 800be2f680dec9ba6d867fe6fab891256843e35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 29 Jul 2014 17:37:46 -0400 Subject: [PATCH 55/55] libfreerdp-codec: complete parsing of progressive codec block arrays --- client/common/cmdline.c | 1 + include/freerdp/codec/progressive.h | 19 ++ libfreerdp/codec/progressive.c | 298 ++++++++++++++++++---------- 3 files changed, 217 insertions(+), 101 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 480f9f21b..b05864db8 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -1640,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") diff --git a/include/freerdp/codec/progressive.h b/include/freerdp/codec/progressive.h index 603d1efe4..8c6327f5d 100644 --- a/include/freerdp/codec/progressive.h +++ b/include/freerdp/codec/progressive.h @@ -26,6 +26,12 @@ #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 @@ -35,6 +41,10 @@ #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; @@ -198,6 +208,15 @@ 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; diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c index 1cd1ce76d..a30e85b01 100644 --- a/libfreerdp/codec/progressive.c +++ b/libfreerdp/codec/progressive.c @@ -72,16 +72,17 @@ const char* progressive_get_block_type_string(UINT16 blockType) return "PROGRESSIVE_WBT_UNKNOWN"; } -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 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; - RFX_RECT* rect; + UINT32 count = 0; UINT32 offset = 0; + RFX_RECT* rect = NULL; PROGRESSIVE_BLOCK_SYNC sync; PROGRESSIVE_BLOCK_REGION region; PROGRESSIVE_BLOCK_CONTEXT context; @@ -93,22 +94,40 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN RFX_COMPONENT_CODEC_QUANT* quantVal; RFX_PROGRESSIVE_CODEC_QUANT* quantProgVal; - printf("ProgressiveDecompress\n"); - - if (SrcSize < 6) - return -1001; - - while ((SrcSize - offset) >= 6) + while ((blocksLen - offset) >= 6) { boffset = 0; - block = &pSrcData[offset]; + block = &blocks[offset]; blockType = *((UINT16*) &block[boffset + 0]); /* blockType (2 bytes) */ blockLen = *((UINT32*) &block[boffset + 2]); /* blockLen (4 bytes) */ boffset += 6; - if ((SrcSize - offset) < blockLen) - return -1002; + 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) { @@ -117,15 +136,18 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN sync.blockType = blockType; sync.blockLen = blockLen; - if (blockLen != 12) - return -1003; + 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; - /* magic SHOULD be set to 0xCACCACCA, but the decoder SHOULD ignore it */ - /* version SHOULD be set to 0x0100, but the decoder SHOULD ignore it */ + if (sync.magic != 0xCACCACCA) + return -1005; + + if (sync.version != 0x0100) + return -1006; break; @@ -135,7 +157,7 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN frameBegin.blockLen = blockLen; if ((blockLen - boffset) < 6) - return -1004; + return -1007; frameBegin.frameIndex = (UINT32) *((UINT32*) &block[boffset + 0]); /* frameIndex (4 bytes) */ frameBegin.regionCount = (UINT32) *((UINT16*) &block[boffset + 4]); /* regionCount (2 bytes) */ @@ -147,12 +169,16 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN * the decoder SHOULD ignore this inconsistency. */ - if ((blockLen - boffset) > 6) + if ((blockLen - boffset) > 0) { - fprintf(stderr, "warning: regions present in frame begin block are ignored\n"); - } + status = progressive_process_blocks(progressive, &block[boffset], + blockLen - boffset, frameBegin.regionCount, PROGRESSIVE_BLOCKS_REGION); - boffset = blockLen; + if (status < 0) + return status; + + boffset += status; + } break; @@ -161,8 +187,8 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN frameEnd.blockType = blockType; frameEnd.blockLen = blockLen; - if (blockLen != 6) - return -1005; + if ((blockLen - boffset) != 0) + return -1008; break; @@ -171,8 +197,8 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN context.blockType = blockType; context.blockLen = blockLen; - if (blockLen != 10) - return -1006; + if ((blockLen - boffset) != 4) + return -1009; context.ctxId = block[boffset + 0]; /* ctxId (1 byte) */ context.tileSize = *((UINT16*) &block[boffset + 1]); /* tileSize (2 bytes) */ @@ -180,7 +206,7 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN boffset += 4; if (context.tileSize != 64) - return -1007; + return -1010; break; @@ -190,7 +216,7 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN region.blockLen = blockLen; if ((blockLen - boffset) < 12) - return -1008; + return -1011; region.tileSize = block[boffset + 0]; /* tileSize (1 byte) */ region.numRects = *((UINT16*) &block[boffset + 1]); /* numRects (2 bytes) */ @@ -202,21 +228,27 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN boffset += 12; if (region.tileSize != 64) - return -1; + return -1012; if (region.numRects < 1) - return -1; + return -1013; if (region.numQuant > 7) - return -1; + return -1014; if ((blockLen - boffset) < (region.numRects * 8)) - return -1; + return -1015; - region.rects = (RFX_RECT*) malloc(region.numRects * sizeof(RFX_RECT)); + 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 -1; + return -1016; for (index = 0; index < region.numRects; index++) { @@ -228,58 +260,75 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN boffset += 8; } - if (region.numQuant > 0) + if ((blockLen - boffset) < (region.numQuant * 5)) + return -1017; + + if (region.numQuant > progressive->cQuant) { - if ((blockLen - boffset) < (region.numQuant * 5)) - return -1; - - region.quantVals = (RFX_COMPONENT_CODEC_QUANT*) malloc(region.numQuant * sizeof(RFX_COMPONENT_CODEC_QUANT)); - - if (!region.quantVals) - return -1; - - 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; - } + progressive->quantVals = (RFX_COMPONENT_CODEC_QUANT*) realloc(progressive->quantVals, + region.numQuant * sizeof(RFX_COMPONENT_CODEC_QUANT)); + progressive->cQuant = region.numQuant; } - if (region.numProgQuant > 0) + region.quantVals = progressive->quantVals; + + if (!region.quantVals) + return -1018; + + for (index = 0; index < region.numQuant; index++) { - if ((blockLen - boffset) < (region.numProgQuant * 16)) - return -1; - - region.quantProgVals = (RFX_PROGRESSIVE_CODEC_QUANT*) malloc(region.numProgQuant * sizeof(RFX_PROGRESSIVE_CODEC_QUANT)); - - if (!region.quantVals) - return -1; - - 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; - } + 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; } - printf("numTiles: %d tileDataSize: %d numQuant: %d numProgQuant: %d\n", - region.numTiles, region.tileDataSize, region.numQuant, region.numProgQuant); + if ((blockLen - boffset) < (region.numProgQuant * 16)) + return -1019; - boffset += region.tileDataSize; /* skip for now */ + 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; @@ -289,7 +338,7 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN simple.blockLen = blockLen; if ((blockLen - boffset) < 16) - return -1009; + return -1022; simple.quantIdxY = block[boffset + 0]; /* quantIdxY (1 byte) */ simple.quantIdxCb = block[boffset + 1]; /* quantIdxCb (1 byte) */ @@ -303,15 +352,27 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN 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; @@ -323,7 +384,7 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN first.blockLen = blockLen; if ((blockLen - boffset) < 17) - return -1010; + return -1027; first.quantIdxY = block[boffset + 0]; /* quantIdxY (1 byte) */ first.quantIdxCb = block[boffset + 1]; /* quantIdxCb (1 byte) */ @@ -339,25 +400,25 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN boffset += 17; if ((blockLen - boffset) < first.yLen) - return -1011; + return -1028; first.yData = &block[boffset]; boffset += first.yLen; if ((blockLen - boffset) < first.cbLen) - return -1012; + return -1029; first.cbData = &block[boffset]; boffset += first.cbLen; if ((blockLen - boffset) < first.crLen) - return -1013; + return -1030; first.crData = &block[boffset]; boffset += first.crLen; if ((blockLen - boffset) < first.tailLen) - return -1014; + return -1031; first.tailData = &block[boffset]; boffset += first.tailLen; @@ -369,8 +430,8 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN upgrade.blockType = blockType; upgrade.blockLen = blockLen; - if ((blockLen - boffset) < 18) - return -1015; + if ((blockLen - boffset) < 20) + return -1032; upgrade.quantIdxY = block[boffset + 0]; /* quantIdxY (1 byte) */ upgrade.quantIdxCb = block[boffset + 1]; /* quantIdxCb (1 byte) */ @@ -384,40 +445,40 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN 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 += 18; + boffset += 20; if ((blockLen - boffset) < upgrade.ySrlLen) - return -1016; + return -1033; upgrade.ySrlData = &block[boffset]; boffset += upgrade.ySrlLen; if ((blockLen - boffset) < upgrade.yRawLen) - return -1017; + return -1034; upgrade.yRawData = &block[boffset]; boffset += upgrade.yRawLen; if ((blockLen - boffset) < upgrade.cbSrlLen) - return -1018; + return -1035; upgrade.cbSrlData = &block[boffset]; boffset += upgrade.cbSrlLen; if ((blockLen - boffset) < upgrade.cbRawLen) - return -1019; + return -1036; upgrade.cbRawData = &block[boffset]; boffset += upgrade.cbRawLen; if ((blockLen - boffset) < upgrade.crSrlLen) - return -1020; + return -1037; upgrade.crSrlData = &block[boffset]; boffset += upgrade.crSrlLen; if ((blockLen - boffset) < upgrade.crRawLen) - return -1021; + return -1038; upgrade.crRawData = &block[boffset]; boffset += upgrade.crRawLen; @@ -425,23 +486,34 @@ int progressive_decompress(PROGRESSIVE_CONTEXT* progressive, BYTE* pSrcData, UIN break; default: - return -1022; + return -1039; break; } if (boffset != blockLen) - { - printf("failure %s\n", progressive_get_block_type_string(blockType)); - return -1023; - } + return -1040; offset += blockLen; + count++; } - if (offset != SrcSize) - return -1024; + if (offset != blocksLen) + return -1041; - return 1; + 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) @@ -463,6 +535,26 @@ PROGRESSIVE_CONTEXT* progressive_context_new(BOOL Compressor) 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; @@ -473,6 +565,10 @@ void progressive_context_free(PROGRESSIVE_CONTEXT* progressive) if (!progressive) return; + free(progressive->rects); + free(progressive->quantVals); + free(progressive->quantProgVals); + free(progressive); }