Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / ipc / ipc_channel_proxy.cc
index 7441c65..2ea722d 100644 (file)
@@ -11,6 +11,7 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/single_thread_task_runner.h"
 #include "base/thread_task_runner_handle.h"
+#include "ipc/ipc_channel_factory.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_logging.h"
 #include "ipc/ipc_message_macros.h"
@@ -48,11 +49,10 @@ void ChannelProxy::Context::ClearIPCTaskRunner() {
   ipc_task_runner_ = NULL;
 }
 
-void ChannelProxy::Context::CreateChannel(const IPC::ChannelHandle& handle,
-                                          const Channel::Mode& mode) {
+void ChannelProxy::Context::CreateChannel(scoped_ptr<ChannelFactory> factory) {
   DCHECK(!channel_);
-  channel_id_ = handle.name;
-  channel_ = Channel::Create(handle, mode, this);
+  channel_id_ = factory->GetName();
+  channel_ = factory->BuildChannel(this);
 }
 
 bool ChannelProxy::Context::TryFilters(const Message& message) {
@@ -315,6 +315,16 @@ scoped_ptr<ChannelProxy> ChannelProxy::Create(
   return channel.Pass();
 }
 
+// static
+scoped_ptr<ChannelProxy> ChannelProxy::Create(
+    scoped_ptr<ChannelFactory> factory,
+    Listener* listener,
+    base::SingleThreadTaskRunner* ipc_task_runner) {
+  scoped_ptr<ChannelProxy> channel(new ChannelProxy(listener, ipc_task_runner));
+  channel->Init(factory.Pass(), true);
+  return channel.Pass();
+}
+
 ChannelProxy::ChannelProxy(Context* context)
     : context_(context),
       did_init_(false) {
@@ -334,8 +344,6 @@ ChannelProxy::~ChannelProxy() {
 void ChannelProxy::Init(const IPC::ChannelHandle& channel_handle,
                         Channel::Mode mode,
                         bool create_pipe_now) {
-  DCHECK(CalledOnValidThread());
-  DCHECK(!did_init_);
 #if defined(OS_POSIX)
   // When we are creating a server on POSIX, we need its file descriptor
   // to be created immediately so that it can be accessed and passed
@@ -345,17 +353,25 @@ void ChannelProxy::Init(const IPC::ChannelHandle& channel_handle,
     create_pipe_now = true;
   }
 #endif  // defined(OS_POSIX)
+  Init(ChannelFactory::Create(channel_handle, mode),
+       create_pipe_now);
+}
+
+void ChannelProxy::Init(scoped_ptr<ChannelFactory> factory,
+                        bool create_pipe_now) {
+  DCHECK(CalledOnValidThread());
+  DCHECK(!did_init_);
 
   if (create_pipe_now) {
     // Create the channel immediately.  This effectively sets up the
     // low-level pipe so that the client can connect.  Without creating
     // the pipe immediately, it is possible for a listener to attempt
     // to connect and get an error since the pipe doesn't exist yet.
-    context_->CreateChannel(channel_handle, mode);
+    context_->CreateChannel(factory.Pass());
   } else {
     context_->ipc_task_runner()->PostTask(
-        FROM_HERE, base::Bind(&Context::CreateChannel, context_.get(),
-                              channel_handle, mode));
+        FROM_HERE, base::Bind(&Context::CreateChannel,
+                              context_.get(), Passed(factory.Pass())));
   }
 
   // complete initialization on the background thread