Exemple #1
0
/**
 * 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;
}
Exemple #2
0
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);
}