1// Copyright 2013 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#include "ppapi/proxy/tcp_socket_resource.h"
6
7#include "base/logging.h"
8#include "ppapi/proxy/ppapi_messages.h"
9#include "ppapi/shared_impl/ppb_tcp_socket_shared.h"
10#include "ppapi/thunk/enter.h"
11#include "ppapi/thunk/ppb_net_address_api.h"
12
13namespace ppapi {
14namespace proxy {
15
16namespace {
17
18typedef thunk::EnterResourceNoLock<thunk::PPB_NetAddress_API>
19    EnterNetAddressNoLock;
20
21}  // namespace
22
23TCPSocketResource::TCPSocketResource(Connection connection,
24                                     PP_Instance instance,
25                                     TCPSocketVersion version)
26    : TCPSocketResourceBase(connection, instance, version) {
27  DCHECK_NE(version, TCP_SOCKET_VERSION_PRIVATE);
28  SendCreate(BROWSER, PpapiHostMsg_TCPSocket_Create(version));
29}
30
31TCPSocketResource::TCPSocketResource(Connection connection,
32                                     PP_Instance instance,
33                                     int pending_host_id,
34                                     const PP_NetAddress_Private& local_addr,
35                                     const PP_NetAddress_Private& remote_addr)
36    : TCPSocketResourceBase(connection, instance,
37                            TCP_SOCKET_VERSION_1_1_OR_ABOVE, local_addr,
38                            remote_addr) {
39  AttachToPendingHost(BROWSER, pending_host_id);
40}
41
42TCPSocketResource::~TCPSocketResource() {
43}
44
45thunk::PPB_TCPSocket_API* TCPSocketResource::AsPPB_TCPSocket_API() {
46  return this;
47}
48
49int32_t TCPSocketResource::Bind(PP_Resource addr,
50                                scoped_refptr<TrackedCallback> callback) {
51  EnterNetAddressNoLock enter(addr, true);
52  if (enter.failed())
53    return PP_ERROR_BADARGUMENT;
54
55  return BindImpl(&enter.object()->GetNetAddressPrivate(), callback);
56}
57
58int32_t TCPSocketResource::Connect(PP_Resource addr,
59                                   scoped_refptr<TrackedCallback> callback) {
60  EnterNetAddressNoLock enter(addr, true);
61  if (enter.failed())
62    return PP_ERROR_BADARGUMENT;
63
64  return ConnectWithNetAddressImpl(&enter.object()->GetNetAddressPrivate(),
65                                   callback);
66}
67
68PP_Resource TCPSocketResource::GetLocalAddress() {
69  PP_NetAddress_Private addr_private;
70  if (!GetLocalAddressImpl(&addr_private))
71    return 0;
72
73  thunk::EnterResourceCreationNoLock enter(pp_instance());
74  if (enter.failed())
75    return 0;
76  return enter.functions()->CreateNetAddressFromNetAddressPrivate(
77      pp_instance(), addr_private);
78}
79
80PP_Resource TCPSocketResource::GetRemoteAddress() {
81  PP_NetAddress_Private addr_private;
82  if (!GetRemoteAddressImpl(&addr_private))
83    return 0;
84
85  thunk::EnterResourceCreationNoLock enter(pp_instance());
86  if (enter.failed())
87    return 0;
88  return enter.functions()->CreateNetAddressFromNetAddressPrivate(
89      pp_instance(), addr_private);
90}
91
92int32_t TCPSocketResource::Read(char* buffer,
93                                int32_t bytes_to_read,
94                                scoped_refptr<TrackedCallback> callback) {
95  return ReadImpl(buffer, bytes_to_read, callback);
96}
97
98int32_t TCPSocketResource::Write(const char* buffer,
99                                 int32_t bytes_to_write,
100                                 scoped_refptr<TrackedCallback> callback) {
101  return WriteImpl(buffer, bytes_to_write, callback);
102}
103
104int32_t TCPSocketResource::Listen(int32_t backlog,
105                                  scoped_refptr<TrackedCallback> callback) {
106  return ListenImpl(backlog, callback);
107}
108
109int32_t TCPSocketResource::Accept(PP_Resource* accepted_tcp_socket,
110                                  scoped_refptr<TrackedCallback> callback) {
111  return AcceptImpl(accepted_tcp_socket, callback);
112}
113
114void TCPSocketResource::Close() {
115  CloseImpl();
116}
117
118int32_t TCPSocketResource::SetOption(PP_TCPSocket_Option name,
119                                     const PP_Var& value,
120                                     scoped_refptr<TrackedCallback> callback) {
121  return SetOptionImpl(name, value, callback);
122}
123
124PP_Resource TCPSocketResource::CreateAcceptedSocket(
125    int pending_host_id,
126    const PP_NetAddress_Private& local_addr,
127    const PP_NetAddress_Private& remote_addr) {
128  return (new TCPSocketResource(connection(), pp_instance(), pending_host_id,
129                                local_addr, remote_addr))->GetReference();
130}
131
132}  // namespace proxy
133}  // namespace ppapi
134