Blame client/Mac/mf_client.m

Packit Service fa4841
/**
Packit Service fa4841
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit Service fa4841
 * X11 Client Interface
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include "mfreerdp.h"
Packit Service fa4841
#include <freerdp/constants.h>
Packit Service fa4841
#include <freerdp/utils/signal.h>
Packit Service fa4841
#include <freerdp/client/cmdline.h>
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * Client Interface
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
static BOOL mfreerdp_client_global_init(void)
Packit Service fa4841
{
Packit Service fa4841
	freerdp_handle_signals();
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static void mfreerdp_client_global_uninit(void)
Packit Service fa4841
{
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static int mfreerdp_client_start(rdpContext *context)
Packit Service fa4841
{
Packit Service fa4841
	MRDPView *view;
Packit Service fa4841
	mfContext *mfc = (mfContext *)context;
Packit Service fa4841
Packit Service fa4841
	if (mfc->view == NULL)
Packit Service fa4841
	{
Packit Service fa4841
		// view not specified beforehand. Create view dynamically
Packit Service fa4841
		mfc->view =
Packit Service fa4841
		    [[MRDPView alloc] initWithFrame:NSMakeRect(0, 0, context->settings->DesktopWidth,
Packit Service fa4841
		                                               context->settings->DesktopHeight)];
Packit Service fa4841
		mfc->view_ownership = TRUE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	view = (MRDPView *)mfc->view;
Packit Service fa4841
	return [view rdpStart:context];
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static int mfreerdp_client_stop(rdpContext *context)
Packit Service fa4841
{
Packit Service fa4841
	mfContext *mfc = (mfContext *)context;
Packit Service fa4841
Packit Service fa4841
	if (mfc->thread)
Packit Service fa4841
	{
Packit Service fa4841
		SetEvent(mfc->stopEvent);
Packit Service fa4841
		WaitForSingleObject(mfc->thread, INFINITE);
Packit Service fa4841
		CloseHandle(mfc->thread);
Packit Service fa4841
		mfc->thread = NULL;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (mfc->view_ownership)
Packit Service fa4841
	{
Packit Service fa4841
		MRDPView *view = (MRDPView *)mfc->view;
Packit Service fa4841
		[view releaseResources];
Packit Service fa4841
		[view release];
Packit Service fa4841
		mfc->view = nil;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return 0;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static BOOL mfreerdp_client_new(freerdp *instance, rdpContext *context)
Packit Service fa4841
{
Packit Service fa4841
	mfContext *mfc;
Packit Service fa4841
	rdpSettings *settings;
Packit Service fa4841
	mfc = (mfContext *)instance->context;
Packit Service fa4841
	mfc->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
Packit Service fa4841
	context->instance->PreConnect = mac_pre_connect;
Packit Service fa4841
	context->instance->PostConnect = mac_post_connect;
Packit Service fa4841
	context->instance->PostDisconnect = mac_post_disconnect;
Packit Service fa4841
	context->instance->Authenticate = mac_authenticate;
Packit Service fa4841
	context->instance->GatewayAuthenticate = mac_gw_authenticate;
Packit Service fa4841
	context->instance->VerifyCertificateEx = mac_verify_certificate_ex;
Packit Service fa4841
	context->instance->VerifyChangedCertificateEx = mac_verify_changed_certificate_ex;
Packit Service fa4841
	context->instance->LogonErrorInfo = mac_logon_error_info;
Packit Service fa4841
	context->instance->settings = instance->settings;
Packit Service fa4841
	settings = context->settings;
Packit Service fa4841
	settings->AsyncUpdate = TRUE;
Packit Service fa4841
	settings->AsyncInput = TRUE;
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static void mfreerdp_client_free(freerdp *instance, rdpContext *context)
Packit Service fa4841
{
Packit Service fa4841
	mfContext *mfc;
Packit Service fa4841
Packit Service fa4841
	if (!instance || !context)
Packit Service fa4841
		return;
Packit Service fa4841
Packit Service fa4841
	mfc = (mfContext *)instance->context;
Packit Service fa4841
	CloseHandle(mfc->stopEvent);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static void mf_scale_mouse_coordinates(mfContext *mfc, UINT16 *px, UINT16 *py)
Packit Service fa4841
{
Packit Service fa4841
	UINT16 x = *px;
Packit Service fa4841
	UINT16 y = *py;
Packit Service fa4841
	UINT32 ww = mfc->client_width;
Packit Service fa4841
	UINT32 wh = mfc->client_height;
Packit Service fa4841
	UINT32 dw = mfc->context.settings->DesktopWidth;
Packit Service fa4841
	UINT32 dh = mfc->context.settings->DesktopHeight;
Packit Service fa4841
Packit Service fa4841
	if (!mfc->context.settings->SmartSizing || ((ww == dw) && (wh == dh)))
Packit Service fa4841
	{
Packit Service fa4841
		y = y + mfc->yCurrentScroll;
Packit Service fa4841
		x = x + mfc->xCurrentScroll;
Packit Service fa4841
Packit Service fa4841
		y -= (dh - wh);
Packit Service fa4841
		x -= (dw - ww);
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
		y = y * dh / wh + mfc->yCurrentScroll;
Packit Service fa4841
		x = x * dw / ww + mfc->xCurrentScroll;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	*px = x;
Packit Service fa4841
	*py = y;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
void mf_scale_mouse_event(void *context, rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
Packit Service fa4841
{
Packit Service fa4841
	mfContext *mfc = (mfContext *)context;
Packit Service fa4841
	MRDPView *view = (MRDPView *)mfc->view;
Packit Service fa4841
	// Convert to windows coordinates
Packit Service fa4841
	y = [view frame].size.height - y;
Packit Service fa4841
Packit Service fa4841
	if ((flags & (PTR_FLAGS_WHEEL | PTR_FLAGS_HWHEEL)) == 0)
Packit Service fa4841
		mf_scale_mouse_coordinates(mfc, &x, &y);
Packit Service fa4841
	freerdp_input_send_mouse_event(input, flags, x, y);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
void mf_scale_mouse_event_ex(void *context, rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
Packit Service fa4841
{
Packit Service fa4841
	mfContext *mfc = (mfContext *)context;
Packit Service fa4841
	MRDPView *view = (MRDPView *)mfc->view;
Packit Service fa4841
	// Convert to windows coordinates
Packit Service fa4841
	y = [view frame].size.height - y;
Packit Service fa4841
Packit Service fa4841
	mf_scale_mouse_coordinates(mfc, &x, &y);
Packit Service fa4841
	freerdp_input_send_extended_mouse_event(input, flags, x, y);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
void mf_press_mouse_button(void *context, rdpInput *input, int button, int x, int y, BOOL down)
Packit Service fa4841
{
Packit Service fa4841
	UINT16 flags = 0;
Packit Service fa4841
	UINT16 xflags = 0;
Packit Service fa4841
Packit Service fa4841
	if (down)
Packit Service fa4841
	{
Packit Service fa4841
		flags |= PTR_FLAGS_DOWN;
Packit Service fa4841
		xflags |= PTR_XFLAGS_DOWN;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	switch (button)
Packit Service fa4841
	{
Packit Service fa4841
		case 0:
Packit Service fa4841
			mf_scale_mouse_event(context, input, flags | PTR_FLAGS_BUTTON1, x, y);
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case 1:
Packit Service fa4841
			mf_scale_mouse_event(context, input, flags | PTR_FLAGS_BUTTON2, x, y);
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case 2:
Packit Service fa4841
			mf_scale_mouse_event(context, input, flags | PTR_FLAGS_BUTTON3, x, y);
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case 3:
Packit Service fa4841
			mf_scale_mouse_event_ex(context, input, xflags | PTR_XFLAGS_BUTTON1, x, y);
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case 4:
Packit Service fa4841
			mf_scale_mouse_event_ex(context, input, xflags | PTR_XFLAGS_BUTTON2, x, y);
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		default:
Packit Service fa4841
			break;
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS *pEntryPoints)
Packit Service fa4841
{
Packit Service fa4841
	pEntryPoints->Version = 1;
Packit Service fa4841
	pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1);
Packit Service fa4841
	pEntryPoints->GlobalInit = mfreerdp_client_global_init;
Packit Service fa4841
	pEntryPoints->GlobalUninit = mfreerdp_client_global_uninit;
Packit Service fa4841
	pEntryPoints->ContextSize = sizeof(mfContext);
Packit Service fa4841
	pEntryPoints->ClientNew = mfreerdp_client_new;
Packit Service fa4841
	pEntryPoints->ClientFree = mfreerdp_client_free;
Packit Service fa4841
	pEntryPoints->ClientStart = mfreerdp_client_start;
Packit Service fa4841
	pEntryPoints->ClientStop = mfreerdp_client_stop;
Packit Service fa4841
	return 0;
Packit Service fa4841
}