1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file.
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/proxy/tcp_socket_resource.h"
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/logging.h"
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/shared_impl/ppb_tcp_socket_shared.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/thunk/enter.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/thunk/ppb_net_address_api.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace ppapi {
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace proxy {
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace {
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)typedef thunk::EnterResourceNoLock<thunk::PPB_NetAddress_API>
19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EnterNetAddressNoLock;
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TCPSocketResource::TCPSocketResource(Connection connection,
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     PP_Instance instance,
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     TCPSocketVersion version)
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : TCPSocketResourceBase(connection, instance, version) {
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK_NE(version, TCP_SOCKET_VERSION_PRIVATE);
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SendCreate(BROWSER, PpapiHostMsg_TCPSocket_Create(version));
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TCPSocketResource::TCPSocketResource(Connection connection,
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     PP_Instance instance,
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     int pending_host_id,
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     const PP_NetAddress_Private& local_addr,
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     const PP_NetAddress_Private& remote_addr)
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : TCPSocketResourceBase(connection, instance,
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            TCP_SOCKET_VERSION_1_1_OR_ABOVE, local_addr,
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            remote_addr) {
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AttachToPendingHost(BROWSER, pending_host_id);
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TCPSocketResource::~TCPSocketResource() {
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)thunk::PPB_TCPSocket_API* TCPSocketResource::AsPPB_TCPSocket_API() {
46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return this;
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int32_t TCPSocketResource::Bind(PP_Resource addr,
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                scoped_refptr<TrackedCallback> callback) {
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EnterNetAddressNoLock enter(addr, true);
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (enter.failed())
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return PP_ERROR_BADARGUMENT;
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return BindImpl(&enter.object()->GetNetAddressPrivate(), callback);
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int32_t TCPSocketResource::Connect(PP_Resource addr,
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                   scoped_refptr<TrackedCallback> callback) {
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EnterNetAddressNoLock enter(addr, true);
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (enter.failed())
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return PP_ERROR_BADARGUMENT;
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return ConnectWithNetAddressImpl(&enter.object()->GetNetAddressPrivate(),
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                   callback);
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)PP_Resource TCPSocketResource::GetLocalAddress() {
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PP_NetAddress_Private addr_private;
70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!GetLocalAddressImpl(&addr_private))
71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return 0;
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  thunk::EnterResourceCreationNoLock enter(pp_instance());
74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (enter.failed())
75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return 0;
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return enter.functions()->CreateNetAddressFromNetAddressPrivate(
77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      pp_instance(), addr_private);
78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)PP_Resource TCPSocketResource::GetRemoteAddress() {
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PP_NetAddress_Private addr_private;
82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!GetRemoteAddressImpl(&addr_private))
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return 0;
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  thunk::EnterResourceCreationNoLock enter(pp_instance());
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (enter.failed())
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return 0;
88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return enter.functions()->CreateNetAddressFromNetAddressPrivate(
89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      pp_instance(), addr_private);
90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int32_t TCPSocketResource::Read(char* buffer,
93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                int32_t bytes_to_read,
94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                scoped_refptr<TrackedCallback> callback) {
95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return ReadImpl(buffer, bytes_to_read, callback);
96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
97424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int32_t TCPSocketResource::Write(const char* buffer,
99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 int32_t bytes_to_write,
100424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 scoped_refptr<TrackedCallback> callback) {
101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return WriteImpl(buffer, bytes_to_write, callback);
102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int32_t TCPSocketResource::Listen(int32_t backlog,
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  scoped_refptr<TrackedCallback> callback) {
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return ListenImpl(backlog, callback);
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int32_t TCPSocketResource::Accept(PP_Resource* accepted_tcp_socket,
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  scoped_refptr<TrackedCallback> callback) {
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return AcceptImpl(accepted_tcp_socket, callback);
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void TCPSocketResource::Close() {
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  CloseImpl();
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int32_t TCPSocketResource::SetOption(PP_TCPSocket_Option name,
119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                     const PP_Var& value,
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                     scoped_refptr<TrackedCallback> callback) {
121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return SetOptionImpl(name, value, callback);
122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PP_Resource TCPSocketResource::CreateAcceptedSocket(
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int pending_host_id,
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const PP_NetAddress_Private& local_addr,
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const PP_NetAddress_Private& remote_addr) {
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return (new TCPSocketResource(connection(), pp_instance(), pending_host_id,
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                local_addr, remote_addr))->GetReference();
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace proxy
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace ppapi
134