Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: ppapi/shared_impl/private/tcp_server_socket_private_impl.cc

Issue 9283022: Exposed Listen and Accept methods to plugin. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Added shared declaration of GetPPB_TCPServerSocketPrivate_0_1_Thunk. Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 "ppapi/shared_impl/private/tcp_server_socket_private_impl.h"
6
7 #include <cstddef>
8
9 #include "base/logging.h"
10 #include "base/message_loop.h"
11 #include "ppapi/c/pp_errors.h"
12
13 namespace ppapi {
14
15 TCPServerSocketPrivateImpl::TCPServerSocketPrivateImpl(PP_Instance instance,
16 uint32 socket_id)
17 : Resource(instance), instance_(instance) {
18 Init(socket_id);
19 }
20
21 TCPServerSocketPrivateImpl::TCPServerSocketPrivateImpl(
22 const HostResource& resource,
23 uint32 socket_id)
24 : Resource(resource), instance_(0) {
25 Init(socket_id);
26 }
27
28 TCPServerSocketPrivateImpl::~TCPServerSocketPrivateImpl() {
29 }
30
31 thunk::PPB_TCPServerSocket_Private_API*
32 TCPServerSocketPrivateImpl::AsPPB_TCPServerSocket_Private_API() {
33 return this;
34 }
35
36 int32_t TCPServerSocketPrivateImpl::Listen(const PP_NetAddress_Private* addr,
37 int32_t backlog,
38 PP_CompletionCallback callback) {
39 if (!addr)
40 return PP_ERROR_BADARGUMENT;
41 if (!callback.func)
42 return PP_ERROR_BLOCKS_MAIN_THREAD;
43 if (state_ != BEFORE_LISTENING)
44 return PP_ERROR_FAILED;
45 if (TrackedCallback::IsPending(listen_callback_))
46 return PP_ERROR_INPROGRESS; // Can only have one pending request.
47
48 listen_callback_ = new TrackedCallback(this, callback);
49 // Send the request, the browser will call us back via ListenACK
50 SendListen(*addr, backlog);
51 return PP_OK_COMPLETIONPENDING;
52 }
53
54 int32_t TCPServerSocketPrivateImpl::Accept(char* tcp_socket,
55 PP_CompletionCallback callback) {
56 if (!tcp_socket)
57 return PP_ERROR_BADARGUMENT;
58 if (!callback.func)
59 return PP_ERROR_BLOCKS_MAIN_THREAD;
60
61 if (state_ != LISTENING)
62 return PP_ERROR_FAILED;
63 if (TrackedCallback::IsPending(accept_callback_))
64 return PP_ERROR_INPROGRESS;
65
66 tcp_socket_buffer_ = tcp_socket;
67 accept_callback_ = new TrackedCallback(this, callback);
68
69 SendAccept();
70 return PP_OK_COMPLETIONPENDING;
71 }
72
73 void TCPServerSocketPrivateImpl::StopListening() {
74 if (state_ == CLOSED)
75 return;
76
77 state_ = CLOSED;
78
79 SendStopListening();
80 socket_id_ = 0;
81
82 PostAbortAndClearIfNecessary(&listen_callback_);
83 PostAbortAndClearIfNecessary(&accept_callback_);
84 tcp_socket_buffer_ = NULL;
85 }
86
87 void TCPServerSocketPrivateImpl::OnListenCompleted(bool succeeded) {
88 if (state_ != BEFORE_LISTENING ||
89 !TrackedCallback::IsPending(listen_callback_)) {
90 NOTREACHED();
91 return;
92 }
93
94 if (succeeded)
95 state_ = LISTENING;
96
97 TrackedCallback::ClearAndRun(&listen_callback_,
98 succeeded ? PP_OK : PP_ERROR_FAILED);
99 }
100
101 void TCPServerSocketPrivateImpl::Init(uint32 socket_id) {
102 DCHECK(socket_id != 0);
103
104 socket_id_ = socket_id;
105 state_ = BEFORE_LISTENING;
106 tcp_socket_buffer_ = NULL;
107 }
108
109 void TCPServerSocketPrivateImpl::PostAbortAndClearIfNecessary(
110 scoped_refptr<TrackedCallback>* callback) {
111 if (callback->get())
112 (*callback)->PostAbort();
113 }
114
115 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698