/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_virtual_channel_event_disconnected(cliprdrPlugin* cliprdr) { UINT rc; if (MessageQueue_PostQuit(cliprdr->queue, 0) && (WaitForSingleObject(cliprdr->thread, INFINITE) == WAIT_FAILED)) { rc = GetLastError(); WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); return rc; } MessageQueue_Free(cliprdr->queue); CloseHandle(cliprdr->thread); rc = cliprdr->channelEntryPoints.pVirtualChannelClose(cliprdr->OpenHandle); if (CHANNEL_RC_OK != rc) { WLog_ERR(TAG, "pVirtualChannelClose failed with %s [%08X]", WTSErrorToString(rc), rc); return rc; } if (cliprdr->data_in) { Stream_Free(cliprdr->data_in, TRUE); cliprdr->data_in = NULL; } cliprdr_remove_open_handle_data(cliprdr->OpenHandle); return CHANNEL_RC_OK; }
static void cliprdr_virtual_channel_event_terminated(cliprdrPlugin* cliprdr) { MessagePipe_PostQuit(cliprdr->MsgPipe, 0); WaitForSingleObject(cliprdr->thread, INFINITE); MessagePipe_Free(cliprdr->MsgPipe); CloseHandle(cliprdr->thread); cliprdr->channelEntryPoints.pVirtualChannelClose(cliprdr->OpenHandle); if (cliprdr->data_in) { Stream_Free(cliprdr->data_in, TRUE); cliprdr->data_in = NULL; } cliprdr_remove_open_handle_data(cliprdr->OpenHandle); cliprdr_remove_init_handle_data(cliprdr->InitHandle); }