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 17 namespace ppapi { 18 namespace thunk { 19 20 namespace { 21 22 PP_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 30 PP_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 38 PP_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 44 int32_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 54 int32_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 64 PP_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 72 PP_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 80 int32_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 93 int32_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 106 int32_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 116 int32_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 127 void 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 135 int32_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 148 const 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 160 const 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 177 const PPB_TCPSocket_1_0* GetPPB_TCPSocket_1_0_Thunk() { 178 return &g_ppb_tcpsocket_thunk_1_0; 179 } 180 181 const 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