summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-02 17:28:10 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-02 17:28:10 +0000
commit26d912d33fc645ff2499e3537adad66d46e76b33 (patch)
tree809d8c79564ba2d697b608347cabcf24a8e8857b /webkit
parentc0022e306a82f29b471bc5d0e7700030de3f9cc5 (diff)
downloadchromium_src-26d912d33fc645ff2499e3537adad66d46e76b33.zip
chromium_src-26d912d33fc645ff2499e3537adad66d46e76b33.tar.gz
chromium_src-26d912d33fc645ff2499e3537adad66d46e76b33.tar.bz2
Implement PseudoTCP support in P2P Transport Pepper API.
BUG=None TEST=Unittests Review URL: http://codereview.chromium.org/6893101 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@83736 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r--webkit/glue/p2p_transport.h11
-rw-r--r--webkit/plugins/ppapi/ppb_transport_impl.cc33
-rw-r--r--webkit/plugins/ppapi/ppb_transport_impl.h3
3 files changed, 42 insertions, 5 deletions
diff --git a/webkit/glue/p2p_transport.h b/webkit/glue/p2p_transport.h
index e80ffb5..2c3200f 100644
--- a/webkit/glue/p2p_transport.h
+++ b/webkit/glue/p2p_transport.h
@@ -22,6 +22,11 @@ class P2PTransport {
STATE_READABLE = 2,
};
+ enum Protocol {
+ PROTOCOL_UDP = 0,
+ PROTOCOL_TCP = 1,
+ };
+
class EventHandler {
public:
virtual ~EventHandler() {}
@@ -31,6 +36,11 @@ class P2PTransport {
// Called when readable of writable state of the stream changes.
virtual void OnStateChange(State state) = 0;
+
+ // Called when an error occures (e.g. TCP handshake
+ // failed). P2PTransport object is not usable after that and
+ // should be destroyed.
+ virtual void OnError(int error) = 0;
};
virtual ~P2PTransport() {}
@@ -38,6 +48,7 @@ class P2PTransport {
// Initialize transport using specified configuration. Returns true
// if initialization succeeded.
virtual bool Init(const std::string& name,
+ Protocol protocol,
const std::string& config,
EventHandler* event_handler) = 0;
diff --git a/webkit/plugins/ppapi/ppb_transport_impl.cc b/webkit/plugins/ppapi/ppb_transport_impl.cc
index 3f48721..a37f299 100644
--- a/webkit/plugins/ppapi/ppb_transport_impl.cc
+++ b/webkit/plugins/ppapi/ppb_transport_impl.cc
@@ -5,6 +5,7 @@
#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/socket/socket.h"
@@ -16,11 +17,16 @@
#include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
#include "webkit/plugins/ppapi/var.h"
+using webkit_glue::P2PTransport;
+
namespace webkit {
namespace ppapi {
namespace {
+const char kUdpProtocolName[] = "udp";
+const char kTcpProtocolName[] = "tcp";
+
PP_Resource CreateTransport(PP_Instance instance_id, const char* name,
const char* proto) {
PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id);
@@ -137,7 +143,16 @@ PPB_Transport_Impl* PPB_Transport_Impl::AsPPB_Transport_Impl() {
bool PPB_Transport_Impl::Init(const char* name, const char* proto) {
name_ = name;
- proto_ = proto;
+
+ if (base::strcasecmp(proto, kUdpProtocolName) == 0) {
+ use_tcp_ = false;
+ } else if (base::strcasecmp(proto, kTcpProtocolName) == 0) {
+ use_tcp_ = true;
+ } else {
+ LOG(WARNING) << "Unknown protocol: " << proto;
+ return false;
+ }
+
p2p_transport_.reset(instance()->delegate()->CreateP2PTransport());
return p2p_transport_.get() != NULL;
}
@@ -153,13 +168,14 @@ int32_t PPB_Transport_Impl::Connect(PP_CompletionCallback callback) {
if (!p2p_transport_.get())
return PP_ERROR_FAILED;
- // TODO(sergeyu): Use |proto_| here.
-
// Connect() has already been called.
if (started_)
return PP_ERROR_INPROGRESS;
- if (!p2p_transport_->Init(name_, "", this))
+ P2PTransport::Protocol protocol = use_tcp_ ?
+ P2PTransport::PROTOCOL_TCP : P2PTransport::PROTOCOL_UDP;
+
+ if (!p2p_transport_->Init(name_, protocol, "", this))
return PP_ERROR_FAILED;
started_ = true;
@@ -285,6 +301,15 @@ void PPB_Transport_Impl::OnStateChange(webkit_glue::P2PTransport::State state) {
}
}
+void PPB_Transport_Impl::OnError(int error) {
+ writable_ = false;
+ if (connect_callback_.get() && !connect_callback_->completed()) {
+ scoped_refptr<TrackedCompletionCallback> callback;
+ callback.swap(connect_callback_);
+ callback->Run(PP_ERROR_FAILED);
+ }
+}
+
void PPB_Transport_Impl::OnRead(int result) {
DCHECK(recv_callback_.get() && !recv_callback_->completed());
diff --git a/webkit/plugins/ppapi/ppb_transport_impl.h b/webkit/plugins/ppapi/ppb_transport_impl.h
index c368b07..ca4818f 100644
--- a/webkit/plugins/ppapi/ppb_transport_impl.h
+++ b/webkit/plugins/ppapi/ppb_transport_impl.h
@@ -43,13 +43,14 @@ class PPB_Transport_Impl : public Resource,
// webkit_glue::P2PTransport::EventHandler implementation.
virtual void OnCandidateReady(const std::string& address) OVERRIDE;
virtual void OnStateChange(webkit_glue::P2PTransport::State state) OVERRIDE;
+ virtual void OnError(int error) OVERRIDE;
private:
void OnRead(int result);
void OnWritten(int result);
std::string name_;
- std::string proto_;
+ bool use_tcp_;
bool started_;
scoped_ptr<webkit_glue::P2PTransport> p2p_transport_;
bool writable_;