// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import "remoting/ios/bridge/host_proxy.h" #import "remoting/ios/data_store.h" #import "remoting/ios/host_preferences.h" #import "remoting/ios/bridge/client_instance.h" #import "remoting/ios/bridge/client_proxy.h" @implementation HostProxy // Override default constructor and initialize internals - (id)init { self = [super init]; if (self) { _isConnected = false; } return self; } // Override default destructor - (void)dealloc { if (_isConnected) { [self disconnectFromHost]; } [super dealloc]; } - (BOOL)isConnected { return _isConnected; } - (void)connectToHost:(NSString*)username authToken:(NSString*)token jabberId:(NSString*)jid hostId:(NSString*)hostId publicKey:(NSString*)hostPublicKey delegate:(id)delegate { // Implicitly, if currently connected, discard the connection and begin a new // connection. [self disconnectFromHost]; NSString* pairId = @""; NSString* pairSecret = @""; const HostPreferences* hostPrefs = [[DataStore sharedStore] getHostForId:hostId]; // Use the pairing id and secret when known if (hostPrefs && hostPrefs.pairId && hostPrefs.pairSecret) { pairId = [hostPrefs.pairId copy]; pairSecret = [hostPrefs.pairSecret copy]; } _hostToClientChannel.reset(new remoting::ClientProxy( [ClientProxyDelegateWrapper wrapDelegate:delegate])); DCHECK(!_clientToHostChannel); _clientToHostChannel = new remoting::ClientInstance(_hostToClientChannel->AsWeakPtr(), [username UTF8String], [token UTF8String], [jid UTF8String], [hostId UTF8String], [hostPublicKey UTF8String], [pairId UTF8String], [pairSecret UTF8String]); _clientToHostChannel->Start(); _isConnected = YES; } - (void)authenticationResponse:(NSString*)pin createPair:(BOOL)createPair { if (_isConnected) { _clientToHostChannel->ProvideSecret([pin UTF8String], createPair); } } - (void)disconnectFromHost { if (_isConnected) { VLOG(1) << "Disconnecting from Host"; // |_clientToHostChannel| must be closed before releasing // |_hostToClientChannel| // |_clientToHostChannel| owns several objects that have references to // itself. These objects need to be cleaned up before we can release // |_clientToHostChannel|. _clientToHostChannel->Cleanup(); // All other references to |_clientToHostChannel| should now be free. When // the next statement is executed the destructor is called automatically. _clientToHostChannel = NULL; _hostToClientChannel.reset(); _isConnected = NO; } } - (void)mouseAction:(const webrtc::DesktopVector&)position wheelDelta:(const webrtc::DesktopVector&)wheelDelta whichButton:(NSInteger)buttonPressed buttonDown:(BOOL)buttonIsDown { if (_isConnected) { _clientToHostChannel->PerformMouseAction( position, wheelDelta, buttonPressed, buttonIsDown); } } - (void)keyboardAction:(NSInteger)keyCode keyDown:(BOOL)keyIsDown { if (_isConnected) { _clientToHostChannel->PerformKeyboardAction(keyCode, keyIsDown); } } @end