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

Side by Side Diff: ppapi/shared_impl/udp_socket_impl.cc

Issue 8688002: PPB_TCPSocket_Private/PPB_UDPSocket_Private are exposed to Browser (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 9 years, 1 month 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) 2011 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/udp_socket_impl.h"
6
7 #include "base/logging.h"
8 #include "ppapi/c/pp_errors.h"
9
10 namespace ppapi {
11
12 const int32_t UDPSocketImpl::kMaxReadSize = 1024 * 1024;
13 const int32_t UDPSocketImpl::kMaxWriteSize = 1024 * 1024;
14
15 UDPSocketImpl::UDPSocketImpl(const HostResource& resource, uint32 socket_id)
16 : Resource(resource) {
17 Init(socket_id);
18 }
19
20 UDPSocketImpl::UDPSocketImpl(PP_Instance instance, uint32 socket_id)
21 : Resource(instance) {
22 Init(socket_id);
23 }
24
25 UDPSocketImpl::~UDPSocketImpl() {
26 Close();
27 }
28
29 void UDPSocketImpl::Init(uint32 socket_id) {
30 DCHECK(socket_id != 0);
31 socket_id_ = socket_id;
32 binded_ = false;
33 closed_ = false;
34 bind_callback_ = PP_BlockUntilComplete();
35 recvfrom_callback_ = PP_BlockUntilComplete();
36 sendto_callback_ = PP_BlockUntilComplete();
37 read_buffer_ = NULL;
38 bytes_to_read_ = -1;
39
40 recvfrom_addr_.size = 0;
41 memset(recvfrom_addr_.data, 0, sizeof(recvfrom_addr_.data));
42 }
43
44 thunk::PPB_UDPSocket_Private_API*
45 UDPSocketImpl::AsPPB_UDPSocket_Private_API() {
46 return this;
47 }
48
49 int32_t UDPSocketImpl::Bind(const PP_NetAddress_Private* addr,
50 PP_CompletionCallback callback) {
51 if (!addr || !callback.func)
52 return PP_ERROR_BADARGUMENT;
53 if (binded_ || closed_)
54 return PP_ERROR_FAILED;
55 if (bind_callback_.func)
56 return PP_ERROR_INPROGRESS;
57
58 bind_callback_ = callback;
59
60 // Send the request, the browser will call us back via BindACK.
61 SendBind(*addr);
62 return PP_OK_COMPLETIONPENDING;
63 }
64
65 int32_t UDPSocketImpl::RecvFrom(char* buffer,
66 int32_t num_bytes,
67 PP_CompletionCallback callback) {
68 if (!buffer || num_bytes <= 0 || !callback.func)
69 return PP_ERROR_BADARGUMENT;
70 if (!binded_)
71 return PP_ERROR_FAILED;
72 if (recvfrom_callback_.func)
73 return PP_ERROR_INPROGRESS;
74
75 read_buffer_ = buffer;
76 bytes_to_read_ = std::min(num_bytes, kMaxReadSize);
77 recvfrom_callback_ = callback;
78
79 // Send the request, the browser will call us back via RecvFromACK.
80 SendRecvFrom(bytes_to_read_);
81 return PP_OK_COMPLETIONPENDING;
82 }
83
84 PP_Bool UDPSocketImpl::GetRecvFromAddress(PP_NetAddress_Private* addr) {
85 if (!addr)
86 return PP_FALSE;
87
88 *addr = recvfrom_addr_;
89 return PP_TRUE;
90 }
91
92 int32_t UDPSocketImpl::SendTo(const char* buffer,
93 int32_t num_bytes,
94 const PP_NetAddress_Private* addr,
95 PP_CompletionCallback callback) {
96 if (!buffer || num_bytes <= 0 || !addr || !callback.func)
97 return PP_ERROR_BADARGUMENT;
98 if (!binded_)
99 return PP_ERROR_FAILED;
100 if (sendto_callback_.func)
101 return PP_ERROR_INPROGRESS;
102
103 if (num_bytes > kMaxWriteSize)
104 num_bytes = kMaxWriteSize;
105
106 sendto_callback_ = callback;
107
108 // Send the request, the browser will call us back via SendToACK.
109 SendSendTo(std::string(buffer, num_bytes), *addr);
110 return PP_OK_COMPLETIONPENDING;
111 }
112
113 void UDPSocketImpl::Close() {
114 if(closed_)
115 return;
116
117 binded_ = false;
118 closed_ = true;
119
120 SendClose();
121
122 socket_id_ = 0;
123
124 PostAbortAndClearIfNecessary(&bind_callback_);
125 PostAbortAndClearIfNecessary(&recvfrom_callback_);
126 PostAbortAndClearIfNecessary(&sendto_callback_);
127 }
128
129 void UDPSocketImpl::OnBindCompleted(bool succeeded) {
130 if (!bind_callback_.func) {
131 NOTREACHED();
132 return;
133 }
134
135 if (succeeded)
136 binded_ = true;
137
138 PP_RunAndClearCompletionCallback(&bind_callback_,
139 succeeded ? PP_OK : PP_ERROR_FAILED);
140 }
141
142 void UDPSocketImpl::OnRecvFromCompleted(bool succeeded,
143 const std::string& data,
144 const PP_NetAddress_Private& addr) {
145 if (!recvfrom_callback_.func || !read_buffer_) {
146 NOTREACHED();
147 return;
148 }
149
150 if (succeeded) {
151 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_);
152 if (!data.empty())
153 memcpy(read_buffer_, data.c_str(), data.size());
154 }
155 read_buffer_ = NULL;
156 bytes_to_read_ = -1;
157 recvfrom_addr_ = addr;
158
159 PP_RunAndClearCompletionCallback(
160 &recvfrom_callback_,
161 succeeded ? static_cast<int32_t>(data.size()) :
162 static_cast<int32_t>(PP_ERROR_FAILED));
163 }
164
165 void UDPSocketImpl::OnSendToCompleted(bool succeeded, int32_t bytes_written) {
166 if (!sendto_callback_.func) {
167 NOTREACHED();
168 return;
169 }
170
171 PP_RunAndClearCompletionCallback(
172 &sendto_callback_,
173 succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED));
174 }
175
176 void UDPSocketImpl::PostAbortAndClearIfNecessary(
177 PP_CompletionCallback* callback) {
178 DCHECK(callback);
179
180 if (callback->func) {
181 PostAbort(*callback);
182 *callback = PP_BlockUntilComplete();
183 }
184 }
185
186 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698