diff --git a/channels/remdesk/CMakeLists.txt b/channels/remdesk/CMakeLists.txt new file mode 100644 index 000000000..23f1cf7b2 --- /dev/null +++ b/channels/remdesk/CMakeLists.txt @@ -0,0 +1,26 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# FreeRDP cmake build script +# +# Copyright 2012 Marc-Andre Moreau +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +define_channel("remdesk") + +if(WITH_CLIENT_CHANNELS) + add_channel_client(${MODULE_PREFIX} ${CHANNEL_NAME}) +endif() + +if(WITH_SERVER_CHANNELS) + add_channel_server(${MODULE_PREFIX} ${CHANNEL_NAME}) +endif() diff --git a/channels/remdesk/ChannelOptions.cmake b/channels/remdesk/ChannelOptions.cmake new file mode 100644 index 000000000..17518e619 --- /dev/null +++ b/channels/remdesk/ChannelOptions.cmake @@ -0,0 +1,12 @@ + +set(OPTION_DEFAULT OFF) +set(OPTION_CLIENT_DEFAULT ON) +set(OPTION_SERVER_DEFAULT ON) + +define_channel_options(NAME "remdesk" TYPE "static" + DESCRIPTION "Remote Assistance Virtual Channel Extension" + SPECIFICATIONS "[MS-RA]" + DEFAULT ${OPTION_DEFAULT}) + +define_channel_client_options(${OPTION_CLIENT_DEFAULT}) +define_channel_server_options(${OPTION_SERVER_DEFAULT}) diff --git a/channels/remdesk/client/CMakeLists.txt b/channels/remdesk/client/CMakeLists.txt new file mode 100644 index 000000000..9d8323634 --- /dev/null +++ b/channels/remdesk/client/CMakeLists.txt @@ -0,0 +1,35 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# FreeRDP cmake build script +# +# Copyright 2012 Marc-Andre Moreau +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +define_channel_client("remdesk") + +set(${MODULE_PREFIX}_SRCS + remdesk_main.c + remdesk_main.h) + +add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE "VirtualChannelEntry") + +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") + +set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS + MONOLITHIC ${MONOLITHIC_BUILD} + MODULE winpr + MODULES winpr-crt) + +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/remdesk/client/remdesk_main.c b/channels/remdesk/client/remdesk_main.c new file mode 100644 index 000000000..feeb7e4db --- /dev/null +++ b/channels/remdesk/client/remdesk_main.c @@ -0,0 +1,330 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include + +#include "remdesk_main.h" + +RemdeskClientContext* remdesk_get_client_interface(remdeskPlugin* remdesk) +{ + RemdeskClientContext* pInterface; + pInterface = (RemdeskClientContext*) remdesk->channelEntryPoints.pInterface; + return pInterface; +} + +static int remdesk_process_receive(remdeskPlugin* remdesk, wStream* s) +{ + int status = 1; + + printf("RemDeskReceive: %d\n", Stream_Length(s)); + winpr_HexDump(Stream_Buffer(s), Stream_Length(s)); + + return status; +} + +static void remdesk_process_connect(remdeskPlugin* remdesk) +{ + printf("RemdeskProcessConnect\n"); +} + +/****************************************************************************************/ + +static wListDictionary* g_InitHandles; +static wListDictionary* g_OpenHandles; + +void remdesk_add_init_handle_data(void* pInitHandle, void* pUserData) +{ + if (!g_InitHandles) + g_InitHandles = ListDictionary_New(TRUE); + + ListDictionary_Add(g_InitHandles, pInitHandle, pUserData); +} + +void* remdesk_get_init_handle_data(void* pInitHandle) +{ + void* pUserData = NULL; + pUserData = ListDictionary_GetItemValue(g_InitHandles, pInitHandle); + return pUserData; +} + +void remdesk_remove_init_handle_data(void* pInitHandle) +{ + ListDictionary_Remove(g_InitHandles, pInitHandle); +} + +void remdesk_add_open_handle_data(DWORD openHandle, void* pUserData) +{ + void* pOpenHandle = (void*) (size_t) openHandle; + + if (!g_OpenHandles) + g_OpenHandles = ListDictionary_New(TRUE); + + ListDictionary_Add(g_OpenHandles, pOpenHandle, pUserData); +} + +void* remdesk_get_open_handle_data(DWORD openHandle) +{ + void* pUserData = NULL; + void* pOpenHandle = (void*) (size_t) openHandle; + pUserData = ListDictionary_GetItemValue(g_OpenHandles, pOpenHandle); + return pUserData; +} + +void remdesk_remove_open_handle_data(DWORD openHandle) +{ + void* pOpenHandle = (void*) (size_t) openHandle; + ListDictionary_Remove(g_OpenHandles, pOpenHandle); +} + +int remdesk_send(remdeskPlugin* remdesk, wStream* s) +{ + UINT32 status = 0; + remdeskPlugin* plugin = (remdeskPlugin*) remdesk; + + if (!plugin) + { + status = CHANNEL_RC_BAD_INIT_HANDLE; + } + else + { + status = plugin->channelEntryPoints.pVirtualChannelWrite(plugin->OpenHandle, + Stream_Buffer(s), (UINT32) Stream_GetPosition(s), s); + } + + if (status != CHANNEL_RC_OK) + { + Stream_Free(s, TRUE); + fprintf(stderr, "remdesk_send: VirtualChannelWrite failed %d\n", status); + } + + return status; +} + +static void remdesk_virtual_channel_event_data_received(remdeskPlugin* remdesk, + void* pData, UINT32 dataLength, UINT32 totalLength, UINT32 dataFlags) +{ + wStream* data_in; + + if ((dataFlags & CHANNEL_FLAG_SUSPEND) || (dataFlags & CHANNEL_FLAG_RESUME)) + { + return; + } + + if (dataFlags & CHANNEL_FLAG_FIRST) + { + if (remdesk->data_in) + Stream_Free(remdesk->data_in, TRUE); + + remdesk->data_in = Stream_New(NULL, totalLength); + } + + data_in = remdesk->data_in; + Stream_EnsureRemainingCapacity(data_in, (int) dataLength); + Stream_Write(data_in, pData, dataLength); + + if (dataFlags & CHANNEL_FLAG_LAST) + { + if (Stream_Capacity(data_in) != Stream_GetPosition(data_in)) + { + fprintf(stderr, "remdesk_plugin_process_received: read error\n"); + } + + remdesk->data_in = NULL; + Stream_SealLength(data_in); + Stream_SetPosition(data_in, 0); + + MessageQueue_Post(remdesk->MsgPipe->In, NULL, 0, (void*) data_in, NULL); + } +} + +static VOID VCAPITYPE remdesk_virtual_channel_open_event(DWORD openHandle, UINT event, + LPVOID pData, UINT32 dataLength, UINT32 totalLength, UINT32 dataFlags) +{ + remdeskPlugin* remdesk; + + remdesk = (remdeskPlugin*) remdesk_get_open_handle_data(openHandle); + + if (!remdesk) + { + fprintf(stderr, "remdesk_virtual_channel_open_event: error no match\n"); + return; + } + + switch (event) + { + case CHANNEL_EVENT_DATA_RECEIVED: + remdesk_virtual_channel_event_data_received(remdesk, pData, dataLength, totalLength, dataFlags); + break; + + case CHANNEL_EVENT_WRITE_COMPLETE: + Stream_Free((wStream*) pData, TRUE); + break; + + case CHANNEL_EVENT_USER: + break; + } +} + +static void* remdesk_virtual_channel_client_thread(void* arg) +{ + wStream* data; + wMessage message; + remdeskPlugin* remdesk = (remdeskPlugin*) arg; + + remdesk_process_connect(remdesk); + + while (1) + { + if (!MessageQueue_Wait(remdesk->MsgPipe->In)) + break; + + if (MessageQueue_Peek(remdesk->MsgPipe->In, &message, TRUE)) + { + if (message.id == WMQ_QUIT) + break; + + if (message.id == 0) + { + data = (wStream*) message.wParam; + remdesk_process_receive(remdesk, data); + } + } + } + + ExitThread(0); + return NULL; +} + +static void remdesk_virtual_channel_event_connected(remdeskPlugin* remdesk, LPVOID pData, UINT32 dataLength) +{ + UINT32 status; + + status = remdesk->channelEntryPoints.pVirtualChannelOpen(remdesk->InitHandle, + &remdesk->OpenHandle, remdesk->channelDef.name, remdesk_virtual_channel_open_event); + + remdesk_add_open_handle_data(remdesk->OpenHandle, remdesk); + + if (status != CHANNEL_RC_OK) + { + fprintf(stderr, "remdesk_virtual_channel_event_connected: open failed: status: %d\n", status); + return; + } + + remdesk->MsgPipe = MessagePipe_New(); + + remdesk->thread = CreateThread(NULL, 0, + (LPTHREAD_START_ROUTINE) remdesk_virtual_channel_client_thread, (void*) remdesk, 0, NULL); +} + +static void remdesk_virtual_channel_event_terminated(remdeskPlugin* remdesk) +{ + MessagePipe_PostQuit(remdesk->MsgPipe, 0); + WaitForSingleObject(remdesk->thread, INFINITE); + + MessagePipe_Free(remdesk->MsgPipe); + CloseHandle(remdesk->thread); + + remdesk->channelEntryPoints.pVirtualChannelClose(remdesk->OpenHandle); + + if (remdesk->data_in) + { + Stream_Free(remdesk->data_in, TRUE); + remdesk->data_in = NULL; + } + + remdesk_remove_open_handle_data(remdesk->OpenHandle); + remdesk_remove_init_handle_data(remdesk->InitHandle); +} + +static VOID VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) +{ + remdeskPlugin* remdesk; + + remdesk = (remdeskPlugin*) remdesk_get_init_handle_data(pInitHandle); + + if (!remdesk) + { + fprintf(stderr, "remdesk_virtual_channel_init_event: error no match\n"); + return; + } + + switch (event) + { + case CHANNEL_EVENT_CONNECTED: + remdesk_virtual_channel_event_connected(remdesk, pData, dataLength); + break; + + case CHANNEL_EVENT_DISCONNECTED: + break; + + case CHANNEL_EVENT_TERMINATED: + remdesk_virtual_channel_event_terminated(remdesk); + break; + } +} + +/* remdesk is always built-in */ +#define VirtualChannelEntry remdesk_VirtualChannelEntry + +BOOL VCAPITYPE VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) +{ + remdeskPlugin* remdesk; + RemdeskClientContext* context; + CHANNEL_ENTRY_POINTS_FREERDP* pEntryPointsEx; + + remdesk = (remdeskPlugin*) calloc(1, sizeof(remdeskPlugin)); + + remdesk->channelDef.options = + CHANNEL_OPTION_INITIALIZED | + CHANNEL_OPTION_ENCRYPT_RDP | + CHANNEL_OPTION_COMPRESS_RDP | + CHANNEL_OPTION_SHOW_PROTOCOL; + + printf("remdesk_VirtualChannelEntry\n"); + + strcpy(remdesk->channelDef.name, "remdesk"); + + pEntryPointsEx = (CHANNEL_ENTRY_POINTS_FREERDP*) pEntryPoints; + + if ((pEntryPointsEx->cbSize >= sizeof(CHANNEL_ENTRY_POINTS_FREERDP)) && + (pEntryPointsEx->MagicNumber == FREERDP_CHANNEL_MAGIC_NUMBER)) + { + context = (RemdeskClientContext*) calloc(1, sizeof(RemdeskClientContext)); + + context->handle = (void*) remdesk; + + *(pEntryPointsEx->ppInterface) = (void*) context; + } + + CopyMemory(&(remdesk->channelEntryPoints), pEntryPoints, sizeof(CHANNEL_ENTRY_POINTS_FREERDP)); + + remdesk->channelEntryPoints.pVirtualChannelInit(&remdesk->InitHandle, + &remdesk->channelDef, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, remdesk_virtual_channel_init_event); + + remdesk_add_init_handle_data(remdesk->InitHandle, (void*) remdesk); + + return 1; +} diff --git a/channels/remdesk/client/remdesk_main.h b/channels/remdesk/client/remdesk_main.h new file mode 100644 index 000000000..56e6f133c --- /dev/null +++ b/channels/remdesk/client/remdesk_main.h @@ -0,0 +1,48 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_REMDESK_CLIENT_MAIN_H +#define FREERDP_CHANNEL_REMDESK_CLIENT_MAIN_H + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +struct remdesk_plugin +{ + CHANNEL_DEF channelDef; + CHANNEL_ENTRY_POINTS_FREERDP channelEntryPoints; + + HANDLE thread; + wStream* data_in; + void* InitHandle; + DWORD OpenHandle; + wMessagePipe* MsgPipe; +}; +typedef struct remdesk_plugin remdeskPlugin; + +#endif /* FREERDP_CHANNEL_REMDESK_CLIENT_MAIN_H */ diff --git a/channels/remdesk/server/CMakeLists.txt b/channels/remdesk/server/CMakeLists.txt new file mode 100644 index 000000000..3139058b9 --- /dev/null +++ b/channels/remdesk/server/CMakeLists.txt @@ -0,0 +1,37 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# FreeRDP cmake build script +# +# Copyright 2012 Marc-Andre Moreau +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +define_channel_server("remdesk") + +set(${MODULE_PREFIX}_SRCS + remdesk_main.c + remdesk_main.h) + +add_channel_server_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE "VirtualChannelEntry") + +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") + +set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS + MONOLITHIC ${MONOLITHIC_BUILD} + MODULE winpr + MODULES winpr-crt) + +target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) + +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Server") diff --git a/channels/remdesk/server/remdesk_main.c b/channels/remdesk/server/remdesk_main.c new file mode 100644 index 000000000..3cd00ad63 --- /dev/null +++ b/channels/remdesk/server/remdesk_main.c @@ -0,0 +1,157 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "remdesk_main.h" + +static int remdesk_server_receive_pdu(RemdeskServerContext* context, wStream* s) +{ + return 0; +} + +static void* remdesk_server_thread(void* arg) +{ + wStream* s; + DWORD status; + DWORD nCount; + void* buffer; + HANDLE events[8]; + HANDLE ChannelEvent; + DWORD BytesReturned; + RemdeskServerContext* context; + + context = (RemdeskServerContext*) arg; + + buffer = NULL; + BytesReturned = 0; + ChannelEvent = NULL; + + s = Stream_New(NULL, 4096); + + if (WTSVirtualChannelQuery(context->priv->ChannelHandle, WTSVirtualEventHandle, &buffer, &BytesReturned) == TRUE) + { + if (BytesReturned == sizeof(HANDLE)) + CopyMemory(&ChannelEvent, buffer, sizeof(HANDLE)); + + WTSFreeMemory(buffer); + } + + nCount = 0; + events[nCount++] = ChannelEvent; + events[nCount++] = context->priv->StopEvent; + + while (1) + { + status = WaitForMultipleObjects(nCount, events, FALSE, INFINITE); + + if (WaitForSingleObject(context->priv->StopEvent, 0) == WAIT_OBJECT_0) + { + break; + } + + if (WTSVirtualChannelRead(context->priv->ChannelHandle, 0, + (PCHAR) Stream_Buffer(s), Stream_Capacity(s), &BytesReturned)) + { + if (BytesReturned) + Stream_Seek(s, BytesReturned); + } + else + { + Stream_EnsureRemainingCapacity(s, BytesReturned); + } + + if (0) + { + remdesk_server_receive_pdu(context, s); + } + } + + Stream_Free(s, TRUE); + + return NULL; +} + +static int remdesk_server_start(RemdeskServerContext* context) +{ + context->priv->ChannelHandle = WTSVirtualChannelOpen(context->vcm, WTS_CURRENT_SESSION, "remdesk"); + + if (!context->priv->ChannelHandle) + return -1; + + context->priv->StopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + + context->priv->Thread = CreateThread(NULL, 0, + (LPTHREAD_START_ROUTINE) remdesk_server_thread, (void*) context, 0, NULL); + + return 0; +} + +static int remdesk_server_stop(RemdeskServerContext* context) +{ + SetEvent(context->priv->StopEvent); + + WaitForSingleObject(context->priv->Thread, INFINITE); + CloseHandle(context->priv->Thread); + + return 0; +} + +RemdeskServerContext* remdesk_server_context_new(HANDLE vcm) +{ + RemdeskServerContext* context; + + context = (RemdeskServerContext*) calloc(1, sizeof(RemdeskServerContext)); + + if (context) + { + context->vcm = vcm; + + context->Start = remdesk_server_start; + context->Stop = remdesk_server_stop; + + context->priv = (RemdeskServerPrivate*) calloc(1, sizeof(RemdeskServerPrivate)); + + if (context->priv) + { + + } + } + + return context; +} + +void remdesk_server_context_free(RemdeskServerContext* context) +{ + if (context) + { + if (context->priv) + { + free(context->priv); + } + + free(context); + } +} diff --git a/channels/remdesk/server/remdesk_main.h b/channels/remdesk/server/remdesk_main.h new file mode 100644 index 000000000..42b504c1a --- /dev/null +++ b/channels/remdesk/server/remdesk_main.h @@ -0,0 +1,37 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_SERVER_REMDESK_MAIN_H +#define FREERDP_CHANNEL_SERVER_REMDESK_MAIN_H + +#include +#include +#include + +#include + +struct _remdesk_server_private +{ + HANDLE Thread; + HANDLE StopEvent; + void* ChannelHandle; +}; + +#endif /* FREERDP_CHANNEL_SERVER_REMDESK_MAIN_H */ + diff --git a/include/freerdp/channels/remdesk.h b/include/freerdp/channels/remdesk.h new file mode 100644 index 000000000..630ad3bf3 --- /dev/null +++ b/include/freerdp/channels/remdesk.h @@ -0,0 +1,29 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_REMDESK_H +#define FREERDP_CHANNEL_REMDESK_H + +#include +#include + +#define REMDESK_SVC_CHANNEL_NAME "remdesk" + +#endif /* FREERDP_CHANNEL_REMDESK_H */ + diff --git a/include/freerdp/client/remdesk.h b/include/freerdp/client/remdesk.h new file mode 100644 index 000000000..600a421ce --- /dev/null +++ b/include/freerdp/client/remdesk.h @@ -0,0 +1,38 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_CLIENT_REMDESK_H +#define FREERDP_CHANNEL_CLIENT_REMDESK_H + +#include + +/** + * Client Interface + */ + +typedef struct _remdesk_client_context RemdeskClientContext; + +struct _remdesk_client_context +{ + void* handle; + void* custom; +}; + +#endif /* FREERDP_CHANNEL_CLIENT_REMDESK_H */ + diff --git a/include/freerdp/server/remdesk.h b/include/freerdp/server/remdesk.h new file mode 100644 index 000000000..75b1e0a93 --- /dev/null +++ b/include/freerdp/server/remdesk.h @@ -0,0 +1,53 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Remote Assistance Virtual Channel + * + * Copyright 2014 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_SERVER_REMDESK_H +#define FREERDP_CHANNEL_SERVER_REMDESK_H + +#include +#include +#include + +#include + +/** + * Server Interface + */ + +typedef struct _remdesk_server_context RemdeskServerContext; +typedef struct _remdesk_server_private RemdeskServerPrivate; + +typedef int (*psRemdeskStart)(RemdeskServerContext* context); +typedef int (*psRemdeskStop)(RemdeskServerContext* context); + +struct _remdesk_server_context +{ + HANDLE vcm; + + psRemdeskStart Start; + psRemdeskStop Stop; + + RemdeskServerPrivate* priv; +}; + +FREERDP_API RemdeskServerContext* remdesk_server_context_new(HANDLE vcm); +FREERDP_API void remdesk_server_context_free(RemdeskServerContext* context); + +#endif /* FREERDP_CHANNEL_SERVER_REMDESK_H */ +