From e49a690d466abca57021e46ffdfc25c8ccb5f07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 31 Aug 2011 04:35:50 -0400 Subject: [PATCH 1/3] windows: fix compilation and linking of all libraries --- CMakeLists.txt | 4 +- include/freerdp/api.h | 8 ++- include/freerdp/rail/rail.h | 16 +++--- include/freerdp/update.h | 4 ++ include/freerdp/utils/certstore.h | 25 ++++---- libfreerdp-core/fastpath.c | 5 +- libfreerdp-core/gcc.c | 2 + libfreerdp-core/listener.c | 10 ++++ libfreerdp-core/tls.c | 11 ++-- libfreerdp-gdi/16bpp.c | 33 +++++------ libfreerdp-gdi/32bpp.c | 33 +++++------ libfreerdp-gdi/8bpp.c | 33 +++++------ libfreerdp-gdi/bitmap.c | 23 ++++---- libfreerdp-gdi/gdi.c | 13 +++-- libfreerdp-gdi/pen.c | 7 ++- libfreerdp-gdi/region.c | 33 +++++------ libfreerdp-rail/rail.c | 2 +- libfreerdp-rail/window.c | 18 +++--- libfreerdp-utils/certstore.c | 95 +++++++++++++++++++------------ libfreerdp-utils/stopwatch.c | 2 +- 20 files changed, 217 insertions(+), 160 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23068d831..07db72780 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,12 +63,12 @@ if(CMAKE_COMPILER_IS_GNUCC) endif() if(MSVC) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gz") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd /MT") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /O2 /Ob2") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_EXPORTS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN") - endif() # Include files diff --git a/include/freerdp/api.h b/include/freerdp/api.h index 44b9f642f..0e6bc9e8b 100644 --- a/include/freerdp/api.h +++ b/include/freerdp/api.h @@ -45,11 +45,17 @@ #endif #ifdef _WIN32 -#define FREERDP_CC __stdcall +#define FREERDP_CC __cdecl #else #define FREERDP_CC #endif +#ifdef _WIN32 +#define INLINE __inline +#else +#define INLINE inline +#endif + #define IFCALL(_cb, ...) do { if (_cb != NULL) { _cb( __VA_ARGS__ ); } } while (0) #endif diff --git a/include/freerdp/rail/rail.h b/include/freerdp/rail/rail.h index 00f90b5e9..60fc97b57 100644 --- a/include/freerdp/rail/rail.h +++ b/include/freerdp/rail/rail.h @@ -50,14 +50,14 @@ struct rdp_rail rdpIconCache* cache; rdpWindowList* list; rdpSettings* settings; - railCreateWindow CreateWindow; - railDestroyWindow DestroyWindow; - railMoveWindow MoveWindow; - railShowWindow ShowWindow; - railSetWindowText SetWindowText; - railSetWindowIcon SetWindowIcon; - railSetWindowRects SetWindowRects; - railSetWindowVisibilityRects SetWindowVisibilityRects; + railCreateWindow rail_CreateWindow; + railDestroyWindow rail_DestroyWindow; + railMoveWindow rail_MoveWindow; + railShowWindow rail_ShowWindow; + railSetWindowText rail_SetWindowText; + railSetWindowIcon rail_SetWindowIcon; + railSetWindowRects rail_SetWindowRects; + railSetWindowVisibilityRects rail_SetWindowVisibilityRects; }; FREERDP_API void rail_register_update_callbacks(rdpRail* rail, rdpUpdate* update); diff --git a/include/freerdp/update.h b/include/freerdp/update.h index aaaf56567..4b7d743c0 100644 --- a/include/freerdp/update.h +++ b/include/freerdp/update.h @@ -25,6 +25,10 @@ #include #include +#ifdef _WIN32 +#include +#endif + /* Common */ struct _BOUNDS diff --git a/include/freerdp/utils/certstore.h b/include/freerdp/utils/certstore.h index 75e8ea3ce..4a90e157e 100644 --- a/include/freerdp/utils/certstore.h +++ b/include/freerdp/utils/certstore.h @@ -27,16 +27,17 @@ struct rdp_certstore struct rdp_certdata* certdata; }; -void certstore_create(rdpCertstore* certstore); -void certstore_open(rdpCertstore* certstore); -void certstore_load(rdpCertstore* certstore); -void certstore_close(rdpCertstore* certstore); -char* get_local_certloc(); -rdpCertdata* certdata_new(char* host_name,char* fingerprint); -void certdata_free(rdpCertdata* certdata); -void certstore_init(rdpCertstore* certstore); -rdpCertstore* certstore_new(rdpCertdata* certdata); -void certstore_free(rdpCertstore* certstore); -int match_certdata(rdpCertstore* certstore); -void print_certdata(rdpCertstore* certstore); +FREERDP_API void certstore_create(rdpCertstore* certstore); +FREERDP_API void certstore_open(rdpCertstore* certstore); +FREERDP_API void certstore_load(rdpCertstore* certstore); +FREERDP_API void certstore_close(rdpCertstore* certstore); +FREERDP_API char* get_local_certloc(); +FREERDP_API rdpCertdata* certdata_new(char* host_name, char* fingerprint); +FREERDP_API void certdata_free(rdpCertdata* certdata); +FREERDP_API void certstore_init(rdpCertstore* certstore); +FREERDP_API rdpCertstore* certstore_new(rdpCertdata* certdata); +FREERDP_API void certstore_free(rdpCertstore* certstore); +FREERDP_API int match_certdata(rdpCertstore* certstore); +FREERDP_API void print_certdata(rdpCertstore* certstore); + #endif /* __CERTSTORE_UTILS_H */ diff --git a/libfreerdp-core/fastpath.c b/libfreerdp-core/fastpath.c index b5bf10653..2275b57f1 100644 --- a/libfreerdp-core/fastpath.c +++ b/libfreerdp-core/fastpath.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "orders.h" @@ -73,7 +74,7 @@ uint16 fastpath_read_header(rdpFastPath* fastpath, STREAM* s) return length; } -inline void fastpath_read_update_header(STREAM* s, uint8* updateCode, uint8* fragmentation, uint8* compression) +INLINE void fastpath_read_update_header(STREAM* s, uint8* updateCode, uint8* fragmentation, uint8* compression) { uint8 updateHeader; @@ -83,7 +84,7 @@ inline void fastpath_read_update_header(STREAM* s, uint8* updateCode, uint8* fra *compression = (updateHeader >> 6) & 0x03; } -inline void fastpath_write_update_header(STREAM* s, uint8 updateCode, uint8 fragmentation, uint8 compression) +INLINE void fastpath_write_update_header(STREAM* s, uint8 updateCode, uint8 fragmentation, uint8 compression) { uint8 updateHeader = 0; diff --git a/libfreerdp-core/gcc.c b/libfreerdp-core/gcc.c index 289afbaa1..301672f58 100644 --- a/libfreerdp-core/gcc.c +++ b/libfreerdp-core/gcc.c @@ -17,6 +17,8 @@ * limitations under the License. */ +#include + #include "gcc.h" /** diff --git a/libfreerdp-core/listener.c b/libfreerdp-core/listener.c index 90da74624..427500af5 100644 --- a/libfreerdp-core/listener.c +++ b/libfreerdp-core/listener.c @@ -21,6 +21,7 @@ #include #include #include +#include #ifndef _WIN32 #include @@ -47,6 +48,9 @@ static boolean freerdp_listener_open(freerdp_listener* instance, const char* bin int option_value; void* sin_addr; char buf[50]; +#ifdef _WIN32 + u_long arg; +#endif hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; @@ -78,7 +82,13 @@ static boolean freerdp_listener_open(freerdp_listener* instance, const char* bin { perror("setsockopt"); } + +#ifndef _WIN32 fcntl(sockfd, F_SETFL, O_NONBLOCK); +#else + arg = 1; + ioctlsocket(sockfd, FIONBIO, &arg); +#endif status = bind(sockfd, ai->ai_addr, ai->ai_addrlen); if (status != 0) diff --git a/libfreerdp-core/tls.c b/libfreerdp-core/tls.c index c5760f0bd..2e45b545f 100644 --- a/libfreerdp-core/tls.c +++ b/libfreerdp-core/tls.c @@ -251,13 +251,14 @@ rdpTls* tls_new() int tls_verify_certificate(CryptoCert cert, char* hostname) { boolean ret; + rdpCertstore* certstore; ret = x509_verify_cert(cert); if (!ret) { rdpCertdata* certdata; certdata = crypto_get_certdata(cert->px509, hostname); - rdpCertstore* certstore = certstore_new(certdata); + certstore = certstore_new(certdata); if (match_certdata(certstore) == 0) goto end; @@ -267,17 +268,17 @@ int tls_verify_certificate(CryptoCert cert, char* hostname) char answer; crypto_cert_printinfo(cert->px509); - while(1) + while (1) { printf("Do you trust the above certificate? (Y/N) "); - answer=fgetc(stdin); + answer = fgetc(stdin); - if(answer=='y' || answer =='Y') + if (answer == 'y' || answer == 'Y') { print_certdata(certstore); break; } - else if(answer=='n' || answer=='N') + else if (answer == 'n' || answer == 'N') { certstore_free(certstore); return 1; diff --git a/libfreerdp-gdi/16bpp.c b/libfreerdp-gdi/16bpp.c index f2019fb2e..149b2c81e 100644 --- a/libfreerdp-gdi/16bpp.c +++ b/libfreerdp-gdi/16bpp.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -799,96 +800,96 @@ int PatBlt_16bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, i return 1; } -inline void SetPixel_BLACK_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_BLACK_16bpp(uint16 *pixel, uint16 *pen) { /* D = 0 */ *pixel = 0; } -inline void SetPixel_NOTMERGEPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_NOTMERGEPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = ~(D | P) */ *pixel = ~(*pixel | *pen); } -inline void SetPixel_MASKNOTPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_MASKNOTPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = D & ~P */ *pixel &= ~(*pen); } -inline void SetPixel_NOTCOPYPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_NOTCOPYPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = ~P */ *pixel = ~(*pen); } -inline void SetPixel_MASKPENNOT_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_MASKPENNOT_16bpp(uint16 *pixel, uint16 *pen) { /* D = P & ~D */ *pixel = *pen & ~*pixel; } -inline void SetPixel_NOT_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_NOT_16bpp(uint16 *pixel, uint16 *pen) { /* D = ~D */ *pixel = ~(*pixel); } -inline void SetPixel_XORPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_XORPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = D ^ P */ *pixel = *pixel ^ *pen; } -inline void SetPixel_NOTMASKPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_NOTMASKPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = ~(D & P) */ *pixel = ~(*pixel & *pen); } -inline void SetPixel_MASKPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_MASKPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = D & P */ *pixel &= *pen; } -inline void SetPixel_NOTXORPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_NOTXORPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = ~(D ^ P) */ *pixel = ~(*pixel ^ *pen); } -inline void SetPixel_NOP_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_NOP_16bpp(uint16 *pixel, uint16 *pen) { /* D = D */ } -inline void SetPixel_MERGENOTPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_MERGENOTPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = D | ~P */ *pixel |= ~(*pen); } -inline void SetPixel_COPYPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_COPYPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = P */ *pixel = *pen; } -inline void SetPixel_MERGEPENNOT_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_MERGEPENNOT_16bpp(uint16 *pixel, uint16 *pen) { /* D = P | ~D */ *pixel = *pen | ~(*pixel); } -inline void SetPixel_MERGEPEN_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_MERGEPEN_16bpp(uint16 *pixel, uint16 *pen) { /* D = P | D */ *pixel |= *pen; } -inline void SetPixel_WHITE_16bpp(uint16 *pixel, uint16 *pen) +INLINE void SetPixel_WHITE_16bpp(uint16 *pixel, uint16 *pen) { /* D = 1 */ *pixel = 0xFFFF; diff --git a/libfreerdp-gdi/32bpp.c b/libfreerdp-gdi/32bpp.c index c94aa6e3b..b5deb2d9a 100644 --- a/libfreerdp-gdi/32bpp.c +++ b/libfreerdp-gdi/32bpp.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -827,96 +828,96 @@ int PatBlt_32bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, i return 1; } -inline void SetPixel_BLACK_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_BLACK_32bpp(uint32 *pixel, uint32 *pen) { /* D = 0 */ *pixel = 0; } -inline void SetPixel_NOTMERGEPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_NOTMERGEPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = ~(D | P) */ *pixel = ~(*pixel | *pen); } -inline void SetPixel_MASKNOTPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_MASKNOTPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = D & ~P */ *pixel &= ~(*pen); } -inline void SetPixel_NOTCOPYPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_NOTCOPYPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = ~P */ *pixel = ~(*pen); } -inline void SetPixel_MASKPENNOT_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_MASKPENNOT_32bpp(uint32 *pixel, uint32 *pen) { /* D = P & ~D */ *pixel = *pen & ~*pixel; } -inline void SetPixel_NOT_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_NOT_32bpp(uint32 *pixel, uint32 *pen) { /* D = ~D */ *pixel = ~(*pixel); } -inline void SetPixel_XORPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_XORPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = D ^ P */ *pixel = *pixel ^ *pen; } -inline void SetPixel_NOTMASKPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_NOTMASKPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = ~(D & P) */ *pixel = ~(*pixel & *pen); } -inline void SetPixel_MASKPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_MASKPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = D & P */ *pixel &= *pen; } -inline void SetPixel_NOTXORPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_NOTXORPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = ~(D ^ P) */ *pixel = ~(*pixel ^ *pen); } -inline void SetPixel_NOP_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_NOP_32bpp(uint32 *pixel, uint32 *pen) { /* D = D */ } -inline void SetPixel_MERGENOTPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_MERGENOTPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = D | ~P */ *pixel |= ~(*pen); } -inline void SetPixel_COPYPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_COPYPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = P */ *pixel = *pen; } -inline void SetPixel_MERGEPENNOT_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_MERGEPENNOT_32bpp(uint32 *pixel, uint32 *pen) { /* D = P | ~D */ *pixel = *pen | ~(*pixel); } -inline void SetPixel_MERGEPEN_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_MERGEPEN_32bpp(uint32 *pixel, uint32 *pen) { /* D = P | D */ *pixel |= *pen; } -inline void SetPixel_WHITE_32bpp(uint32 *pixel, uint32 *pen) +INLINE void SetPixel_WHITE_32bpp(uint32 *pixel, uint32 *pen) { /* D = 1 */ *pixel = 0xFFFFFF; diff --git a/libfreerdp-gdi/8bpp.c b/libfreerdp-gdi/8bpp.c index a63077a0f..f9d90479d 100644 --- a/libfreerdp-gdi/8bpp.c +++ b/libfreerdp-gdi/8bpp.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -707,96 +708,96 @@ int PatBlt_8bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, in return 1; } -inline void SetPixel_BLACK_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_BLACK_8bpp(uint8* pixel, uint8* pen) { /* D = 0 */ *pixel = 0; } -inline void SetPixel_NOTMERGEPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_NOTMERGEPEN_8bpp(uint8* pixel, uint8* pen) { /* D = ~(D | P) */ *pixel = ~(*pixel | *pen); } -inline void SetPixel_MASKNOTPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_MASKNOTPEN_8bpp(uint8* pixel, uint8* pen) { /* D = D & ~P */ *pixel &= ~(*pen); } -inline void SetPixel_NOTCOPYPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_NOTCOPYPEN_8bpp(uint8* pixel, uint8* pen) { /* D = ~P */ *pixel = ~(*pen); } -inline void SetPixel_MASKPENNOT_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_MASKPENNOT_8bpp(uint8* pixel, uint8* pen) { /* D = P & ~D */ *pixel = *pen & ~*pixel; } -inline void SetPixel_NOT_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_NOT_8bpp(uint8* pixel, uint8* pen) { /* D = ~D */ *pixel = ~(*pixel); } -inline void SetPixel_XORPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_XORPEN_8bpp(uint8* pixel, uint8* pen) { /* D = D ^ P */ *pixel = *pixel ^ *pen; } -inline void SetPixel_NOTMASKPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_NOTMASKPEN_8bpp(uint8* pixel, uint8* pen) { /* D = ~(D & P) */ *pixel = ~(*pixel & *pen); } -inline void SetPixel_MASKPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_MASKPEN_8bpp(uint8* pixel, uint8* pen) { /* D = D & P */ *pixel &= *pen; } -inline void SetPixel_NOTXORPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_NOTXORPEN_8bpp(uint8* pixel, uint8* pen) { /* D = ~(D ^ P) */ *pixel = ~(*pixel ^ *pen); } -inline void SetPixel_NOP_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_NOP_8bpp(uint8* pixel, uint8* pen) { /* D = D */ } -inline void SetPixel_MERGENOTPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_MERGENOTPEN_8bpp(uint8* pixel, uint8* pen) { /* D = D | ~P */ *pixel |= ~(*pen); } -inline void SetPixel_COPYPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_COPYPEN_8bpp(uint8* pixel, uint8* pen) { /* D = P */ *pixel = *pen; } -inline void SetPixel_MERGEPENNOT_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_MERGEPENNOT_8bpp(uint8* pixel, uint8* pen) { /* D = P | ~D */ *pixel = *pen | ~(*pixel); } -inline void SetPixel_MERGEPEN_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_MERGEPEN_8bpp(uint8* pixel, uint8* pen) { /* D = P | D */ *pixel |= *pen; } -inline void SetPixel_WHITE_8bpp(uint8* pixel, uint8* pen) +INLINE void SetPixel_WHITE_8bpp(uint8* pixel, uint8* pen) { /* D = 1 */ *pixel = 0xFF; diff --git a/libfreerdp-gdi/bitmap.c b/libfreerdp-gdi/bitmap.c index 91d13efd5..61bf5b2e8 100644 --- a/libfreerdp-gdi/bitmap.c +++ b/libfreerdp-gdi/bitmap.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -48,39 +49,39 @@ pBitBlt BitBlt_[5] = * @return pixel color */ -inline GDI_COLOR gdi_GetPixel(HGDI_DC hdc, int nXPos, int nYPos) +INLINE GDI_COLOR gdi_GetPixel(HGDI_DC hdc, int nXPos, int nYPos) { HGDI_BITMAP hBmp = (HGDI_BITMAP) hdc->selectedObject; GDI_COLOR* colorp = (GDI_COLOR*)&(hBmp->data[(nYPos * hBmp->width * hdc->bytesPerPixel) + nXPos * hdc->bytesPerPixel]); return (GDI_COLOR) *colorp; } -inline uint8 gdi_GetPixel_8bpp(HGDI_BITMAP hBmp, int X, int Y) +INLINE uint8 gdi_GetPixel_8bpp(HGDI_BITMAP hBmp, int X, int Y) { return *((uint8*)&(hBmp->data[(Y * hBmp->width) + X])); } -inline uint16 gdi_GetPixel_16bpp(HGDI_BITMAP hBmp, int X, int Y) +INLINE uint16 gdi_GetPixel_16bpp(HGDI_BITMAP hBmp, int X, int Y) { return *((uint16*)&(hBmp->data[(Y * hBmp->width * 2) + X * 2])); } -inline uint32 gdi_GetPixel_32bpp(HGDI_BITMAP hBmp, int X, int Y) +INLINE uint32 gdi_GetPixel_32bpp(HGDI_BITMAP hBmp, int X, int Y) { return *((uint32*)&(hBmp->data[(Y * hBmp->width * 4) + X * 4])); } -inline uint8* gdi_GetPointer_8bpp(HGDI_BITMAP hBmp, int X, int Y) +INLINE uint8* gdi_GetPointer_8bpp(HGDI_BITMAP hBmp, int X, int Y) { return ((uint8*)&(hBmp->data[(Y * hBmp->width) + X])); } -inline uint16* gdi_GetPointer_16bpp(HGDI_BITMAP hBmp, int X, int Y) +INLINE uint16* gdi_GetPointer_16bpp(HGDI_BITMAP hBmp, int X, int Y) { return ((uint16*)&(hBmp->data[(Y * hBmp->width * 2) + X * 2])); } -inline uint32* gdi_GetPointer_32bpp(HGDI_BITMAP hBmp, int X, int Y) +INLINE uint32* gdi_GetPointer_32bpp(HGDI_BITMAP hBmp, int X, int Y) { return ((uint32*)&(hBmp->data[(Y * hBmp->width * 4) + X * 4])); } @@ -95,24 +96,24 @@ inline uint32* gdi_GetPointer_32bpp(HGDI_BITMAP hBmp, int X, int Y) * @return */ -inline GDI_COLOR gdi_SetPixel(HGDI_DC hdc, int X, int Y, GDI_COLOR crColor) +INLINE GDI_COLOR gdi_SetPixel(HGDI_DC hdc, int X, int Y, GDI_COLOR crColor) { HGDI_BITMAP hBmp = (HGDI_BITMAP) hdc->selectedObject; *((GDI_COLOR*)&(hBmp->data[(Y * hBmp->width * hdc->bytesPerPixel) + X * hdc->bytesPerPixel])) = crColor; return 0; } -inline void gdi_SetPixel_8bpp(HGDI_BITMAP hBmp, int X, int Y, uint8 pixel) +INLINE void gdi_SetPixel_8bpp(HGDI_BITMAP hBmp, int X, int Y, uint8 pixel) { *((uint8*)&(hBmp->data[(Y * hBmp->width) + X])) = pixel; } -inline void gdi_SetPixel_16bpp(HGDI_BITMAP hBmp, int X, int Y, uint16 pixel) +INLINE void gdi_SetPixel_16bpp(HGDI_BITMAP hBmp, int X, int Y, uint16 pixel) { *((uint16*)&(hBmp->data[(Y * hBmp->width * 2) + X * 2])) = pixel; } -inline void gdi_SetPixel_32bpp(HGDI_BITMAP hBmp, int X, int Y, uint32 pixel) +INLINE void gdi_SetPixel_32bpp(HGDI_BITMAP hBmp, int X, int Y, uint32 pixel) { *((uint32*)&(hBmp->data[(Y * hBmp->width * 4) + X * 4])) = pixel; } diff --git a/libfreerdp-gdi/gdi.c b/libfreerdp-gdi/gdi.c index 685f073bf..00ce2b519 100644 --- a/libfreerdp-gdi/gdi.c +++ b/libfreerdp-gdi/gdi.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -301,17 +302,17 @@ const uint32 rop3_code_table[] = /* GDI Helper Functions */ -inline uint32 gdi_rop3_code(uint8 code) +INLINE uint32 gdi_rop3_code(uint8 code) { return rop3_code_table[code]; } -inline void gdi_copy_mem(uint8 * d, uint8 * s, int n) +INLINE void gdi_copy_mem(uint8 * d, uint8 * s, int n) { memmove(d, s, n); } -inline void gdi_copy_mem_backwards(uint8 * d, uint8 * s, int n) +INLINE void gdi_copy_mem_backwards(uint8 * d, uint8 * s, int n) { d = (d + n) - 1; s = (s + n) - 1; @@ -336,7 +337,7 @@ inline void gdi_copy_mem_backwards(uint8 * d, uint8 * s, int n) } } -inline uint8* gdi_get_bitmap_pointer(HGDI_DC hdcBmp, int x, int y) +INLINE uint8* gdi_get_bitmap_pointer(HGDI_DC hdcBmp, int x, int y) { uint8 * p; HGDI_BITMAP hBmp = (HGDI_BITMAP) hdcBmp->selectedObject; @@ -353,7 +354,7 @@ inline uint8* gdi_get_bitmap_pointer(HGDI_DC hdcBmp, int x, int y) } } -inline uint8* gdi_get_brush_pointer(HGDI_DC hdcBrush, int x, int y) +INLINE uint8* gdi_get_brush_pointer(HGDI_DC hdcBrush, int x, int y) { uint8 * p; @@ -377,7 +378,7 @@ inline uint8* gdi_get_brush_pointer(HGDI_DC hdcBrush, int x, int y) return p; } -inline int gdi_is_mono_pixel_set(uint8* data, int x, int y, int width) +INLINE int gdi_is_mono_pixel_set(uint8* data, int x, int y, int width) { int byte; int shift; diff --git a/libfreerdp-gdi/pen.c b/libfreerdp-gdi/pen.c index ad6fa996e..735f1592c 100644 --- a/libfreerdp-gdi/pen.c +++ b/libfreerdp-gdi/pen.c @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -47,13 +48,13 @@ HGDI_PEN gdi_CreatePen(int fnPenStyle, int nWidth, int crColor) return hPen; } -inline uint8 gdi_GetPenColor_8bpp(HGDI_PEN pen) +INLINE uint8 gdi_GetPenColor_8bpp(HGDI_PEN pen) { /* TODO: implement conversion using palette */ return 0xFF; } -inline uint16 gdi_GetPenColor_16bpp(HGDI_PEN pen) +INLINE uint16 gdi_GetPenColor_16bpp(HGDI_PEN pen) { uint16 p; int r, g, b; @@ -63,7 +64,7 @@ inline uint16 gdi_GetPenColor_16bpp(HGDI_PEN pen) return p; } -inline uint32 gdi_GetPenColor_32bpp(HGDI_PEN pen) +INLINE uint32 gdi_GetPenColor_32bpp(HGDI_PEN pen) { return pen->color; } diff --git a/libfreerdp-gdi/region.c b/libfreerdp-gdi/region.c index 249b41fb9..3c26cafdd 100644 --- a/libfreerdp-gdi/region.c +++ b/libfreerdp-gdi/region.c @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -74,7 +75,7 @@ HGDI_RECT gdi_CreateRect(int xLeft, int yTop, int xRight, int yBottom) * @param rgn destination region */ -inline void gdi_RectToRgn(HGDI_RECT rect, HGDI_RGN rgn) +INLINE void gdi_RectToRgn(HGDI_RECT rect, HGDI_RGN rgn) { rgn->x = rect->left; rgn->y = rect->top; @@ -91,7 +92,7 @@ inline void gdi_RectToRgn(HGDI_RECT rect, HGDI_RGN rgn) * @param rgn destination region */ -inline void gdi_CRectToRgn(int left, int top, int right, int bottom, HGDI_RGN rgn) +INLINE void gdi_CRectToRgn(int left, int top, int right, int bottom, HGDI_RGN rgn) { rgn->x = left; rgn->y = top; @@ -108,7 +109,7 @@ inline void gdi_CRectToRgn(int left, int top, int right, int bottom, HGDI_RGN rg * @param h height */ -inline void gdi_RectToCRgn(HGDI_RECT rect, int *x, int *y, int *w, int *h) +INLINE void gdi_RectToCRgn(HGDI_RECT rect, int *x, int *y, int *w, int *h) { *x = rect->left; *y = rect->top; @@ -128,7 +129,7 @@ inline void gdi_RectToCRgn(HGDI_RECT rect, int *x, int *y, int *w, int *h) * @param h height */ -inline void gdi_CRectToCRgn(int left, int top, int right, int bottom, int *x, int *y, int *w, int *h) +INLINE void gdi_CRectToCRgn(int left, int top, int right, int bottom, int *x, int *y, int *w, int *h) { *x = left; *y = top; @@ -142,7 +143,7 @@ inline void gdi_CRectToCRgn(int left, int top, int right, int bottom, int *x, in * @param rect destination rectangle */ -inline void gdi_RgnToRect(HGDI_RGN rgn, HGDI_RECT rect) +INLINE void gdi_RgnToRect(HGDI_RGN rgn, HGDI_RECT rect) { rect->left = rgn->x; rect->top = rgn->y; @@ -159,7 +160,7 @@ inline void gdi_RgnToRect(HGDI_RGN rgn, HGDI_RECT rect) * @param rect destination rectangle */ -inline void gdi_CRgnToRect(int x, int y, int w, int h, HGDI_RECT rect) +INLINE void gdi_CRgnToRect(int x, int y, int w, int h, HGDI_RECT rect) { rect->left = x; rect->top = y; @@ -176,7 +177,7 @@ inline void gdi_CRgnToRect(int x, int y, int w, int h, HGDI_RECT rect) * @param bottom y2 */ -inline void gdi_RgnToCRect(HGDI_RGN rgn, int *left, int *top, int *right, int *bottom) +INLINE void gdi_RgnToCRect(HGDI_RGN rgn, int *left, int *top, int *right, int *bottom) { *left = rgn->x; *top = rgn->y; @@ -196,7 +197,7 @@ inline void gdi_RgnToCRect(HGDI_RGN rgn, int *left, int *top, int *right, int *b * @param bottom y2 */ -inline void gdi_CRgnToCRect(int x, int y, int w, int h, int *left, int *top, int *right, int *bottom) +INLINE void gdi_CRgnToCRect(int x, int y, int w, int h, int *left, int *top, int *right, int *bottom) { *left = x; *top = y; @@ -215,7 +216,7 @@ inline void gdi_CRgnToCRect(int x, int y, int w, int h, int *left, int *top, int * @return 1 if there is an overlap, 0 otherwise */ -inline int gdi_CopyOverlap(int x, int y, int width, int height, int srcx, int srcy) +INLINE int gdi_CopyOverlap(int x, int y, int width, int height, int srcx, int srcy) { GDI_RECT dst; GDI_RECT src; @@ -238,7 +239,7 @@ inline int gdi_CopyOverlap(int x, int y, int width, int height, int srcx, int sr * @return 1 if successful, 0 otherwise */ -inline int gdi_SetRect(HGDI_RECT rc, int xLeft, int yTop, int xRight, int yBottom) +INLINE int gdi_SetRect(HGDI_RECT rc, int xLeft, int yTop, int xRight, int yBottom) { rc->left = xLeft; rc->top = yTop; @@ -257,7 +258,7 @@ inline int gdi_SetRect(HGDI_RECT rc, int xLeft, int yTop, int xRight, int yBotto * @return */ -inline int gdi_SetRgn(HGDI_RGN hRgn, int nXLeft, int nYLeft, int nWidth, int nHeight) +INLINE int gdi_SetRgn(HGDI_RGN hRgn, int nXLeft, int nYLeft, int nWidth, int nHeight) { hRgn->x = nXLeft; hRgn->y = nYLeft; @@ -277,7 +278,7 @@ inline int gdi_SetRgn(HGDI_RGN hRgn, int nXLeft, int nYLeft, int nWidth, int nHe * @return */ -inline int gdi_SetRectRgn(HGDI_RGN hRgn, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) +INLINE int gdi_SetRectRgn(HGDI_RGN hRgn, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) { gdi_CRectToRgn(nLeftRect, nTopRect, nRightRect, nBottomRect, hRgn); hRgn->null = 0; @@ -302,7 +303,7 @@ inline int gdi_SetRectRgn(HGDI_RGN hRgn, int nLeftRect, int nTopRect, int nRight * @return 1 if both regions are equal, 0 otherwise */ -inline int gdi_EqualRgn(HGDI_RGN hSrcRgn1, HGDI_RGN hSrcRgn2) +INLINE int gdi_EqualRgn(HGDI_RGN hSrcRgn1, HGDI_RGN hSrcRgn2) { if ((hSrcRgn1->x == hSrcRgn2->x) && (hSrcRgn1->y == hSrcRgn2->y) && @@ -322,7 +323,7 @@ inline int gdi_EqualRgn(HGDI_RGN hSrcRgn1, HGDI_RGN hSrcRgn2) * @return 1 if successful, 0 otherwise */ -inline int gdi_CopyRect(HGDI_RECT dst, HGDI_RECT src) +INLINE int gdi_CopyRect(HGDI_RECT dst, HGDI_RECT src) { dst->left = src->left; dst->top = src->top; @@ -340,7 +341,7 @@ inline int gdi_CopyRect(HGDI_RECT dst, HGDI_RECT src) * @return 1 if the point is inside, 0 otherwise */ -inline int gdi_PtInRect(HGDI_RECT rc, int x, int y) +INLINE int gdi_PtInRect(HGDI_RECT rc, int x, int y) { /* * points on the left and top sides are considered in, @@ -369,7 +370,7 @@ inline int gdi_PtInRect(HGDI_RECT rc, int x, int y) * @return */ -inline int gdi_InvalidateRegion(HGDI_DC hdc, int x, int y, int w, int h) +INLINE int gdi_InvalidateRegion(HGDI_DC hdc, int x, int y, int w, int h) { GDI_RECT inv; GDI_RECT rgn; diff --git a/libfreerdp-rail/rail.c b/libfreerdp-rail/rail.c index cb174313c..5feee5a17 100644 --- a/libfreerdp-rail/rail.c +++ b/libfreerdp-rail/rail.c @@ -71,7 +71,7 @@ static void rail_WindowIcon(rdpUpdate* update, WINDOW_ORDER_INFO* orderInfo, WIN else window->smallIcon = icon; - IFCALL(rail->SetWindowIcon, rail, window, icon); + IFCALL(rail->rail_SetWindowIcon, rail, window, icon); } static void rail_WindowCachedIcon(rdpUpdate* update, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* window_cached_icon) diff --git a/libfreerdp-rail/window.c b/libfreerdp-rail/window.c index 9a55e01c0..2723829cf 100644 --- a/libfreerdp-rail/window.c +++ b/libfreerdp-rail/window.c @@ -278,15 +278,15 @@ void rail_CreateWindow(rdpRail* rail, rdpWindow* window) memcpy(window->title, "RAIL", sizeof("RAIL")); } - IFCALL(rail->CreateWindow, rail, window); + IFCALL(rail->rail_CreateWindow, rail, window); if (window->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS) { - IFCALL(rail->SetWindowRects, rail, window); + IFCALL(rail->rail_SetWindowRects, rail, window); } if (window->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY) { - IFCALL(rail->SetWindowVisibilityRects, rail, window); + IFCALL(rail->rail_SetWindowVisibilityRects, rail, window); } } @@ -304,7 +304,7 @@ void rail_UpdateWindow(rdpRail* rail, rdpWindow* window) if (window->fieldFlags & WINDOW_ORDER_FIELD_SHOW) { - IFCALL(rail->ShowWindow, rail, window, window->showState); + IFCALL(rail->rail_ShowWindow, rail, window, window->showState); } if (window->fieldFlags & WINDOW_ORDER_FIELD_TITLE) @@ -314,7 +314,7 @@ void rail_UpdateWindow(rdpRail* rail, rdpWindow* window) window->title = freerdp_uniconv_in(rail->uniconv, window->titleInfo.string, window->titleInfo.length); - IFCALL(rail->SetWindowText, rail, window); + IFCALL(rail->rail_SetWindowText, rail, window); } if (window->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET) @@ -340,7 +340,7 @@ void rail_UpdateWindow(rdpRail* rail, rdpWindow* window) if ((window->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET) || (window->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE)) { - IFCALL(rail->MoveWindow, rail, window); + IFCALL(rail->rail_MoveWindow, rail, window); } if (window->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA) @@ -350,7 +350,7 @@ void rail_UpdateWindow(rdpRail* rail, rdpWindow* window) if (window->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS) { - IFCALL(rail->SetWindowRects, rail, window); + IFCALL(rail->rail_SetWindowRects, rail, window); } if (window->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET) @@ -360,13 +360,13 @@ void rail_UpdateWindow(rdpRail* rail, rdpWindow* window) if (window->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY) { - IFCALL(rail->SetWindowVisibilityRects, rail, window); + IFCALL(rail->rail_SetWindowVisibilityRects, rail, window); } } void rail_DestroyWindow(rdpRail* rail, rdpWindow* window) { - IFCALL(rail->DestroyWindow, rail, window); + IFCALL(rail->rail_DestroyWindow, rail, window); if (window != NULL) { diff --git a/libfreerdp-utils/certstore.c b/libfreerdp-utils/certstore.c index b784d33a3..71fb06e85 100644 --- a/libfreerdp-utils/certstore.c +++ b/libfreerdp-utils/certstore.c @@ -36,19 +36,20 @@ void certstore_create(rdpCertstore* certstore) printf("certstore_create: error opening [%s] for writing\n", certstore->file); return; } + fflush(certstore->fp); } void certstore_load(rdpCertstore* certstore) { - certstore->fp = fopen((char*)certstore->file, "r+"); + certstore->fp = fopen((char*) certstore->file, "r+"); } void certstore_open(rdpCertstore* certstore) { struct stat stat_info; - if (stat((char*)certstore->file, &stat_info) != 0) + if (stat((char*) certstore->file, &stat_info) != 0) certstore_create(certstore); else certstore_load(certstore); @@ -62,14 +63,23 @@ void certstore_close(rdpCertstore* certstore) char* get_local_certloc() { - char *home_path; - char *certloc; + char* home_path; + char* certloc; struct stat stat_info; - home_path=getenv("HOME"); - certloc=(char*)xmalloc(strlen(home_path)+strlen("/.")+strlen(cert_dir)+strlen("/")+strlen(cert_loc)+1); + home_path = getenv("HOME"); + + certloc = (char*) xmalloc(strlen(home_path) + strlen("/.") + strlen(cert_dir) + strlen("/") + strlen(cert_loc) + 1); sprintf(certloc,"%s/.%s/%s",home_path,cert_dir,cert_loc); - if(stat((char*)certloc, &stat_info) != 0) + + if(stat((char*) certloc, &stat_info) != 0) + { +#ifndef _WIN32 mkdir(certloc, S_IRUSR | S_IWUSR | S_IXUSR); +#else + CreateDirectory(certloc, 0); +#endif + } + return certloc; } @@ -115,14 +125,18 @@ void certstore_init(rdpCertstore* certstore) rdpCertdata* certdata_new(char* host_name,char* fingerprint) { - rdpCertdata* certdata=(rdpCertdata*)xzalloc(sizeof(rdpCertdata)); - if(certdata !=NULL) + rdpCertdata* certdata; + + certdata = (rdpCertdata*) xzalloc(sizeof(rdpCertdata)); + + if (certdata !=NULL) { - certdata->hostname=xzalloc(strlen(host_name)+1); - certdata->thumbprint=xzalloc(strlen(fingerprint)+1); - sprintf(certdata->hostname,"%s",host_name); - sprintf(certdata->thumbprint,"%s",fingerprint); + certdata->hostname = xzalloc(strlen(host_name) + 1); + certdata->thumbprint = xzalloc(strlen(fingerprint) + 1); + sprintf(certdata->hostname, "%s", host_name); + sprintf(certdata->thumbprint, "%s", fingerprint); } + return certdata; } @@ -138,7 +152,9 @@ void certdata_free(rdpCertdata* certdata) rdpCertstore* certstore_new(rdpCertdata* certdata) { - rdpCertstore* certstore = (rdpCertstore*) xzalloc(sizeof(rdpCertstore)); + rdpCertstore* certstore; + + certstore = (rdpCertstore*) xzalloc(sizeof(rdpCertstore)); if (certstore != NULL) { @@ -164,32 +180,39 @@ void certstore_free(rdpCertstore* certstore) int match_certdata(rdpCertstore* certstore) { - char *host; - char *p; - char *thumb_print; + char* host; + char* p; + char* thumb_print; int length; unsigned char c; + rdpCertdata* cert_data; FILE* cfp; - cfp=certstore->fp; - rdpCertdata* cert_data=certstore->certdata; - length=strlen(cert_data->thumbprint); - host=xzalloc(strlen(cert_data->hostname)+1); - for(;;) + cfp = certstore->fp; + cert_data = certstore->certdata; + length = strlen(cert_data->thumbprint); + host = xzalloc(strlen(cert_data->hostname) + 1); + + for (;;) { - if((int)fread(host,sizeof(char),strlen(cert_data->hostname),cfp) < strlen(cert_data->hostname)) + if ((int) fread(host, sizeof(char), strlen(cert_data->hostname), cfp) < strlen(cert_data->hostname)) break; - if((!strcmp(host,cert_data->hostname)) && ((c=fgetc(cfp))==' ' || c=='\t') ) + + if ((!strcmp(host, cert_data->hostname)) && ((c = fgetc(cfp)) ==' ' || c == '\t') ) { - ungetc(c,cfp); - while((c=fgetc(cfp))==' ' || c=='\t'); - if(c==EOF) + ungetc(c, cfp); + while((c = fgetc(cfp)) == ' ' || c == '\t'); + + if (c == EOF) break; - ungetc(c,cfp); - thumb_print=xzalloc(length+1); - p=thumb_print; - while((p-thumb_print) < length && (*p=fgetc(cfp))!=EOF && *p!='\n' && *p==*(cert_data->thumbprint+(p-thumb_print))) + + ungetc(c, cfp); + thumb_print = xzalloc(length + 1); + p = thumb_print; + + while((p - thumb_print) < length && (*p = fgetc(cfp)) != EOF && *p != '\n' && *p == *(cert_data->thumbprint + (p - thumb_print))) p++; - if(p-thumb_print==length) + + if(p - thumb_print == length) certstore->match=0; else certstore->match=-1; @@ -197,13 +220,15 @@ int match_certdata(rdpCertstore* certstore) } else { - while(c!='\n' && c!=EOF) - c=fgetc(cfp); - if(c==EOF) + while (c != '\n' && c != EOF) + c = fgetc(cfp); + + if(c == EOF) break; } } xfree(host); + return certstore->match; } void print_certdata(rdpCertstore* certstore) diff --git a/libfreerdp-utils/stopwatch.c b/libfreerdp-utils/stopwatch.c index e74c1d909..da001e780 100644 --- a/libfreerdp-utils/stopwatch.c +++ b/libfreerdp-utils/stopwatch.c @@ -65,6 +65,6 @@ void stopwatch_get_elapsed_time_in_useconds(STOPWATCH* stopwatch, uint32* sec, u *sec = ((uint32) stopwatch->elapsed) / CLOCKS_PER_SEC; uelapsed = stopwatch->elapsed - ((double)(*sec) * CLOCKS_PER_SEC); - *usec = (uelapsed / (CLOCKS_PER_SEC / 1000000)); + *usec = (uint32)(uelapsed / (CLOCKS_PER_SEC / 1000000)); } From 13bdbc074431edbd418e18f0e291c775f51a5335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 31 Aug 2011 05:59:03 -0400 Subject: [PATCH 2/3] wfreerdp: initial commit --- client/CMakeLists.txt | 4 +- client/Windows/CMakeLists.txt | 27 +++ client/Windows/wfreerdp.c | 375 ++++++++++++++++++++++++++++++++++ client/Windows/wfreerdp.h | 68 ++++++ 4 files changed, 473 insertions(+), 1 deletion(-) create mode 100644 client/Windows/CMakeLists.txt create mode 100644 client/Windows/wfreerdp.c create mode 100644 client/Windows/wfreerdp.h diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 97668b5c4..8f199257f 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -20,7 +20,6 @@ # User Interfaces if(NOT WIN32) - # Build Test Client add_subdirectory(test) @@ -35,4 +34,7 @@ if(NOT WIN32) if(DIRECTFB_FOUND) add_subdirectory(DirectFB) endif() +else() + # Build Windows Client + add_subdirectory(Windows) endif() diff --git a/client/Windows/CMakeLists.txt b/client/Windows/CMakeLists.txt new file mode 100644 index 000000000..6ccf8514b --- /dev/null +++ b/client/Windows/CMakeLists.txt @@ -0,0 +1,27 @@ +# FreeRDP: A Remote Desktop Protocol Client +# FreeRDP Windows cmake build script +# +# Copyright 2011 O.S. Systems Software Ltda. +# Copyright 2011 Otavio Salvador +# Copyright 2011 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. + +add_executable(wfreerdp + wfreerdp.c + wfreerdp.h) + +target_link_libraries(wfreerdp freerdp-core) +target_link_libraries(wfreerdp freerdp-gdi) +target_link_libraries(wfreerdp freerdp-utils) +target_link_libraries(wfreerdp freerdp-chanman) diff --git a/client/Windows/wfreerdp.c b/client/Windows/wfreerdp.c new file mode 100644 index 000000000..3b60dce43 --- /dev/null +++ b/client/Windows/wfreerdp.c @@ -0,0 +1,375 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Windows Client + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2010-2011 Vic Lee + * Copyright 2010-2011 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. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "wfreerdp.h" + +struct _thread_data +{ + freerdp* instance; +}; +typedef struct _thread_data thread_data; + +HANDLE g_done_event; +HINSTANCE g_hInstance; +HCURSOR g_default_cursor; +volatile int g_thread_count = 0; +LPCTSTR g_wnd_class_name = L"wfreerdp"; + +int wf_create_console(void) +{ + if (!AllocConsole()) + return 1; + + freopen("CONOUT$", "w", stdout); + printf("Debug console created.\n"); + + return 0; +} + +boolean wf_pre_connect(freerdp* instance) +{ + wfInfo* wfi; + rdpSettings* settings; + + wfi = (wfInfo*) xzalloc(sizeof(wfInfo)); + SET_WFI(instance, wfi); + + settings = instance->settings; + + settings->order_support[NEG_DSTBLT_INDEX] = True; + settings->order_support[NEG_PATBLT_INDEX] = True; + settings->order_support[NEG_SCRBLT_INDEX] = True; + settings->order_support[NEG_OPAQUE_RECT_INDEX] = True; + settings->order_support[NEG_DRAWNINEGRID_INDEX] = False; + settings->order_support[NEG_MULTIDSTBLT_INDEX] = False; + settings->order_support[NEG_MULTIPATBLT_INDEX] = False; + settings->order_support[NEG_MULTISCRBLT_INDEX] = False; + settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = True; + settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = False; + settings->order_support[NEG_LINETO_INDEX] = True; + settings->order_support[NEG_POLYLINE_INDEX] = True; + settings->order_support[NEG_MEMBLT_INDEX] = True; + settings->order_support[NEG_MEM3BLT_INDEX] = False; + settings->order_support[NEG_SAVEBITMAP_INDEX] = True; + settings->order_support[NEG_GLYPH_INDEX_INDEX] = True; + settings->order_support[NEG_FAST_INDEX_INDEX] = True; + settings->order_support[NEG_FAST_GLYPH_INDEX] = True; + settings->order_support[NEG_POLYGON_SC_INDEX] = False; + settings->order_support[NEG_POLYGON_CB_INDEX] = False; + settings->order_support[NEG_ELLIPSE_SC_INDEX] = False; + settings->order_support[NEG_ELLIPSE_CB_INDEX] = False; + + settings->kbd_layout = (int) GetKeyboardLayout(0) & 0x0000FFFF; + printf("keyboard_layout: 0x%X\n", settings->kbd_layout); + + freerdp_chanman_pre_connect(GET_CHANMAN(instance), instance); + + return True; +} + +boolean wf_post_connect(freerdp* instance) +{ + GDI* gdi; + wfInfo* wfi; + + wfi = GET_WFI(instance); + SET_WFI(instance->update, wfi); + + gdi_init(instance, CLRCONV_ALPHA | CLRBUF_32BPP); + gdi = GET_GDI(instance->update); + + freerdp_chanman_post_connect(GET_CHANMAN(instance), instance); + + return True; +} + +int wf_receive_channel_data(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size) +{ + return freerdp_chanman_data(instance, channelId, data, size, flags, total_size); +} + +void wf_process_channel_event(rdpChanMan* chanman, freerdp* instance) +{ + wfInfo* wfi; + RDP_EVENT* event; + + wfi = GET_WFI(instance); + + event = freerdp_chanman_pop_event(chanman); + + if (event) + freerdp_event_free(event); +} + +boolean wf_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount) +{ + wfInfo* wfi = GET_WFI(instance); + return True; +} + +boolean wf_check_fds(freerdp* instance) +{ + wfInfo* wfi = GET_WFI(instance); + return True; +} + +int wfreerdp_run(freerdp* instance) +{ + MSG msg; + int index; + int gmcode; + int alldone; + int rcount; + int wcount; + void* rfds[32]; + void* wfds[32]; + int fds_count; + HANDLE fds[64]; + rdpChanMan* chanman; + + chanman = GET_CHANMAN(instance); + + /* program main loop */ + while (1) + { + rcount = 0; + wcount = 0; + + if (instance->GetFileDescriptor(instance, rfds, &rcount, wfds, &wcount) != True) + { + printf("Failed to get FreeRDP file descriptor\n"); + break; + } + if (freerdp_chanman_get_fds(chanman, instance, rfds, &rcount, wfds, &wcount) != True) + { + printf("Failed to get channel manager file descriptor\n"); + break; + } + if (wf_get_fds(instance, rfds, &rcount, wfds, &wcount) != True) + { + printf("Failed to get wfreerdp file descriptor\n"); + break; + } + + fds_count = 0; + /* setup read fds */ + for (index = 0; index < rcount; index++) + { + fds[fds_count++] = rfds[index]; + } + /* setup write fds */ + for (index = 0; index < wcount; index++) + { + fds[fds_count++] = wfds[index]; + } + /* exit if nothing to do */ + if (fds_count == 0) + { + printf("wfreerdp_run: fds_count is zero\n"); + break; + } + /* do the wait */ + if (MsgWaitForMultipleObjects(fds_count, fds, FALSE, INFINITE, QS_ALLINPUT) == WAIT_FAILED) + { + printf("wfreerdp_run: WaitForMultipleObjects failed\n"); + break; + } + + if (instance->CheckFileDescriptor(instance) != True) + { + printf("Failed to check FreeRDP file descriptor\n"); + break; + } + if (wf_check_fds(instance) != True) + { + printf("Failed to check wfreerdp file descriptor\n"); + break; + } + if (freerdp_chanman_check_fds(chanman, instance) != True) + { + printf("Failed to check channel manager file descriptor\n"); + break; + } + wf_process_channel_event(chanman, instance); + + alldone = FALSE; + while (PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)) + { + gmcode = GetMessage(&msg, 0, 0, 0); + if (gmcode == 0 || gmcode == -1) + { + alldone = TRUE; + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } + if (alldone) + { + break; + } + } + + /* cleanup */ + freerdp_chanman_free(chanman); + freerdp_free(instance); + + return 0; +} + +static DWORD WINAPI thread_func(LPVOID lpParam) +{ + wfInfo* wfi; + freerdp* instance; + thread_data* data; + + data = (thread_data*) lpParam; + instance = data->instance; + + wfi = (wfInfo*) xzalloc(sizeof(wfInfo)); + wfi->clrconv = (HCLRCONV) xzalloc(sizeof(CLRCONV)); + wfi->clrconv->alpha = 1; + wfi->clrconv->palette = NULL; + SET_WFI(instance, wfi); + + wfreerdp_run(instance); + g_thread_count--; + + if (g_thread_count < 1) + SetEvent(g_done_event); + + return (DWORD) NULL; +} + +static DWORD WINAPI kbd_thread_func(LPVOID lpParam) +{ +#if 0 + MSG msg; + BOOL bRet; + HHOOK hook_handle; + + hook_handle = SetWindowsHookEx(WH_KEYBOARD_LL, wf_ll_kbd_proc, g_hInstance, 0); + + if (hook_handle) + { + while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) + { + if (bRet == -1) + { + printf("keyboard thread error getting message\n"); + break; + } + else + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + UnhookWindowsHookEx(hook_handle); + } + else + printf("failed to install keyboard hook\n"); +#endif + + return (DWORD) NULL; +} + +INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +{ + freerdp* instance; + thread_data* data; + WSADATA wsa_data; + WNDCLASSEX wnd_cls; + rdpChanMan* chanman; + + if (WSAStartup(0x101, &wsa_data) != 0) + return 1; + + g_done_event = CreateEvent(0, 1, 0, 0); + +#if defined(WITH_DEBUG) || defined(_DEBUG) + wf_create_console(); +#endif + + g_default_cursor = LoadCursor(NULL, IDC_ARROW); + + wnd_cls.cbSize = sizeof(WNDCLASSEX); + wnd_cls.style = CS_HREDRAW | CS_VREDRAW; + //wnd_cls.lpfnWndProc = wf_event_proc; + wnd_cls.cbClsExtra = 0; + wnd_cls.cbWndExtra = 0; + wnd_cls.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wnd_cls.hCursor = g_default_cursor; + wnd_cls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); + wnd_cls.lpszMenuName = NULL; + wnd_cls.lpszClassName = g_wnd_class_name; + wnd_cls.hInstance = hInstance; + wnd_cls.hIconSm = LoadIcon(NULL, IDI_APPLICATION); + RegisterClassEx(&wnd_cls); + + g_hInstance = hInstance; + + instance = freerdp_new(); + instance->PreConnect = wf_pre_connect; + instance->PostConnect = wf_post_connect; + instance->ReceiveChannelData = wf_receive_channel_data; + + chanman = freerdp_chanman_new(); + SET_CHANMAN(instance, chanman); + + if (!CreateThread(NULL, 0, kbd_thread_func, NULL, 0, NULL)) + printf("error creating keyboard handler thread"); + + while (1) + { + data = (thread_data*) xzalloc(sizeof(thread_data)); + data->instance = instance; + + freerdp_parse_args(instance->settings, __argc, __argv, NULL, NULL, NULL, NULL); + + if (CreateThread(NULL, 0, thread_func, data, 0, NULL) != 0) + { + g_thread_count++; + } + } + + if (g_thread_count > 0) + WaitForSingleObject(g_done_event, INFINITE); + else + MessageBox(GetConsoleWindow(), + L"Failed to start wfreerdp.\n\nPlease check the debug output.", + L"FreeRDP Error", MB_ICONSTOP); + + WSACleanup(); + + return 0; +} diff --git a/client/Windows/wfreerdp.h b/client/Windows/wfreerdp.h new file mode 100644 index 000000000..ff92b0164 --- /dev/null +++ b/client/Windows/wfreerdp.h @@ -0,0 +1,68 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Windows Client + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2010-2011 Vic Lee + * Copyright 2010-2011 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 __WFREERDP_H +#define __WFREERDP_H + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#include +#include + +#include +#include +#include +#include +#include + +#define SET_WFI(_instance, _wfi) (_instance)->param1 = _wfi +#define GET_WFI(_instance) ((wfInfo*) ((_instance)->param1)) + +#define SET_CHANMAN(_instance, _chanman) (_instance)->param2 = _chanman +#define GET_CHANMAN(_instance) ((rdpChanMan*) ((_instance)->param2)) + +struct wf_bitmap +{ + HDC hdc; + HBITMAP bitmap; + HBITMAP org_bitmap; +}; + +struct wf_info +{ + int fs_toggle; + int fullscreen; + int percentscreen; + char window_title[64]; + + HWND hwnd; + struct wf_bitmap* primary; + struct wf_bitmap* drawing; + HCLRCONV clrconv; + HCURSOR cursor; + HBRUSH brush; + HBRUSH org_brush; +}; +typedef struct wf_info wfInfo; + +#endif From aee51a7e2e1742a140a6115ea9d0d3daf20aab65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 31 Aug 2011 02:01:49 -0400 Subject: [PATCH 3/3] xfreerdp: fix after refactoring libfreerdp-rail on windows --- client/X11/xf_rail.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c index 2b38f417a..ecad1ab74 100644 --- a/client/X11/xf_rail.c +++ b/client/X11/xf_rail.c @@ -187,14 +187,14 @@ void xf_rail_DestroyWindow(rdpRail* rail, rdpWindow* window) void xf_rail_register_callbacks(xfInfo* xfi, rdpRail* rail) { rail->extra = (void*) xfi; - rail->CreateWindow = xf_rail_CreateWindow; - rail->MoveWindow = xf_rail_MoveWindow; - rail->ShowWindow = xf_rail_ShowWindow; - rail->SetWindowText = xf_rail_SetWindowText; - rail->SetWindowIcon = xf_rail_SetWindowIcon; - rail->SetWindowRects = xf_rail_SetWindowRects; - rail->SetWindowVisibilityRects = xf_rail_SetWindowVisibilityRects; - rail->DestroyWindow = xf_rail_DestroyWindow; + rail->rail_CreateWindow = xf_rail_CreateWindow; + rail->rail_MoveWindow = xf_rail_MoveWindow; + rail->rail_ShowWindow = xf_rail_ShowWindow; + rail->rail_SetWindowText = xf_rail_SetWindowText; + rail->rail_SetWindowIcon = xf_rail_SetWindowIcon; + rail->rail_SetWindowRects = xf_rail_SetWindowRects; + rail->rail_SetWindowVisibilityRects = xf_rail_SetWindowVisibilityRects; + rail->rail_DestroyWindow = xf_rail_DestroyWindow; } static void xf_on_free_rail_client_event(RDP_EVENT* event)