1 // Copyright (c) 2012 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 <stdint.h>
6 
7 #include "ppapi/c/pp_errors.h"
8 #include "ppapi/c/private/ppb_tcp_server_socket_private.h"
9 #include "ppapi/shared_impl/tracked_callback.h"
10 #include "ppapi/thunk/enter.h"
11 #include "ppapi/thunk/ppb_tcp_server_socket_private_api.h"
12 #include "ppapi/thunk/resource_creation_api.h"
13 #include "ppapi/thunk/thunk.h"
14 
15 namespace ppapi {
16 namespace thunk {
17 
18 namespace {
19 
20 typedef EnterResource<PPB_TCPServerSocket_Private_API> EnterTCPServer;
21 
Create(PP_Instance instance)22 PP_Resource Create(PP_Instance instance) {
23   EnterResourceCreation enter(instance);
24   if (enter.failed())
25     return 0;
26   return enter.functions()->CreateTCPServerSocketPrivate(instance);
27 }
28 
IsTCPServerSocket(PP_Resource resource)29 PP_Bool IsTCPServerSocket(PP_Resource resource) {
30   EnterTCPServer enter(resource, false);
31   return PP_FromBool(enter.succeeded());
32 }
33 
Listen(PP_Resource tcp_server_socket,const PP_NetAddress_Private * addr,int32_t backlog,PP_CompletionCallback callback)34 int32_t Listen(PP_Resource tcp_server_socket,
35                const PP_NetAddress_Private* addr,
36                int32_t backlog,
37                PP_CompletionCallback callback) {
38   EnterTCPServer enter(tcp_server_socket, callback, true);
39   if (enter.failed())
40     return enter.retval();
41   return enter.SetResult(enter.object()->Listen(addr, backlog,
42                                                 enter.callback()));
43 }
44 
Accept(PP_Resource tcp_server_socket,PP_Resource * tcp_socket,PP_CompletionCallback callback)45 int32_t Accept(PP_Resource tcp_server_socket,
46                PP_Resource* tcp_socket,
47                PP_CompletionCallback callback) {
48   EnterTCPServer enter(tcp_server_socket, callback, true);
49   if (enter.failed())
50     return enter.retval();
51   return enter.SetResult(enter.object()->Accept(tcp_socket, enter.callback()));
52 }
53 
GetLocalAddress(PP_Resource tcp_server_socket,PP_NetAddress_Private * addr)54 int32_t GetLocalAddress(PP_Resource tcp_server_socket,
55                         PP_NetAddress_Private* addr) {
56   EnterTCPServer enter(tcp_server_socket, true);
57   if (enter.failed())
58     return PP_ERROR_BADRESOURCE;
59   return enter.object()->GetLocalAddress(addr);
60 }
61 
StopListening(PP_Resource tcp_server_socket)62 void StopListening(PP_Resource tcp_server_socket) {
63   EnterTCPServer enter(tcp_server_socket, true);
64   if (enter.succeeded())
65     enter.object()->StopListening();
66 }
67 
68 const PPB_TCPServerSocket_Private_0_1 g_ppb_tcp_server_socket_thunk_0_1 = {
69   Create,
70   IsTCPServerSocket,
71   Listen,
72   Accept,
73   StopListening
74 };
75 
76 const PPB_TCPServerSocket_Private_0_2 g_ppb_tcp_server_socket_thunk_0_2 = {
77   Create,
78   IsTCPServerSocket,
79   Listen,
80   Accept,
81   GetLocalAddress,
82   StopListening,
83 };
84 
85 }  // namespace
86 
87 const PPB_TCPServerSocket_Private_0_1*
GetPPB_TCPServerSocket_Private_0_1_Thunk()88 GetPPB_TCPServerSocket_Private_0_1_Thunk() {
89   return &g_ppb_tcp_server_socket_thunk_0_1;
90 }
91 
92 const PPB_TCPServerSocket_Private_0_2*
GetPPB_TCPServerSocket_Private_0_2_Thunk()93 GetPPB_TCPServerSocket_Private_0_2_Thunk() {
94   return &g_ppb_tcp_server_socket_thunk_0_2;
95 }
96 
97 }  // namespace thunk
98 }  // namespace ppapi
99