Index: webkit/plugins/ppapi/ppb_transport_impl.cc |
diff --git a/webkit/plugins/ppapi/ppb_transport_impl.cc b/webkit/plugins/ppapi/ppb_transport_impl.cc |
deleted file mode 100644 |
index caa60e41b5aba03f9f72d72c1ed679569f307e5e..0000000000000000000000000000000000000000 |
--- a/webkit/plugins/ppapi/ppb_transport_impl.cc |
+++ /dev/null |
@@ -1,404 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "webkit/plugins/ppapi/ppb_transport_impl.h" |
- |
-#include "base/message_loop.h" |
-#include "base/string_util.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/net_util.h" |
-#include "net/socket/socket.h" |
-#include "ppapi/c/dev/ppb_transport_dev.h" |
-#include "ppapi/c/pp_completion_callback.h" |
-#include "ppapi/c/pp_errors.h" |
-#include "ppapi/shared_impl/callback_tracker.h" |
-#include "ppapi/shared_impl/ppapi_globals.h" |
-#include "ppapi/shared_impl/var.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" |
-#include "webkit/plugins/ppapi/common.h" |
-#include "webkit/plugins/ppapi/plugin_module.h" |
-#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
-#include "webkit/plugins/ppapi/resource_helper.h" |
- |
-using ppapi::StringVar; |
-using ppapi::thunk::PPB_Transport_API; |
-using ppapi::TrackedCallback; |
-using webkit_glue::P2PTransport; |
- |
-namespace webkit { |
-namespace ppapi { |
- |
-namespace { |
- |
-const char kUdpProtocolName[] = "udp"; |
-const char kTcpProtocolName[] = "tcp"; |
- |
-const int kMinBufferSize = 1024; |
-const int kMaxBufferSize = 1024 * 1024; |
-const int kMinAckDelay = 10; |
-const int kMaxAckDelay = 1000; |
- |
-int MapNetError(int result) { |
- if (result > 0) |
- return result; |
- |
- switch (result) { |
- case net::OK: |
- return PP_OK; |
- case net::ERR_IO_PENDING: |
- return PP_OK_COMPLETIONPENDING; |
- case net::ERR_INVALID_ARGUMENT: |
- return PP_ERROR_BADARGUMENT; |
- default: |
- return PP_ERROR_FAILED; |
- } |
-} |
- |
-WebKit::WebFrame* GetFrameForResource(const ::ppapi::Resource* resource) { |
- PluginInstance* plugin_instance = |
- ResourceHelper::GetPluginInstance(resource); |
- if (!plugin_instance) |
- return NULL; |
- return plugin_instance->container()->element().document().frame(); |
-} |
- |
-} // namespace |
- |
-PPB_Transport_Impl::PPB_Transport_Impl(PP_Instance instance) |
- : Resource(::ppapi::OBJECT_IS_IMPL, instance), |
- type_(PP_TRANSPORTTYPE_DATAGRAM), |
- started_(false), |
- writable_(false) { |
-} |
- |
-PPB_Transport_Impl::~PPB_Transport_Impl() { |
-} |
- |
-// static |
-PP_Resource PPB_Transport_Impl::Create(PP_Instance instance, |
- const char* name, |
- PP_TransportType type) { |
- scoped_refptr<PPB_Transport_Impl> t(new PPB_Transport_Impl(instance)); |
- if (!t->Init(name, type)) |
- return 0; |
- return t->GetReference(); |
-} |
- |
-PPB_Transport_API* PPB_Transport_Impl::AsPPB_Transport_API() { |
- return this; |
-} |
- |
-bool PPB_Transport_Impl::Init(const char* name, PP_TransportType type) { |
- name_ = name; |
- |
- if (type != PP_TRANSPORTTYPE_DATAGRAM && type != PP_TRANSPORTTYPE_STREAM) { |
- LOG(WARNING) << "Unknown transport type: " << type; |
- return false; |
- } |
- type_ = type; |
- |
- PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this); |
- if (!plugin_delegate) |
- return false; |
- p2p_transport_.reset(plugin_delegate->CreateP2PTransport()); |
- return p2p_transport_.get() != NULL; |
-} |
- |
-PP_Bool PPB_Transport_Impl::IsWritable() { |
- if (!p2p_transport_.get()) |
- return PP_FALSE; |
- |
- return PP_FromBool(writable_); |
-} |
- |
-int32_t PPB_Transport_Impl::SetProperty(PP_TransportProperty property, |
- PP_Var value) { |
- // SetProperty() may be called only before Connect(). |
- if (started_) |
- return PP_ERROR_FAILED; |
- |
- switch (property) { |
- case PP_TRANSPORTPROPERTY_STUN_SERVER: { |
- StringVar* value_str = StringVar::FromPPVar(value); |
- if (!value_str) |
- return PP_ERROR_BADARGUMENT; |
- if (!net::ParseHostAndPort(value_str->value(), &config_.stun_server, |
- &config_.stun_server_port)) { |
- return PP_ERROR_BADARGUMENT; |
- } |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_RELAY_SERVER: { |
- StringVar* value_str = StringVar::FromPPVar(value); |
- if (!value_str) |
- return PP_ERROR_BADARGUMENT; |
- if (!net::ParseHostAndPort(value_str->value(), &config_.relay_server, |
- &config_.relay_server_port)) { |
- return PP_ERROR_BADARGUMENT; |
- } |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_RELAY_USERNAME: { |
- StringVar* value_str = StringVar::FromPPVar(value); |
- if (!value_str) |
- return PP_ERROR_BADARGUMENT; |
- config_.relay_username = value_str->value(); |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_RELAY_PASSWORD: { |
- StringVar* value_str = StringVar::FromPPVar(value); |
- if (!value_str) |
- return PP_ERROR_BADARGUMENT; |
- config_.relay_password = value_str->value(); |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_RELAY_MODE: { |
- switch (value.value.as_int) { |
- case PP_TRANSPORTRELAYMODE_TURN: |
- config_.legacy_relay = false; |
- break; |
- case PP_TRANSPORTRELAYMODE_GOOGLE: |
- config_.legacy_relay = true; |
- break; |
- default: |
- return PP_ERROR_BADARGUMENT; |
- } |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_TCP_RECEIVE_WINDOW: { |
- if (type_ != PP_TRANSPORTTYPE_STREAM) |
- return PP_ERROR_BADARGUMENT; |
- |
- int32_t int_value = value.value.as_int; |
- if (value.type != PP_VARTYPE_INT32 || int_value < kMinBufferSize || |
- int_value > kMaxBufferSize) { |
- return PP_ERROR_BADARGUMENT; |
- } |
- config_.tcp_receive_window = int_value; |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_TCP_SEND_WINDOW: { |
- if (type_ != PP_TRANSPORTTYPE_STREAM) |
- return PP_ERROR_BADARGUMENT; |
- |
- int32_t int_value = value.value.as_int; |
- if (value.type != PP_VARTYPE_INT32 || int_value < kMinBufferSize || |
- int_value > kMaxBufferSize) { |
- return PP_ERROR_BADARGUMENT; |
- } |
- config_.tcp_send_window = int_value; |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_TCP_NO_DELAY: { |
- if (type_ != PP_TRANSPORTTYPE_STREAM) |
- return PP_ERROR_BADARGUMENT; |
- |
- if (value.type != PP_VARTYPE_BOOL) |
- return PP_ERROR_BADARGUMENT; |
- config_.tcp_no_delay = PP_ToBool(value.value.as_bool); |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_TCP_ACK_DELAY: { |
- if (type_ != PP_TRANSPORTTYPE_STREAM) |
- return PP_ERROR_BADARGUMENT; |
- |
- int32_t int_value = value.value.as_int; |
- if (value.type != PP_VARTYPE_INT32 || int_value < kMinAckDelay || |
- int_value > kMaxAckDelay) { |
- return PP_ERROR_BADARGUMENT; |
- } |
- config_.tcp_ack_delay_ms = int_value; |
- break; |
- } |
- |
- case PP_TRANSPORTPROPERTY_DISABLE_TCP_TRANSPORT: { |
- if (value.type != PP_VARTYPE_BOOL) |
- return PP_ERROR_BADARGUMENT; |
- config_.disable_tcp_transport = PP_ToBool(value.value.as_bool); |
- break; |
- } |
- |
- default: |
- return PP_ERROR_BADARGUMENT; |
- } |
- |
- return PP_OK; |
-} |
- |
-int32_t PPB_Transport_Impl::Connect(PP_CompletionCallback callback) { |
- if (!callback.func) |
- return PP_ERROR_BLOCKS_MAIN_THREAD; |
- if (!p2p_transport_.get()) |
- return PP_ERROR_FAILED; |
- |
- // Connect() has already been called. |
- if (started_) |
- return PP_ERROR_INPROGRESS; |
- |
- P2PTransport::Protocol protocol = (type_ == PP_TRANSPORTTYPE_STREAM) ? |
- P2PTransport::PROTOCOL_TCP : P2PTransport::PROTOCOL_UDP; |
- |
- if (!p2p_transport_->Init( |
- GetFrameForResource(this), name_, protocol, config_, this)) { |
- return PP_ERROR_FAILED; |
- } |
- |
- started_ = true; |
- |
- PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
- if (!plugin_module) |
- return PP_ERROR_FAILED; |
- |
- connect_callback_ = new TrackedCallback(this, callback); |
- return PP_OK_COMPLETIONPENDING; |
-} |
- |
-int32_t PPB_Transport_Impl::GetNextAddress(PP_Var* address, |
- PP_CompletionCallback callback) { |
- if (!callback.func) |
- return PP_ERROR_BLOCKS_MAIN_THREAD; |
- if (!p2p_transport_.get()) |
- return PP_ERROR_FAILED; |
- |
- if (TrackedCallback::IsPending(next_address_callback_)) |
- return PP_ERROR_INPROGRESS; |
- |
- PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
- if (!plugin_module) |
- return PP_ERROR_FAILED; |
- |
- if (!local_candidates_.empty()) { |
- *address = StringVar::StringToPPVar(local_candidates_.front()); |
- local_candidates_.pop_front(); |
- return PP_OK; |
- } |
- |
- next_address_callback_ = new TrackedCallback(this, callback); |
- return PP_OK_COMPLETIONPENDING; |
-} |
- |
-int32_t PPB_Transport_Impl::ReceiveRemoteAddress(PP_Var address) { |
- if (!p2p_transport_.get()) |
- return PP_ERROR_FAILED; |
- |
- StringVar* address_str = StringVar::FromPPVar(address); |
- if (!address_str) |
- return PP_ERROR_BADARGUMENT; |
- |
- return p2p_transport_->AddRemoteCandidate(address_str->value()) ? |
- PP_OK : PP_ERROR_FAILED; |
-} |
- |
-int32_t PPB_Transport_Impl::Recv(void* data, uint32_t len, |
- PP_CompletionCallback callback) { |
- if (!callback.func) |
- return PP_ERROR_BLOCKS_MAIN_THREAD; |
- if (!p2p_transport_.get()) |
- return PP_ERROR_FAILED; |
- |
- if (TrackedCallback::IsPending(recv_callback_)) |
- return PP_ERROR_INPROGRESS; |
- |
- net::Socket* channel = p2p_transport_->GetChannel(); |
- if (!channel) |
- return PP_ERROR_FAILED; |
- |
- PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
- if (!plugin_module) |
- return PP_ERROR_FAILED; |
- |
- scoped_refptr<net::IOBuffer> buffer = |
- new net::WrappedIOBuffer(static_cast<const char*>(data)); |
- int result = MapNetError( |
- channel->Read(buffer, len, base::Bind(&PPB_Transport_Impl::OnRead, |
- base::Unretained(this)))); |
- if (result == PP_OK_COMPLETIONPENDING) |
- recv_callback_ = new TrackedCallback(this, callback); |
- |
- return result; |
-} |
- |
-int32_t PPB_Transport_Impl::Send(const void* data, uint32_t len, |
- PP_CompletionCallback callback) { |
- if (!callback.func) |
- return PP_ERROR_BLOCKS_MAIN_THREAD; |
- if (!p2p_transport_.get()) |
- return PP_ERROR_FAILED; |
- |
- if (TrackedCallback::IsPending(send_callback_)) |
- return PP_ERROR_INPROGRESS; |
- |
- net::Socket* channel = p2p_transport_->GetChannel(); |
- if (!channel) |
- return PP_ERROR_FAILED; |
- |
- PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
- if (!plugin_module) |
- return PP_ERROR_FAILED; |
- |
- scoped_refptr<net::IOBuffer> buffer = |
- new net::WrappedIOBuffer(static_cast<const char*>(data)); |
- int result = MapNetError( |
- channel->Write(buffer, len, base::Bind(&PPB_Transport_Impl::OnWritten, |
- base::Unretained(this)))); |
- if (result == PP_OK_COMPLETIONPENDING) |
- send_callback_ = new TrackedCallback(this, callback); |
- |
- return result; |
-} |
- |
-int32_t PPB_Transport_Impl::Close() { |
- if (!p2p_transport_.get()) |
- return PP_ERROR_FAILED; |
- |
- p2p_transport_.reset(); |
- |
- ::ppapi::PpapiGlobals::Get()->GetCallbackTrackerForInstance( |
- pp_instance())->PostAbortForResource(pp_resource()); |
- return PP_OK; |
-} |
- |
-void PPB_Transport_Impl::OnCandidateReady(const std::string& address) { |
- // Store the candidate first before calling the callback. |
- local_candidates_.push_back(address); |
- |
- if (TrackedCallback::IsPending(next_address_callback_)) |
- TrackedCallback::ClearAndRun(&next_address_callback_, PP_OK); |
-} |
- |
-void PPB_Transport_Impl::OnStateChange(webkit_glue::P2PTransport::State state) { |
- writable_ = (state | webkit_glue::P2PTransport::STATE_WRITABLE) != 0; |
- if (writable_ && TrackedCallback::IsPending(connect_callback_)) |
- TrackedCallback::ClearAndRun(&connect_callback_, PP_OK); |
-} |
- |
-void PPB_Transport_Impl::OnError(int error) { |
- writable_ = false; |
- if (TrackedCallback::IsPending(connect_callback_)) |
- TrackedCallback::ClearAndRun(&connect_callback_, PP_ERROR_FAILED); |
-} |
- |
-void PPB_Transport_Impl::OnRead(int result) { |
- DCHECK(TrackedCallback::IsPending(recv_callback_)); |
- TrackedCallback::ClearAndRun(&recv_callback_, MapNetError(result)); |
-} |
- |
-void PPB_Transport_Impl::OnWritten(int result) { |
- DCHECK(TrackedCallback::IsPending(send_callback_)); |
- TrackedCallback::ClearAndRun(&send_callback_, MapNetError(result)); |
-} |
- |
-} // namespace ppapi |
-} // namespace webkit |