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
13 namespace ppapi {
14 namespace proxy {
15
16 namespace {
17
18 typedef thunk::EnterResourceNoLock<thunk::PPB_NetAddress_API>
19 EnterNetAddressNoLock;
20
21 } // namespace
22
TCPSocketResource(Connection connection,PP_Instance instance,TCPSocketVersion version)23 TCPSocketResource::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
TCPSocketResource(Connection connection,PP_Instance instance,int pending_host_id,const PP_NetAddress_Private & local_addr,const PP_NetAddress_Private & remote_addr)31 TCPSocketResource::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
~TCPSocketResource()42 TCPSocketResource::~TCPSocketResource() {
43 }
44
AsPPB_TCPSocket_API()45 thunk::PPB_TCPSocket_API* TCPSocketResource::AsPPB_TCPSocket_API() {
46 return this;
47 }
48
Bind(PP_Resource addr,scoped_refptr<TrackedCallback> callback)49 int32_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
Connect(PP_Resource addr,scoped_refptr<TrackedCallback> callback)58 int32_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
GetLocalAddress()68 PP_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
GetRemoteAddress()80 PP_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
Read(char * buffer,int32_t bytes_to_read,scoped_refptr<TrackedCallback> callback)92 int32_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
Write(const char * buffer,int32_t bytes_to_write,scoped_refptr<TrackedCallback> callback)98 int32_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
Listen(int32_t backlog,scoped_refptr<TrackedCallback> callback)104 int32_t TCPSocketResource::Listen(int32_t backlog,
105 scoped_refptr<TrackedCallback> callback) {
106 return ListenImpl(backlog, callback);
107 }
108
Accept(PP_Resource * accepted_tcp_socket,scoped_refptr<TrackedCallback> callback)109 int32_t TCPSocketResource::Accept(PP_Resource* accepted_tcp_socket,
110 scoped_refptr<TrackedCallback> callback) {
111 return AcceptImpl(accepted_tcp_socket, callback);
112 }
113
Close()114 void TCPSocketResource::Close() {
115 CloseImpl();
116 }
117
SetOption(PP_TCPSocket_Option name,const PP_Var & value,scoped_refptr<TrackedCallback> callback)118 int32_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
CreateAcceptedSocket(int pending_host_id,const PP_NetAddress_Private & local_addr,const PP_NetAddress_Private & remote_addr)124 PP_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