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.
5 #include "ppapi/proxy/tcp_socket_resource.h"
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"
18 typedef thunk::EnterResourceNoLock
<thunk::PPB_NetAddress_API
>
19 EnterNetAddressNoLock
;
23 TCPSocketResource::TCPSocketResource(Connection connection
,
25 TCPSocketVersion version
)
26 : TCPSocketResourceBase(connection
, instance
, version
) {
27 DCHECK_NE(version
, TCP_SOCKET_VERSION_PRIVATE
);
28 SendCreate(BROWSER
, PpapiHostMsg_TCPSocket_Create(version
));
31 TCPSocketResource::TCPSocketResource(Connection connection
,
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
,
39 AttachToPendingHost(BROWSER
, pending_host_id
);
42 TCPSocketResource::~TCPSocketResource() {
45 thunk::PPB_TCPSocket_API
* TCPSocketResource::AsPPB_TCPSocket_API() {
49 int32_t TCPSocketResource::Bind(PP_Resource addr
,
50 scoped_refptr
<TrackedCallback
> callback
) {
51 EnterNetAddressNoLock
enter(addr
, true);
53 return PP_ERROR_BADARGUMENT
;
55 return BindImpl(&enter
.object()->GetNetAddressPrivate(), callback
);
58 int32_t TCPSocketResource::Connect(PP_Resource addr
,
59 scoped_refptr
<TrackedCallback
> callback
) {
60 EnterNetAddressNoLock
enter(addr
, true);
62 return PP_ERROR_BADARGUMENT
;
64 return ConnectWithNetAddressImpl(&enter
.object()->GetNetAddressPrivate(),
68 PP_Resource
TCPSocketResource::GetLocalAddress() {
69 PP_NetAddress_Private addr_private
;
70 if (!GetLocalAddressImpl(&addr_private
))
73 thunk::EnterResourceCreationNoLock
enter(pp_instance());
76 return enter
.functions()->CreateNetAddressFromNetAddressPrivate(
77 pp_instance(), addr_private
);
80 PP_Resource
TCPSocketResource::GetRemoteAddress() {
81 PP_NetAddress_Private addr_private
;
82 if (!GetRemoteAddressImpl(&addr_private
))
85 thunk::EnterResourceCreationNoLock
enter(pp_instance());
88 return enter
.functions()->CreateNetAddressFromNetAddressPrivate(
89 pp_instance(), addr_private
);
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
);
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
);
104 int32_t TCPSocketResource::Listen(int32_t backlog
,
105 scoped_refptr
<TrackedCallback
> callback
) {
106 return ListenImpl(backlog
, callback
);
109 int32_t TCPSocketResource::Accept(PP_Resource
* accepted_tcp_socket
,
110 scoped_refptr
<TrackedCallback
> callback
) {
111 return AcceptImpl(accepted_tcp_socket
, callback
);
114 void TCPSocketResource::Close() {
118 int32_t TCPSocketResource::SetOption1_1(
119 PP_TCPSocket_Option name
,
121 scoped_refptr
<TrackedCallback
> callback
) {
122 return SetOptionImpl(name
, value
,
123 true, // Check connect() state.
127 int32_t TCPSocketResource::SetOption(PP_TCPSocket_Option name
,
129 scoped_refptr
<TrackedCallback
> callback
) {
130 return SetOptionImpl(name
, value
,
131 false, // Do not check connect() state.
135 PP_Resource
TCPSocketResource::CreateAcceptedSocket(
137 const PP_NetAddress_Private
& local_addr
,
138 const PP_NetAddress_Private
& remote_addr
) {
139 return (new TCPSocketResource(connection(), pp_instance(), pending_host_id
,
140 local_addr
, remote_addr
))->GetReference();