2013-02-14 17:59:12 +04:00
|
|
|
/*
|
|
|
|
RDP Session object
|
|
|
|
|
2013-12-04 14:37:57 +04:00
|
|
|
Copyright 2013 Thincast Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson
|
2013-02-14 17:59:12 +04:00
|
|
|
|
|
|
|
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
|
|
If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#import "ios_freerdp.h"
|
|
|
|
#import "ios_freerdp_ui.h"
|
|
|
|
#import "ios_freerdp_events.h"
|
|
|
|
|
|
|
|
#import "RDPSession.h"
|
|
|
|
#import "TSXTypes.h"
|
|
|
|
#import "Bookmark.h"
|
|
|
|
#import "ConnectionParams.h"
|
|
|
|
|
|
|
|
NSString* TSXSessionDidDisconnectNotification = @"TSXSessionDidDisconnect";
|
|
|
|
NSString* TSXSessionDidFailToConnectNotification = @"TSXSessionDidFailToConnect";
|
|
|
|
|
|
|
|
@interface RDPSession (Private)
|
|
|
|
- (void)runSession;
|
|
|
|
- (void)runSessionFinished:(NSNumber*)result;
|
|
|
|
- (mfInfo*)mfi;
|
|
|
|
|
|
|
|
// The connection thread calls these on the main thread.
|
|
|
|
- (void)sessionWillConnect;
|
|
|
|
- (void)sessionDidConnect;
|
|
|
|
- (void)sessionDidDisconnect;
|
|
|
|
- (void)sessionDidFailToConnect:(int)reason;
|
|
|
|
- (void)sessionBitmapContextWillChange;
|
|
|
|
- (void)sessionBitmapContextDidChange;
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation RDPSession
|
|
|
|
|
|
|
|
@synthesize delegate=_delegate, params=_params, toolbarVisible = _toolbar_visible, uiRequestCompleted = _ui_request_completed, bookmark = _bookmark;
|
|
|
|
|
|
|
|
+ (void)initialize
|
|
|
|
{
|
|
|
|
ios_init_freerdp();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Designated initializer.
|
|
|
|
- (id)initWithBookmark:(ComputerBookmark *)bookmark
|
|
|
|
{
|
|
|
|
if (!(self = [super init]))
|
|
|
|
return nil;
|
|
|
|
|
|
|
|
if (!bookmark)
|
|
|
|
[NSException raise:NSInvalidArgumentException format:@"%s: params may not be nil.", __func__];
|
|
|
|
|
|
|
|
_bookmark = [bookmark retain];
|
|
|
|
_params = [[bookmark params] copy];
|
|
|
|
_name = [[bookmark label] retain];
|
|
|
|
_delegate = nil;
|
|
|
|
_toolbar_visible = YES;
|
|
|
|
_freerdp = ios_freerdp_new();
|
|
|
|
rdpSettings* settings = _freerdp->settings;
|
|
|
|
_ui_request_completed = [[NSCondition alloc] init];
|
|
|
|
|
|
|
|
BOOL connected_via_3g = ![bookmark conntectedViaWLAN];
|
|
|
|
|
|
|
|
// Screen Size is set on connect (we need a valid delegate in case the user choose an automatic screen size)
|
|
|
|
|
|
|
|
// Other simple numeric settings
|
|
|
|
if ([_params hasValueForKey:@"colors"])
|
|
|
|
settings->ColorDepth = [_params intForKey:@"colors" with3GEnabled:connected_via_3g];
|
|
|
|
|
|
|
|
if ([_params hasValueForKey:@"port"])
|
|
|
|
settings->ServerPort = [_params intForKey:@"port"];
|
|
|
|
|
|
|
|
if ([_params boolForKey:@"console"])
|
|
|
|
settings->ConsoleSession = 1;
|
|
|
|
|
|
|
|
// connection info
|
2015-06-09 16:22:50 +03:00
|
|
|
if (!(settings->ServerHostname = strdup([_params UTF8StringForKey:@"hostname"])))
|
|
|
|
goto out_free;
|
2013-02-14 17:59:12 +04:00
|
|
|
|
|
|
|
// String settings
|
|
|
|
if ([[_params StringForKey:@"username"] length])
|
2015-06-09 16:22:50 +03:00
|
|
|
{
|
2013-02-14 17:59:12 +04:00
|
|
|
settings->Username = strdup([_params UTF8StringForKey:@"username"]);
|
2015-06-09 16:22:50 +03:00
|
|
|
if (!settings->Username)
|
|
|
|
goto out_free;
|
|
|
|
}
|
|
|
|
|
2013-02-14 17:59:12 +04:00
|
|
|
if ([[_params StringForKey:@"password"] length])
|
2015-06-09 16:22:50 +03:00
|
|
|
{
|
2013-02-14 17:59:12 +04:00
|
|
|
settings->Password = strdup([_params UTF8StringForKey:@"password"]);
|
2015-06-09 16:22:50 +03:00
|
|
|
if (!settings->Password)
|
|
|
|
goto out_free;
|
|
|
|
}
|
|
|
|
|
2013-02-14 17:59:12 +04:00
|
|
|
if ([[_params StringForKey:@"domain"] length])
|
2015-06-09 16:22:50 +03:00
|
|
|
{
|
2013-02-14 17:59:12 +04:00
|
|
|
settings->Domain = strdup([_params UTF8StringForKey:@"domain"]);
|
2015-06-09 16:22:50 +03:00
|
|
|
if (!settings->Domain)
|
|
|
|
goto out_free;
|
|
|
|
}
|
|
|
|
|
2013-02-14 17:59:12 +04:00
|
|
|
settings->ShellWorkingDirectory = strdup([_params UTF8StringForKey:@"working_directory"]);
|
|
|
|
settings->AlternateShell = strdup([_params UTF8StringForKey:@"remote_program"]);
|
|
|
|
|
2015-06-09 16:22:50 +03:00
|
|
|
if (!settings->ShellWorkingDirectory || !settings->AlternateShell)
|
|
|
|
goto out_free;
|
|
|
|
|
|
|
|
// RemoteFX
|
2013-02-14 17:59:12 +04:00
|
|
|
if ([_params boolForKey:@"perf_remotefx" with3GEnabled:connected_via_3g])
|
|
|
|
{
|
|
|
|
settings->RemoteFxCodec = TRUE;
|
|
|
|
settings->FastPathOutput = TRUE;
|
|
|
|
settings->ColorDepth = 32;
|
|
|
|
settings->LargePointerFlag = TRUE;
|
2015-06-09 16:22:50 +03:00
|
|
|
settings->FrameMarkerCommandEnabled = TRUE;
|
|
|
|
settings->FrameAcknowledge = 10;
|
2013-02-14 17:59:12 +04:00
|
|
|
}
|
2013-05-22 12:48:43 +04:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// enable NSCodec if remotefx is not used
|
|
|
|
settings->NSCodec = TRUE;
|
|
|
|
}
|
|
|
|
|
2013-04-05 14:36:23 +04:00
|
|
|
settings->BitmapCacheV3Enabled = TRUE;
|
2013-03-05 16:25:50 +04:00
|
|
|
|
2013-02-14 17:59:12 +04:00
|
|
|
// Performance flags
|
|
|
|
settings->DisableWallpaper = ![_params boolForKey:@"perf_show_desktop" with3GEnabled:connected_via_3g];
|
|
|
|
settings->DisableFullWindowDrag = ![_params boolForKey:@"perf_window_dragging" with3GEnabled:connected_via_3g];
|
|
|
|
settings->DisableMenuAnims = ![_params boolForKey:@"perf_menu_animation" with3GEnabled:connected_via_3g];
|
|
|
|
settings->DisableThemes = ![_params boolForKey:@"perf_windows_themes" with3GEnabled:connected_via_3g];
|
|
|
|
settings->AllowFontSmoothing = [_params boolForKey:@"perf_font_smoothing" with3GEnabled:connected_via_3g];
|
|
|
|
settings->AllowDesktopComposition = [_params boolForKey:@"perf_desktop_composition" with3GEnabled:connected_via_3g];
|
|
|
|
|
|
|
|
settings->PerformanceFlags = PERF_FLAG_NONE;
|
|
|
|
if (settings->DisableWallpaper)
|
|
|
|
settings->PerformanceFlags |= PERF_DISABLE_WALLPAPER;
|
|
|
|
if (settings->DisableFullWindowDrag)
|
|
|
|
settings->PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
|
|
|
|
if (settings->DisableMenuAnims)
|
|
|
|
settings->PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
|
|
|
|
if (settings->DisableThemes)
|
|
|
|
settings->PerformanceFlags |= PERF_DISABLE_THEMING;
|
|
|
|
if (settings->AllowFontSmoothing)
|
|
|
|
settings->PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
|
|
|
|
if (settings->AllowDesktopComposition)
|
|
|
|
settings->PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
|
|
|
|
|
|
|
|
if ([_params hasValueForKey:@"width"])
|
|
|
|
settings->DesktopWidth = [_params intForKey:@"width"];
|
|
|
|
if ([_params hasValueForKey:@"height"])
|
|
|
|
settings->DesktopHeight = [_params intForKey:@"height"];
|
|
|
|
|
|
|
|
// security
|
|
|
|
switch ([_params intForKey:@"security"])
|
|
|
|
{
|
|
|
|
case TSXProtocolSecurityNLA:
|
|
|
|
settings->RdpSecurity = FALSE;
|
|
|
|
settings->TlsSecurity = FALSE;
|
|
|
|
settings->NlaSecurity = TRUE;
|
|
|
|
settings->ExtSecurity = FALSE;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TSXProtocolSecurityTLS:
|
|
|
|
settings->RdpSecurity = FALSE;
|
|
|
|
settings->TlsSecurity = TRUE;
|
|
|
|
settings->NlaSecurity = FALSE;
|
|
|
|
settings->ExtSecurity = FALSE;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TSXProtocolSecurityRDP:
|
|
|
|
settings->RdpSecurity = TRUE;
|
|
|
|
settings->TlsSecurity = FALSE;
|
|
|
|
settings->NlaSecurity = FALSE;
|
|
|
|
settings->ExtSecurity = FALSE;
|
Standard RDP Security Layer Levels/Method Overhaul
[MS-RDPBCGR] Section 5.3 describes the encryption level and method values for
standard RDP security.
Looking at the current usage of these values in the FreeRDP code gives me
reason to believe that there is a certain lack of understanding of how these
values should be handled.
The encryption level is only configured on the server side in the "Encryption
Level" setting found in the Remote Desktop Session Host Configuration RDP-Tcp
properties dialog and this value is never transferred from the client to the
server over the wire.
The possible options are "None", "Low", "Client Compatible", "High" and
"FIPS Compliant". The client receices this value in the Server Security Data
block (TS_UD_SC_SEC1), probably only for informational purposes and maybe to
give the client the possibility to verify if the server's decision for the
encryption method confirms to the server's encryption level.
The possible encryption methods are "NONE", "40BIT", "56BIT", "128BIT" and
"FIPS" and the RDP client advertises the ones it supports to the server in the
Client Security Data block (TS_UD_CS_SEC).
The server's configured encryption level value restricts the possible final
encryption method.
Something that I was not able to find in the documentation is the priority
level of the individual encryption methods based on which the server makes its
final method decision if there are several options.
My analysis with Windows Servers reveiled that the order is 128, 56, 40, FIPS.
The server only chooses FIPS if the level is "FIPS Comliant" or if it is the
only method advertised by the client.
Bottom line:
* FreeRDP's client side does not need to set settings->EncryptionLevel
(which was done quite frequently).
* FreeRDP's server side does not have to set the supported encryption methods
list in settings->EncryptionMethods
Changes in this commit:
Removed unnecessary/confusing changes of EncryptionLevel/Methods settings
Refactor settings->DisableEncryption
* This value actually means "Advanced RDP Encryption (NLA/TLS) is NOT used"
* The old name caused lots of confusion among developers
* Renamed it to "UseRdpSecurityLayer" (the compare logic stays untouched)
Any client's setting of settings->EncryptionMethods were annihilated
* All clients "want" to set all supported methods
* Some clients forgot 56bit because 56bit was not supported at the time the
code was written
* settings->EncryptionMethods was overwritten anyways in nego_connect()
* Removed all client side settings of settings->EncryptionMethods
The default is "None" (0)
* Changed nego_connect() to advertise all supported methods if
settings->EncryptionMethods is 0 (None)
* Added a commandline option /encryption-methods:comma separated list of the
values "40", "56", "128", "FIPS". E.g. /encryption-methods:56,128
* Print warning if server chooses non-advertised method
Verify received level and method in client's gcc_read_server_security_data
* Only accept valid/known encryption methods
* Verify encryption level/method combinations according to MS-RDPBCGR 5.3.2
Server implementations can now set settings->EncryptionLevel
* The default for settings->EncryptionLevel is 0 (None)
* nego_send_negotiation_response() changes it to ClientCompatible in that case
* default to ClientCompatible if the server implementation set an invalid level
Fix server's gcc_write_server_security_data
* Verify server encryption level value set by server implementations
* Choose rdp encryption method based on level and supported client methods
* Moved FIPS to the lowest priority (only used if other methods are possible)
Updated sample server
* Support RDP Security (RdpKeyFile was not set)
* Added commented sample code for setting the security level
2014-12-12 04:17:12 +03:00
|
|
|
settings->UseRdpSecurityLayer = TRUE;
|
2013-02-14 17:59:12 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2013-05-08 16:50:29 +04:00
|
|
|
// ts gateway settings
|
|
|
|
if ([_params boolForKey:@"enable_tsg_settings"])
|
|
|
|
{
|
|
|
|
settings->GatewayHostname = strdup([_params UTF8StringForKey:@"tsg_hostname"]);
|
|
|
|
settings->GatewayPort = [_params intForKey:@"tsg_port"];
|
|
|
|
settings->GatewayUsername = strdup([_params UTF8StringForKey:@"tsg_username"]);
|
|
|
|
settings->GatewayPassword = strdup([_params UTF8StringForKey:@"tsg_password"]);
|
|
|
|
settings->GatewayDomain = strdup([_params UTF8StringForKey:@"tsg_domain"]);
|
2013-07-03 23:07:12 +04:00
|
|
|
settings->GatewayUsageMethod = TSC_PROXY_MODE_DIRECT;
|
|
|
|
settings->GatewayEnabled = TRUE;
|
2013-05-08 16:50:29 +04:00
|
|
|
settings->GatewayUseSameCredentials = FALSE;
|
2015-06-09 16:22:50 +03:00
|
|
|
|
|
|
|
if (!settings->GatewayHostname || !settings->GatewayUsername || !settings->GatewayPassword
|
|
|
|
|| !settings->GatewayDomain)
|
|
|
|
{
|
|
|
|
goto out_free;
|
|
|
|
}
|
2013-05-08 16:50:29 +04:00
|
|
|
}
|
|
|
|
|
2013-02-14 17:59:12 +04:00
|
|
|
// Remote keyboard layout
|
|
|
|
settings->KeyboardLayout = 0x409;
|
|
|
|
|
|
|
|
// Audio settings
|
|
|
|
settings->AudioPlayback = FALSE;
|
|
|
|
settings->AudioCapture = FALSE;
|
|
|
|
|
|
|
|
[self mfi]->session = self;
|
|
|
|
return self;
|
2015-06-09 16:22:50 +03:00
|
|
|
|
|
|
|
out_free:
|
|
|
|
[self release];
|
|
|
|
return nil;
|
2013-02-14 17:59:12 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)dealloc
|
|
|
|
{
|
|
|
|
[self setDelegate:nil];
|
|
|
|
[_bookmark release];
|
|
|
|
[_name release];
|
|
|
|
[_params release];
|
|
|
|
[_ui_request_completed release];
|
|
|
|
|
|
|
|
ios_freerdp_free(_freerdp);
|
|
|
|
|
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (CGContextRef)bitmapContext
|
|
|
|
{
|
2013-04-18 12:51:39 +04:00
|
|
|
return [self mfi]->bitmap_context;
|
2013-02-14 17:59:12 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Connecting and disconnecting
|
|
|
|
|
|
|
|
- (void)connect
|
|
|
|
{
|
|
|
|
// Set Screen Size to automatic if widht or height are still 0
|
|
|
|
rdpSettings* settings = _freerdp->settings;
|
|
|
|
if (settings->DesktopWidth == 0 || settings->DesktopHeight == 0)
|
|
|
|
{
|
|
|
|
CGSize size = CGSizeZero;
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(sizeForFitScreenForSession:)])
|
|
|
|
size = [[self delegate] sizeForFitScreenForSession:self];
|
|
|
|
|
|
|
|
if (!CGSizeEqualToSize(CGSizeZero, size))
|
|
|
|
{
|
|
|
|
[_params setInt:size.width forKey:@"width"];
|
|
|
|
[_params setInt:size.height forKey:@"height"];
|
|
|
|
settings->DesktopWidth = size.width;
|
|
|
|
settings->DesktopHeight = size.height;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: This is a hack to ensure connections to RDVH with 16bpp don't have an odd screen resolution width
|
|
|
|
// Otherwise this could result in screen corruption ..
|
|
|
|
if (settings->ColorDepth <= 16)
|
|
|
|
settings->DesktopWidth &= (~1);
|
|
|
|
|
|
|
|
[self performSelectorInBackground:@selector(runSession) withObject:nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)disconnect
|
|
|
|
{
|
|
|
|
mfInfo* mfi = [self mfi];
|
|
|
|
|
|
|
|
ios_events_send(mfi, [NSDictionary dictionaryWithObject:@"disconnect" forKey:@"type"]);
|
|
|
|
|
|
|
|
if (mfi->connection_state == TSXConnectionConnecting)
|
|
|
|
{
|
|
|
|
mfi->unwanted = YES;
|
|
|
|
[self sessionDidDisconnect];
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (TSXConnectionState)connectionState
|
|
|
|
{
|
|
|
|
return [self mfi]->connection_state;
|
|
|
|
}
|
|
|
|
|
|
|
|
// suspends the session
|
|
|
|
-(void)suspend
|
|
|
|
{
|
|
|
|
if(!_suspended)
|
|
|
|
{
|
|
|
|
_suspended = YES;
|
|
|
|
// instance->update->SuppressOutput(instance->context, 0, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// resumes a previously suspended session
|
|
|
|
-(void)resume
|
|
|
|
{
|
|
|
|
if(_suspended)
|
|
|
|
{
|
|
|
|
/* RECTANGLE_16 rec;
|
|
|
|
rec.left = 0;
|
|
|
|
rec.top = 0;
|
|
|
|
rec.right = instance->settings->width;
|
|
|
|
rec.bottom = instance->settings->height;
|
|
|
|
*/
|
|
|
|
_suspended = NO;
|
|
|
|
// instance->update->SuppressOutput(instance->context, 1, &rec);
|
|
|
|
// [delegate sessionScreenSettingsChanged:self];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// returns YES if the session is started
|
|
|
|
-(BOOL)isSuspended
|
|
|
|
{
|
|
|
|
return _suspended;
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Input events
|
|
|
|
|
|
|
|
- (void)sendInputEvent:(NSDictionary*)eventDescriptor
|
|
|
|
{
|
|
|
|
if ([self mfi]->connection_state == TSXConnectionConnected)
|
|
|
|
ios_events_send([self mfi], eventDescriptor);
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Server events (main thread)
|
|
|
|
|
|
|
|
- (void)setNeedsDisplayInRectAsValue:(NSValue*)rect_value
|
|
|
|
{
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(session:needsRedrawInRect:)])
|
|
|
|
[[self delegate] session:self needsRedrawInRect:[rect_value CGRectValue]];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark interface functions
|
|
|
|
|
|
|
|
- (UIImage*)getScreenshotWithSize:(CGSize)size
|
|
|
|
{
|
|
|
|
NSAssert([self mfi]->bitmap_context != nil, @"Screenshot requested while having no valid RDP drawing context");
|
|
|
|
|
|
|
|
CGImageRef cgImage = CGBitmapContextCreateImage([self mfi]->bitmap_context);
|
|
|
|
UIGraphicsBeginImageContext(size);
|
|
|
|
|
|
|
|
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0, size.height);
|
|
|
|
CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);
|
|
|
|
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, size.width, size.height), cgImage);
|
|
|
|
|
|
|
|
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
|
|
|
|
|
|
UIGraphicsEndImageContext();
|
|
|
|
CGImageRelease(cgImage);
|
|
|
|
|
|
|
|
return viewImage;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (rdpSettings*)getSessionParams
|
|
|
|
{
|
|
|
|
return _freerdp->settings;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString*)sessionName
|
|
|
|
{
|
|
|
|
return _name;
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
@implementation RDPSession (Private)
|
|
|
|
|
|
|
|
- (mfInfo*)mfi
|
|
|
|
{
|
|
|
|
return MFI_FROM_INSTANCE(_freerdp);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Blocks until rdp session finishes.
|
|
|
|
- (void)runSession
|
|
|
|
{
|
|
|
|
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
|
|
|
|
|
|
|
|
// Run the session
|
|
|
|
[self performSelectorOnMainThread:@selector(sessionWillConnect) withObject:nil waitUntilDone:YES];
|
|
|
|
int result_code = ios_run_freerdp(_freerdp);
|
|
|
|
[self mfi]->connection_state = TSXConnectionDisconnected;
|
|
|
|
[self performSelectorOnMainThread:@selector(runSessionFinished:) withObject:[NSNumber numberWithInt:result_code] waitUntilDone:YES];
|
|
|
|
|
|
|
|
[pool release];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Main thread.
|
|
|
|
- (void)runSessionFinished:(NSNumber*)result
|
|
|
|
{
|
|
|
|
int result_code = [result intValue];
|
|
|
|
|
|
|
|
switch (result_code)
|
|
|
|
{
|
|
|
|
case MF_EXIT_CONN_CANCELED:
|
|
|
|
[self sessionDidDisconnect];
|
|
|
|
break;
|
|
|
|
case MF_EXIT_LOGON_TIMEOUT:
|
|
|
|
case MF_EXIT_CONN_FAILED:
|
|
|
|
[self sessionDidFailToConnect:result_code];
|
|
|
|
break;
|
|
|
|
case MF_EXIT_SUCCESS:
|
|
|
|
default:
|
|
|
|
[self sessionDidDisconnect];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Session management (main thread)
|
|
|
|
|
|
|
|
- (void)sessionWillConnect
|
|
|
|
{
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(sessionWillConnect:)])
|
|
|
|
[[self delegate] sessionWillConnect:self];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)sessionDidConnect
|
|
|
|
{
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(sessionDidConnect:)])
|
|
|
|
[[self delegate] sessionDidConnect:self];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)sessionDidFailToConnect:(int)reason
|
|
|
|
{
|
|
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:TSXSessionDidFailToConnectNotification object:self];
|
|
|
|
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(session:didFailToConnect:)])
|
|
|
|
[[self delegate] session:self didFailToConnect:reason];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)sessionDidDisconnect
|
|
|
|
{
|
|
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:TSXSessionDidDisconnectNotification object:self];
|
|
|
|
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(sessionDidDisconnect:)])
|
|
|
|
[[self delegate] sessionDidDisconnect:self];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)sessionBitmapContextWillChange
|
|
|
|
{
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(sessionBitmapContextWillChange:)])
|
|
|
|
[[self delegate] sessionBitmapContextWillChange:self];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)sessionBitmapContextDidChange
|
|
|
|
{
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(sessionBitmapContextDidChange:)])
|
|
|
|
[[self delegate] sessionBitmapContextDidChange:self];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)sessionRequestsAuthenticationWithParams:(NSMutableDictionary*)params
|
|
|
|
{
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(session:requestsAuthenticationWithParams:)])
|
|
|
|
[[self delegate] session:self requestsAuthenticationWithParams:params];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)sessionVerifyCertificateWithParams:(NSMutableDictionary*)params
|
|
|
|
{
|
|
|
|
if ([[self delegate] respondsToSelector:@selector(session:verifyCertificateWithParams:)])
|
|
|
|
[[self delegate] session:self verifyCertificateWithParams:params];
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|