| Index: remoting/ios/bridge/client_proxy.mm
|
| diff --git a/remoting/ios/bridge/client_proxy.mm b/remoting/ios/bridge/client_proxy.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8568b9d55ec65b68306d2d24ba24ffc851ebb4d6
|
| --- /dev/null
|
| +++ b/remoting/ios/bridge/client_proxy.mm
|
| @@ -0,0 +1,150 @@
|
| +// 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.
|
| +
|
| +#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| +#error "This file requires ARC support."
|
| +#endif
|
| +
|
| +#include "remoting/ios/bridge/client_proxy.h"
|
| +
|
| +#import "remoting/ios/data_store.h"
|
| +#import "remoting/ios/host_preferences.h"
|
| +#import "remoting/ios/bridge/client_proxy_delegate_wrapper.h"
|
| +
|
| +namespace {
|
| +// The value indicating a successful connection has been established via a call
|
| +// to ReportConnectionStatus
|
| +const static int kSuccessfulConnection = 3;
|
| +
|
| +// Translate a connection status code integer to a NSString description
|
| +NSString* GetStatusMsgFromInteger(NSInteger code) {
|
| + switch (code) {
|
| + case 0: // INITIALIZING
|
| + return @"Initializing connection";
|
| + case 1: // CONNECTING
|
| + return @"Connecting";
|
| + case 2: // AUTHENTICATED
|
| + return @"Authenticated";
|
| + case 3: // CONNECTED
|
| + return @"Connected";
|
| + case 4: // FAILED
|
| + return @"Connection Failed";
|
| + case 5: // CLOSED
|
| + return @"Connection closed";
|
| + default:
|
| + return @"Unknown connection state";
|
| + }
|
| +}
|
| +
|
| +// Translate a connection error code integer to a NSString description
|
| +NSString* GetErrorMsgFromInteger(NSInteger code) {
|
| + switch (code) {
|
| + case 1: // PEER_IS_OFFLINE
|
| + return @"Requested host is offline.";
|
| + case 2: // SESSION_REJECTED
|
| + return @"Session was rejected by the host.";
|
| + case 3: // INCOMPATIBLE_PROTOCOL
|
| + return @"Incompatible Protocol.";
|
| + case 4: // AUTHENTICATION_FAILED
|
| + return @"Authentication Failed.";
|
| + case 5: // CHANNEL_CONNECTION_ERROR
|
| + return @"Channel Connection Error";
|
| + case 6: // SIGNALING_ERROR
|
| + return @"Signaling Error";
|
| + case 7: // SIGNALING_TIMEOUT
|
| + return @"Signaling Timeout";
|
| + case 8: // HOST_OVERLOAD
|
| + return @"Host Overload";
|
| + case 9: // UNKNOWN_ERROR
|
| + return @"An unknown error has occurred, preventing the session "
|
| + "from opening.";
|
| + default:
|
| + return @"An unknown error code has occurred.";
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace remoting {
|
| +
|
| +ClientProxy::ClientProxy(ClientProxyDelegateWrapper* wrapper) {
|
| + delegate_ = [wrapper delegate];
|
| +}
|
| +
|
| +void ClientProxy::ReportConnectionStatus(
|
| + protocol::ConnectionToHost::State state,
|
| + protocol::ErrorCode error) {
|
| + DCHECK(delegate_);
|
| + if (state <= kSuccessfulConnection && error == protocol::ErrorCode::OK) {
|
| + // Report Progress
|
| + [delegate_ connectionStatus:GetStatusMsgFromInteger(state)];
|
| +
|
| + if (state == kSuccessfulConnection) {
|
| + [delegate_ connected];
|
| + }
|
| + } else {
|
| + [delegate_ connectionStatus:GetStatusMsgFromInteger(state)];
|
| + if (error != protocol::ErrorCode::OK) {
|
| + [delegate_ connectionFailed:GetErrorMsgFromInteger(error)];
|
| + }
|
| + }
|
| +}
|
| +
|
| +void ClientProxy::DisplayAuthenticationPrompt(bool pairing_supported) {
|
| + DCHECK(delegate_);
|
| + [delegate_ requestHostPin:pairing_supported];
|
| +}
|
| +
|
| +void ClientProxy::CommitPairingCredentials(const std::string& hostId,
|
| + const std::string& pairId,
|
| + const std::string& pairSecret) {
|
| + DCHECK(delegate_);
|
| + NSString* nsHostId = [[NSString alloc] initWithUTF8String:hostId.c_str()];
|
| + NSString* nsPairId = [[NSString alloc] initWithUTF8String:pairId.c_str()];
|
| + NSString* nsPairSecret =
|
| + [[NSString alloc] initWithUTF8String:pairSecret.c_str()];
|
| +
|
| + const HostPreferences* hostPrefs =
|
| + [[DataStore sharedStore] getHostForId:nsHostId];
|
| + if (hostPrefs == nil) {
|
| + hostPrefs = [[DataStore sharedStore] createHost:nsHostId];
|
| + }
|
| + if (hostPrefs) {
|
| + hostPrefs.pairId = nsPairId;
|
| + hostPrefs.pairSecret = nsPairSecret;
|
| +
|
| + [[DataStore sharedStore] saveChanges];
|
| + }
|
| +}
|
| +
|
| +void ClientProxy::RedrawCanvas(const webrtc::DesktopSize& view_size,
|
| + webrtc::DesktopFrame* buffer,
|
| + const webrtc::DesktopRegion& region) {
|
| + DCHECK(delegate_);
|
| + std::vector<webrtc::DesktopRect> regions;
|
| +
|
| + for (webrtc::DesktopRegion::Iterator i(region); !i.IsAtEnd(); i.Advance()) {
|
| + const webrtc::DesktopRect& rect(i.rect());
|
| +
|
| + regions.push_back(webrtc::DesktopRect::MakeXYWH(
|
| + rect.left(), rect.top(), rect.width(), rect.height()));
|
| + }
|
| +
|
| + [delegate_ applyFrame:view_size
|
| + stride:buffer->stride()
|
| + data:buffer->data()
|
| + regions:regions];
|
| +}
|
| +
|
| +void ClientProxy::UpdateCursorShape(
|
| + const protocol::CursorShapeInfo& cursor_shape) {
|
| + DCHECK(delegate_);
|
| + [delegate_ applyCursor:webrtc::DesktopSize(cursor_shape.width(),
|
| + cursor_shape.height())
|
| + hotspot:webrtc::DesktopVector(cursor_shape.hotspot_x(),
|
| + cursor_shape.hotspot_y())
|
| + cursorData:(uint8_t*)cursor_shape.data().c_str()];
|
| +}
|
| +
|
| +} // namespace remoting
|
|
|