Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Native Client Authors. All rights reserved. | 1 // Copyright (c) 2012 The Native Client 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 "net/TcpSocket.h" | 5 #include "net/TcpSocket.h" |
| 6 | 6 |
| 7 #include <assert.h> | 7 #include <assert.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 #include "../net/SocketSubSystem.h" | 9 #include "../net/SocketSubSystem.h" |
| 10 #include "ppapi/c/pp_errors.h" | 10 #include "ppapi/c/pp_errors.h" |
| 11 #include "ppapi/cpp/module.h" | 11 #include "ppapi/cpp/module.h" |
| 12 #include "ppapi/cpp/private/net_address_private.h" | |
| 12 #include "../util/DebugPrint.h" | 13 #include "../util/DebugPrint.h" |
| 13 #include "../util/PthreadHelpers.h" | 14 #include "../util/PthreadHelpers.h" |
| 14 | 15 |
| 15 TCPSocket::TCPSocket(SocketSubSystem* sys, int oflag) | 16 TCPSocket::TCPSocket(SocketSubSystem* sys, int oflag) |
| 16 : ref_(1), oflag_(oflag), factory_(this), socket_(NULL), | 17 : ref_(1), oflag_(oflag), factory_(this), socket_(NULL), |
| 17 read_buf_(kBufSize), write_sent_(false), sys_(sys) { | 18 read_buf_(kBufSize), write_sent_(false), sys_(sys) { |
| 18 } | 19 } |
| 19 | 20 |
| 20 TCPSocket::~TCPSocket() { | 21 TCPSocket::~TCPSocket() { |
| 21 assert(!socket_); | 22 assert(!socket_); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 155 SimpleAutoLock lock(sys_->mutex()); | 156 SimpleAutoLock lock(sys_->mutex()); |
| 156 assert(!socket_); | 157 assert(!socket_); |
| 157 socket_ = new pp::TCPSocketPrivate(sys_->instance()); | 158 socket_ = new pp::TCPSocketPrivate(sys_->instance()); |
| 158 *pres = socket_->Connect(host, port, | 159 *pres = socket_->Connect(host, port, |
| 159 factory_.NewCallback(&TCPSocket::OnConnect, pres)); | 160 factory_.NewCallback(&TCPSocket::OnConnect, pres)); |
| 160 if (*pres != PP_OK_COMPLETIONPENDING) { | 161 if (*pres != PP_OK_COMPLETIONPENDING) { |
| 161 sys_->cond().broadcast(); | 162 sys_->cond().broadcast(); |
| 162 } | 163 } |
| 163 } | 164 } |
| 164 | 165 |
| 166 void TCPSocket::GetAddress(struct sockaddr* addr) { | |
| 167 struct sockaddr_in* iaddr = (struct sockaddr_in*) addr; | |
| 168 struct sockaddr_in6* iaddr6 = (struct sockaddr_in6*) addr; | |
| 169 PP_NetAddress_Private netaddr; | |
| 170 socket_->GetRemoteAddress(&netaddr); | |
| 171 PP_NetAddressFamily_Private family = | |
| 172 pp::NetAddressPrivate::GetFamily(netaddr); | |
| 173 if (family == PP_NETADDRESSFAMILY_IPV4) | |
| 174 iaddr->sin_family = AF_INET; | |
| 175 else if (family == PP_NETADDRESSFAMILY_IPV6) | |
|
Evgeniy Stepanov
2012/06/18 10:46:45
Please make it fail if address family is not one o
vissi
2012/06/18 10:56:44
Done.
| |
| 176 iaddr->sin_family = AF_INET6; | |
| 177 iaddr6->sin6_port = pp::NetAddressPrivate::GetPort(netaddr); | |
| 178 if (family == PP_NETADDRESSFAMILY_IPV6) { | |
| 179 pp::NetAddressPrivate::GetAddress( | |
| 180 netaddr, &iaddr6->sin6_addr, sizeof(in6_addr)); | |
| 181 } else { | |
| 182 pp::NetAddressPrivate::GetAddress( | |
| 183 netaddr, &iaddr->sin_addr, sizeof(in_addr)); | |
| 184 } | |
| 185 } | |
| 186 | |
| 165 void TCPSocket::OnConnect(int32_t result, int32_t* pres) { | 187 void TCPSocket::OnConnect(int32_t result, int32_t* pres) { |
| 166 SimpleAutoLock lock(sys_->mutex()); | 188 SimpleAutoLock lock(sys_->mutex()); |
| 167 if (result == PP_OK) { | 189 if (result == PP_OK) { |
| 168 Read(PP_OK, NULL); | 190 Read(PP_OK, NULL); |
| 169 } else { | 191 } else { |
| 170 delete socket_; | 192 delete socket_; |
| 171 socket_ = NULL; | 193 socket_ = NULL; |
| 172 } | 194 } |
| 173 *pres = result; | 195 *pres = result; |
| 174 sys_->cond().broadcast(); | 196 sys_->cond().broadcast(); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 265 bool TCPSocket::Accept(int32_t result, PP_Resource resource, int32_t* pres) { | 287 bool TCPSocket::Accept(int32_t result, PP_Resource resource, int32_t* pres) { |
| 266 SimpleAutoLock lock(sys_->mutex()); | 288 SimpleAutoLock lock(sys_->mutex()); |
| 267 assert(!socket_); | 289 assert(!socket_); |
| 268 socket_ = new pp::TCPSocketPrivate(pp::PassRef(), resource); | 290 socket_ = new pp::TCPSocketPrivate(pp::PassRef(), resource); |
| 269 Read(PP_OK, NULL); | 291 Read(PP_OK, NULL); |
| 270 *pres = PP_OK; | 292 *pres = PP_OK; |
| 271 sys_->cond().broadcast(); | 293 sys_->cond().broadcast(); |
| 272 return true; | 294 return true; |
| 273 } | 295 } |
| 274 | 296 |
| OLD | NEW |