Merge pull request #50 from roman-b/rail

Rail
This commit is contained in:
Marc-André Moreau 2011-08-19 08:36:57 -07:00
commit 9e42276d1b
5 changed files with 73 additions and 52 deletions

View File

@ -31,7 +31,7 @@
#include "rail_orders.h"
#include "rail_main.h"
static void rail_send_channel_data(void* rail_object, void* data, size_t length)
void rail_send_channel_data(void* rail_object, void* data, size_t length)
{
STREAM* s = NULL;
railPlugin* plugin = (railPlugin*) rail_object;
@ -59,16 +59,9 @@ static void rail_process_connect(rdpSvcPlugin* plugin)
{
railPlugin* rail = (railPlugin*) plugin;
rail->rail_event_sender.event_sender_object = rail;
rail->rail_event_sender.send_rail_channel_event = rail_send_channel_event;
rail->rail_data_sender.data_sender_object = rail;
rail->rail_data_sender.send_rail_channel_data = rail_send_channel_data;
rail->rail_order = rail_order_new();
rail->rail_order->plugin_data = (RDP_PLUGIN_DATA*)plugin->channel_entry_points.pExtendedData;
rail->rail_order->data_sender = &(rail->rail_data_sender);
rail->rail_order->event_sender = &(rail->rail_event_sender);
rail->rail_order->plugin = rail;
}
static void rail_process_terminate(rdpSvcPlugin* plugin)

View File

@ -26,25 +26,11 @@
#include <freerdp/utils/stream.h>
#include <freerdp/utils/svc_plugin.h>
typedef struct _RAIL_CHANNEL_DATA_SENDER RAIL_CHANNEL_DATA_SENDER;
typedef struct _RAIL_CHANNEL_EVENT_SENDER RAIL_CHANNEL_EVENT_SENDER;
struct _RAIL_CHANNEL_DATA_SENDER
{
void* data_sender_object;
void (*send_rail_channel_data)(void* sender_object, void* data, size_t length);
};
struct _RAIL_CHANNEL_EVENT_SENDER
{
void * event_sender_object;
void (*send_rail_channel_event)(void* ui_event_sender_object, uint16 event_type, void* param);
};
struct rdp_rail_order
{
UNICONV* uniconv;
RDP_PLUGIN_DATA* plugin_data;
void* plugin;
RAIL_HANDSHAKE_ORDER handshake;
RAIL_CLIENT_STATUS_ORDER client_status;
RAIL_EXEC_ORDER exec;
@ -60,21 +46,18 @@ struct rdp_rail_order
RAIL_LANGBAR_INFO_ORDER langbar_info;
RAIL_GET_APPID_REQ_ORDER get_appid_req;
RAIL_GET_APPID_RESP_ORDER get_appid_resp;
RAIL_CHANNEL_DATA_SENDER* data_sender;
RAIL_CHANNEL_EVENT_SENDER* event_sender;
};
typedef struct rdp_rail_order rdpRailOrder;
struct rail_plugin
{
rdpSvcPlugin plugin;
RAIL_CHANNEL_DATA_SENDER rail_data_sender;
RAIL_CHANNEL_EVENT_SENDER rail_event_sender;
rdpRailOrder* rail_order;
};
typedef struct rail_plugin railPlugin;
void rail_send_channel_event(void* rail_object, uint16 event_type, void* param);
void rail_send_channel_data(void* rail_object, void* data, size_t length);
#define WITH_DEBUG_RAIL 1

View File

@ -114,7 +114,7 @@ void rail_send_pdu(rdpRailOrder* rail_order, STREAM* s, uint16 orderType)
printf("Sending %s PDU, length:%d\n",
RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)], orderLength);
rail_order->data_sender->send_rail_channel_data(rail_order->data_sender->data_sender_object, s->data, orderLength);
rail_send_channel_data(rail_order->plugin, s->data, orderLength);
}
void rail_write_high_contrast(STREAM* s, HIGH_CONTRAST* high_contrast)
@ -328,37 +328,38 @@ void rail_recv_handshake_order(rdpRailOrder* rail_order, STREAM* s)
rail_order->sysparam.params = 0;
rail_order->sysparam.params |= SPI_SET_HIGH_CONTRAST;
rail_order->sysparam.params |= SPI_MASK_SET_HIGH_CONTRAST;
rail_order->sysparam.highContrast.colorScheme.string = NULL;
rail_order->sysparam.highContrast.colorScheme.length = 0;
rail_order->sysparam.highContrast.flags = 0x7E;
rail_order->sysparam.params |= SPI_TASKBAR_POS;
rail_order->sysparam.taskbarPos.left = 0;
rail_order->sysparam.taskbarPos.top = 0;
rail_order->sysparam.taskbarPos.right = 1024;
rail_order->sysparam.taskbarPos.bottom = 29;
rail_order->sysparam.params |= SPI_SET_MOUSE_BUTTON_SWAP;
rail_order->sysparam.params |= SPI_MASK_SET_MOUSE_BUTTON_SWAP;
rail_order->sysparam.mouseButtonSwap = False;
rail_order->sysparam.params |= SPI_SET_KEYBOARD_PREF;
rail_order->sysparam.params |= SPI_MASK_SET_KEYBOARD_PREF;
rail_order->sysparam.keyboardPref = False;
rail_order->sysparam.params |= SPI_SET_DRAG_FULL_WINDOWS;
rail_order->sysparam.params |= SPI_MASK_SET_DRAG_FULL_WINDOWS;
rail_order->sysparam.dragFullWindows = True;
rail_order->sysparam.params |= SPI_SET_KEYBOARD_CUES;
rail_order->sysparam.params |= SPI_MASK_SET_KEYBOARD_CUES;
rail_order->sysparam.keyboardCues = False;
rail_order->sysparam.params |= SPI_SET_WORK_AREA;
rail_order->sysparam.params |= SPI_MASK_SET_WORK_AREA;
rail_order->sysparam.workArea.left = 0;
rail_order->sysparam.workArea.top = 0;
rail_order->sysparam.workArea.right = 1024;
rail_order->sysparam.workArea.bottom = 768;
rail_send_channel_event(rail_order->event_sender->event_sender_object,
RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS, (void*) &rail_order->sysparam);
rail_send_channel_event(rail_order->plugin,
RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS, (void*) &rail_order->sysparam);
}
void rail_recv_exec_result_order(rdpRailOrder* rail_order, STREAM* s)
{
rail_read_server_exec_result_order(s, &rail_order->exec_result);
rail_send_channel_event(rail_order->plugin,
RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS, (void*) &rail_order->exec_result);
}
void rail_order_recv(rdpRailOrder* rail_order, STREAM* s)
@ -378,7 +379,7 @@ void rail_order_recv(rdpRailOrder* rail_order, STREAM* s)
break;
case RDP_RAIL_ORDER_EXEC_RESULT:
rail_read_server_exec_result_order(s, &rail_order->exec_result);
rail_recv_exec_result_order(rail_order, s);
break;
case RDP_RAIL_ORDER_SYSPARAM:
@ -471,43 +472,43 @@ void rail_send_client_sysparam_order(rdpRailOrder* rail_order)
void rail_send_client_sysparams_order(rdpRailOrder* rail_order)
{
if (rail_order->sysparam.params & SPI_SET_HIGH_CONTRAST)
if (rail_order->sysparam.params & SPI_MASK_SET_HIGH_CONTRAST)
{
rail_order->sysparam.param = SPI_SET_HIGH_CONTRAST;
rail_send_client_sysparam_order(rail_order);
}
if (rail_order->sysparam.params & SPI_TASKBAR_POS)
if (rail_order->sysparam.params & SPI_MASK_TASKBAR_POS)
{
rail_order->sysparam.param = SPI_TASKBAR_POS;
rail_send_client_sysparam_order(rail_order);
}
if (rail_order->sysparam.params & SPI_SET_MOUSE_BUTTON_SWAP)
if (rail_order->sysparam.params & SPI_MASK_SET_MOUSE_BUTTON_SWAP)
{
rail_order->sysparam.param = SPI_SET_MOUSE_BUTTON_SWAP;
rail_send_client_sysparam_order(rail_order);
}
if (rail_order->sysparam.params & SPI_SET_KEYBOARD_PREF)
if (rail_order->sysparam.params & SPI_MASK_SET_KEYBOARD_PREF)
{
rail_order->sysparam.param = SPI_SET_KEYBOARD_PREF;
rail_send_client_sysparam_order(rail_order);
}
if (rail_order->sysparam.params & SPI_SET_DRAG_FULL_WINDOWS)
if (rail_order->sysparam.params & SPI_MASK_SET_DRAG_FULL_WINDOWS)
{
rail_order->sysparam.param = SPI_SET_DRAG_FULL_WINDOWS;
rail_send_client_sysparam_order(rail_order);
}
if (rail_order->sysparam.params & SPI_SET_KEYBOARD_CUES)
if (rail_order->sysparam.params & SPI_MASK_SET_KEYBOARD_CUES)
{
rail_order->sysparam.param = SPI_SET_KEYBOARD_CUES;
rail_send_client_sysparam_order(rail_order);
}
if (rail_order->sysparam.params & SPI_SET_WORK_AREA)
if (rail_order->sysparam.params & SPI_MASK_SET_WORK_AREA)
{
rail_order->sysparam.param = SPI_SET_WORK_AREA;
rail_send_client_sysparam_order(rail_order);

View File

@ -120,6 +120,29 @@ void xf_process_rail_get_sysparams_event(xfInfo* xfi, rdpChanMan* chanman, RDP_E
freerdp_chanman_send_event(chanman, new_event);
}
void xf_process_rail_exec_result_event(xfInfo* xfi, rdpChanMan* chanman, RDP_EVENT* event)
{
RAIL_EXEC_RESULT_ORDER * exec_result;
const char* error_code_names[] =
{
"RAIL_EXEC_S_OK",
"RAIL_EXEC_E_HOOK_NOT_LOADED",
"RAIL_EXEC_E_DECODE_FAILED",
"RAIL_EXEC_E_NOT_IN_ALLOWLIST",
"RAIL_EXEC_E_FILE_NOT_FOUND",
"RAIL_EXEC_E_FAIL",
"RAIL_EXEC_E_SESSION_LOCKED"
};
exec_result = (RAIL_EXEC_RESULT_ORDER *)event->user_data;
if (exec_result->execResult != RAIL_EXEC_S_OK)
{
printf("RAIL exec error: execResult=%s NtError=0x%X\n",
error_code_names[exec_result->execResult], exec_result->rawResult);
}
}
void xf_process_rail_event(xfInfo* xfi, rdpChanMan* chanman, RDP_EVENT* event)
{
switch (event->event_type)
@ -128,6 +151,10 @@ void xf_process_rail_event(xfInfo* xfi, rdpChanMan* chanman, RDP_EVENT* event)
xf_process_rail_get_sysparams_event(xfi, chanman, event);
break;
case RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS:
xf_process_rail_exec_result_event(xfi, chanman, event);
break;
default:
break;
}

View File

@ -66,6 +66,22 @@
#define SPI_SET_SCREEN_SAVE_ACTIVE 0x00000011
#define SPI_SET_SCREEN_SAVE_SECURE 0x00000077
/*Bit mask values for SPI_ parameters*/
enum SPI_MASK
{
SPI_MASK_SET_DRAG_FULL_WINDOWS = 0x00000001,
SPI_MASK_SET_KEYBOARD_CUES = 0x00000002,
SPI_MASK_SET_KEYBOARD_PREF = 0x00000004,
SPI_MASK_SET_MOUSE_BUTTON_SWAP = 0x00000008,
SPI_MASK_SET_WORK_AREA = 0x00000010,
SPI_MASK_DISPLAY_CHANGE = 0x00000020,
SPI_MASK_TASKBAR_POS = 0x00000040,
SPI_MASK_SET_HIGH_CONTRAST = 0x00000080,
SPI_MASK_SET_SCREEN_SAVE_ACTIVE = 0x00000100,
SPI_MASK_SET_SET_SCREEN_SAVE_SECURE = 0x00000200
};
/* Client System Command PDU */
#define SC_SIZE 0xF000
#define SC_MOVE 0xF010
@ -314,7 +330,8 @@ enum RDP_RAIL_PDU_TYPE
enum RDP_EVENT_TYPE_RAIL
{
RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS = 1,
RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS = 2
RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS = 2,
RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS = 3
};
#endif /* __RAIL_GLOBAL_H */