OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/plugins/ppapi/ppb_transport_impl.h" | 5 #include "webkit/plugins/ppapi/ppb_transport_impl.h" |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
11 #include "net/socket/socket.h" | 11 #include "net/socket/socket.h" |
12 #include "ppapi/c/dev/ppb_transport_dev.h" | 12 #include "ppapi/c/dev/ppb_transport_dev.h" |
13 #include "ppapi/c/pp_completion_callback.h" | 13 #include "ppapi/c/pp_completion_callback.h" |
14 #include "ppapi/c/pp_errors.h" | 14 #include "ppapi/c/pp_errors.h" |
15 #include "ppapi/shared_impl/var.h" | 15 #include "ppapi/shared_impl/var.h" |
16 #include "webkit/plugins/ppapi/common.h" | 16 #include "webkit/plugins/ppapi/common.h" |
17 #include "webkit/plugins/ppapi/plugin_module.h" | 17 #include "webkit/plugins/ppapi/plugin_module.h" |
18 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 18 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
| 19 #include "webkit/plugins/ppapi/resource_helper.h" |
19 | 20 |
20 using ppapi::StringVar; | 21 using ppapi::StringVar; |
21 using ppapi::thunk::PPB_Transport_API; | 22 using ppapi::thunk::PPB_Transport_API; |
22 using webkit_glue::P2PTransport; | 23 using webkit_glue::P2PTransport; |
23 | 24 |
24 namespace webkit { | 25 namespace webkit { |
25 namespace ppapi { | 26 namespace ppapi { |
26 | 27 |
27 namespace { | 28 namespace { |
28 | 29 |
(...skipping 11 matching lines...) Expand all Loading... |
40 return PP_OK_COMPLETIONPENDING; | 41 return PP_OK_COMPLETIONPENDING; |
41 case net::ERR_INVALID_ARGUMENT: | 42 case net::ERR_INVALID_ARGUMENT: |
42 return PP_ERROR_BADARGUMENT; | 43 return PP_ERROR_BADARGUMENT; |
43 default: | 44 default: |
44 return PP_ERROR_FAILED; | 45 return PP_ERROR_FAILED; |
45 } | 46 } |
46 } | 47 } |
47 | 48 |
48 } // namespace | 49 } // namespace |
49 | 50 |
50 PPB_Transport_Impl::PPB_Transport_Impl(PluginInstance* instance) | 51 PPB_Transport_Impl::PPB_Transport_Impl(PP_Instance instance) |
51 : Resource(instance), | 52 : Resource(instance), |
52 started_(false), | 53 started_(false), |
53 writable_(false), | 54 writable_(false), |
54 ALLOW_THIS_IN_INITIALIZER_LIST( | 55 ALLOW_THIS_IN_INITIALIZER_LIST( |
55 channel_write_callback_(this, &PPB_Transport_Impl::OnWritten)), | 56 channel_write_callback_(this, &PPB_Transport_Impl::OnWritten)), |
56 ALLOW_THIS_IN_INITIALIZER_LIST( | 57 ALLOW_THIS_IN_INITIALIZER_LIST( |
57 channel_read_callback_(this, &PPB_Transport_Impl::OnRead)) { | 58 channel_read_callback_(this, &PPB_Transport_Impl::OnRead)) { |
58 } | 59 } |
59 | 60 |
60 PPB_Transport_Impl::~PPB_Transport_Impl() { | 61 PPB_Transport_Impl::~PPB_Transport_Impl() { |
61 } | 62 } |
62 | 63 |
63 // static | 64 // static |
64 PP_Resource PPB_Transport_Impl::Create(PluginInstance* instance, | 65 PP_Resource PPB_Transport_Impl::Create(PP_Instance instance, |
65 const char* name, | 66 const char* name, |
66 const char* proto) { | 67 const char* proto) { |
67 scoped_refptr<PPB_Transport_Impl> t(new PPB_Transport_Impl(instance)); | 68 scoped_refptr<PPB_Transport_Impl> t(new PPB_Transport_Impl(instance)); |
68 if (!t->Init(name, proto)) | 69 if (!t->Init(name, proto)) |
69 return 0; | 70 return 0; |
70 return t->GetReference(); | 71 return t->GetReference(); |
71 } | 72 } |
72 | 73 |
73 PPB_Transport_API* PPB_Transport_Impl::AsPPB_Transport_API() { | 74 PPB_Transport_API* PPB_Transport_Impl::AsPPB_Transport_API() { |
74 return this; | 75 return this; |
75 } | 76 } |
76 | 77 |
77 bool PPB_Transport_Impl::Init(const char* name, const char* proto) { | 78 bool PPB_Transport_Impl::Init(const char* name, const char* proto) { |
78 name_ = name; | 79 name_ = name; |
79 | 80 |
80 if (base::strcasecmp(proto, kUdpProtocolName) == 0) { | 81 if (base::strcasecmp(proto, kUdpProtocolName) == 0) { |
81 use_tcp_ = false; | 82 use_tcp_ = false; |
82 } else if (base::strcasecmp(proto, kTcpProtocolName) == 0) { | 83 } else if (base::strcasecmp(proto, kTcpProtocolName) == 0) { |
83 use_tcp_ = true; | 84 use_tcp_ = true; |
84 } else { | 85 } else { |
85 LOG(WARNING) << "Unknown protocol: " << proto; | 86 LOG(WARNING) << "Unknown protocol: " << proto; |
86 return false; | 87 return false; |
87 } | 88 } |
88 | 89 |
89 p2p_transport_.reset(instance()->delegate()->CreateP2PTransport()); | 90 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this); |
| 91 if (!plugin_delegate) |
| 92 return false; |
| 93 p2p_transport_.reset(plugin_delegate->CreateP2PTransport()); |
90 return p2p_transport_.get() != NULL; | 94 return p2p_transport_.get() != NULL; |
91 } | 95 } |
92 | 96 |
93 PP_Bool PPB_Transport_Impl::IsWritable() { | 97 PP_Bool PPB_Transport_Impl::IsWritable() { |
94 if (!p2p_transport_.get()) | 98 if (!p2p_transport_.get()) |
95 return PP_FALSE; | 99 return PP_FALSE; |
96 | 100 |
97 return PP_FromBool(writable_); | 101 return PP_FromBool(writable_); |
98 } | 102 } |
99 | 103 |
100 int32_t PPB_Transport_Impl::Connect(PP_CompletionCallback callback) { | 104 int32_t PPB_Transport_Impl::Connect(PP_CompletionCallback callback) { |
101 if (!p2p_transport_.get()) | 105 if (!p2p_transport_.get()) |
102 return PP_ERROR_FAILED; | 106 return PP_ERROR_FAILED; |
103 | 107 |
104 // Connect() has already been called. | 108 // Connect() has already been called. |
105 if (started_) | 109 if (started_) |
106 return PP_ERROR_INPROGRESS; | 110 return PP_ERROR_INPROGRESS; |
107 | 111 |
108 P2PTransport::Protocol protocol = use_tcp_ ? | 112 P2PTransport::Protocol protocol = use_tcp_ ? |
109 P2PTransport::PROTOCOL_TCP : P2PTransport::PROTOCOL_UDP; | 113 P2PTransport::PROTOCOL_TCP : P2PTransport::PROTOCOL_UDP; |
110 | 114 |
111 if (!p2p_transport_->Init(name_, protocol, "", this)) | 115 if (!p2p_transport_->Init(name_, protocol, "", this)) |
112 return PP_ERROR_FAILED; | 116 return PP_ERROR_FAILED; |
113 | 117 |
114 started_ = true; | 118 started_ = true; |
115 | 119 |
| 120 PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
| 121 if (!plugin_module) |
| 122 return PP_ERROR_FAILED; |
| 123 |
116 connect_callback_ = new TrackedCompletionCallback( | 124 connect_callback_ = new TrackedCompletionCallback( |
117 instance()->module()->GetCallbackTracker(), pp_resource(), callback); | 125 plugin_module->GetCallbackTracker(), pp_resource(), callback); |
118 return PP_OK_COMPLETIONPENDING; | 126 return PP_OK_COMPLETIONPENDING; |
119 } | 127 } |
120 | 128 |
121 int32_t PPB_Transport_Impl::GetNextAddress(PP_Var* address, | 129 int32_t PPB_Transport_Impl::GetNextAddress(PP_Var* address, |
122 PP_CompletionCallback callback) { | 130 PP_CompletionCallback callback) { |
123 if (!p2p_transport_.get()) | 131 if (!p2p_transport_.get()) |
124 return PP_ERROR_FAILED; | 132 return PP_ERROR_FAILED; |
125 | 133 |
126 if (next_address_callback_.get() && !next_address_callback_->completed()) | 134 if (next_address_callback_.get() && !next_address_callback_->completed()) |
127 return PP_ERROR_INPROGRESS; | 135 return PP_ERROR_INPROGRESS; |
128 | 136 |
| 137 PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
| 138 if (!plugin_module) |
| 139 return PP_ERROR_FAILED; |
| 140 |
129 if (!local_candidates_.empty()) { | 141 if (!local_candidates_.empty()) { |
130 *address = StringVar::StringToPPVar(instance()->module()->pp_module(), | 142 *address = StringVar::StringToPPVar(plugin_module->pp_module(), |
131 local_candidates_.front()); | 143 local_candidates_.front()); |
132 local_candidates_.pop_front(); | 144 local_candidates_.pop_front(); |
133 return PP_OK; | 145 return PP_OK; |
134 } | 146 } |
135 | 147 |
136 next_address_callback_ = new TrackedCompletionCallback( | 148 next_address_callback_ = new TrackedCompletionCallback( |
137 instance()->module()->GetCallbackTracker(), pp_resource(), callback); | 149 plugin_module->GetCallbackTracker(), pp_resource(), callback); |
138 return PP_OK_COMPLETIONPENDING; | 150 return PP_OK_COMPLETIONPENDING; |
139 } | 151 } |
140 | 152 |
141 int32_t PPB_Transport_Impl::ReceiveRemoteAddress(PP_Var address) { | 153 int32_t PPB_Transport_Impl::ReceiveRemoteAddress(PP_Var address) { |
142 if (!p2p_transport_.get()) | 154 if (!p2p_transport_.get()) |
143 return PP_ERROR_FAILED; | 155 return PP_ERROR_FAILED; |
144 | 156 |
145 StringVar* address_str = StringVar::FromPPVar(address); | 157 StringVar* address_str = StringVar::FromPPVar(address); |
146 if (!address_str) | 158 if (!address_str) |
147 return PP_ERROR_BADARGUMENT; | 159 return PP_ERROR_BADARGUMENT; |
148 | 160 |
149 return p2p_transport_->AddRemoteCandidate(address_str->value()) ? | 161 return p2p_transport_->AddRemoteCandidate(address_str->value()) ? |
150 PP_OK : PP_ERROR_FAILED; | 162 PP_OK : PP_ERROR_FAILED; |
151 } | 163 } |
152 | 164 |
153 int32_t PPB_Transport_Impl::Recv(void* data, uint32_t len, | 165 int32_t PPB_Transport_Impl::Recv(void* data, uint32_t len, |
154 PP_CompletionCallback callback) { | 166 PP_CompletionCallback callback) { |
155 if (!p2p_transport_.get()) | 167 if (!p2p_transport_.get()) |
156 return PP_ERROR_FAILED; | 168 return PP_ERROR_FAILED; |
157 | 169 |
158 if (recv_callback_.get() && !recv_callback_->completed()) | 170 if (recv_callback_.get() && !recv_callback_->completed()) |
159 return PP_ERROR_INPROGRESS; | 171 return PP_ERROR_INPROGRESS; |
160 | 172 |
161 net::Socket* channel = p2p_transport_->GetChannel(); | 173 net::Socket* channel = p2p_transport_->GetChannel(); |
162 if (!channel) | 174 if (!channel) |
163 return PP_ERROR_FAILED; | 175 return PP_ERROR_FAILED; |
164 | 176 |
| 177 PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
| 178 if (!plugin_module) |
| 179 return PP_ERROR_FAILED; |
| 180 |
165 scoped_refptr<net::IOBuffer> buffer = | 181 scoped_refptr<net::IOBuffer> buffer = |
166 new net::WrappedIOBuffer(static_cast<const char*>(data)); | 182 new net::WrappedIOBuffer(static_cast<const char*>(data)); |
167 int result = MapNetError(channel->Read(buffer, len, &channel_read_callback_)); | 183 int result = MapNetError(channel->Read(buffer, len, &channel_read_callback_)); |
168 if (result == PP_OK_COMPLETIONPENDING) { | 184 if (result == PP_OK_COMPLETIONPENDING) { |
169 recv_callback_ = new TrackedCompletionCallback( | 185 recv_callback_ = new TrackedCompletionCallback( |
170 instance()->module()->GetCallbackTracker(), pp_resource(), callback); | 186 plugin_module->GetCallbackTracker(), pp_resource(), callback); |
171 } | 187 } |
172 | 188 |
173 return result; | 189 return result; |
174 } | 190 } |
175 | 191 |
176 int32_t PPB_Transport_Impl::Send(const void* data, uint32_t len, | 192 int32_t PPB_Transport_Impl::Send(const void* data, uint32_t len, |
177 PP_CompletionCallback callback) { | 193 PP_CompletionCallback callback) { |
178 if (!p2p_transport_.get()) | 194 if (!p2p_transport_.get()) |
179 return PP_ERROR_FAILED; | 195 return PP_ERROR_FAILED; |
180 | 196 |
181 if (send_callback_.get() && !send_callback_->completed()) | 197 if (send_callback_.get() && !send_callback_->completed()) |
182 return PP_ERROR_INPROGRESS; | 198 return PP_ERROR_INPROGRESS; |
183 | 199 |
184 net::Socket* channel = p2p_transport_->GetChannel(); | 200 net::Socket* channel = p2p_transport_->GetChannel(); |
185 if (!channel) | 201 if (!channel) |
186 return PP_ERROR_FAILED; | 202 return PP_ERROR_FAILED; |
187 | 203 |
| 204 PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
| 205 if (!plugin_module) |
| 206 return PP_ERROR_FAILED; |
| 207 |
188 scoped_refptr<net::IOBuffer> buffer = | 208 scoped_refptr<net::IOBuffer> buffer = |
189 new net::WrappedIOBuffer(static_cast<const char*>(data)); | 209 new net::WrappedIOBuffer(static_cast<const char*>(data)); |
190 int result = MapNetError(channel->Write(buffer, len, | 210 int result = MapNetError(channel->Write(buffer, len, |
191 &channel_write_callback_)); | 211 &channel_write_callback_)); |
192 if (result == PP_OK_COMPLETIONPENDING) { | 212 if (result == PP_OK_COMPLETIONPENDING) { |
193 send_callback_ = new TrackedCompletionCallback( | 213 send_callback_ = new TrackedCompletionCallback( |
194 instance()->module()->GetCallbackTracker(), pp_resource(), callback); | 214 plugin_module->GetCallbackTracker(), pp_resource(), callback); |
195 } | 215 } |
196 | 216 |
197 return result; | 217 return result; |
198 } | 218 } |
199 | 219 |
200 int32_t PPB_Transport_Impl::Close() { | 220 int32_t PPB_Transport_Impl::Close() { |
201 if (!p2p_transport_.get()) | 221 if (!p2p_transport_.get()) |
202 return PP_ERROR_FAILED; | 222 return PP_ERROR_FAILED; |
203 | 223 |
204 p2p_transport_.reset(); | 224 p2p_transport_.reset(); |
205 instance()->module()->GetCallbackTracker()->AbortAll(); | 225 |
| 226 |
| 227 PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
| 228 if (plugin_module) |
| 229 plugin_module->GetCallbackTracker()->AbortAll(); |
206 return PP_OK; | 230 return PP_OK; |
207 } | 231 } |
208 | 232 |
209 void PPB_Transport_Impl::OnCandidateReady(const std::string& address) { | 233 void PPB_Transport_Impl::OnCandidateReady(const std::string& address) { |
210 // Store the candidate first before calling the callback. | 234 // Store the candidate first before calling the callback. |
211 local_candidates_.push_back(address); | 235 local_candidates_.push_back(address); |
212 | 236 |
213 if (next_address_callback_.get() && !next_address_callback_->completed()) { | 237 if (next_address_callback_.get() && !next_address_callback_->completed()) { |
214 scoped_refptr<TrackedCompletionCallback> callback; | 238 scoped_refptr<TrackedCompletionCallback> callback; |
215 callback.swap(next_address_callback_); | 239 callback.swap(next_address_callback_); |
(...skipping 30 matching lines...) Expand all Loading... |
246 void PPB_Transport_Impl::OnWritten(int result) { | 270 void PPB_Transport_Impl::OnWritten(int result) { |
247 DCHECK(send_callback_.get() && !send_callback_->completed()); | 271 DCHECK(send_callback_.get() && !send_callback_->completed()); |
248 | 272 |
249 scoped_refptr<TrackedCompletionCallback> callback; | 273 scoped_refptr<TrackedCompletionCallback> callback; |
250 callback.swap(send_callback_); | 274 callback.swap(send_callback_); |
251 callback->Run(MapNetError(result)); | 275 callback->Run(MapNetError(result)); |
252 } | 276 } |
253 | 277 |
254 } // namespace ppapi | 278 } // namespace ppapi |
255 } // namespace webkit | 279 } // namespace webkit |
OLD | NEW |