OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #if !defined(__has_feature) || !__has_feature(objc_arc) | |
6 #error "This file requires ARC support." | |
7 #endif | |
8 | |
9 #include "remoting/ios/bridge/client_proxy.h" | |
10 | |
11 #import "remoting/ios/data_store.h" | |
12 #import "remoting/ios/host_preferences.h" | |
13 #import "remoting/ios/bridge/client_proxy_delegate_wrapper.h" | |
14 | |
15 namespace { | |
16 // The value indicating a successful connection has been established via a call | |
17 // to ReportConnectionStatus | |
18 const static int kSuccessfulConnection = 3; | |
19 | |
20 // Translate a connection status code integer to a NSString description | |
21 NSString* GetStatusMsgFromInteger(NSInteger code) { | |
22 switch (code) { | |
23 case 0: // INITIALIZING | |
24 return @"Initializing connection"; | |
25 case 1: // CONNECTING | |
26 return @"Connecting"; | |
27 case 2: // AUTHENTICATED | |
28 return @"Authenticated"; | |
29 case 3: // CONNECTED | |
30 return @"Connected"; | |
31 case 4: // FAILED | |
32 return @"Connection Failed"; | |
33 case 5: // CLOSED | |
34 return @"Connection closed"; | |
35 default: | |
36 return @"Unknown connection state"; | |
37 } | |
38 } | |
39 | |
40 // Translate a connection error code integer to a NSString description | |
41 NSString* GetErrorMsgFromInteger(NSInteger code) { | |
42 switch (code) { | |
43 case 1: // PEER_IS_OFFLINE | |
44 return @"Requested host is offline."; | |
45 case 2: // SESSION_REJECTED | |
46 return @"Session was rejected by the host."; | |
47 case 3: // INCOMPATIBLE_PROTOCOL | |
48 return @"Incompatible Protocol."; | |
49 case 4: // AUTHENTICATION_FAILED | |
50 return @"Authentication Failed."; | |
51 case 5: // CHANNEL_CONNECTION_ERROR | |
52 return @"Channel Connection Error"; | |
53 case 6: // SIGNALING_ERROR | |
54 return @"Signaling Error"; | |
55 case 7: // SIGNALING_TIMEOUT | |
56 return @"Signaling Timeout"; | |
57 case 8: // HOST_OVERLOAD | |
58 return @"Host Overload"; | |
59 case 9: // UNKNOWN_ERROR | |
60 return @"An unknown error has occurred, preventing the session " | |
61 "from opening."; | |
62 default: | |
63 return @"An unknown error code has occurred."; | |
64 } | |
65 } | |
66 | |
67 } // namespace | |
68 | |
69 namespace remoting { | |
70 | |
71 ClientProxy::ClientProxy(ClientProxyDelegateWrapper* wrapper) { | |
72 delegate_ = [wrapper delegate]; | |
73 } | |
74 | |
75 void ClientProxy::ReportConnectionStatus( | |
76 protocol::ConnectionToHost::State state, | |
77 protocol::ErrorCode error) { | |
78 DCHECK(delegate_); | |
79 if (state <= kSuccessfulConnection && error == protocol::ErrorCode::OK) { | |
80 // Report Progress | |
81 [delegate_ connectionStatus:GetStatusMsgFromInteger(state)]; | |
82 | |
83 if (state == kSuccessfulConnection) { | |
84 [delegate_ connected]; | |
85 } | |
86 } else { | |
87 [delegate_ connectionStatus:GetStatusMsgFromInteger(state)]; | |
88 if (error != protocol::ErrorCode::OK) { | |
89 [delegate_ connectionFailed:GetErrorMsgFromInteger(error)]; | |
90 } | |
91 } | |
92 } | |
93 | |
94 void ClientProxy::DisplayAuthenticationPrompt(bool pairing_supported) { | |
95 DCHECK(delegate_); | |
96 [delegate_ requestHostPin:pairing_supported]; | |
97 } | |
98 | |
99 void ClientProxy::CommitPairingCredentials(const std::string& hostId, | |
100 const std::string& pairId, | |
101 const std::string& pairSecret) { | |
102 DCHECK(delegate_); | |
103 NSString* nsHostId = [[NSString alloc] initWithUTF8String:hostId.c_str()]; | |
104 NSString* nsPairId = [[NSString alloc] initWithUTF8String:pairId.c_str()]; | |
105 NSString* nsPairSecret = | |
106 [[NSString alloc] initWithUTF8String:pairSecret.c_str()]; | |
107 | |
108 const HostPreferences* hostPrefs = | |
109 [[DataStore sharedStore] getHostForId:nsHostId]; | |
110 if (hostPrefs == nil) { | |
111 hostPrefs = [[DataStore sharedStore] createHost:nsHostId]; | |
112 } | |
113 if (hostPrefs) { | |
114 hostPrefs.pairId = nsPairId; | |
115 hostPrefs.pairSecret = nsPairSecret; | |
116 | |
117 [[DataStore sharedStore] saveChanges]; | |
118 } | |
119 } | |
120 | |
121 void ClientProxy::RedrawCanvas(const webrtc::DesktopSize& view_size, | |
122 webrtc::DesktopFrame* buffer, | |
123 const webrtc::DesktopRegion& region) { | |
124 DCHECK(delegate_); | |
125 std::vector<webrtc::DesktopRect> regions; | |
126 | |
127 for (webrtc::DesktopRegion::Iterator i(region); !i.IsAtEnd(); i.Advance()) { | |
128 const webrtc::DesktopRect& rect(i.rect()); | |
129 | |
130 regions.push_back(webrtc::DesktopRect::MakeXYWH( | |
131 rect.left(), rect.top(), rect.width(), rect.height())); | |
132 } | |
133 | |
134 [delegate_ applyFrame:view_size | |
135 stride:buffer->stride() | |
136 data:buffer->data() | |
137 regions:regions]; | |
138 } | |
139 | |
140 void ClientProxy::UpdateCursorShape( | |
141 const protocol::CursorShapeInfo& cursor_shape) { | |
142 DCHECK(delegate_); | |
143 [delegate_ applyCursor:webrtc::DesktopSize(cursor_shape.width(), | |
144 cursor_shape.height()) | |
145 hotspot:webrtc::DesktopVector(cursor_shape.hotspot_x(), | |
146 cursor_shape.hotspot_y()) | |
147 cursorData:(uint8_t*)cursor_shape.data().c_str()]; | |
148 } | |
149 | |
150 } // namespace remoting | |
OLD | NEW |