示例#1
0
/**
 * called only from main thread
 */
static void freerdp_channels_process_sync(rdpChannels* chan_man, freerdp* instance)
{
	rdpChannel* lrdp_chan;
	struct sync_data* item;
	struct channel_data* lchan_data;

	while (chan_man->sync_data_list->head != NULL)
	{
		freerdp_mutex_lock(chan_man->sync_data_mutex);
		item = (struct sync_data*)list_dequeue(chan_man->sync_data_list);
		freerdp_mutex_unlock(chan_man->sync_data_mutex);

		lchan_data = chan_man->chans + item->index;
		lrdp_chan = freerdp_channels_find_channel_by_name(chan_man, instance->settings,
			lchan_data->name, &item->index);

		if (lrdp_chan != NULL)
			instance->SendChannelData(instance, lrdp_chan->channel_id, item->data, item->data_length);

		if (lchan_data->open_event_proc != 0)
		{
			lchan_data->open_event_proc(lchan_data->open_handle,
				CHANNEL_EVENT_WRITE_COMPLETE,
				item->user_data, sizeof(void *), sizeof(void *), 0);
		}
		xfree(item);
	}
}
示例#2
0
文件: channels.c 项目: d0rian/FreeRDP
/**
 * called only from main thread
 */
static void freerdp_channels_process_sync(rdpChannels* channels, freerdp* instance)
{
	SYNC_DATA* item;
	rdpChannel* lrdp_channel;
	struct channel_data* lchannel_data;

	while (QueryDepthSList(channels->pSyncDataList) > 0)
	{
		item = (SYNC_DATA*) InterlockedPopEntrySList(channels->pSyncDataList);

		if (!item)
			break;

		lchannel_data = channels->channels_data + item->Index;

		lrdp_channel = freerdp_channels_find_channel_by_name(channels, instance->settings,
			lchannel_data->name, &item->Index);

		if (lrdp_channel != NULL)
			instance->SendChannelData(instance, lrdp_channel->ChannelId, item->Data, item->DataLength);

		if (lchannel_data->open_event_proc != 0)
		{
			lchannel_data->open_event_proc(lchannel_data->open_handle,
				CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, sizeof(void*), sizeof(void*), 0);
		}

		_aligned_free(item);
	}
}
/**
 * called only from main thread
 */
static int freerdp_channels_process_sync(rdpChannels* channels, freerdp* instance)
{
	int rc = TRUE;
	wMessage message;
	wMessage* event;
	rdpChannel* channel;
	CHANNEL_OPEN_EVENT* item;
	CHANNEL_OPEN_DATA* pChannelOpenData;

	while (MessageQueue_Peek(channels->MsgPipe->Out, &message, TRUE))
	{
		if (message.id == WMQ_QUIT)
		{
			rc = FALSE;
			break;
		}

		if (message.id == 0)
		{
			item = (CHANNEL_OPEN_EVENT*) message.wParam;

			if (!item)
				break;

			pChannelOpenData = &channels->openDataList[item->Index];

			channel = freerdp_channels_find_channel_by_name(channels, instance->settings,
				pChannelOpenData->name, &item->Index);

			if (channel)
				instance->SendChannelData(instance, channel->ChannelId, item->Data, item->DataLength);

			if (pChannelOpenData->pChannelOpenEventProc)
			{
				pChannelOpenData->pChannelOpenEventProc(pChannelOpenData->OpenHandle,
					CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, item->DataLength, item->DataLength, 0);
			}

			free(item);
		}
		else if (message.id == 1)
		{
			event = (wMessage*) message.wParam;

			/**
			 * Ignore for now, the same event is being pushed on the In queue,
			 * and we're pushing it on the Out queue just to wake other threads
			 */
		}
	}

	return rc;
}
示例#4
0
文件: client.c 项目: kdienes/FreeRDP
/**
 * called only from main thread
 */
static int freerdp_channels_process_sync(rdpChannels* channels,
        freerdp* instance)
{
	int status = TRUE;
	wMessage message;
	rdpMcsChannel* channel;
	CHANNEL_OPEN_EVENT* item;
	CHANNEL_OPEN_DATA* pChannelOpenData;

	while (MessageQueue_Peek(channels->queue, &message, TRUE))
	{
		if (message.id == WMQ_QUIT)
		{
			status = FALSE;
			break;
		}

		if (message.id == 0)
		{
			item = (CHANNEL_OPEN_EVENT*) message.wParam;

			if (!item)
				break;

			pChannelOpenData = item->pChannelOpenData;
			channel = freerdp_channels_find_channel_by_name(instance->context->rdp, pChannelOpenData->name);

			if (channel)
				instance->SendChannelData(instance, channel->ChannelId, item->Data, item->DataLength);

			if (pChannelOpenData->pChannelOpenEventProc)
			{
				pChannelOpenData->pChannelOpenEventProc(
				    pChannelOpenData->OpenHandle, CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, item->DataLength,
				    item->DataLength, 0);
			}
			else if (pChannelOpenData->pChannelOpenEventProcEx)
			{
				pChannelOpenData->pChannelOpenEventProcEx(pChannelOpenData->lpUserParam,
				        pChannelOpenData->OpenHandle, CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, item->DataLength,
				        item->DataLength, 0);
			}

			free(item);
		}
	}

	return status;
}
示例#5
0
文件: channels.c 项目: akboom/FreeRDP
/**
 * called only from main thread
 */
static void freerdp_channels_process_sync(rdpChannels* channels, freerdp* instance)
{
	wMessage message;
	wMessage* event;
	CHANNEL_OPEN_EVENT* item;
	rdpChannel* lrdp_channel;
	struct channel_data* lchannel_data;

	while (MessageQueue_Peek(channels->MsgPipe->Out, &message, TRUE))
	{
		if (message.id == WMQ_QUIT)
			break;

		if (message.id == 0)
		{
			item = (CHANNEL_OPEN_EVENT*) message.wParam;

			if (!item)
				break;

			lchannel_data = channels->channels_data + item->Index;

			lrdp_channel = freerdp_channels_find_channel_by_name(channels, instance->settings,
				lchannel_data->name, &item->Index);

			if (lrdp_channel)
				instance->SendChannelData(instance, lrdp_channel->ChannelId, item->Data, item->DataLength);

			if (lchannel_data->open_event_proc)
			{
				lchannel_data->open_event_proc(lchannel_data->open_handle,
					CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, item->DataLength, item->DataLength, 0);
			}

			free(item);
		}
		else if (message.id == 1)
		{
			event = (wMessage*) message.wParam;

			/**
			 * Ignore for now, the same event is being pushed on the In queue,
			 * and we're pushing it on the Out queue just to wake other threads
			 */
		}
	}
}