blob: ab08ff3626c66b36da23094ca5305ed286468177 [file] [log] [blame]
Ben Murdocheb525c52013-07-10 11:40:50 +01001// 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/cpp/tcp_socket.h"
6
7#include "ppapi/c/pp_errors.h"
8#include "ppapi/cpp/completion_callback.h"
9#include "ppapi/cpp/instance_handle.h"
10#include "ppapi/cpp/module_impl.h"
11
12namespace pp {
13
14namespace {
15
16template <> const char* interface_name<PPB_TCPSocket_1_0>() {
17 return PPB_TCPSOCKET_INTERFACE_1_0;
18}
19
Torne (Richard Coles)68043e12013-09-26 13:24:57 +010020template <> const char* interface_name<PPB_TCPSocket_1_1>() {
21 return PPB_TCPSOCKET_INTERFACE_1_1;
22}
23
Ben Murdocheb525c52013-07-10 11:40:50 +010024} // namespace
25
26TCPSocket::TCPSocket() {
27}
28
29TCPSocket::TCPSocket(const InstanceHandle& instance) {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +010030 if (has_interface<PPB_TCPSocket_1_1>()) {
31 PassRefFromConstructor(get_interface<PPB_TCPSocket_1_1>()->Create(
32 instance.pp_instance()));
33 } else if (has_interface<PPB_TCPSocket_1_0>()) {
Ben Murdocheb525c52013-07-10 11:40:50 +010034 PassRefFromConstructor(get_interface<PPB_TCPSocket_1_0>()->Create(
35 instance.pp_instance()));
36 }
37}
38
39TCPSocket::TCPSocket(PassRef, PP_Resource resource)
40 : Resource(PASS_REF, resource) {
41}
42
43TCPSocket::TCPSocket(const TCPSocket& other) : Resource(other) {
44}
45
46TCPSocket::~TCPSocket() {
47}
48
49TCPSocket& TCPSocket::operator=(const TCPSocket& other) {
50 Resource::operator=(other);
51 return *this;
52}
53
54// static
55bool TCPSocket::IsAvailable() {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +010056 return has_interface<PPB_TCPSocket_1_1>() ||
57 has_interface<PPB_TCPSocket_1_0>();
58}
59
60int32_t TCPSocket::Bind(const NetAddress& addr,
61 const CompletionCallback& callback) {
62 if (has_interface<PPB_TCPSocket_1_1>()) {
63 return get_interface<PPB_TCPSocket_1_1>()->Bind(
64 pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
65 }
66 return callback.MayForce(PP_ERROR_NOINTERFACE);
Ben Murdocheb525c52013-07-10 11:40:50 +010067}
68
69int32_t TCPSocket::Connect(const NetAddress& addr,
70 const CompletionCallback& callback) {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +010071 if (has_interface<PPB_TCPSocket_1_1>()) {
72 return get_interface<PPB_TCPSocket_1_1>()->Connect(
73 pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
74 }
Ben Murdocheb525c52013-07-10 11:40:50 +010075 if (has_interface<PPB_TCPSocket_1_0>()) {
76 return get_interface<PPB_TCPSocket_1_0>()->Connect(
77 pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
78 }
79 return callback.MayForce(PP_ERROR_NOINTERFACE);
80}
81
82NetAddress TCPSocket::GetLocalAddress() const {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +010083 if (has_interface<PPB_TCPSocket_1_1>()) {
84 return NetAddress(
85 PASS_REF,
86 get_interface<PPB_TCPSocket_1_1>()->GetLocalAddress(pp_resource()));
87 }
Ben Murdocheb525c52013-07-10 11:40:50 +010088 if (has_interface<PPB_TCPSocket_1_0>()) {
89 return NetAddress(
90 PASS_REF,
91 get_interface<PPB_TCPSocket_1_0>()->GetLocalAddress(pp_resource()));
92 }
93 return NetAddress();
94}
95
96NetAddress TCPSocket::GetRemoteAddress() const {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +010097 if (has_interface<PPB_TCPSocket_1_1>()) {
98 return NetAddress(
99 PASS_REF,
100 get_interface<PPB_TCPSocket_1_1>()->GetRemoteAddress(pp_resource()));
101 }
Ben Murdocheb525c52013-07-10 11:40:50 +0100102 if (has_interface<PPB_TCPSocket_1_0>()) {
103 return NetAddress(
104 PASS_REF,
105 get_interface<PPB_TCPSocket_1_0>()->GetRemoteAddress(pp_resource()));
106 }
107 return NetAddress();
108}
109
110int32_t TCPSocket::Read(char* buffer,
111 int32_t bytes_to_read,
112 const CompletionCallback& callback) {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +0100113 if (has_interface<PPB_TCPSocket_1_1>()) {
114 return get_interface<PPB_TCPSocket_1_1>()->Read(
115 pp_resource(), buffer, bytes_to_read,
116 callback.pp_completion_callback());
117 }
Ben Murdocheb525c52013-07-10 11:40:50 +0100118 if (has_interface<PPB_TCPSocket_1_0>()) {
119 return get_interface<PPB_TCPSocket_1_0>()->Read(
120 pp_resource(), buffer, bytes_to_read,
121 callback.pp_completion_callback());
122 }
123 return callback.MayForce(PP_ERROR_NOINTERFACE);
124}
125
126int32_t TCPSocket::Write(const char* buffer,
127 int32_t bytes_to_write,
128 const CompletionCallback& callback) {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +0100129 if (has_interface<PPB_TCPSocket_1_1>()) {
130 return get_interface<PPB_TCPSocket_1_1>()->Write(
131 pp_resource(), buffer, bytes_to_write,
132 callback.pp_completion_callback());
133 }
Ben Murdocheb525c52013-07-10 11:40:50 +0100134 if (has_interface<PPB_TCPSocket_1_0>()) {
135 return get_interface<PPB_TCPSocket_1_0>()->Write(
136 pp_resource(), buffer, bytes_to_write,
137 callback.pp_completion_callback());
138 }
139 return callback.MayForce(PP_ERROR_NOINTERFACE);
140}
141
Torne (Richard Coles)68043e12013-09-26 13:24:57 +0100142int32_t TCPSocket::Listen(int32_t backlog,
143 const CompletionCallback& callback) {
144 if (has_interface<PPB_TCPSocket_1_1>()) {
145 return get_interface<PPB_TCPSocket_1_1>()->Listen(
146 pp_resource(), backlog, callback.pp_completion_callback());
147 }
148 return callback.MayForce(PP_ERROR_NOINTERFACE);
149}
150
151int32_t TCPSocket::Accept(
152 const CompletionCallbackWithOutput<TCPSocket>& callback) {
153 if (has_interface<PPB_TCPSocket_1_1>()) {
154 return get_interface<PPB_TCPSocket_1_1>()->Accept(
155 pp_resource(), callback.output(), callback.pp_completion_callback());
156 }
157 return callback.MayForce(PP_ERROR_NOINTERFACE);
158}
159
Ben Murdocheb525c52013-07-10 11:40:50 +0100160void TCPSocket::Close() {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +0100161 if (has_interface<PPB_TCPSocket_1_1>()) {
162 get_interface<PPB_TCPSocket_1_1>()->Close(pp_resource());
163 } else if (has_interface<PPB_TCPSocket_1_0>()) {
Ben Murdocheb525c52013-07-10 11:40:50 +0100164 get_interface<PPB_TCPSocket_1_0>()->Close(pp_resource());
Torne (Richard Coles)68043e12013-09-26 13:24:57 +0100165 }
Ben Murdocheb525c52013-07-10 11:40:50 +0100166}
167
168int32_t TCPSocket::SetOption(PP_TCPSocket_Option name,
169 const Var& value,
170 const CompletionCallback& callback) {
Torne (Richard Coles)68043e12013-09-26 13:24:57 +0100171 if (has_interface<PPB_TCPSocket_1_1>()) {
172 return get_interface<PPB_TCPSocket_1_1>()->SetOption(
173 pp_resource(), name, value.pp_var(), callback.pp_completion_callback());
174 }
Ben Murdocheb525c52013-07-10 11:40:50 +0100175 if (has_interface<PPB_TCPSocket_1_0>()) {
176 return get_interface<PPB_TCPSocket_1_0>()->SetOption(
177 pp_resource(), name, value.pp_var(), callback.pp_completion_callback());
178 }
179 return callback.MayForce(PP_ERROR_NOINTERFACE);
180}
181
182} // namespace pp