OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/cpp/private/tcp_socket_private.h" | 5 #include "ppapi/cpp/private/tcp_socket_private.h" |
6 | 6 |
7 #include "ppapi/c/pp_bool.h" | 7 #include "ppapi/c/pp_bool.h" |
8 #include "ppapi/c/pp_errors.h" | 8 #include "ppapi/c/pp_errors.h" |
9 #include "ppapi/cpp/completion_callback.h" | 9 #include "ppapi/cpp/completion_callback.h" |
10 #include "ppapi/cpp/instance_handle.h" | 10 #include "ppapi/cpp/instance_handle.h" |
11 #include "ppapi/cpp/module.h" | 11 #include "ppapi/cpp/module.h" |
12 #include "ppapi/cpp/module_impl.h" | 12 #include "ppapi/cpp/module_impl.h" |
13 | 13 |
14 namespace pp { | 14 namespace pp { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
| 18 template <> const char* interface_name<PPB_TCPSocket_Private_0_5>() { |
| 19 return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_5; |
| 20 } |
| 21 |
18 template <> const char* interface_name<PPB_TCPSocket_Private_0_4>() { | 22 template <> const char* interface_name<PPB_TCPSocket_Private_0_4>() { |
19 return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_4; | 23 return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_4; |
20 } | 24 } |
21 | 25 |
22 template <> const char* interface_name<PPB_TCPSocket_Private_0_3>() { | 26 template <> const char* interface_name<PPB_TCPSocket_Private_0_3>() { |
23 return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_3; | 27 return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_3; |
24 } | 28 } |
25 | 29 |
26 } // namespace | 30 } // namespace |
27 | 31 |
28 TCPSocketPrivate::TCPSocketPrivate(const InstanceHandle& instance) { | 32 TCPSocketPrivate::TCPSocketPrivate(const InstanceHandle& instance) { |
29 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 33 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 34 PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_5>()->Create( |
| 35 instance.pp_instance())); |
| 36 } else if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
30 PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_4>()->Create( | 37 PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_4>()->Create( |
31 instance.pp_instance())); | 38 instance.pp_instance())); |
32 } else if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 39 } else if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
33 PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_3>()->Create( | 40 PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_3>()->Create( |
34 instance.pp_instance())); | 41 instance.pp_instance())); |
35 } | 42 } |
36 } | 43 } |
37 | 44 |
38 TCPSocketPrivate::TCPSocketPrivate(PassRef, PP_Resource resource) | 45 TCPSocketPrivate::TCPSocketPrivate(PassRef, PP_Resource resource) |
39 : Resource(PASS_REF, resource) { | 46 : Resource(PASS_REF, resource) { |
40 } | 47 } |
41 | 48 |
42 // static | 49 // static |
43 bool TCPSocketPrivate::IsAvailable() { | 50 bool TCPSocketPrivate::IsAvailable() { |
44 return has_interface<PPB_TCPSocket_Private_0_4>() || | 51 return has_interface<PPB_TCPSocket_Private_0_5>() || |
| 52 has_interface<PPB_TCPSocket_Private_0_4>() || |
45 has_interface<PPB_TCPSocket_Private_0_3>(); | 53 has_interface<PPB_TCPSocket_Private_0_3>(); |
46 } | 54 } |
47 | 55 |
48 int32_t TCPSocketPrivate::Connect(const char* host, | 56 int32_t TCPSocketPrivate::Connect(const char* host, |
49 uint16_t port, | 57 uint16_t port, |
50 const CompletionCallback& callback) { | 58 const CompletionCallback& callback) { |
| 59 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 60 return get_interface<PPB_TCPSocket_Private_0_5>()->Connect( |
| 61 pp_resource(), host, port, callback.pp_completion_callback()); |
| 62 } |
51 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 63 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
52 return get_interface<PPB_TCPSocket_Private_0_4>()->Connect( | 64 return get_interface<PPB_TCPSocket_Private_0_4>()->Connect( |
53 pp_resource(), host, port, callback.pp_completion_callback()); | 65 pp_resource(), host, port, callback.pp_completion_callback()); |
54 } | 66 } |
55 if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 67 if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
56 return get_interface<PPB_TCPSocket_Private_0_3>()->Connect( | 68 return get_interface<PPB_TCPSocket_Private_0_3>()->Connect( |
57 pp_resource(), host, port, callback.pp_completion_callback()); | 69 pp_resource(), host, port, callback.pp_completion_callback()); |
58 } | 70 } |
59 return callback.MayForce(PP_ERROR_NOINTERFACE); | 71 return callback.MayForce(PP_ERROR_NOINTERFACE); |
60 } | 72 } |
61 | 73 |
62 int32_t TCPSocketPrivate::ConnectWithNetAddress( | 74 int32_t TCPSocketPrivate::ConnectWithNetAddress( |
63 const PP_NetAddress_Private* addr, | 75 const PP_NetAddress_Private* addr, |
64 const CompletionCallback& callback) { | 76 const CompletionCallback& callback) { |
| 77 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 78 return get_interface<PPB_TCPSocket_Private_0_5>()->ConnectWithNetAddress( |
| 79 pp_resource(), addr, callback.pp_completion_callback()); |
| 80 } |
65 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 81 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
66 return get_interface<PPB_TCPSocket_Private_0_4>()->ConnectWithNetAddress( | 82 return get_interface<PPB_TCPSocket_Private_0_4>()->ConnectWithNetAddress( |
67 pp_resource(), addr, callback.pp_completion_callback()); | 83 pp_resource(), addr, callback.pp_completion_callback()); |
68 } | 84 } |
69 if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 85 if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
70 return get_interface<PPB_TCPSocket_Private_0_3>()->ConnectWithNetAddress( | 86 return get_interface<PPB_TCPSocket_Private_0_3>()->ConnectWithNetAddress( |
71 pp_resource(), addr, callback.pp_completion_callback()); | 87 pp_resource(), addr, callback.pp_completion_callback()); |
72 } | 88 } |
73 return callback.MayForce(PP_ERROR_NOINTERFACE); | 89 return callback.MayForce(PP_ERROR_NOINTERFACE); |
74 } | 90 } |
75 | 91 |
76 bool TCPSocketPrivate::GetLocalAddress(PP_NetAddress_Private* local_addr) { | 92 bool TCPSocketPrivate::GetLocalAddress(PP_NetAddress_Private* local_addr) { |
| 93 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 94 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_5>()-> |
| 95 GetLocalAddress(pp_resource(), local_addr); |
| 96 return PP_ToBool(result); |
| 97 } |
77 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 98 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
78 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_4>()-> | 99 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_4>()-> |
79 GetLocalAddress(pp_resource(), local_addr); | 100 GetLocalAddress(pp_resource(), local_addr); |
80 return PP_ToBool(result); | 101 return PP_ToBool(result); |
81 } | 102 } |
82 if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 103 if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
83 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_3>()-> | 104 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_3>()-> |
84 GetLocalAddress(pp_resource(), local_addr); | 105 GetLocalAddress(pp_resource(), local_addr); |
85 return PP_ToBool(result); | 106 return PP_ToBool(result); |
86 } | 107 } |
87 return false; | 108 return false; |
88 } | 109 } |
89 | 110 |
90 bool TCPSocketPrivate::GetRemoteAddress(PP_NetAddress_Private* remote_addr) { | 111 bool TCPSocketPrivate::GetRemoteAddress(PP_NetAddress_Private* remote_addr) { |
| 112 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 113 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_5>()-> |
| 114 GetRemoteAddress(pp_resource(), remote_addr); |
| 115 return PP_ToBool(result); |
| 116 } |
91 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 117 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
92 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_4>()-> | 118 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_4>()-> |
93 GetRemoteAddress(pp_resource(), remote_addr); | 119 GetRemoteAddress(pp_resource(), remote_addr); |
94 return PP_ToBool(result); | 120 return PP_ToBool(result); |
95 } | 121 } |
96 if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 122 if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
97 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_3>()-> | 123 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_3>()-> |
98 GetRemoteAddress(pp_resource(), remote_addr); | 124 GetRemoteAddress(pp_resource(), remote_addr); |
99 return PP_ToBool(result); | 125 return PP_ToBool(result); |
100 } | 126 } |
101 return false; | 127 return false; |
102 } | 128 } |
103 | 129 |
104 int32_t TCPSocketPrivate::SSLHandshake(const char* server_name, | 130 int32_t TCPSocketPrivate::SSLHandshake(const char* server_name, |
105 uint16_t server_port, | 131 uint16_t server_port, |
106 const CompletionCallback& callback) { | 132 const CompletionCallback& callback) { |
| 133 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 134 return get_interface<PPB_TCPSocket_Private_0_5>()->SSLHandshake( |
| 135 pp_resource(), server_name, server_port, |
| 136 callback.pp_completion_callback()); |
| 137 } |
107 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 138 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
108 return get_interface<PPB_TCPSocket_Private_0_4>()->SSLHandshake( | 139 return get_interface<PPB_TCPSocket_Private_0_4>()->SSLHandshake( |
109 pp_resource(), server_name, server_port, | 140 pp_resource(), server_name, server_port, |
110 callback.pp_completion_callback()); | 141 callback.pp_completion_callback()); |
111 } | 142 } |
112 if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 143 if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
113 return get_interface<PPB_TCPSocket_Private_0_3>()->SSLHandshake( | 144 return get_interface<PPB_TCPSocket_Private_0_3>()->SSLHandshake( |
114 pp_resource(), server_name, server_port, | 145 pp_resource(), server_name, server_port, |
115 callback.pp_completion_callback()); | 146 callback.pp_completion_callback()); |
116 } | 147 } |
117 return callback.MayForce(PP_ERROR_NOINTERFACE); | 148 return callback.MayForce(PP_ERROR_NOINTERFACE); |
118 } | 149 } |
119 | 150 |
120 X509CertificatePrivate TCPSocketPrivate::GetServerCertificate() { | 151 X509CertificatePrivate TCPSocketPrivate::GetServerCertificate() { |
| 152 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 153 return X509CertificatePrivate(PASS_REF, |
| 154 get_interface<PPB_TCPSocket_Private_0_5>()->GetServerCertificate( |
| 155 pp_resource())); |
| 156 } |
121 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 157 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
122 return X509CertificatePrivate(PASS_REF, | 158 return X509CertificatePrivate(PASS_REF, |
123 get_interface<PPB_TCPSocket_Private_0_4>()->GetServerCertificate( | 159 get_interface<PPB_TCPSocket_Private_0_4>()->GetServerCertificate( |
124 pp_resource())); | 160 pp_resource())); |
125 } | 161 } |
126 return X509CertificatePrivate(); | 162 return X509CertificatePrivate(); |
127 } | 163 } |
128 | 164 |
129 bool TCPSocketPrivate::AddChainBuildingCertificate( | 165 bool TCPSocketPrivate::AddChainBuildingCertificate( |
130 const X509CertificatePrivate& cert, | 166 const X509CertificatePrivate& cert, |
131 bool trusted) { | 167 bool trusted) { |
| 168 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 169 return PP_ToBool(get_interface<PPB_TCPSocket_Private_0_5>()-> |
| 170 AddChainBuildingCertificate(pp_resource(), cert.pp_resource(), |
| 171 PP_FromBool(trusted))); |
| 172 } |
132 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 173 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
133 return PP_ToBool(get_interface<PPB_TCPSocket_Private_0_4>()-> | 174 return PP_ToBool(get_interface<PPB_TCPSocket_Private_0_4>()-> |
134 AddChainBuildingCertificate(pp_resource(), cert.pp_resource(), | 175 AddChainBuildingCertificate(pp_resource(), cert.pp_resource(), |
135 PP_FromBool(trusted))); | 176 PP_FromBool(trusted))); |
136 } | 177 } |
137 return false; | 178 return false; |
138 } | 179 } |
139 | 180 |
140 int32_t TCPSocketPrivate::Read(char* buffer, | 181 int32_t TCPSocketPrivate::Read(char* buffer, |
141 int32_t bytes_to_read, | 182 int32_t bytes_to_read, |
142 const CompletionCallback& callback) { | 183 const CompletionCallback& callback) { |
| 184 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 185 return get_interface<PPB_TCPSocket_Private_0_5>()->Read( |
| 186 pp_resource(), buffer, bytes_to_read, |
| 187 callback.pp_completion_callback()); |
| 188 } |
143 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 189 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
144 return get_interface<PPB_TCPSocket_Private_0_4>()->Read( | 190 return get_interface<PPB_TCPSocket_Private_0_4>()->Read( |
145 pp_resource(), buffer, bytes_to_read, | 191 pp_resource(), buffer, bytes_to_read, |
146 callback.pp_completion_callback()); | 192 callback.pp_completion_callback()); |
147 } | 193 } |
148 if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 194 if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
149 return get_interface<PPB_TCPSocket_Private_0_3>()->Read( | 195 return get_interface<PPB_TCPSocket_Private_0_3>()->Read( |
150 pp_resource(), buffer, bytes_to_read, | 196 pp_resource(), buffer, bytes_to_read, |
151 callback.pp_completion_callback()); | 197 callback.pp_completion_callback()); |
152 } | 198 } |
153 return callback.MayForce(PP_ERROR_NOINTERFACE); | 199 return callback.MayForce(PP_ERROR_NOINTERFACE); |
154 } | 200 } |
155 | 201 |
156 int32_t TCPSocketPrivate::Write(const char* buffer, | 202 int32_t TCPSocketPrivate::Write(const char* buffer, |
157 int32_t bytes_to_write, | 203 int32_t bytes_to_write, |
158 const CompletionCallback& callback) { | 204 const CompletionCallback& callback) { |
| 205 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 206 return get_interface<PPB_TCPSocket_Private_0_5>()->Write( |
| 207 pp_resource(), buffer, bytes_to_write, |
| 208 callback.pp_completion_callback()); |
| 209 } |
159 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 210 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
160 return get_interface<PPB_TCPSocket_Private_0_4>()->Write( | 211 return get_interface<PPB_TCPSocket_Private_0_4>()->Write( |
161 pp_resource(), buffer, bytes_to_write, | 212 pp_resource(), buffer, bytes_to_write, |
162 callback.pp_completion_callback()); | 213 callback.pp_completion_callback()); |
163 } | 214 } |
164 if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 215 if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
165 return get_interface<PPB_TCPSocket_Private_0_3>()->Write( | 216 return get_interface<PPB_TCPSocket_Private_0_3>()->Write( |
166 pp_resource(), buffer, bytes_to_write, | 217 pp_resource(), buffer, bytes_to_write, |
167 callback.pp_completion_callback()); | 218 callback.pp_completion_callback()); |
168 } | 219 } |
169 return callback.MayForce(PP_ERROR_NOINTERFACE); | 220 return callback.MayForce(PP_ERROR_NOINTERFACE); |
170 } | 221 } |
171 | 222 |
172 void TCPSocketPrivate::Disconnect() { | 223 void TCPSocketPrivate::Disconnect() { |
| 224 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 225 return get_interface<PPB_TCPSocket_Private_0_5>()->Disconnect( |
| 226 pp_resource()); |
| 227 } |
173 if (has_interface<PPB_TCPSocket_Private_0_4>()) { | 228 if (has_interface<PPB_TCPSocket_Private_0_4>()) { |
174 return get_interface<PPB_TCPSocket_Private_0_4>()->Disconnect( | 229 return get_interface<PPB_TCPSocket_Private_0_4>()->Disconnect( |
175 pp_resource()); | 230 pp_resource()); |
176 } | 231 } |
177 if (has_interface<PPB_TCPSocket_Private_0_3>()) { | 232 if (has_interface<PPB_TCPSocket_Private_0_3>()) { |
178 return get_interface<PPB_TCPSocket_Private_0_3>()->Disconnect( | 233 return get_interface<PPB_TCPSocket_Private_0_3>()->Disconnect( |
179 pp_resource()); | 234 pp_resource()); |
180 } | 235 } |
181 } | 236 } |
182 | 237 |
| 238 int32_t TCPSocketPrivate::SetOption(PP_TCPSocketOption_Private name, |
| 239 const Var& value, |
| 240 const CompletionCallback& callback) { |
| 241 if (has_interface<PPB_TCPSocket_Private_0_5>()) { |
| 242 return get_interface<PPB_TCPSocket_Private_0_5>()->SetOption( |
| 243 pp_resource(), name, value.pp_var(), callback.pp_completion_callback()); |
| 244 } |
| 245 return callback.MayForce(PP_ERROR_NOINTERFACE); |
| 246 } |
| 247 |
183 } // namespace pp | 248 } // namespace pp |
OLD | NEW |