void test_drdynvc(void) { rdpChanMan* chan_man; rdpSettings settings = { 0 }; freerdp instance = { 0 }; settings.hostname = "testhost"; instance.settings = &settings; instance.ChannelDataInput = test_rdp_channel_data; chan_man = freerdp_chanman_new(); freerdp_chanman_load_plugin(chan_man, &settings, "../channels/drdynvc/drdynvc.so", NULL); freerdp_chanman_pre_connect(chan_man, &instance); freerdp_chanman_post_connect(chan_man, &instance); /* server sends capability request PDU */ freerdp_chanman_data(&instance, 0, (char*)test_capability_request_data, sizeof(test_capability_request_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_capability_request_data) - 1); /* drdynvc sends capability response PDU to server */ data_received = 0; while (!data_received) { freerdp_chanman_check_fds(chan_man, &instance); } freerdp_chanman_close(chan_man, &instance); freerdp_chanman_free(chan_man); }
//----------------------------------------------------------------------------- static void emulate_server_send_channel_data( freerdp* instance, void* data, size_t size ) { freerdp_chanman_data(instance, 0, (char*)data, size, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, size); }
int tf_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 test_cliprdr(void) { int i; rdpChanMan* chan_man; rdpSettings settings = { 0 }; freerdp instance = { 0 }; FRDP_EVENT* event; FRDP_CB_FORMAT_LIST_EVENT* format_list_event; FRDP_CB_DATA_REQUEST_EVENT* data_request_event; FRDP_CB_DATA_RESPONSE_EVENT* data_response_event; settings.hostname = "testhost"; instance.settings = &settings; instance.SendChannelData = test_rdp_channel_data; chan_man = freerdp_chanman_new(); freerdp_chanman_load_plugin(chan_man, &settings, "../channels/cliprdr/cliprdr.so", NULL); freerdp_chanman_pre_connect(chan_man, &instance); freerdp_chanman_post_connect(chan_man, &instance); /* server sends cliprdr capabilities and monitor ready PDU */ freerdp_chanman_data(&instance, 0, (char*)test_clip_caps_data, sizeof(test_clip_caps_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_clip_caps_data) - 1); freerdp_chanman_data(&instance, 0, (char*)test_monitor_ready_data, sizeof(test_monitor_ready_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_monitor_ready_data) - 1); /* cliprdr sends clipboard_sync event to UI */ while ((event = freerdp_chanman_pop_event(chan_man)) == NULL) { freerdp_chanman_check_fds(chan_man, &instance); } printf("Got event %d\n", event->event_type); CU_ASSERT(event->event_type == FRDP_EVENT_TYPE_CB_SYNC); freerdp_event_free(event); /* UI sends format_list event to cliprdr */ event = freerdp_event_new(FRDP_EVENT_TYPE_CB_FORMAT_LIST, event_process_callback, NULL); format_list_event = (FRDP_CB_FORMAT_LIST_EVENT*)event; format_list_event->num_formats = 2; format_list_event->formats = (uint32*)xmalloc(sizeof(uint32) * 2); format_list_event->formats[0] = CB_FORMAT_TEXT; format_list_event->formats[1] = CB_FORMAT_HTML; event_processed = 0; freerdp_chanman_send_event(chan_man, "cliprdr", event); /* cliprdr sends format list PDU to server */ while (!event_processed) { freerdp_chanman_check_fds(chan_man, &instance); } /* server sends format list response PDU to cliprdr */ freerdp_chanman_data(&instance, 0, (char*)test_format_list_response_data, sizeof(test_format_list_response_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_format_list_response_data) - 1); /* server sends format list PDU to cliprdr */ freerdp_chanman_data(&instance, 0, (char*)test_format_list_data, sizeof(test_format_list_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_format_list_data) - 1); /* cliprdr sends format_list event to UI */ while ((event = freerdp_chanman_pop_event(chan_man)) == NULL) { freerdp_chanman_check_fds(chan_man, &instance); } printf("Got event %d\n", event->event_type); CU_ASSERT(event->event_type == FRDP_EVENT_TYPE_CB_FORMAT_LIST); if (event->event_type == FRDP_EVENT_TYPE_CB_FORMAT_LIST) { format_list_event = (FRDP_CB_FORMAT_LIST_EVENT*)event; for (i = 0; i < format_list_event->num_formats; i++) printf("Format: 0x%X\n", format_list_event->formats[i]); } freerdp_event_free(event); /* server sends data request PDU to cliprdr */ freerdp_chanman_data(&instance, 0, (char*)test_data_request_data, sizeof(test_data_request_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_data_request_data) - 1); /* cliprdr sends data request event to UI */ while ((event = freerdp_chanman_pop_event(chan_man)) == NULL) { freerdp_chanman_check_fds(chan_man, &instance); } printf("Got event %d\n", event->event_type); CU_ASSERT(event->event_type == FRDP_EVENT_TYPE_CB_DATA_REQUEST); if (event->event_type == FRDP_EVENT_TYPE_CB_DATA_REQUEST) { data_request_event = (FRDP_CB_DATA_REQUEST_EVENT*)event; printf("Requested format: 0x%X\n", data_request_event->format); } freerdp_event_free(event); /* UI sends data response event to cliprdr */ event = freerdp_event_new(FRDP_EVENT_TYPE_CB_DATA_RESPONSE, event_process_callback, NULL); data_response_event = (FRDP_CB_DATA_RESPONSE_EVENT*)event; data_response_event->data = (uint8*)xmalloc(6); strcpy((char*)data_response_event->data, "hello"); data_response_event->size = 6; event_processed = 0; freerdp_chanman_send_event(chan_man, "cliprdr", event); /* cliprdr sends data response PDU to server */ while (!event_processed) { freerdp_chanman_check_fds(chan_man, &instance); } /* UI sends data request event to cliprdr */ event = freerdp_event_new(FRDP_EVENT_TYPE_CB_DATA_REQUEST, event_process_callback, NULL); data_request_event = (FRDP_CB_DATA_REQUEST_EVENT*)event; data_request_event->format = CB_FORMAT_UNICODETEXT; event_processed = 0; freerdp_chanman_send_event(chan_man, "cliprdr", event); /* cliprdr sends data request PDU to server */ while (!event_processed) { freerdp_chanman_check_fds(chan_man, &instance); } /* server sends data response PDU to cliprdr */ freerdp_chanman_data(&instance, 0, (char*)test_data_response_data, sizeof(test_data_response_data) - 1, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_data_response_data) - 1); /* cliprdr sends data response event to UI */ while ((event = freerdp_chanman_pop_event(chan_man)) == NULL) { freerdp_chanman_check_fds(chan_man, &instance); } printf("Got event %d\n", event->event_type); CU_ASSERT(event->event_type == FRDP_EVENT_TYPE_CB_DATA_RESPONSE); if (event->event_type == FRDP_EVENT_TYPE_CB_DATA_RESPONSE) { data_response_event = (FRDP_CB_DATA_RESPONSE_EVENT*)event; printf("Data response size: %d\n", data_response_event->size); freerdp_hexdump(data_response_event->data, data_response_event->size); } freerdp_event_free(event); freerdp_chanman_close(chan_man, &instance); freerdp_chanman_free(chan_man); }