static void *jni_update_thread(void *arg) { int status; wMessage message; wMessageQueue* queue; freerdp* instance = (freerdp*) arg; assert( NULL != instance); DEBUG_ANDROID("Start."); status = 1; queue = freerdp_get_message_queue(instance, FREERDP_UPDATE_MESSAGE_QUEUE); while (MessageQueue_Wait(queue)) { while (MessageQueue_Peek(queue, &message, TRUE)) { status = freerdp_message_queue_process_message(instance, FREERDP_UPDATE_MESSAGE_QUEUE, &message); if (!status) break; } if (!status) break; } DEBUG_ANDROID("Quit."); ExitThread(0); return NULL; }
int MessageQueue_Get(wMessageQueue* queue, wMessage* message) { int status = -1; if (!MessageQueue_Wait(queue)) return status; EnterCriticalSection(&queue->lock); if (queue->size > 0) { CopyMemory(message, &(queue->array[queue->head]), sizeof(wMessage)); ZeroMemory(&(queue->array[queue->head]), sizeof(wMessage)); queue->head = (queue->head + 1) % queue->capacity; queue->size--; if (queue->size < 1) ResetEvent(queue->event); status = (message->id != WMQ_QUIT) ? 1 : 0; } LeaveCriticalSection(&queue->lock); return status; }
void* wf_input_thread(void* arg) { int status; wMessage message; wMessageQueue* queue; freerdp* instance = (freerdp*) arg; assert( NULL != instance); status = 1; queue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE); while (MessageQueue_Wait(queue)) { while (MessageQueue_Peek(queue, &message, TRUE)) { status = freerdp_message_queue_process_message(instance, FREERDP_INPUT_MESSAGE_QUEUE, &message); if (!status) break; } if (!status) break; } ExitThread(0); return NULL; }
static void* rail_virtual_channel_client_thread(void* arg) { wStream* data; wMessage message; railPlugin* rail = (railPlugin*) arg; while (1) { if (!MessageQueue_Wait(rail->queue)) break; if (MessageQueue_Peek(rail->queue, &message, TRUE)) { if (message.id == WMQ_QUIT) break; if (message.id == 0) { data = (wStream*) message.wParam; rail_order_recv(rail, data); } } } ExitThread(0); return NULL; }
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* rail_virtual_channel_client_thread(void* arg) { wStream* data; wMessage message; railPlugin* rail = (railPlugin*) arg; while (1) { if (!MessageQueue_Wait(rail->queue)) break; if (MessageQueue_Peek(rail->queue, &message, TRUE)) { if (message.id == WMQ_QUIT) break; if (message.id == 0) { data = (wStream*) message.wParam; if (!rail_order_recv(rail, data)) { WLog_ERR(TAG, "%s: invalid message, exiting", __FUNCTION__); break; } } } } ExitThread(0); return NULL; }
static void* drive_thread_func(void* arg) { IRP* irp; wMessage message; DRIVE_DEVICE* drive = (DRIVE_DEVICE*) arg; while (1) { if (!MessageQueue_Wait(drive->IrpQueue)) break; if (!MessageQueue_Peek(drive->IrpQueue, &message, TRUE)) break; if (message.id == WMQ_QUIT) break; irp = (IRP*) message.wParam; if (irp) drive_process_irp(drive, irp); } ExitThread(0); return NULL; }
static void* cliprdr_virtual_channel_client_thread(void* arg) { wStream* data; wMessage message; cliprdrPlugin* cliprdr = (cliprdrPlugin*) arg; while (1) { if (!MessageQueue_Wait(cliprdr->MsgPipe->In)) break; if (MessageQueue_Peek(cliprdr->MsgPipe->In, &message, TRUE)) { if (message.id == WMQ_QUIT) break; if (message.id == 0) { data = (wStream*) message.wParam; cliprdr_order_recv(cliprdr, data); } } } ExitThread(0); return NULL; }
static void* drdynvc_virtual_channel_client_thread(void* arg) { wStream* data; wMessage message; UINT error = CHANNEL_RC_OK; drdynvcPlugin* drdynvc = (drdynvcPlugin*) arg; while (1) { if (!MessageQueue_Wait(drdynvc->queue)) { WLog_ERR(TAG, "MessageQueue_Wait failed!"); error = ERROR_INTERNAL_ERROR; break; } if (!MessageQueue_Peek(drdynvc->queue, &message, TRUE)) { WLog_ERR(TAG, "MessageQueue_Peek failed!"); error = ERROR_INTERNAL_ERROR; break; } if (message.id == WMQ_QUIT) break; if (message.id == 0) { data = (wStream*) message.wParam; if ((error = drdynvc_order_recv(drdynvc, data))) { Stream_Free(data, TRUE); WLog_ERR(TAG, "drdynvc_order_recv failed with error %"PRIu32"!", error); break; } Stream_Free(data, TRUE); } } if (error && drdynvc->rdpcontext) setChannelError(drdynvc->rdpcontext, error, "drdynvc_virtual_channel_client_thread reported an error"); ExitThread((DWORD) error); return NULL; }
static void* remdesk_virtual_channel_client_thread(void* arg) { wStream* data; wMessage message; remdeskPlugin* remdesk = (remdeskPlugin*) arg; UINT error = CHANNEL_RC_OK; freerdp_channel_init_thread_context(remdesk->rdpcontext); remdesk_process_connect(remdesk); while (1) { if (!MessageQueue_Wait(remdesk->queue)) { WLog_ERR(TAG, "MessageQueue_Wait failed!"); error = ERROR_INTERNAL_ERROR; break; } if (!MessageQueue_Peek(remdesk->queue, &message, TRUE)) { WLog_ERR(TAG, "MessageQueue_Peek failed!"); error = ERROR_INTERNAL_ERROR; break; } if (message.id == WMQ_QUIT) break; if (message.id == 0) { data = (wStream*) message.wParam; if ((error = remdesk_process_receive(remdesk, data))) { WLog_ERR(TAG, "remdesk_process_receive failed with error %lu!", error); break; } } } if (error && remdesk->rdpcontext) setChannelError(remdesk->rdpcontext, error, "remdesk_virtual_channel_client_thread reported an error"); ExitThread((DWORD)error); return NULL; }
static void* drive_thread_func(void* arg) { IRP* irp; wMessage message; DRIVE_DEVICE* drive = (DRIVE_DEVICE*) arg; UINT error = CHANNEL_RC_OK; while (1) { if (!MessageQueue_Wait(drive->IrpQueue)) { WLog_ERR(TAG, "MessageQueue_Wait failed!"); error = ERROR_INTERNAL_ERROR; break; } if (!MessageQueue_Peek(drive->IrpQueue, &message, TRUE)) { WLog_ERR(TAG, "MessageQueue_Peek failed!"); error = ERROR_INTERNAL_ERROR; break; } if (message.id == WMQ_QUIT) break; irp = (IRP*) message.wParam; if (irp) if ((error = drive_process_irp(drive, irp))) { WLog_ERR(TAG, "drive_process_irp failed with error %u!", error); break; } } if (error && drive->rdpcontext) setChannelError(drive->rdpcontext, error, "drive_thread_func reported an error"); ExitThread((DWORD)error); return NULL; }
static void* parallel_thread_func(void* arg) { IRP* irp; wMessage message; PARALLEL_DEVICE* parallel = (PARALLEL_DEVICE*) arg; UINT error = CHANNEL_RC_OK; freerdp_channel_init_thread_context(parallel->rdpcontext); while (1) { if (!MessageQueue_Wait(parallel->queue)) { WLog_ERR(TAG, "MessageQueue_Wait failed!"); error = ERROR_INTERNAL_ERROR; break; } if (!MessageQueue_Peek(parallel->queue, &message, TRUE)) { WLog_ERR(TAG, "MessageQueue_Peek failed!"); error = ERROR_INTERNAL_ERROR; break; } if (message.id == WMQ_QUIT) break; irp = (IRP*) message.wParam; if ((error = parallel_process_irp(parallel, irp))) { WLog_ERR(TAG, "parallel_process_irp failed with error %d!", error); break; } } if (error && parallel->rdpcontext) setChannelError(parallel->rdpcontext, error, "parallel_thread_func reported an error"); ExitThread((DWORD)error); return NULL; }
static void* serial_thread_func(void* arg) { IRP* irp; wMessage message; SERIAL_DEVICE* serial = (SERIAL_DEVICE*) arg; UINT error = CHANNEL_RC_OK; while (1) { if (!MessageQueue_Wait(serial->MainIrpQueue)) { WLog_ERR(TAG, "MessageQueue_Wait failed!"); error = ERROR_INTERNAL_ERROR; break; } if (!MessageQueue_Peek(serial->MainIrpQueue, &message, TRUE)) { WLog_ERR(TAG, "MessageQueue_Peek failed!"); error = ERROR_INTERNAL_ERROR; break; } if (message.id == WMQ_QUIT) { terminate_pending_irp_threads(serial); break; } irp = (IRP*) message.wParam; if (irp) create_irp_thread(serial, irp); } if (error && serial->rdpcontext) setChannelError(serial->rdpcontext, error, "serial_thread_func reported an error"); ExitThread((DWORD) error); return NULL; }
static void* cliprdr_virtual_channel_client_thread(void* arg) { wStream* data; wMessage message; cliprdrPlugin* cliprdr = (cliprdrPlugin*) arg; UINT error = CHANNEL_RC_OK; while (1) { if (!MessageQueue_Wait(cliprdr->queue)) { WLog_ERR(TAG, "MessageQueue_Wait failed!"); error = ERROR_INTERNAL_ERROR; break; } if (!MessageQueue_Peek(cliprdr->queue, &message, TRUE)) { WLog_ERR(TAG, "MessageQueue_Peek failed!"); error = ERROR_INTERNAL_ERROR; break; } if (message.id == WMQ_QUIT) break; if (message.id == 0) { data = (wStream*) message.wParam; if ((error = cliprdr_order_recv(cliprdr, data))) { WLog_ERR(TAG, "cliprdr_order_recv failed with error %lu!", error); break; } } } if (error && cliprdr->context->rdpcontext) setChannelError(cliprdr->context->rdpcontext, error, "cliprdr_virtual_channel_client_thread reported an error"); ExitThread((DWORD)error); return NULL; }
static void* svc_plugin_thread_func(void* arg) { wStream* data; wMessage* event; wMessage message; rdpSvcPlugin* plugin = (rdpSvcPlugin*) arg; DEBUG_SVC("in"); assert(NULL != plugin); IFCALL(plugin->connect_callback, plugin); while (1) { if (!MessageQueue_Wait(plugin->MsgPipe->In)) break; if (MessageQueue_Peek(plugin->MsgPipe->In, &message, TRUE)) { if (message.id == WMQ_QUIT) break; if (message.id == 0) { data = (wStream*) message.wParam; IFCALL(plugin->receive_callback, plugin, data); } else if (message.id == 1) { event = (wMessage*) message.wParam; IFCALL(plugin->event_callback, plugin, event); } } } DEBUG_SVC("out"); ExitThread(0); return 0; }
static void* message_queue_consumer_thread(void* arg) { wMessage message; wMessageQueue* queue; queue = (wMessageQueue*) arg; while (MessageQueue_Wait(queue)) { if (MessageQueue_Peek(queue, &message, TRUE)) { if (message.id == WMQ_QUIT) break; printf("Message.Type: %d\n", message.id); } } return NULL; }
static void* parallel_thread_func(void* arg) { IRP* irp; wMessage message; PARALLEL_DEVICE* parallel = (PARALLEL_DEVICE*) arg; while (1) { if (!MessageQueue_Wait(parallel->queue)) break; if (!MessageQueue_Peek(parallel->queue, &message, TRUE)) break; if (message.id == WMQ_QUIT) break; irp = (IRP*) message.wParam; parallel_process_irp(parallel, irp); } return NULL; }
static DWORD WINAPI drdynvc_virtual_channel_client_thread(LPVOID arg) { wStream* data; wMessage message; UINT error = CHANNEL_RC_OK; drdynvcPlugin* drdynvc = (drdynvcPlugin*) arg; if (!drdynvc) { ExitThread((DWORD) CHANNEL_RC_BAD_CHANNEL_HANDLE); return CHANNEL_RC_BAD_CHANNEL_HANDLE; } while (1) { if (!MessageQueue_Wait(drdynvc->queue)) { WLog_Print(drdynvc->log, WLOG_ERROR, "MessageQueue_Wait failed!"); error = ERROR_INTERNAL_ERROR; break; } if (!MessageQueue_Peek(drdynvc->queue, &message, TRUE)) { WLog_Print(drdynvc->log, WLOG_ERROR, "MessageQueue_Peek failed!"); error = ERROR_INTERNAL_ERROR; break; } if (message.id == WMQ_QUIT) break; if (message.id == 0) { data = (wStream*) message.wParam; if ((error = drdynvc_order_recv(drdynvc, data))) { Stream_Free(data, TRUE); WLog_Print(drdynvc->log, WLOG_ERROR, "drdynvc_order_recv failed with error %"PRIu32"!", error); break; } Stream_Free(data, TRUE); } } { /* Disconnect remaining dynamic channels that the server did not. * This is required to properly shut down channels by calling the appropriate * event handlers. */ DVCMAN* drdynvcMgr = (DVCMAN*)drdynvc->channel_mgr; while (ArrayList_Count(drdynvcMgr->channels) > 0) { IWTSVirtualChannel* channel = (IWTSVirtualChannel*) ArrayList_GetItem(drdynvcMgr->channels, 0); const UINT32 ChannelId = drdynvc->channel_mgr->GetChannelId(channel); dvcman_close_channel(drdynvc->channel_mgr, ChannelId); } } if (error && drdynvc->rdpcontext) setChannelError(drdynvc->rdpcontext, error, "drdynvc_virtual_channel_client_thread reported an error"); ExitThread((DWORD) error); return error; }