Merge branch 'master' of github.com:FreeRDP/FreeRDP
Conflicts: libfreerdp/core/input.c libfreerdp/core/update.c
This commit is contained in:
commit
83ad1730b8
@ -68,11 +68,11 @@ endif()
|
|||||||
|
|
||||||
# Allow to search the host machine for git
|
# Allow to search the host machine for git
|
||||||
if(ANDROID OR IOS)
|
if(ANDROID OR IOS)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, BOTH)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
|
||||||
endif(ANDROID OR IOS)
|
endif(ANDROID OR IOS)
|
||||||
include(GetGitRevisionDescription)
|
include(GetGitRevisionDescription)
|
||||||
if(ANDROID OR IOS)
|
if(ANDROID OR IOS)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, ONLY)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
|
||||||
endif(ANDROID OR IOS)
|
endif(ANDROID OR IOS)
|
||||||
|
|
||||||
git_describe(GIT_REVISION --match "[0-9]*" --abbrev=4 --tags --always)
|
git_describe(GIT_REVISION --match "[0-9]*" --abbrev=4 --tags --always)
|
||||||
@ -301,8 +301,9 @@ endif()
|
|||||||
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/client/Android/FreeRDPCore/jni/${ANDROID_ABI})
|
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/client/Android/FreeRDPCore/jni/${ANDROID_ABI})
|
||||||
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/regenerate_jni_headers.sh.cmake
|
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/regenerate_jni_headers.sh.cmake
|
||||||
${CMAKE_BINARY_DIR}/scripts/regenerate_jni_headers.sh @ONLY)
|
${CMAKE_BINARY_DIR}/scripts/regenerate_jni_headers.sh @ONLY)
|
||||||
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
|
if (WITH_GPROF)
|
||||||
${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
|
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
|
||||||
|
endif(WITH_GPROF)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -43,12 +43,22 @@
|
|||||||
#define AVMEDIA_TYPE_AUDIO 1
|
#define AVMEDIA_TYPE_AUDIO 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if LIBAVCODEC_VERSION_MAJOR < 54
|
||||||
|
#define MAX_AUDIO_FRAME_SIZE AVCODEC_MAX_AUDIO_FRAME_SIZE
|
||||||
|
#else
|
||||||
|
#define MAX_AUDIO_FRAME_SIZE 192000
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _TSMFFFmpegDecoder
|
typedef struct _TSMFFFmpegDecoder
|
||||||
{
|
{
|
||||||
ITSMFDecoder iface;
|
ITSMFDecoder iface;
|
||||||
|
|
||||||
int media_type;
|
int media_type;
|
||||||
|
#if LIBAVCODEC_VERSION_MAJOR < 55
|
||||||
enum CodecID codec_id;
|
enum CodecID codec_id;
|
||||||
|
#else
|
||||||
|
enum AVCodecID codec_id;
|
||||||
|
#endif
|
||||||
AVCodecContext* codec_context;
|
AVCodecContext* codec_context;
|
||||||
AVCodec* codec;
|
AVCodec* codec;
|
||||||
AVFrame* frame;
|
AVFrame* frame;
|
||||||
@ -98,6 +108,7 @@ static BOOL tsmf_ffmpeg_init_audio_stream(ITSMFDecoder* decoder, const TS_AM_MED
|
|||||||
mdecoder->codec_context->channels = media_type->Channels;
|
mdecoder->codec_context->channels = media_type->Channels;
|
||||||
mdecoder->codec_context->block_align = media_type->BlockAlign;
|
mdecoder->codec_context->block_align = media_type->BlockAlign;
|
||||||
|
|
||||||
|
#if LIBAVCODEC_VERSION_MAJOR < 55
|
||||||
#ifdef AV_CPU_FLAG_SSE2
|
#ifdef AV_CPU_FLAG_SSE2
|
||||||
mdecoder->codec_context->dsp_mask = AV_CPU_FLAG_SSE2 | AV_CPU_FLAG_MMX2;
|
mdecoder->codec_context->dsp_mask = AV_CPU_FLAG_SSE2 | AV_CPU_FLAG_MMX2;
|
||||||
#else
|
#else
|
||||||
@ -107,6 +118,13 @@ static BOOL tsmf_ffmpeg_init_audio_stream(ITSMFDecoder* decoder, const TS_AM_MED
|
|||||||
mdecoder->codec_context->dsp_mask = FF_MM_SSE2 | FF_MM_MMX2;
|
mdecoder->codec_context->dsp_mask = FF_MM_SSE2 | FF_MM_MMX2;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#else /* LIBAVCODEC_VERSION_MAJOR < 55 */
|
||||||
|
#ifdef AV_CPU_FLAG_SSE2
|
||||||
|
av_set_cpu_flags_mask(AV_CPU_FLAG_SSE2 | AV_CPU_FLAG_MMX2);
|
||||||
|
#else
|
||||||
|
av_set_cpu_flags_mask(FF_MM_SSE2 | FF_MM_MMX2);
|
||||||
|
#endif
|
||||||
|
#endif /* LIBAVCODEC_VERSION_MAJOR < 55 */
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -351,7 +369,7 @@ static BOOL tsmf_ffmpeg_decode_audio(ITSMFDecoder* decoder, const BYTE* data, UI
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (mdecoder->decoded_size_max == 0)
|
if (mdecoder->decoded_size_max == 0)
|
||||||
mdecoder->decoded_size_max = AVCODEC_MAX_AUDIO_FRAME_SIZE + 16;
|
mdecoder->decoded_size_max = MAX_AUDIO_FRAME_SIZE + 16;
|
||||||
mdecoder->decoded_data = malloc(mdecoder->decoded_size_max);
|
mdecoder->decoded_data = malloc(mdecoder->decoded_size_max);
|
||||||
ZeroMemory(mdecoder->decoded_data, mdecoder->decoded_size_max);
|
ZeroMemory(mdecoder->decoded_data, mdecoder->decoded_size_max);
|
||||||
/* align the memory for SSE2 needs */
|
/* align the memory for SSE2 needs */
|
||||||
@ -363,7 +381,7 @@ static BOOL tsmf_ffmpeg_decode_audio(ITSMFDecoder* decoder, const BYTE* data, UI
|
|||||||
while (src_size > 0)
|
while (src_size > 0)
|
||||||
{
|
{
|
||||||
/* Ensure enough space for decoding */
|
/* Ensure enough space for decoding */
|
||||||
if (mdecoder->decoded_size_max - mdecoder->decoded_size < AVCODEC_MAX_AUDIO_FRAME_SIZE)
|
if (mdecoder->decoded_size_max - mdecoder->decoded_size < MAX_AUDIO_FRAME_SIZE)
|
||||||
{
|
{
|
||||||
mdecoder->decoded_size_max = mdecoder->decoded_size_max * 2 + 16;
|
mdecoder->decoded_size_max = mdecoder->decoded_size_max * 2 + 16;
|
||||||
mdecoder->decoded_data = realloc(mdecoder->decoded_data, mdecoder->decoded_size_max);
|
mdecoder->decoded_data = realloc(mdecoder->decoded_data, mdecoder->decoded_size_max);
|
||||||
|
@ -19,11 +19,10 @@ if (NOT ANDROID_NDK)
|
|||||||
message(FATAL_ERROR "ANDROID_NDK not set but required for building android native library.")
|
message(FATAL_ERROR "ANDROID_NDK not set but required for building android native library.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, BOTH)
|
set(CMAKE_PROGRAM_PATH ${ANDROID_NDK})
|
||||||
find_program(NDK_COMMAND ndk-build)
|
find_program(NDK_COMMAND ndk-build CMAKE_FIND_ROOT_PATH_BOTH)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, ONLY)
|
|
||||||
|
|
||||||
if(NDK_COMMAND STREQUAL "ANT_COMMAND-NOTFOUND")
|
if(NDK_COMMAND STREQUAL "NDK_COMMAND-NOTFOUND")
|
||||||
message(FATAL_ERROR "ndk-build not found but required to build native lib")
|
message(FATAL_ERROR "ndk-build not found but required to build native lib")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -34,9 +33,9 @@ if(ANDROID_BUILD_JAVA)
|
|||||||
endif()
|
endif()
|
||||||
# And isn't shiped with the android ndk/sdk so
|
# And isn't shiped with the android ndk/sdk so
|
||||||
# we need to find it on the local machine
|
# we need to find it on the local machine
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, BOTH)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
|
||||||
find_program(ANT_COMMAND ant)
|
find_program(ANT_COMMAND ant)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, ONLY)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
|
||||||
|
|
||||||
if(ANT_COMMAND STREQUAL "ANT_COMMAND-NOTFOUND")
|
if(ANT_COMMAND STREQUAL "ANT_COMMAND-NOTFOUND")
|
||||||
message(FATAL_ERROR "ant not found but required to build android java")
|
message(FATAL_ERROR "ant not found but required to build android java")
|
||||||
|
@ -15,6 +15,6 @@
|
|||||||
# 'key.alias' for the name of the key to use.
|
# 'key.alias' for the name of the key to use.
|
||||||
# The password will be asked during the build when you use the 'release' target.
|
# The password will be asked during the build when you use the 'release' target.
|
||||||
build.dir=@CMAKE_CURRENT_BINARY_DIR@
|
build.dir=@CMAKE_CURRENT_BINARY_DIR@
|
||||||
source.dir=@CMAKE_CURRENT_SOURCE_DIR@/src
|
source.path=@CMAKE_CURRENT_SOURCE_DIR@/src:@CMAKE_CURRENT_BINARY_DIR@/src
|
||||||
out.dir=@CMAKE_CURRENT_BINARY_DIR@/bin
|
out.dir=@CMAKE_CURRENT_BINARY_DIR@/bin
|
||||||
|
|
||||||
|
@ -26,6 +26,14 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build.xml.cmake
|
|||||||
${CMAKE_CURRENT_BINARY_DIR}/build.xml @ONLY)
|
${CMAKE_CURRENT_BINARY_DIR}/build.xml @ONLY)
|
||||||
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/project.properties.cmake
|
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/project.properties.cmake
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/project.properties @ONLY)
|
${CMAKE_CURRENT_BINARY_DIR}/project.properties @ONLY)
|
||||||
|
|
||||||
|
# The following is required if building android out of tree
|
||||||
|
if (${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
set (AFREERDP_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
|
||||||
|
else()
|
||||||
|
set (AFREERDP_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src:${CMAKE_CURRENT_SOURCE_DIR}/../FreeRDPCore/src")
|
||||||
|
endif()
|
||||||
|
|
||||||
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/ant.properties.cmake
|
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/ant.properties.cmake
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/ant.properties @ONLY)
|
${CMAKE_CURRENT_BINARY_DIR}/ant.properties @ONLY)
|
||||||
|
|
||||||
|
@ -15,6 +15,5 @@
|
|||||||
# 'key.alias' for the name of the key to use.
|
# 'key.alias' for the name of the key to use.
|
||||||
# The password will be asked during the build when you use the 'release' target.
|
# The password will be asked during the build when you use the 'release' target.
|
||||||
build.dir=@CMAKE_CURRENT_BINARY_DIR@
|
build.dir=@CMAKE_CURRENT_BINARY_DIR@
|
||||||
source.dir=@CMAKE_CURRENT_SOURCE_DIR@/src
|
source.dir=@AFREERDP_SOURCE_DIR@
|
||||||
out.dir=@CMAKE_CURRENT_BINARY_DIR@/bin
|
out.dir=@CMAKE_CURRENT_BINARY_DIR@/bin
|
||||||
|
|
||||||
|
@ -51,10 +51,13 @@ static UINT32 get_local_format_id_by_name(cliprdrContext *cliprdr, void *format_
|
|||||||
formatMapping *map;
|
formatMapping *map;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < cliprdr->map_size; i++) {
|
for (i = 0; i < cliprdr->map_size; i++)
|
||||||
|
{
|
||||||
map = &cliprdr->format_mappings[i];
|
map = &cliprdr->format_mappings[i];
|
||||||
if ((cliprdr->capabilities & CAPS_USE_LONG_FORMAT_NAMES) != 0) {
|
if ((cliprdr->capabilities & CAPS_USE_LONG_FORMAT_NAMES) != 0)
|
||||||
if (map->name) {
|
{
|
||||||
|
if (map->name)
|
||||||
|
{
|
||||||
if (memcmp(map->name, format_name, wcslen((LPCWSTR)format_name)) == 0)
|
if (memcmp(map->name, format_name, wcslen((LPCWSTR)format_name)) == 0)
|
||||||
return map->local_format_id;
|
return map->local_format_id;
|
||||||
}
|
}
|
||||||
@ -69,9 +72,11 @@ static UINT32 get_remote_format_id(cliprdrContext *cliprdr, UINT32 local_format)
|
|||||||
formatMapping *map;
|
formatMapping *map;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < cliprdr->map_size; i++) {
|
for (i = 0; i < cliprdr->map_size; i++)
|
||||||
|
{
|
||||||
map = &cliprdr->format_mappings[i];
|
map = &cliprdr->format_mappings[i];
|
||||||
if (map->local_format_id == local_format) {
|
if (map->local_format_id == local_format)
|
||||||
|
{
|
||||||
return map->remote_format_id;
|
return map->remote_format_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -81,9 +86,10 @@ static UINT32 get_remote_format_id(cliprdrContext *cliprdr, UINT32 local_format)
|
|||||||
|
|
||||||
static void map_ensure_capacity(cliprdrContext *cliprdr)
|
static void map_ensure_capacity(cliprdrContext *cliprdr)
|
||||||
{
|
{
|
||||||
if (cliprdr->map_size >= cliprdr->map_capacity) {
|
if (cliprdr->map_size >= cliprdr->map_capacity)
|
||||||
|
{
|
||||||
cliprdr->format_mappings = (formatMapping *)realloc(cliprdr->format_mappings,
|
cliprdr->format_mappings = (formatMapping *)realloc(cliprdr->format_mappings,
|
||||||
cliprdr->map_capacity * 2);
|
sizeof(formatMapping) * cliprdr->map_capacity * 2);
|
||||||
cliprdr->map_capacity *= 2;
|
cliprdr->map_capacity *= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,13 +99,16 @@ static void clear_format_map(cliprdrContext *cliprdr)
|
|||||||
formatMapping *map;
|
formatMapping *map;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (cliprdr->format_mappings) {
|
if (cliprdr->format_mappings)
|
||||||
for (i = 0; i < cliprdr->map_size; i++) {
|
{
|
||||||
|
for (i = 0; i < cliprdr->map_capacity; i++)
|
||||||
|
{
|
||||||
map = &cliprdr->format_mappings[i];
|
map = &cliprdr->format_mappings[i];
|
||||||
map->remote_format_id = 0;
|
map->remote_format_id = 0;
|
||||||
map->local_format_id = 0;
|
map->local_format_id = 0;
|
||||||
|
|
||||||
if (map->name) {
|
if (map->name)
|
||||||
|
{
|
||||||
free(map->name);
|
free(map->name);
|
||||||
map->name = NULL;
|
map->name = NULL;
|
||||||
}
|
}
|
||||||
@ -119,7 +128,8 @@ static void cliprdr_send_format_list(cliprdrContext *cliprdr)
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
int namelen;
|
int namelen;
|
||||||
|
|
||||||
if (!OpenClipboard(cliprdr->hwndClipboard)) {
|
if (!OpenClipboard(cliprdr->hwndClipboard))
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
|
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -130,23 +140,36 @@ static void cliprdr_send_format_list(cliprdrContext *cliprdr)
|
|||||||
format_data = (BYTE *)calloc(1, data_size);
|
format_data = (BYTE *)calloc(1, data_size);
|
||||||
assert(format_data != NULL);
|
assert(format_data != NULL);
|
||||||
|
|
||||||
while (format = EnumClipboardFormats(format)) {
|
while (format = EnumClipboardFormats(format))
|
||||||
|
{
|
||||||
Write_UINT32(format_data + len, format);
|
Write_UINT32(format_data + len, format);
|
||||||
len += 4;
|
len += 4;
|
||||||
if ((cliprdr->capabilities & CAPS_USE_LONG_FORMAT_NAMES) != 0) {
|
if ((cliprdr->capabilities & CAPS_USE_LONG_FORMAT_NAMES) != 0)
|
||||||
if (format >= CF_MAX) {
|
{
|
||||||
|
if (format >= CF_MAX)
|
||||||
|
{
|
||||||
namelen = GetClipboardFormatNameW(format, (LPWSTR)(format_data + len), MAX_PATH);
|
namelen = GetClipboardFormatNameW(format, (LPWSTR)(format_data + len), MAX_PATH);
|
||||||
len += namelen * sizeof(WCHAR);
|
len += namelen * sizeof(WCHAR);
|
||||||
}
|
}
|
||||||
len += 2; /* end of Unicode string */
|
len += 2; /* end of Unicode string */
|
||||||
} else {
|
}
|
||||||
ZeroMemory(format_data + len, 32);
|
else
|
||||||
if (format >= CF_MAX) {
|
{
|
||||||
|
if (format >= CF_MAX)
|
||||||
|
{
|
||||||
static wchar_t wName[MAX_PATH] = {0};
|
static wchar_t wName[MAX_PATH] = {0};
|
||||||
|
int wLen;
|
||||||
|
|
||||||
ZeroMemory(wName, MAX_PATH*2);
|
ZeroMemory(wName, MAX_PATH*2);
|
||||||
GetClipboardFormatNameW(format, wName, MAX_PATH);
|
wLen = GetClipboardFormatNameW(format, wName, MAX_PATH);
|
||||||
memcpy(format_data + len, wName, 32); /* truncate the long name to 32 bytes */
|
if (wLen < 16)
|
||||||
|
{
|
||||||
|
memcpy(format_data + len, wName, wLen * sizeof(WCHAR));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(format_data + len, wName, 32); /* truncate the long name to 32 bytes */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
len += 32;
|
len += 32;
|
||||||
}
|
}
|
||||||
@ -180,6 +203,8 @@ int cliprdr_send_data_request(cliprdrContext *cliprdr, UINT32 format)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
cliprdr_event->format = get_remote_format_id(cliprdr, format);
|
cliprdr_event->format = get_remote_format_id(cliprdr, format);
|
||||||
|
if (cliprdr_event->format == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
ret = freerdp_channels_send_event(cliprdr->channels, (wMessage *)cliprdr_event);
|
ret = freerdp_channels_send_event(cliprdr->channels, (wMessage *)cliprdr_event);
|
||||||
|
|
||||||
@ -196,12 +221,14 @@ static LRESULT CALLBACK cliprdr_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM
|
|||||||
{
|
{
|
||||||
static cliprdrContext *cliprdr = NULL;
|
static cliprdrContext *cliprdr = NULL;
|
||||||
|
|
||||||
switch (Msg) {
|
switch (Msg)
|
||||||
|
{
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
cliprdr = (cliprdrContext *)((CREATESTRUCT *)lParam)->lpCreateParams;
|
cliprdr = (cliprdrContext *)((CREATESTRUCT *)lParam)->lpCreateParams;
|
||||||
cliprdr->hwndNextViewer = SetClipboardViewer(hWnd);
|
cliprdr->hwndNextViewer = SetClipboardViewer(hWnd);
|
||||||
|
|
||||||
if (cliprdr->hwndNextViewer == NULL && GetLastError() != 0) {
|
if (cliprdr->hwndNextViewer == NULL && GetLastError() != 0)
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("error: SetClipboardViewer failed with 0x%0x.", GetLastError());
|
DEBUG_CLIPRDR("error: SetClipboardViewer failed with 0x%0x.", GetLastError());
|
||||||
}
|
}
|
||||||
cliprdr->hwndClipboard = hWnd;
|
cliprdr->hwndClipboard = hWnd;
|
||||||
@ -212,17 +239,23 @@ static LRESULT CALLBACK cliprdr_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_CHANGECBCHAIN:
|
case WM_CHANGECBCHAIN:
|
||||||
if (cliprdr->hwndNextViewer == (HWND)wParam) {
|
if (cliprdr->hwndNextViewer == (HWND)wParam)
|
||||||
|
{
|
||||||
cliprdr->hwndNextViewer = (HWND)lParam;
|
cliprdr->hwndNextViewer = (HWND)lParam;
|
||||||
} else if (cliprdr->hwndNextViewer != NULL) {
|
}
|
||||||
|
else if (cliprdr->hwndNextViewer != NULL)
|
||||||
|
{
|
||||||
SendMessage(cliprdr->hwndNextViewer, Msg, wParam, lParam);
|
SendMessage(cliprdr->hwndNextViewer, Msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_DRAWCLIPBOARD:
|
case WM_DRAWCLIPBOARD:
|
||||||
if (cliprdr->channel_initialized) {
|
if (cliprdr->channel_initialized)
|
||||||
if (GetClipboardOwner() != cliprdr->hwndClipboard) {
|
{
|
||||||
if (!cliprdr->hmem) {
|
if (GetClipboardOwner() != cliprdr->hwndClipboard)
|
||||||
|
{
|
||||||
|
if (!cliprdr->hmem)
|
||||||
|
{
|
||||||
cliprdr->hmem = GlobalFree(cliprdr->hmem);
|
cliprdr->hmem = GlobalFree(cliprdr->hmem);
|
||||||
}
|
}
|
||||||
cliprdr_send_format_list(cliprdr);
|
cliprdr_send_format_list(cliprdr);
|
||||||
@ -234,7 +267,8 @@ static LRESULT CALLBACK cliprdr_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM
|
|||||||
|
|
||||||
case WM_RENDERALLFORMATS:
|
case WM_RENDERALLFORMATS:
|
||||||
/* discard all contexts in clipboard */
|
/* discard all contexts in clipboard */
|
||||||
if (!OpenClipboard(cliprdr->hwndClipboard)) {
|
if (!OpenClipboard(cliprdr->hwndClipboard))
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
|
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -243,12 +277,14 @@ static LRESULT CALLBACK cliprdr_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_RENDERFORMAT:
|
case WM_RENDERFORMAT:
|
||||||
if (cliprdr_send_data_request(cliprdr, (UINT32)wParam) != 0) {
|
if (cliprdr_send_data_request(cliprdr, (UINT32)wParam) != 0)
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("error: cliprdr_send_data_request failed.");
|
DEBUG_CLIPRDR("error: cliprdr_send_data_request failed.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SetClipboardData(wParam, cliprdr->hmem) == NULL) {
|
if (SetClipboardData(wParam, cliprdr->hmem) == NULL)
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("SetClipboardData failed with 0x%x", GetLastError());
|
DEBUG_CLIPRDR("SetClipboardData failed with 0x%x", GetLastError());
|
||||||
cliprdr->hmem = GlobalFree(cliprdr->hmem);
|
cliprdr->hmem = GlobalFree(cliprdr->hmem);
|
||||||
}
|
}
|
||||||
@ -292,7 +328,8 @@ static int create_cliprdr_window(cliprdrContext *cliprdr)
|
|||||||
L"rdpclip",
|
L"rdpclip",
|
||||||
0, 0, 0, 0, 0, HWND_MESSAGE, NULL, GetModuleHandle(NULL), cliprdr);
|
0, 0, 0, 0, 0, HWND_MESSAGE, NULL, GetModuleHandle(NULL), cliprdr);
|
||||||
|
|
||||||
if (cliprdr->hwndClipboard == NULL) {
|
if (cliprdr->hwndClipboard == NULL)
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("error: CreateWindowEx failed with %x.", GetLastError());
|
DEBUG_CLIPRDR("error: CreateWindowEx failed with %x.", GetLastError());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -308,16 +345,21 @@ static void *cliprdr_thread_func(void *arg)
|
|||||||
int ret;
|
int ret;
|
||||||
HRESULT result;
|
HRESULT result;
|
||||||
|
|
||||||
if ((ret = create_cliprdr_window(cliprdr)) != 0) {
|
if ((ret = create_cliprdr_window(cliprdr)) != 0)
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("error: create clipboard window failed.");
|
DEBUG_CLIPRDR("error: create clipboard window failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((mcode = GetMessage(&msg, 0, 0, 0) != 0)) {
|
while ((mcode = GetMessage(&msg, 0, 0, 0) != 0))
|
||||||
if (mcode == -1) {
|
{
|
||||||
|
if (mcode == -1)
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("error: clipboard thread GetMessage failed.");
|
DEBUG_CLIPRDR("error: clipboard thread GetMessage failed.");
|
||||||
break;
|
break;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
TranslateMessage(&msg);
|
TranslateMessage(&msg);
|
||||||
DispatchMessage(&msg);
|
DispatchMessage(&msg);
|
||||||
}
|
}
|
||||||
@ -362,7 +404,8 @@ void wf_cliprdr_uninit(wfContext* wfc)
|
|||||||
if (cliprdr->hwndClipboard)
|
if (cliprdr->hwndClipboard)
|
||||||
PostMessage(cliprdr->hwndClipboard, WM_QUIT, 0, 0);
|
PostMessage(cliprdr->hwndClipboard, WM_QUIT, 0, 0);
|
||||||
|
|
||||||
if (cliprdr->cliprdr_thread) {
|
if (cliprdr->cliprdr_thread)
|
||||||
|
{
|
||||||
WaitForSingleObject(cliprdr->cliprdr_thread, INFINITE);
|
WaitForSingleObject(cliprdr->cliprdr_thread, INFINITE);
|
||||||
CloseHandle(cliprdr->cliprdr_thread);
|
CloseHandle(cliprdr->cliprdr_thread);
|
||||||
}
|
}
|
||||||
@ -406,23 +449,32 @@ static void wf_cliprdr_process_cb_data_request_event(wfContext *wfc, RDP_CB_DATA
|
|||||||
|
|
||||||
local_format = event->format;
|
local_format = event->format;
|
||||||
|
|
||||||
if (local_format == 0x9) { /* FORMAT_ID_PALETTE */
|
if (local_format == 0x9) /* FORMAT_ID_PALETTE */
|
||||||
|
{
|
||||||
/* TODO: implement this */
|
/* TODO: implement this */
|
||||||
DEBUG_CLIPRDR("FORMAT_ID_PALETTE is not supported yet.");
|
DEBUG_CLIPRDR("FORMAT_ID_PALETTE is not supported yet.");
|
||||||
} else if (local_format == 0x3) { /* FORMAT_ID_MATEFILE */
|
}
|
||||||
|
else if (local_format == 0x3) /* FORMAT_ID_MATEFILE */
|
||||||
|
{
|
||||||
/* TODO: implement this */
|
/* TODO: implement this */
|
||||||
DEBUG_CLIPRDR("FORMAT_ID_MATEFILE is not supported yet.");
|
DEBUG_CLIPRDR("FORMAT_ID_MATEFILE is not supported yet.");
|
||||||
} else if (local_format == RegisterClipboardFormatW(L"FileGroupDescriptorW")) {
|
}
|
||||||
|
else if (local_format == RegisterClipboardFormatW(L"FileGroupDescriptorW"))
|
||||||
|
{
|
||||||
/* TODO: implement this */
|
/* TODO: implement this */
|
||||||
DEBUG_CLIPRDR("FileGroupDescriptorW is not supported yet.");
|
DEBUG_CLIPRDR("FileGroupDescriptorW is not supported yet.");
|
||||||
} else {
|
}
|
||||||
if (!OpenClipboard(cliprdr->hwndClipboard)) {
|
else
|
||||||
|
{
|
||||||
|
if (!OpenClipboard(cliprdr->hwndClipboard))
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
|
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hClipdata = GetClipboardData(event->format);
|
hClipdata = GetClipboardData(event->format);
|
||||||
if (!hClipdata) {
|
if (!hClipdata)
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("GetClipboardData failed.");
|
DEBUG_CLIPRDR("GetClipboardData failed.");
|
||||||
CloseClipboard();
|
CloseClipboard();
|
||||||
return;
|
return;
|
||||||
@ -466,8 +518,10 @@ static void wf_cliprdr_process_cb_format_list_event(wfContext *wfc, RDP_CB_FORMA
|
|||||||
|
|
||||||
clear_format_map(cliprdr);
|
clear_format_map(cliprdr);
|
||||||
|
|
||||||
if ((cliprdr->capabilities & CAPS_USE_LONG_FORMAT_NAMES) != 0) {
|
if ((cliprdr->capabilities & CAPS_USE_LONG_FORMAT_NAMES) != 0)
|
||||||
while (left_size >= 6) {
|
{
|
||||||
|
while (left_size >= 6)
|
||||||
|
{
|
||||||
formatMapping *map;
|
formatMapping *map;
|
||||||
BYTE* tmp;
|
BYTE* tmp;
|
||||||
int name_len;
|
int name_len;
|
||||||
@ -475,19 +529,24 @@ static void wf_cliprdr_process_cb_format_list_event(wfContext *wfc, RDP_CB_FORMA
|
|||||||
map = &cliprdr->format_mappings[i++];
|
map = &cliprdr->format_mappings[i++];
|
||||||
|
|
||||||
Read_UINT32(p, map->remote_format_id);
|
Read_UINT32(p, map->remote_format_id);
|
||||||
|
map->name = NULL;
|
||||||
|
|
||||||
/* get name_len */
|
/* get name_len */
|
||||||
for (tmp = p, name_len = 0; tmp + 1 < end_mark; tmp += 2, name_len += 2) {
|
for (tmp = p, name_len = 0; tmp + 1 < end_mark; tmp += 2, name_len += 2)
|
||||||
|
{
|
||||||
if (*((unsigned short*) tmp) == 0)
|
if (*((unsigned short*) tmp) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name_len > 0) {
|
if (name_len > 0)
|
||||||
|
{
|
||||||
map->name = malloc(name_len + 2);
|
map->name = malloc(name_len + 2);
|
||||||
memcpy(map->name, p, name_len + 2);
|
memcpy(map->name, p, name_len + 2);
|
||||||
|
|
||||||
map->local_format_id = RegisterClipboardFormatW((LPCWSTR)map->name);
|
map->local_format_id = RegisterClipboardFormatW((LPCWSTR)map->name);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
map->local_format_id = map->remote_format_id;
|
map->local_format_id = map->remote_format_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,43 +557,58 @@ static void wf_cliprdr_process_cb_format_list_event(wfContext *wfc, RDP_CB_FORMA
|
|||||||
|
|
||||||
map_ensure_capacity(cliprdr);
|
map_ensure_capacity(cliprdr);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
int k;
|
int k;
|
||||||
|
|
||||||
for (k = 0; k < event->raw_format_data_size / 36; k++) {
|
for (k = 0; k < event->raw_format_data_size / 36; k++)
|
||||||
|
{
|
||||||
formatMapping *map;
|
formatMapping *map;
|
||||||
int name_len;
|
int name_len;
|
||||||
|
|
||||||
map = &cliprdr->format_mappings[i++];
|
map = &cliprdr->format_mappings[i++];
|
||||||
|
|
||||||
Read_UINT32(p, map->remote_format_id);
|
Read_UINT32(p, map->remote_format_id);
|
||||||
|
map->name = NULL;
|
||||||
|
|
||||||
if (event->raw_format_unicode) {
|
if (event->raw_format_unicode)
|
||||||
|
{
|
||||||
/* get name_len, in bytes, if the file name is truncated, no terminated null will be included. */
|
/* get name_len, in bytes, if the file name is truncated, no terminated null will be included. */
|
||||||
for (name_len = 0; name_len < 32; name_len += 2) {
|
for (name_len = 0; name_len < 32; name_len += 2)
|
||||||
|
{
|
||||||
if (*((unsigned short*) (p + name_len)) == 0)
|
if (*((unsigned short*) (p + name_len)) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name_len > 0) {
|
if (name_len > 0)
|
||||||
|
{
|
||||||
map->name = calloc(1, name_len + 2);
|
map->name = calloc(1, name_len + 2);
|
||||||
memcpy(map->name, p, name_len);
|
memcpy(map->name, p, name_len);
|
||||||
map->local_format_id = RegisterClipboardFormatW((LPCWSTR)map->name);
|
map->local_format_id = RegisterClipboardFormatW((LPCWSTR)map->name);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
map->local_format_id = map->remote_format_id;
|
map->local_format_id = map->remote_format_id;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/* get name_len, in bytes, if the file name is truncated, no terminated null will be included. */
|
/* get name_len, in bytes, if the file name is truncated, no terminated null will be included. */
|
||||||
for (name_len = 0; name_len < 32; name_len += 1) {
|
for (name_len = 0; name_len < 32; name_len += 1)
|
||||||
|
{
|
||||||
if (*((unsigned char*) (p + name_len)) == 0)
|
if (*((unsigned char*) (p + name_len)) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name_len > 0) {
|
if (name_len > 0)
|
||||||
|
{
|
||||||
map->name = calloc(1, name_len + 1);
|
map->name = calloc(1, name_len + 1);
|
||||||
memcpy(map->name, p, name_len);
|
memcpy(map->name, p, name_len);
|
||||||
map->local_format_id = RegisterClipboardFormatA((LPCSTR)map->name);
|
map->local_format_id = RegisterClipboardFormatA((LPCSTR)map->name);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
map->local_format_id = map->remote_format_id;
|
map->local_format_id = map->remote_format_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -545,18 +619,21 @@ static void wf_cliprdr_process_cb_format_list_event(wfContext *wfc, RDP_CB_FORMA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!OpenClipboard(cliprdr->hwndClipboard)) {
|
if (!OpenClipboard(cliprdr->hwndClipboard))
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
|
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EmptyClipboard()) {
|
if (!EmptyClipboard())
|
||||||
|
{
|
||||||
DEBUG_CLIPRDR("EmptyClipboard failed with 0x%x", GetLastError());
|
DEBUG_CLIPRDR("EmptyClipboard failed with 0x%x", GetLastError());
|
||||||
CloseClipboard();
|
CloseClipboard();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < cliprdr->map_size; i++) {
|
for (i = 0; i < cliprdr->map_size; i++)
|
||||||
|
{
|
||||||
SetClipboardData(cliprdr->format_mappings[i].local_format_id, NULL);
|
SetClipboardData(cliprdr->format_mappings[i].local_format_id, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -580,7 +657,8 @@ static void wf_cliprdr_process_cb_data_response_event(wfContext *wfc, RDP_CB_DAT
|
|||||||
|
|
||||||
void wf_process_cliprdr_event(wfContext *wfc, wMessage *event)
|
void wf_process_cliprdr_event(wfContext *wfc, wMessage *event)
|
||||||
{
|
{
|
||||||
switch (GetMessageType(event->id)) {
|
switch (GetMessageType(event->id))
|
||||||
|
{
|
||||||
case CliprdrChannel_ClipCaps:
|
case CliprdrChannel_ClipCaps:
|
||||||
wf_cliprdr_process_cb_clip_caps_event(wfc, (RDP_CB_CLIP_CAPS *)event);
|
wf_cliprdr_process_cb_clip_caps_event(wfc, (RDP_CB_CLIP_CAPS *)event);
|
||||||
break;
|
break;
|
||||||
|
@ -226,43 +226,43 @@ BOOL freerdp_client_rdp_file_set_string(rdpFile* file, char* name, char* value)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (_stricmp(name, "username") == 0)
|
if (_stricmp(name, "username") == 0)
|
||||||
file->Username = value;
|
file->Username = _strdup(value);
|
||||||
else if (_stricmp(name, "domain") == 0)
|
else if (_stricmp(name, "domain") == 0)
|
||||||
file->Domain = value;
|
file->Domain = _strdup(value);
|
||||||
else if (_stricmp(name, "full address") == 0)
|
else if (_stricmp(name, "full address") == 0)
|
||||||
file->FullAddress = value;
|
file->FullAddress = _strdup(value);
|
||||||
else if (_stricmp(name, "alternate full address") == 0)
|
else if (_stricmp(name, "alternate full address") == 0)
|
||||||
file->AlternateFullAddress = value;
|
file->AlternateFullAddress = _strdup(value);
|
||||||
else if (_stricmp(name, "usbdevicestoredirect") == 0)
|
else if (_stricmp(name, "usbdevicestoredirect") == 0)
|
||||||
file->UsbDevicesToRedirect = value;
|
file->UsbDevicesToRedirect = _strdup(value);
|
||||||
else if (_stricmp(name, "loadbalanceinfo") == 0)
|
else if (_stricmp(name, "loadbalanceinfo") == 0)
|
||||||
file->LoadBalanceInfo = value;
|
file->LoadBalanceInfo = _strdup(value);
|
||||||
else if (_stricmp(name, "remoteapplicationname") == 0)
|
else if (_stricmp(name, "remoteapplicationname") == 0)
|
||||||
file->RemoteApplicationName = value;
|
file->RemoteApplicationName = _strdup(value);
|
||||||
else if (_stricmp(name, "remoteapplicationicon") == 0)
|
else if (_stricmp(name, "remoteapplicationicon") == 0)
|
||||||
file->RemoteApplicationIcon = value;
|
file->RemoteApplicationIcon = _strdup(value);
|
||||||
else if (_stricmp(name, "remoteapplicationprogram") == 0)
|
else if (_stricmp(name, "remoteapplicationprogram") == 0)
|
||||||
file->RemoteApplicationProgram = value;
|
file->RemoteApplicationProgram = _strdup(value);
|
||||||
else if (_stricmp(name, "remoteapplicationfile") == 0)
|
else if (_stricmp(name, "remoteapplicationfile") == 0)
|
||||||
file->RemoteApplicationFile = value;
|
file->RemoteApplicationFile = _strdup(value);
|
||||||
else if (_stricmp(name, "remoteapplicationguid") == 0)
|
else if (_stricmp(name, "remoteapplicationguid") == 0)
|
||||||
file->RemoteApplicationGuid = value;
|
file->RemoteApplicationGuid = _strdup(value);
|
||||||
else if (_stricmp(name, "remoteapplicationcmdline") == 0)
|
else if (_stricmp(name, "remoteapplicationcmdline") == 0)
|
||||||
file->RemoteApplicationCmdLine = value;
|
file->RemoteApplicationCmdLine = _strdup(value);
|
||||||
else if (_stricmp(name, "alternate shell") == 0)
|
else if (_stricmp(name, "alternate shell") == 0)
|
||||||
file->AlternateShell = value;
|
file->AlternateShell = _strdup(value);
|
||||||
else if (_stricmp(name, "shell working directory") == 0)
|
else if (_stricmp(name, "shell working directory") == 0)
|
||||||
file->ShellWorkingDirectory = value;
|
file->ShellWorkingDirectory = _strdup(value);
|
||||||
else if (_stricmp(name, "gatewayhostname") == 0)
|
else if (_stricmp(name, "gatewayhostname") == 0)
|
||||||
file->GatewayHostname = value;
|
file->GatewayHostname = _strdup(value);
|
||||||
else if (_stricmp(name, "kdcproxyname") == 0)
|
else if (_stricmp(name, "kdcproxyname") == 0)
|
||||||
file->KdcProxyName = value;
|
file->KdcProxyName = _strdup(value);
|
||||||
else if (_stricmp(name, "drivestoredirect") == 0)
|
else if (_stricmp(name, "drivestoredirect") == 0)
|
||||||
file->DrivesToRedirect = value;
|
file->DrivesToRedirect = _strdup(value);
|
||||||
else if (_stricmp(name, "devicestoredirect") == 0)
|
else if (_stricmp(name, "devicestoredirect") == 0)
|
||||||
file->DevicesToRedirect = value;
|
file->DevicesToRedirect = _strdup(value);
|
||||||
else if (_stricmp(name, "winposstr") == 0)
|
else if (_stricmp(name, "winposstr") == 0)
|
||||||
file->WinPosStr = value;
|
file->WinPosStr = _strdup(value);
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
@ -297,10 +297,10 @@ void freerdp_client_parse_rdp_file_string_unicode(rdpFile* file, WCHAR* name, WC
|
|||||||
WideCharToMultiByte(CP_UTF8, 0, value, length, valueA, length, NULL, NULL);
|
WideCharToMultiByte(CP_UTF8, 0, value, length, valueA, length, NULL, NULL);
|
||||||
valueA[length] = '\0';
|
valueA[length] = '\0';
|
||||||
|
|
||||||
if (!freerdp_client_rdp_file_set_string(file, nameA, valueA))
|
freerdp_client_rdp_file_set_string(file, nameA, valueA);
|
||||||
free(valueA);
|
|
||||||
|
|
||||||
free(nameA);
|
free(nameA);
|
||||||
|
free(valueA);
|
||||||
}
|
}
|
||||||
|
|
||||||
void freerdp_client_parse_rdp_file_string_ascii(rdpFile* file, char* name, char* value)
|
void freerdp_client_parse_rdp_file_string_ascii(rdpFile* file, char* name, char* value)
|
||||||
|
@ -326,7 +326,7 @@ endif()
|
|||||||
# rpath makes low sence for Android
|
# 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( 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} -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
|
set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
|
||||||
if(NOT DEFINED ANDROID_NDK_SEARCH_PATHS)
|
if(NOT DEFINED ANDROID_NDK_SEARCH_PATHS)
|
||||||
if( CMAKE_HOST_WIN32 )
|
if( CMAKE_HOST_WIN32 )
|
||||||
file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
|
file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
|
||||||
@ -690,6 +690,7 @@ if( BUILD_WITH_ANDROID_NDK )
|
|||||||
endif()
|
endif()
|
||||||
__LIST_FILTER( __availableToolchainsLst "^[.]" )
|
__LIST_FILTER( __availableToolchainsLst "^[.]" )
|
||||||
__LIST_FILTER( __availableToolchainsLst "llvm" )
|
__LIST_FILTER( __availableToolchainsLst "llvm" )
|
||||||
|
__LIST_FILTER( __availableToolchainsLst "renderscript" )
|
||||||
__GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
|
__GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
|
||||||
if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
|
if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
|
||||||
__GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
|
__GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
|
||||||
@ -721,7 +722,7 @@ __INIT_VARIABLE( ANDROID_ABI OBSOLETE_ARM_TARGET OBSOLETE_ARM_TARGETS VALUES ${A
|
|||||||
# verify that target ABI is supported
|
# verify that target ABI is supported
|
||||||
list( FIND ANDROID_SUPPORTED_ABIS "${ANDROID_ABI}" __androidAbiIdx )
|
list( FIND ANDROID_SUPPORTED_ABIS "${ANDROID_ABI}" __androidAbiIdx )
|
||||||
if( __androidAbiIdx EQUAL -1 )
|
if( __androidAbiIdx EQUAL -1 )
|
||||||
string( REPLACE ";" "\", \"", PRINTABLE_ANDROID_SUPPORTED_ABIS "${ANDROID_SUPPORTED_ABIS}" )
|
string( REPLACE ";" "\", \"" PRINTABLE_ANDROID_SUPPORTED_ABIS "${ANDROID_SUPPORTED_ABIS}" )
|
||||||
message( FATAL_ERROR "Specified ANDROID_ABI = \"${ANDROID_ABI}\" is not supported by this cmake toolchain or your NDK/toolchain.
|
message( FATAL_ERROR "Specified ANDROID_ABI = \"${ANDROID_ABI}\" is not supported by this cmake toolchain or your NDK/toolchain.
|
||||||
Supported values are: \"${PRINTABLE_ANDROID_SUPPORTED_ABIS}\"
|
Supported values are: \"${PRINTABLE_ANDROID_SUPPORTED_ABIS}\"
|
||||||
" )
|
" )
|
||||||
|
@ -29,14 +29,15 @@ FreeRDP requires openssl libraries for building but they are not part of the
|
|||||||
Android NDK and therefore they need to be prebuild manually.
|
Android NDK and therefore they need to be prebuild manually.
|
||||||
Multiple source versions and builds of static openssl libraries are floating around.
|
Multiple source versions and builds of static openssl libraries are floating around.
|
||||||
At the time of writing we have tested and used:
|
At the time of writing we have tested and used:
|
||||||
https://github.com/bmiklautz/Android-external-openssl-ndk-static.
|
https://github.com/bmiklautz/Android-external-openssl-ndk-static
|
||||||
|
https://github.com/akallabeth/openssl-android
|
||||||
However, any other static build should work as well.
|
However, any other static build should work as well.
|
||||||
|
|
||||||
To build openssl:
|
To build openssl:
|
||||||
|
|
||||||
git clone git@github.com:bmiklautz/android-external-openssl-ndk-static.git
|
Set up ANDROID_NDK and ANDROID_SDK to the absolute paths on your machine.
|
||||||
cd android-external-openssl-ndk-static
|
From the project root folder run './scripts/android_setup_build_env.sh'
|
||||||
ndk-build # found in the Android NDK
|
This will set up openssl and gprof helper libraries as required for FreeRDP.
|
||||||
|
|
||||||
|
|
||||||
Building
|
Building
|
||||||
|
@ -494,10 +494,9 @@ static void input_free_queued_message(void *obj)
|
|||||||
|
|
||||||
rdpInput* input_new(rdpRdp* rdp)
|
rdpInput* input_new(rdpRdp* rdp)
|
||||||
{
|
{
|
||||||
wObject cb;
|
const wObject cb = { NULL, NULL, NULL, input_free_queued_message, NULL };
|
||||||
rdpInput* input;
|
rdpInput* input;
|
||||||
|
|
||||||
cb.fnObjectFree = input_free_queued_message ;
|
|
||||||
input = (rdpInput*) malloc(sizeof(rdpInput));
|
input = (rdpInput*) malloc(sizeof(rdpInput));
|
||||||
|
|
||||||
if (input != NULL)
|
if (input != NULL)
|
||||||
|
@ -1553,10 +1553,9 @@ static void update_free_queued_message(void *obj)
|
|||||||
|
|
||||||
rdpUpdate* update_new(rdpRdp* rdp)
|
rdpUpdate* update_new(rdpRdp* rdp)
|
||||||
{
|
{
|
||||||
wObject cb;
|
const wObject cb = { NULL, NULL, NULL, update_free_queued_message, NULL };
|
||||||
rdpUpdate* update;
|
rdpUpdate* update;
|
||||||
|
|
||||||
cb.fnObjectFree = update_free_queued_message;
|
|
||||||
update = (rdpUpdate*) malloc(sizeof(rdpUpdate));
|
update = (rdpUpdate*) malloc(sizeof(rdpUpdate));
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
|
@ -10,28 +10,26 @@
|
|||||||
# Usage:
|
# Usage:
|
||||||
# android_setup_build_env.sh <source root>
|
# android_setup_build_env.sh <source root>
|
||||||
|
|
||||||
OPENSSL_SCM=https://github.com/bmiklautz/android-external-openssl-ndk-static
|
OPENSSL_SCM=https://github.com/akallabeth/openssl-android
|
||||||
NDK_PROFILER_SCM=https://github.com/richq/android-ndk-profiler
|
NDK_PROFILER_SCM=https://github.com/richq/android-ndk-profiler
|
||||||
|
|
||||||
SCRIPT_NAME=`basename $0`
|
SCRIPT_NAME=`basename $0`
|
||||||
|
|
||||||
if [ $# -ne 1 ]; then
|
if [ $# -ne 1 ]; then
|
||||||
|
echo "Missing command line argument, current directory as root."
|
||||||
echo "Missing command line argument."
|
ROOT=`pwd`
|
||||||
echo "$SCRIPT_NAME <FreeRDP source>"
|
ROOT=$ROOT/external
|
||||||
exit -1
|
else
|
||||||
|
ROOT=`readlink -f $1`
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -d $1 ]; then
|
if [ ! -d $ROOT ]; then
|
||||||
echo "Argument '$1' is not a directory."
|
echo "Argument '$ROOT' is not a directory."
|
||||||
exit -2
|
exit -2
|
||||||
fi
|
fi
|
||||||
SRC=`realpath $1`
|
echo "Using '$ROOT' as root."
|
||||||
|
|
||||||
echo "Using '$SRC' as root."
|
|
||||||
|
|
||||||
echo "Preparing OpenSSL..."
|
echo "Preparing OpenSSL..."
|
||||||
OPENSSL_SRC=$SRC/external/openssl
|
OPENSSL_SRC=$ROOT/openssl-build
|
||||||
if [ -d $OPENSSL_SRC ]; then
|
if [ -d $OPENSSL_SRC ]; then
|
||||||
cd $OPENSSL_SRC
|
cd $OPENSSL_SRC
|
||||||
git pull
|
git pull
|
||||||
@ -39,21 +37,35 @@ if [ -d $OPENSSL_SRC ]; then
|
|||||||
else
|
else
|
||||||
git clone $OPENSSL_SCM $OPENSSL_SRC
|
git clone $OPENSSL_SCM $OPENSSL_SRC
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
cd $OPENSSL_SRC
|
|
||||||
fi
|
fi
|
||||||
if [ $RETVAL -ne 0 ]; then
|
if [ $RETVAL -ne 0 ]; then
|
||||||
echo "Failed to execute git command [$RETVAL]"
|
echo "Failed to execute git command [$RETVAL]"
|
||||||
exit -3
|
exit -3
|
||||||
fi
|
fi
|
||||||
ndk-build
|
|
||||||
RETVAL=$?
|
cd $OPENSSL_SRC
|
||||||
|
make clean
|
||||||
|
# The makefile has a bug, which aborts during
|
||||||
|
# first compilation. Rerun make to build the whole lib.
|
||||||
|
make
|
||||||
|
make
|
||||||
|
RETVAL=0 # TODO: Check, why 2 is returned.
|
||||||
if [ $RETVAL -ne 0 ]; then
|
if [ $RETVAL -ne 0 ]; then
|
||||||
echo "Failed to execute ndk-build command [$RETVAL]"
|
echo "Failed to execute make command [$RETVAL]"
|
||||||
exit -4
|
exit -4
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Copy the created library to the default openssl directory,
|
||||||
|
# so that CMake will detect it automatically.
|
||||||
|
SSL_ROOT=`find $OPENSSL_SRC -type d -name "openssl-?.?.*"`
|
||||||
|
rm -f $ROOT/openssl
|
||||||
|
ln -s $SSL_ROOT $ROOT/openssl
|
||||||
|
mkdir -p $ROOT/openssl/obj/local/armeabi/
|
||||||
|
cp $ROOT/openssl/libssl.a $ROOT/openssl/obj/local/armeabi/
|
||||||
|
cp $ROOT/openssl/libcrypto.a $ROOT/openssl/obj/local/armeabi/
|
||||||
|
|
||||||
echo "Preparing NDK profiler..."
|
echo "Preparing NDK profiler..."
|
||||||
NDK_PROFILER_SRC=$SRC/external/android-ndk-profiler
|
NDK_PROFILER_SRC=$ROOT/android-ndk-profiler
|
||||||
if [ -d $NDK_PROFILER_SRC ]; then
|
if [ -d $NDK_PROFILER_SRC ]; then
|
||||||
cd $NDK_PROFILER_SRC
|
cd $NDK_PROFILER_SRC
|
||||||
git pull
|
git pull
|
||||||
@ -61,13 +73,14 @@ if [ -d $NDK_PROFILER_SRC ]; then
|
|||||||
else
|
else
|
||||||
git clone $NDK_PROFILER_SCM $NDK_PROFILER_SRC
|
git clone $NDK_PROFILER_SCM $NDK_PROFILER_SRC
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
cd $NDK_PROFILER_SRC
|
|
||||||
fi
|
fi
|
||||||
if [ $RETVAL -ne 0 ]; then
|
if [ $RETVAL -ne 0 ]; then
|
||||||
echo "Failed to execute git command [$RETVAL]"
|
echo "Failed to execute git command [$RETVAL]"
|
||||||
exit -5
|
exit -5
|
||||||
fi
|
fi
|
||||||
ndk-build
|
cd $NDK_PROFILER_SRC
|
||||||
|
ndk-build V=1 APP_ABI=armeabi-v7a clean
|
||||||
|
ndk-build V=1 APP_ABI=armeabi-v7a
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
if [ $RETVAL -ne 0 ]; then
|
if [ $RETVAL -ne 0 ]; then
|
||||||
echo "Failed to execute ndk-build command [$RETVAL]"
|
echo "Failed to execute ndk-build command [$RETVAL]"
|
||||||
|
56
scripts/gprof_generate.sh.cmake
Executable file
56
scripts/gprof_generate.sh.cmake
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# This script tries to pull gprof profiling information generated by aFreeRDP
|
||||||
|
# from the target using adb and generating human readable profiling data from
|
||||||
|
# it.
|
||||||
|
#
|
||||||
|
# Any arguments supplied to the script will be appended to adb.
|
||||||
|
#
|
||||||
|
# Requirements:
|
||||||
|
# - ANDROID_SDK is set to the android SDK directory or adb is in path.
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ -d $ANDROID_SDK ]; then
|
||||||
|
ADB=$ANDROID_SDK/platform-tools/adb
|
||||||
|
else
|
||||||
|
ADB=`which adb`
|
||||||
|
fi
|
||||||
|
|
||||||
|
GCC=@CMAKE_C_COMPILER@
|
||||||
|
GPROF=${GCC/gcc/gprof}
|
||||||
|
LIB=@CMAKE_BINARY_DIR@/client/Android/FreeRDPCore/jni/armeabi-v7a/libfreerdp-android.so
|
||||||
|
|
||||||
|
if [ ! -f $LIB ]; then
|
||||||
|
echo "Missing libfreerdp-android.so"
|
||||||
|
echo "Please build the project first."
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f $GPROF ]; then
|
||||||
|
echo "gprof could not be found at $GPROF."
|
||||||
|
echo "Please assure, that you are using a GCC based android toolchain."
|
||||||
|
exit -2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f $ADB ] || [ ! -x $ADB ]; then
|
||||||
|
echo "adb could not be found."
|
||||||
|
echo "assure, that either ANDROID_SDK is set to the path of your android SDK"
|
||||||
|
echo "or that adb is in path."
|
||||||
|
exit -3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Do the acutal work in a temporary directory.
|
||||||
|
SRC=`mktemp -d`
|
||||||
|
cd $SRC
|
||||||
|
$ADB $@ pull /sdcard/gmon.out
|
||||||
|
if [ ! -f gmon.out ]; then
|
||||||
|
echo "Could not pull profiling information from device!"
|
||||||
|
RC=-4
|
||||||
|
else
|
||||||
|
echo "Pulled profiling information from device, starting conversion..."
|
||||||
|
$GPROF $LIB -PprofCount -QprofCount -P__gnu_mcount_nc -Q__gnu_mcount_nc
|
||||||
|
RC=0
|
||||||
|
fi
|
||||||
|
rm -rf $SRC
|
||||||
|
|
||||||
|
exit $RC
|
@ -10,7 +10,7 @@ set(${MODULE_PREFIX}_TESTS
|
|||||||
TestInitializeSecurityContext.c
|
TestInitializeSecurityContext.c
|
||||||
TestAcquireCredentialsHandle.c
|
TestAcquireCredentialsHandle.c
|
||||||
TestNTLM.c
|
TestNTLM.c
|
||||||
TestSchannel.c)
|
)
|
||||||
|
|
||||||
create_test_sourcelist(${MODULE_PREFIX}_SRCS
|
create_test_sourcelist(${MODULE_PREFIX}_SRCS
|
||||||
${${MODULE_PREFIX}_DRIVER}
|
${${MODULE_PREFIX}_DRIVER}
|
||||||
|
@ -180,13 +180,14 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
|
|||||||
pid_t pid;
|
pid_t pid;
|
||||||
int flags;
|
int flags;
|
||||||
int numArgs;
|
int numArgs;
|
||||||
LPSTR* pArgs;
|
LPSTR* pArgs = NULL;
|
||||||
char** envp;
|
char** envp = NULL;
|
||||||
char* filename = NULL;
|
char* filename = NULL;
|
||||||
WINPR_THREAD* thread;
|
WINPR_THREAD* thread;
|
||||||
WINPR_PROCESS* process;
|
WINPR_PROCESS* process;
|
||||||
WINPR_ACCESS_TOKEN* token;
|
WINPR_ACCESS_TOKEN* token;
|
||||||
LPTCH lpszEnvironmentBlock;
|
LPTCH lpszEnvironmentBlock;
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
pid = 0;
|
pid = 0;
|
||||||
envp = NULL;
|
envp = NULL;
|
||||||
@ -210,6 +211,8 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
filename = FindApplicationPath(pArgs[0]);
|
filename = FindApplicationPath(pArgs[0]);
|
||||||
|
if (NULL == filename)
|
||||||
|
goto finish;
|
||||||
|
|
||||||
/* fork and exec */
|
/* fork and exec */
|
||||||
|
|
||||||
@ -218,7 +221,7 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
|
|||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
{
|
{
|
||||||
/* fork failure */
|
/* fork failure */
|
||||||
return FALSE;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pid == 0)
|
if (pid == 0)
|
||||||
@ -252,7 +255,8 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
|
|||||||
|
|
||||||
if (execve(filename, pArgs, envp) < 0)
|
if (execve(filename, pArgs, envp) < 0)
|
||||||
{
|
{
|
||||||
return FALSE;
|
/* execve failed - end the process */
|
||||||
|
_exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -263,7 +267,9 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
|
|||||||
process = (WINPR_PROCESS*) malloc(sizeof(WINPR_PROCESS));
|
process = (WINPR_PROCESS*) malloc(sizeof(WINPR_PROCESS));
|
||||||
|
|
||||||
if (!process)
|
if (!process)
|
||||||
return FALSE;
|
{
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
ZeroMemory(process, sizeof(WINPR_PROCESS));
|
ZeroMemory(process, sizeof(WINPR_PROCESS));
|
||||||
|
|
||||||
@ -278,7 +284,9 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
|
|||||||
ZeroMemory(thread, sizeof(WINPR_THREAD));
|
ZeroMemory(thread, sizeof(WINPR_THREAD));
|
||||||
|
|
||||||
if (!thread)
|
if (!thread)
|
||||||
return FALSE;
|
{
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
WINPR_HANDLE_SET_TYPE(thread, HANDLE_TYPE_THREAD);
|
WINPR_HANDLE_SET_TYPE(thread, HANDLE_TYPE_THREAD);
|
||||||
|
|
||||||
@ -289,7 +297,13 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
|
|||||||
lpProcessInformation->dwProcessId = (DWORD) pid;
|
lpProcessInformation->dwProcessId = (DWORD) pid;
|
||||||
lpProcessInformation->dwThreadId = (DWORD) pid;
|
lpProcessInformation->dwThreadId = (DWORD) pid;
|
||||||
|
|
||||||
free(filename);
|
ret = TRUE;
|
||||||
|
|
||||||
|
finish:
|
||||||
|
if (filename)
|
||||||
|
{
|
||||||
|
free(filename);
|
||||||
|
}
|
||||||
|
|
||||||
if (pArgs)
|
if (pArgs)
|
||||||
{
|
{
|
||||||
@ -312,7 +326,7 @@ BOOL _CreateProcessExA(HANDLE hToken, DWORD dwLogonFlags,
|
|||||||
free(envp);
|
free(envp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
BOOL CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
||||||
|
Loading…
Reference in New Issue
Block a user