Blame client/iOS/Models/RDPSession.m

Packit 1fb8d4
/*
Packit 1fb8d4
 RDP Session object
Packit 1fb8d4
Packit 1fb8d4
 Copyright 2013 Thincast Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson
Packit 1fb8d4
Packit 1fb8d4
 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
Packit 1fb8d4
 If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#import "ios_freerdp.h"
Packit 1fb8d4
#import "ios_freerdp_ui.h"
Packit 1fb8d4
#import "ios_freerdp_events.h"
Packit 1fb8d4
Packit 1fb8d4
#import "RDPSession.h"
Packit 1fb8d4
#import "TSXTypes.h"
Packit 1fb8d4
#import "Bookmark.h"
Packit 1fb8d4
#import "ConnectionParams.h"
Packit 1fb8d4
Packit 1fb8d4
NSString* TSXSessionDidDisconnectNotification = @"TSXSessionDidDisconnect";
Packit 1fb8d4
NSString* TSXSessionDidFailToConnectNotification =
Packit 1fb8d4
    @"TSXSessionDidFailToConnect";
Packit 1fb8d4
Packit 1fb8d4
@interface RDPSession(Private)
Packit 1fb8d4
- (void)runSession;
Packit 1fb8d4
- (void)runSessionFinished:(NSNumber*)result;
Packit 1fb8d4
- (mfInfo*)mfi;
Packit 1fb8d4
Packit 1fb8d4
// The connection thread calls these on the main thread.
Packit 1fb8d4
- (void)sessionWillConnect;
Packit 1fb8d4
- (void)sessionDidConnect;
Packit 1fb8d4
- (void)sessionDidDisconnect;
Packit 1fb8d4
- (void)sessionDidFailToConnect:(int)reason;
Packit 1fb8d4
- (void)sessionBitmapContextWillChange;
Packit 1fb8d4
- (void)sessionBitmapContextDidChange;
Packit 1fb8d4
@end
Packit 1fb8d4
Packit 1fb8d4
@implementation RDPSession
Packit 1fb8d4
Packit 1fb8d4
@synthesize delegate = _delegate, params = _params,
Packit 1fb8d4
            toolbarVisible = _toolbar_visible, uiRequestCompleted = _ui_request_completed,
Packit 1fb8d4
            bookmark = _bookmark;
Packit 1fb8d4
Packit 1fb8d4
+ (void)initialize
Packit 1fb8d4
{
Packit 1fb8d4
	ios_init_freerdp();
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL addArgument(int* argc, char** *argv, const char* fmt, ...)
Packit 1fb8d4
{
Packit 1fb8d4
	va_list ap;
Packit 1fb8d4
	char* arg = NULL;
Packit 1fb8d4
	char** tmp = realloc(*argv, (*argc + 1) * sizeof(char*));
Packit 1fb8d4
Packit 1fb8d4
	if (!tmp)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	*argv = tmp;
Packit 1fb8d4
	*argc = *argc + 1;
Packit 1fb8d4
	va_start(ap, fmt);
Packit 1fb8d4
	vasprintf(&arg, fmt, ap);
Packit 1fb8d4
	va_end(ap);
Packit 1fb8d4
	(*argv)[*argc - 1] = arg;
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL addFlag(int* argc, char** *argv, const char* str, BOOL flag)
Packit 1fb8d4
{
Packit 1fb8d4
	return addArgument(argc, argv, "%s%s", flag ? "+" : "-", str);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static void freeArguments(int argc, char** argv)
Packit 1fb8d4
{
Packit 1fb8d4
	int i;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < argc; i++)
Packit 1fb8d4
		free(argv[i]);
Packit 1fb8d4
Packit 1fb8d4
	free(argv);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
// Designated initializer.
Packit 1fb8d4
- (id)initWithBookmark:(ComputerBookmark*)bookmark
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit 1fb8d4
	char** argv = NULL;
Packit 1fb8d4
	int argc = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (!(self = [super init]))
Packit 1fb8d4
		return nil;
Packit 1fb8d4
Packit 1fb8d4
	if (!bookmark)
Packit 1fb8d4
		[NSException raise:NSInvalidArgumentException format:
Packit 1fb8d4
		 @"%s: params may not be nil.", __func__];
Packit 1fb8d4
Packit 1fb8d4
	_bookmark = [bookmark retain];
Packit 1fb8d4
	_params = [[bookmark params] copy];
Packit 1fb8d4
	_name = [[bookmark label] retain];
Packit 1fb8d4
	_delegate = nil;
Packit 1fb8d4
	_toolbar_visible = YES;
Packit 1fb8d4
	_freerdp = ios_freerdp_new();
Packit 1fb8d4
	_ui_request_completed = [[NSCondition alloc] init];
Packit 1fb8d4
	BOOL connected_via_3g = ![bookmark conntectedViaWLAN];
Packit 1fb8d4
Packit 1fb8d4
	if (!addArgument(&argc, &argv, "iFreeRDP"))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addArgument(&argc, &argv, "/gdi:sw"))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	// Screen Size is set on connect (we need a valid delegate in case the user choose an automatic screen size)
Packit 1fb8d4
Packit 1fb8d4
	// Other simple numeric settings
Packit 1fb8d4
	if ([_params hasValueForKey:@"colors"])
Packit 1fb8d4
		if (!addArgument(&argc, &argv,
Packit 1fb8d4
		                 "/bpp:%d", [_params intForKey:@"colors" with3GEnabled:
Packit 1fb8d4
		                             connected_via_3g]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if ([_params hasValueForKey:@"port"])
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/port:%d", [_params intForKey:@"port"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if ([_params boolForKey:@"console"])
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/admin"))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addArgument(&argc, &argv, "/v:%s", [_params UTF8StringForKey:
Packit 1fb8d4
	                 @"hostname"]))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	// String settings
Packit 1fb8d4
	if ([[_params StringForKey:@"username"] length])
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/u:%s", [_params UTF8StringForKey:
Packit 1fb8d4
		                 @"username"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if ([[_params StringForKey:@"password"] length])
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/p:%s", [_params UTF8StringForKey:
Packit 1fb8d4
		                 @"password"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if ([[_params StringForKey:@"domain"] length])
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/d:%s", [_params UTF8StringForKey:
Packit 1fb8d4
		                 @"domain"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if ([[_params StringForKey:@"working_directory"] length])
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/shell-dir:%s", [_params UTF8StringForKey:
Packit 1fb8d4
		                 @"working_directory"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if ([[_params StringForKey:@"remote_program"] length])
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/shell:%s", [_params UTF8StringForKey:
Packit 1fb8d4
		                 @"remote_program"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	// RemoteFX
Packit 1fb8d4
	if ([_params boolForKey:@"perf_remotefx" with3GEnabled:connected_via_3g])
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/rfx"))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if ([_params boolForKey:@"perf_gfx" with3GEnabled:connected_via_3g])
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/gfx"))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if ([_params boolForKey:@"perf_h264" with3GEnabled:connected_via_3g])
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/gfx-h264"))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (![_params boolForKey:@"perf_remotefx" with3GEnabled:connected_via_3g] &&
Packit 1fb8d4
	    ![_params boolForKey:@"perf_gfx" with3GEnabled:connected_via_3g] &&
Packit 1fb8d4
	    ![_params boolForKey:@"perf_h264" with3GEnabled:connected_via_3g])
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/nsc"))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addFlag(&argc, &argv, "bitmap-cache", TRUE))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addFlag(&argc, &argv, "wallpaper", [_params boolForKey:@"perf_show_desktop"
Packit 1fb8d4
	             with3GEnabled:connected_via_3g]))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addFlag(&argc, &argv,
Packit 1fb8d4
	             "window-drag", [_params boolForKey:@"perf_window_dragging"
Packit 1fb8d4
	                             with3GEnabled:connected_via_3g]))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addFlag(&argc, &argv,
Packit 1fb8d4
	             "menu-anims", [_params boolForKey:@"perf_menu_animation"
Packit 1fb8d4
	                            with3GEnabled:connected_via_3g]))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addFlag(&argc, &argv, "themes", [_params boolForKey:@"perf_windows_themes"
Packit 1fb8d4
	                                      with3GEnabled:connected_via_3g]))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addFlag(&argc, &argv, "fonts", [_params boolForKey:@"perf_font_smoothing"
Packit 1fb8d4
	                                     with3GEnabled:connected_via_3g]))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if (!addFlag(&argc, &argv, "aero", [_params boolForKey:
Packit 1fb8d4
	                                    @"perf_desktop_composition" with3GEnabled:connected_via_3g]))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if ([_params hasValueForKey:@"width"])
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/w:%d", [_params intForKey:@"width"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	if ([_params hasValueForKey:@"height"])
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/h:%d", [_params intForKey:@"height"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	// security
Packit 1fb8d4
	switch ([_params intForKey:@"security"])
Packit 1fb8d4
	{
Packit 1fb8d4
		case TSXProtocolSecurityNLA:
Packit 1fb8d4
			if (!addArgument(&argc, &argv, "/sec:NLA"))
Packit 1fb8d4
				goto out_free;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case TSXProtocolSecurityTLS:
Packit 1fb8d4
			if (!addArgument(&argc, &argv, "/sec:TLS"))
Packit 1fb8d4
				goto out_free;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case TSXProtocolSecurityRDP:
Packit 1fb8d4
			if (!addArgument(&argc, &argv, "/sec:RDP"))
Packit 1fb8d4
				goto out_free;
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	// ts gateway settings
Packit 1fb8d4
	if ([_params boolForKey:@"enable_tsg_settings"])
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!addArgument(&argc, &argv,
Packit 1fb8d4
		                 "/g:%s", [_params UTF8StringForKey:@"tsg_hostname"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/gp:%d", [_params intForKey:@"tsg_port"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/gu:%s", [_params intForKey:@"tsg_username"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/gp:%s", [_params intForKey:@"tsg_password"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
Packit 1fb8d4
		if (!addArgument(&argc, &argv, "/gd:%s", [_params intForKey:@"tsg_domain"]))
Packit 1fb8d4
			goto out_free;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	// Remote keyboard layout
Packit 1fb8d4
	if (!addArgument(&argc, &argv, "/kbd:%d", 0x409))
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	status = freerdp_client_settings_parse_command_line(_freerdp->settings, argc,
Packit 1fb8d4
	         argv,
Packit 1fb8d4
	         FALSE);
Packit 1fb8d4
Packit 1fb8d4
	if (0 != status)
Packit 1fb8d4
		goto out_free;
Packit 1fb8d4
Packit 1fb8d4
	freeArguments(argc, argv);
Packit 1fb8d4
	[self mfi]->session = self;
Packit 1fb8d4
	return self;
Packit 1fb8d4
out_free:
Packit 1fb8d4
	freeArguments(argc, argv);
Packit 1fb8d4
	[self release];
Packit 1fb8d4
	return nil;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)dealloc
Packit 1fb8d4
{
Packit 1fb8d4
	[self setDelegate:nil];
Packit 1fb8d4
	[_bookmark release];
Packit 1fb8d4
	[_name release];
Packit 1fb8d4
	[_params release];
Packit 1fb8d4
	[_ui_request_completed release];
Packit 1fb8d4
	ios_freerdp_free(_freerdp);
Packit 1fb8d4
	[super dealloc];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (CGContextRef)bitmapContext
Packit 1fb8d4
{
Packit 1fb8d4
	return [self mfi]->bitmap_context;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#pragma mark -
Packit 1fb8d4
#pragma mark Connecting and disconnecting
Packit 1fb8d4
Packit 1fb8d4
- (void)connect
Packit 1fb8d4
{
Packit 1fb8d4
	// Set Screen Size to automatic if widht or height are still 0
Packit 1fb8d4
	rdpSettings* settings = _freerdp->settings;
Packit 1fb8d4
Packit 1fb8d4
	if (settings->DesktopWidth == 0 || settings->DesktopHeight == 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		CGSize size = CGSizeZero;
Packit 1fb8d4
Packit 1fb8d4
		if ([[self delegate] respondsToSelector:@selector(sizeForFitScreenForSession:)])
Packit 1fb8d4
			size = [[self delegate] sizeForFitScreenForSession:self];
Packit 1fb8d4
Packit 1fb8d4
		if (!CGSizeEqualToSize(CGSizeZero, size))
Packit 1fb8d4
		{
Packit 1fb8d4
			[_params setInt:size.width forKey:@"width"];
Packit 1fb8d4
			[_params setInt:size.height forKey:@"height"];
Packit 1fb8d4
			settings->DesktopWidth = size.width;
Packit 1fb8d4
			settings->DesktopHeight = size.height;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	// TODO: This is a hack to ensure connections to RDVH with 16bpp don't have an odd screen resolution width
Packit 1fb8d4
	//       Otherwise this could result in screen corruption ..
Packit 1fb8d4
	if (settings->ColorDepth <= 16)
Packit 1fb8d4
		settings->DesktopWidth &= (~1);
Packit 1fb8d4
Packit 1fb8d4
	[self performSelectorInBackground:@selector(runSession) withObject:nil];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)disconnect
Packit 1fb8d4
{
Packit 1fb8d4
	mfInfo* mfi = [self mfi];
Packit 1fb8d4
	ios_events_send(mfi, [NSDictionary dictionaryWithObject:@"disconnect" forKey:
Packit 1fb8d4
	                      @"type"]);
Packit 1fb8d4
Packit 1fb8d4
	if (mfi->connection_state == TSXConnectionConnecting)
Packit 1fb8d4
	{
Packit 1fb8d4
		mfi->unwanted = YES;
Packit 1fb8d4
		[self sessionDidDisconnect];
Packit 1fb8d4
		return;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (TSXConnectionState)connectionState
Packit 1fb8d4
{
Packit 1fb8d4
	return [self mfi]->connection_state;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
// suspends the session
Packit 1fb8d4
-(void)suspend
Packit 1fb8d4
{
Packit 1fb8d4
	if (!_suspended)
Packit 1fb8d4
	{
Packit 1fb8d4
		_suspended = YES;
Packit 1fb8d4
		//        instance->update->SuppressOutput(instance->context, 0, NULL);
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
// resumes a previously suspended session
Packit 1fb8d4
-(void)resume
Packit 1fb8d4
{
Packit 1fb8d4
	if (_suspended)
Packit 1fb8d4
	{
Packit 1fb8d4
		/*        RECTANGLE_16 rec;
Packit 1fb8d4
		        rec.left = 0;
Packit 1fb8d4
		        rec.top = 0;
Packit 1fb8d4
		        rec.right = instance->settings->width;
Packit 1fb8d4
		        rec.bottom = instance->settings->height;
Packit 1fb8d4
		*/
Packit 1fb8d4
		_suspended = NO;
Packit 1fb8d4
		//        instance->update->SuppressOutput(instance->context, 1, &rec);
Packit 1fb8d4
		//        [delegate sessionScreenSettingsChanged:self];
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
// returns YES if the session is started
Packit 1fb8d4
-(BOOL)isSuspended
Packit 1fb8d4
{
Packit 1fb8d4
	return _suspended;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#pragma mark -
Packit 1fb8d4
#pragma mark Input events
Packit 1fb8d4
Packit 1fb8d4
- (void)sendInputEvent:(NSDictionary*)eventDescriptor
Packit 1fb8d4
{
Packit 1fb8d4
	if ([self mfi]->connection_state == TSXConnectionConnected)
Packit 1fb8d4
		ios_events_send([self mfi], eventDescriptor);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#pragma mark -
Packit 1fb8d4
#pragma mark Server events (main thread)
Packit 1fb8d4
Packit 1fb8d4
- (void)setNeedsDisplayInRectAsValue:(NSValue*)rect_value
Packit 1fb8d4
{
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(session:needsRedrawInRect:)])
Packit 1fb8d4
		[[self delegate] session:self needsRedrawInRect:[rect_value CGRectValue]];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
#pragma mark -
Packit 1fb8d4
#pragma mark interface functions
Packit 1fb8d4
Packit 1fb8d4
- (UIImage*)getScreenshotWithSize:(CGSize)size
Packit 1fb8d4
{
Packit 1fb8d4
	NSAssert([self mfi]->bitmap_context != nil,
Packit 1fb8d4
	         @"Screenshot requested while having no valid RDP drawing context");
Packit 1fb8d4
	CGImageRef cgImage = CGBitmapContextCreateImage([self mfi]->bitmap_context);
Packit 1fb8d4
	UIGraphicsBeginImageContext(size);
Packit 1fb8d4
	CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0, size.height);
Packit 1fb8d4
	CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);
Packit 1fb8d4
	CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, size.width,
Packit 1fb8d4
	                   size.height), cgImage);
Packit 1fb8d4
	UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
Packit 1fb8d4
	UIGraphicsEndImageContext();
Packit 1fb8d4
	CGImageRelease(cgImage);
Packit 1fb8d4
	return viewImage;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (rdpSettings*)getSessionParams
Packit 1fb8d4
{
Packit 1fb8d4
	return _freerdp->settings;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (NSString*)sessionName
Packit 1fb8d4
{
Packit 1fb8d4
	return _name;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
@end
Packit 1fb8d4
Packit 1fb8d4
#pragma mark -
Packit 1fb8d4
@implementation RDPSession(Private)
Packit 1fb8d4
Packit 1fb8d4
- (mfInfo*)mfi
Packit 1fb8d4
{
Packit 1fb8d4
	return MFI_FROM_INSTANCE(_freerdp);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
// Blocks until rdp session finishes.
Packit 1fb8d4
- (void)runSession
Packit 1fb8d4
{
Packit 1fb8d4
	NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
Packit 1fb8d4
	// Run the session
Packit 1fb8d4
	[self performSelectorOnMainThread:@selector(sessionWillConnect) withObject:nil
Packit 1fb8d4
	 waitUntilDone:YES];
Packit 1fb8d4
	int result_code = ios_run_freerdp(_freerdp);
Packit 1fb8d4
	[self mfi]->connection_state = TSXConnectionDisconnected;
Packit 1fb8d4
	[self performSelectorOnMainThread:@selector(runSessionFinished:) withObject:
Packit 1fb8d4
	 [NSNumber numberWithInt:result_code] waitUntilDone:YES];
Packit 1fb8d4
	[pool release];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
// Main thread.
Packit 1fb8d4
- (void)runSessionFinished:(NSNumber*)result
Packit 1fb8d4
{
Packit 1fb8d4
	int result_code = [result intValue];
Packit 1fb8d4
Packit 1fb8d4
	switch (result_code)
Packit 1fb8d4
	{
Packit 1fb8d4
		case MF_EXIT_CONN_CANCELED:
Packit 1fb8d4
			[self sessionDidDisconnect];
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case MF_EXIT_LOGON_TIMEOUT:
Packit 1fb8d4
		case MF_EXIT_CONN_FAILED:
Packit 1fb8d4
			[self sessionDidFailToConnect:result_code];
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case MF_EXIT_SUCCESS:
Packit 1fb8d4
		default:
Packit 1fb8d4
			[self sessionDidDisconnect];
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#pragma mark -
Packit 1fb8d4
#pragma mark Session management (main thread)
Packit 1fb8d4
Packit 1fb8d4
- (void)sessionWillConnect
Packit 1fb8d4
{
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(sessionWillConnect:)])
Packit 1fb8d4
		[[self delegate] sessionWillConnect:self];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)sessionDidConnect
Packit 1fb8d4
{
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(sessionDidConnect:)])
Packit 1fb8d4
		[[self delegate] sessionDidConnect:self];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)sessionDidFailToConnect:(int)reason
Packit 1fb8d4
{
Packit 1fb8d4
	[[NSNotificationCenter defaultCenter] postNotificationName:
Packit 1fb8d4
	 TSXSessionDidFailToConnectNotification object:self];
Packit 1fb8d4
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(session:didFailToConnect:)])
Packit 1fb8d4
		[[self delegate] session:self didFailToConnect:reason];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)sessionDidDisconnect
Packit 1fb8d4
{
Packit 1fb8d4
	[[NSNotificationCenter defaultCenter] postNotificationName:
Packit 1fb8d4
	 TSXSessionDidDisconnectNotification object:self];
Packit 1fb8d4
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(sessionDidDisconnect:)])
Packit 1fb8d4
		[[self delegate] sessionDidDisconnect:self];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)sessionBitmapContextWillChange
Packit 1fb8d4
{
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(
Packit 1fb8d4
	         sessionBitmapContextWillChange:)])
Packit 1fb8d4
		[[self delegate] sessionBitmapContextWillChange:self];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)sessionBitmapContextDidChange
Packit 1fb8d4
{
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(sessionBitmapContextDidChange
Packit 1fb8d4
	        :)])
Packit 1fb8d4
		[[self delegate] sessionBitmapContextDidChange:self];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)sessionRequestsAuthenticationWithParams:(NSMutableDictionary*)params
Packit 1fb8d4
{
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(session:
Packit 1fb8d4
	        requestsAuthenticationWithParams:)])
Packit 1fb8d4
		[[self delegate] session:self requestsAuthenticationWithParams:params];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)sessionVerifyCertificateWithParams:(NSMutableDictionary*)params
Packit 1fb8d4
{
Packit 1fb8d4
	if ([[self delegate] respondsToSelector:@selector(session:
Packit 1fb8d4
	        verifyCertificateWithParams:)])
Packit 1fb8d4
		[[self delegate] session:self verifyCertificateWithParams:params];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
@end