Пример #1
0
RD_EVENT *
freerdp_chanman_pop_event(rdpChanMan * chan_man)
{
	RD_EVENT * event;

	if (chan_man->event == NULL)
		return NULL;
	event = chan_man->event;
	chan_man->event = NULL;
	SEMAPHORE_POST(chan_man->sem_event); /* release chan_man->event */
	return event;
}
Пример #2
0
/* can be called from any thread */
static uint32 VCHAN_CC
MyVirtualChannelWrite(uint32 openHandle, void * pData, uint32 dataLength,
	void * pUserData)
{
	rdpChanMan * chan_man;
	struct chan_data * lchan;
	int index;

	chan_man = freerdp_chanman_find_by_open_handle(openHandle, &index);
	if ((chan_man == NULL) || (index < 0) || (index >= CHANNEL_MAX_COUNT))
	{
		DEBUG_CHANMAN("MyVirtualChannelWrite: error bad chanhan");
		return CHANNEL_RC_BAD_CHANNEL_HANDLE;
	}
	if (!chan_man->is_connected)
	{
		DEBUG_CHANMAN("MyVirtualChannelWrite: error not connected");
		return CHANNEL_RC_NOT_CONNECTED;
	}
	if (pData == 0)
	{
		DEBUG_CHANMAN("MyVirtualChannelWrite: error bad pData");
		return CHANNEL_RC_NULL_DATA;
	}
	if (dataLength == 0)
	{
		DEBUG_CHANMAN("MyVirtualChannelWrite: error bad dataLength");
		return CHANNEL_RC_ZERO_LENGTH;
	}
	lchan = chan_man->chans + index;
	if (lchan->flags != 2)
	{
		DEBUG_CHANMAN("MyVirtualChannelWrite: error not open");
		return CHANNEL_RC_NOT_OPEN;
	}
	SEMAPHORE_WAIT(chan_man->sem); /* lock chan_man->sync* vars */
	if (!chan_man->is_connected)
	{
		SEMAPHORE_POST(chan_man->sem);
		DEBUG_CHANMAN("MyVirtualChannelWrite: error not connected");
		return CHANNEL_RC_NOT_CONNECTED;
	}
	chan_man->sync_data = pData;
	chan_man->sync_data_length = dataLength;
	chan_man->sync_user_data = pUserData;
	chan_man->sync_index = index;
	/* set the event */
	freerdp_chanman_set_ev(chan_man);
	return CHANNEL_RC_OK;
}
Пример #3
0
static uint32 VCHAN_CC
MyVirtualChannelEventPush(uint32 openHandle,
	RD_EVENT * event)
{
	rdpChanMan * chan_man;
	struct chan_data * lchan;
	int index;

	chan_man = freerdp_chanman_find_by_open_handle(openHandle, &index);
	if ((chan_man == NULL) || (index < 0) || (index >= CHANNEL_MAX_COUNT))
	{
		DEBUG_CHANMAN("MyVirtualChannelEventPush: error bad chanhan");
		return CHANNEL_RC_BAD_CHANNEL_HANDLE;
	}
	if (!chan_man->is_connected)
	{
		DEBUG_CHANMAN("MyVirtualChannelEventPush: error not connected");
		return CHANNEL_RC_NOT_CONNECTED;
	}
	if (event == NULL)
	{
		DEBUG_CHANMAN("MyVirtualChannelEventPush: error bad event");
		return CHANNEL_RC_NULL_DATA;
	}
	lchan = chan_man->chans + index;
	if (lchan->flags != 2)
	{
		DEBUG_CHANMAN("MyVirtualChannelEventPush: error not open");
		return CHANNEL_RC_NOT_OPEN;
	}
	SEMAPHORE_WAIT(chan_man->sem_event); /* lock chan_man->event */
	if (!chan_man->is_connected)
	{
		SEMAPHORE_POST(chan_man->sem_event);
		DEBUG_CHANMAN("MyVirtualChannelEventPush: error not connected");
		return CHANNEL_RC_NOT_CONNECTED;
	}
	chan_man->event = event;
	/* set the event */
	freerdp_chanman_set_ev(chan_man);
	return CHANNEL_RC_OK;
}
Пример #4
0
/* called only from main thread */
static void
freerdp_chanman_process_sync(rdpChanMan * chan_man, rdpInst * inst)
{
	void * ldata;
	uint32 ldata_len;
	void * luser_data;
	int lindex;
	struct chan_data * lchan_data;
	struct rdp_chan * lrdp_chan;

	if (chan_man->sync_data == NULL)
		return;

	ldata = chan_man->sync_data;
	ldata_len = chan_man->sync_data_length;
	luser_data = chan_man->sync_user_data;
	lindex = chan_man->sync_index;
	chan_man->sync_data = NULL;
	chan_man->sync_data_length = 0;
	chan_man->sync_user_data = NULL;
	chan_man->sync_index = 0;
	SEMAPHORE_POST(chan_man->sem); /* release chan_man->sync* vars */
	lchan_data = chan_man->chans + lindex;
	lrdp_chan = freerdp_chanman_find_rdp_chan_by_name(chan_man, inst->settings,
		lchan_data->name, &lindex);
	if (lrdp_chan != 0)
	{
		inst->rdp_channel_data(inst, lrdp_chan->chan_id, ldata, ldata_len);
	}
	if (lchan_data->open_event_proc != 0)
	{
		lchan_data->open_event_proc(lchan_data->open_handle,
			CHANNEL_EVENT_WRITE_COMPLETE,
			luser_data, sizeof(void *), sizeof(void *), 0);
	}
}
Пример #5
0
void msocket_server_cleanup_connection(msocket_server_t *self, void *arg){
   MUTEX_LOCK(self->mutex);
   adt_ary_push(&self->cleanupItems,arg);
   MUTEX_UNLOCK(self->mutex);
   SEMAPHORE_POST(self->sem);
}