Blame client/iOS/Models/RDPSession.m

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