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// From ppb_tcp_socket.idl modified Sun Sep 15 16:14:21 2013.
6
7#include "ppapi/c/pp_completion_callback.h"
8#include "ppapi/c/pp_errors.h"
9#include "ppapi/c/ppb_tcp_socket.h"
10#include "ppapi/shared_impl/tracked_callback.h"
11#include "ppapi/thunk/enter.h"
12#include "ppapi/thunk/ppb_instance_api.h"
13#include "ppapi/thunk/ppb_tcp_socket_api.h"
14#include "ppapi/thunk/resource_creation_api.h"
15#include "ppapi/thunk/thunk.h"
16
17namespace ppapi {
18namespace thunk {
19
20namespace {
21
22PP_Resource Create_1_0(PP_Instance instance) {
23  VLOG(4) << "PPB_TCPSocket::Create_1_0()";
24  EnterResourceCreation enter(instance);
25  if (enter.failed())
26    return 0;
27  return enter.functions()->CreateTCPSocket1_0(instance);
28}
29
30PP_Resource Create(PP_Instance instance) {
31  VLOG(4) << "PPB_TCPSocket::Create()";
32  EnterResourceCreation enter(instance);
33  if (enter.failed())
34    return 0;
35  return enter.functions()->CreateTCPSocket(instance);
36}
37
38PP_Bool IsTCPSocket(PP_Resource resource) {
39  VLOG(4) << "PPB_TCPSocket::IsTCPSocket()";
40  EnterResource<PPB_TCPSocket_API> enter(resource, false);
41  return PP_FromBool(enter.succeeded());
42}
43
44int32_t Bind(PP_Resource tcp_socket,
45             PP_Resource addr,
46             struct PP_CompletionCallback callback) {
47  VLOG(4) << "PPB_TCPSocket::Bind()";
48  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, callback, true);
49  if (enter.failed())
50    return enter.retval();
51  return enter.SetResult(enter.object()->Bind(addr, enter.callback()));
52}
53
54int32_t Connect(PP_Resource tcp_socket,
55                PP_Resource addr,
56                struct PP_CompletionCallback callback) {
57  VLOG(4) << "PPB_TCPSocket::Connect()";
58  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, callback, true);
59  if (enter.failed())
60    return enter.retval();
61  return enter.SetResult(enter.object()->Connect(addr, enter.callback()));
62}
63
64PP_Resource GetLocalAddress(PP_Resource tcp_socket) {
65  VLOG(4) << "PPB_TCPSocket::GetLocalAddress()";
66  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, true);
67  if (enter.failed())
68    return 0;
69  return enter.object()->GetLocalAddress();
70}
71
72PP_Resource GetRemoteAddress(PP_Resource tcp_socket) {
73  VLOG(4) << "PPB_TCPSocket::GetRemoteAddress()";
74  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, true);
75  if (enter.failed())
76    return 0;
77  return enter.object()->GetRemoteAddress();
78}
79
80int32_t Read(PP_Resource tcp_socket,
81             char* buffer,
82             int32_t bytes_to_read,
83             struct PP_CompletionCallback callback) {
84  VLOG(4) << "PPB_TCPSocket::Read()";
85  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, callback, true);
86  if (enter.failed())
87    return enter.retval();
88  return enter.SetResult(enter.object()->Read(buffer,
89                                              bytes_to_read,
90                                              enter.callback()));
91}
92
93int32_t Write(PP_Resource tcp_socket,
94              const char* buffer,
95              int32_t bytes_to_write,
96              struct PP_CompletionCallback callback) {
97  VLOG(4) << "PPB_TCPSocket::Write()";
98  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, callback, true);
99  if (enter.failed())
100    return enter.retval();
101  return enter.SetResult(enter.object()->Write(buffer,
102                                               bytes_to_write,
103                                               enter.callback()));
104}
105
106int32_t Listen(PP_Resource tcp_socket,
107               int32_t backlog,
108               struct PP_CompletionCallback callback) {
109  VLOG(4) << "PPB_TCPSocket::Listen()";
110  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, callback, true);
111  if (enter.failed())
112    return enter.retval();
113  return enter.SetResult(enter.object()->Listen(backlog, enter.callback()));
114}
115
116int32_t Accept(PP_Resource tcp_socket,
117               PP_Resource* accepted_tcp_socket,
118               struct PP_CompletionCallback callback) {
119  VLOG(4) << "PPB_TCPSocket::Accept()";
120  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, callback, true);
121  if (enter.failed())
122    return enter.retval();
123  return enter.SetResult(enter.object()->Accept(accepted_tcp_socket,
124                                                enter.callback()));
125}
126
127void Close(PP_Resource tcp_socket) {
128  VLOG(4) << "PPB_TCPSocket::Close()";
129  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, true);
130  if (enter.failed())
131    return;
132  enter.object()->Close();
133}
134
135int32_t SetOption(PP_Resource tcp_socket,
136                  PP_TCPSocket_Option name,
137                  struct PP_Var value,
138                  struct PP_CompletionCallback callback) {
139  VLOG(4) << "PPB_TCPSocket::SetOption()";
140  EnterResource<PPB_TCPSocket_API> enter(tcp_socket, callback, true);
141  if (enter.failed())
142    return enter.retval();
143  return enter.SetResult(enter.object()->SetOption(name,
144                                                   value,
145                                                   enter.callback()));
146}
147
148const PPB_TCPSocket_1_0 g_ppb_tcpsocket_thunk_1_0 = {
149  &Create_1_0,
150  &IsTCPSocket,
151  &Connect,
152  &GetLocalAddress,
153  &GetRemoteAddress,
154  &Read,
155  &Write,
156  &Close,
157  &SetOption
158};
159
160const PPB_TCPSocket_1_1 g_ppb_tcpsocket_thunk_1_1 = {
161  &Create,
162  &IsTCPSocket,
163  &Bind,
164  &Connect,
165  &GetLocalAddress,
166  &GetRemoteAddress,
167  &Read,
168  &Write,
169  &Listen,
170  &Accept,
171  &Close,
172  &SetOption
173};
174
175}  // namespace
176
177const PPB_TCPSocket_1_0* GetPPB_TCPSocket_1_0_Thunk() {
178  return &g_ppb_tcpsocket_thunk_1_0;
179}
180
181const PPB_TCPSocket_1_1* GetPPB_TCPSocket_1_1_Thunk() {
182  return &g_ppb_tcpsocket_thunk_1_1;
183}
184
185}  // namespace thunk
186}  // namespace ppapi
187