Blame server/shadow/shadow_encomsp.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 * Copyright 2015 Thincast Technologies GmbH
Packit 1fb8d4
 * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/log.h>
Packit 1fb8d4
#include "shadow.h"
Packit 1fb8d4
Packit 1fb8d4
#include "shadow_encomsp.h"
Packit 1fb8d4
Packit 1fb8d4
#define TAG SERVER_TAG("shadow")
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * Function description
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return 0 on success, otherwise a Win32 error code
Packit 1fb8d4
 */
Packit 1fb8d4
static UINT encomsp_change_participant_control_level(EncomspServerContext* context,
Packit 1fb8d4
		ENCOMSP_CHANGE_PARTICIPANT_CONTROL_LEVEL_PDU* pdu)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL inLobby;
Packit 1fb8d4
	BOOL mayView;
Packit 1fb8d4
	BOOL mayInteract;
Packit 1fb8d4
	rdpShadowClient* client = (rdpShadowClient*) context->custom;
Packit 1fb8d4
Packit 1fb8d4
	WLog_INFO(TAG, "ChangeParticipantControlLevel: ParticipantId: %"PRIu32" Flags: 0x%04"PRIX16"",
Packit 1fb8d4
			pdu->ParticipantId, pdu->Flags);
Packit 1fb8d4
Packit 1fb8d4
	mayView = (pdu->Flags & ENCOMSP_MAY_VIEW) ? TRUE : FALSE;
Packit 1fb8d4
	mayInteract = (pdu->Flags & ENCOMSP_MAY_INTERACT) ? TRUE : FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (mayInteract && !mayView)
Packit 1fb8d4
		mayView = TRUE; /* may interact implies may view */
Packit 1fb8d4
Packit 1fb8d4
	if (mayInteract)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!client->mayInteract)
Packit 1fb8d4
		{
Packit 1fb8d4
			/* request interact + view */
Packit 1fb8d4
			client->mayInteract = TRUE;
Packit 1fb8d4
			client->mayView = TRUE;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (mayView)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (client->mayInteract)
Packit 1fb8d4
		{
Packit 1fb8d4
			/* release interact */
Packit 1fb8d4
			client->mayInteract = FALSE;
Packit 1fb8d4
		}
Packit 1fb8d4
		else if (!client->mayView)
Packit 1fb8d4
		{
Packit 1fb8d4
			/* request view */
Packit 1fb8d4
			client->mayView = TRUE;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		if (client->mayInteract)
Packit 1fb8d4
		{
Packit 1fb8d4
			/* release interact + view */
Packit 1fb8d4
			client->mayView = FALSE;
Packit 1fb8d4
			client->mayInteract = FALSE;
Packit 1fb8d4
		}
Packit 1fb8d4
		else if (client->mayView)
Packit 1fb8d4
		{
Packit 1fb8d4
			/* release view */
Packit 1fb8d4
			client->mayView = FALSE;
Packit 1fb8d4
			client->mayInteract = FALSE;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	inLobby = client->mayView ? FALSE : TRUE;
Packit 1fb8d4
Packit 1fb8d4
	if (inLobby != client->inLobby)
Packit 1fb8d4
	{
Packit 1fb8d4
		shadow_encoder_reset(client->encoder);
Packit 1fb8d4
		client->inLobby = inLobby;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return CHANNEL_RC_OK;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int shadow_client_encomsp_init(rdpShadowClient* client)
Packit 1fb8d4
{
Packit 1fb8d4
	EncomspServerContext* encomsp;
Packit 1fb8d4
Packit 1fb8d4
	encomsp = client->encomsp = encomsp_server_context_new(client->vcm);
Packit 1fb8d4
Packit 1fb8d4
	encomsp->rdpcontext = &client->context;
Packit 1fb8d4
Packit 1fb8d4
	encomsp->custom = (void*) client;
Packit 1fb8d4
Packit 1fb8d4
	encomsp->ChangeParticipantControlLevel = encomsp_change_participant_control_level;
Packit 1fb8d4
Packit 1fb8d4
	if (client->encomsp)
Packit 1fb8d4
		client->encomsp->Start(client->encomsp);
Packit 1fb8d4
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void shadow_client_encomsp_uninit(rdpShadowClient* client)
Packit 1fb8d4
{
Packit 1fb8d4
	if (client->encomsp) {
Packit 1fb8d4
		client->encomsp->Stop(client->encomsp);
Packit 1fb8d4
		encomsp_server_context_free(client->encomsp);
Packit 1fb8d4
		client->encomsp = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
}