Index: mojo/shell/app_child_process.cc |
diff --git a/mojo/shell/app_child_process.cc b/mojo/shell/app_child_process.cc |
index 7909d83da23d502a4891c9662e6e58cb1ff64cfc..492a66762a30425b0ea6959abb7ba9bc73b54fd7 100644 |
--- a/mojo/shell/app_child_process.cc |
+++ b/mojo/shell/app_child_process.cc |
@@ -20,7 +20,6 @@ |
#include "base/threading/thread_checker.h" |
#include "mojo/common/message_pump_mojo.h" |
#include "mojo/embedder/embedder.h" |
-#include "mojo/public/cpp/bindings/remote_ptr.h" |
#include "mojo/public/cpp/system/core.h" |
#include "mojo/shell/app_child_process.mojom.h" |
@@ -82,6 +81,9 @@ class Blocker { |
class AppChildControllerImpl; |
+static void DestroyController(scoped_ptr<AppChildControllerImpl> controller) { |
+} |
+ |
// Should be created and initialized on the main thread. |
class AppContext { |
public: |
@@ -111,6 +113,12 @@ class AppContext { |
CHECK(controller_runner_); |
} |
+ void Shutdown() { |
+ controller_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DestroyController, base::Passed(&controller_))); |
+ } |
+ |
base::SingleThreadTaskRunner* io_runner() const { |
return io_runner_.get(); |
} |
@@ -145,10 +153,14 @@ class AppContext { |
// AppChildControllerImpl ------------------------------------------------------ |
-class AppChildControllerImpl : public mojo_shell::AppChildController { |
+class AppChildControllerImpl : public InterfaceImpl<AppChildController> { |
public: |
virtual ~AppChildControllerImpl() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ // TODO(vtl): Pass in the result from |MainMain()|. |
+ if (controller_client_) |
+ controller_client_->AppCompleted(MOJO_RESULT_UNIMPLEMENTED); |
} |
// To be executed on the controller thread. Creates the |AppChildController|, |
@@ -161,31 +173,39 @@ class AppChildControllerImpl : public mojo_shell::AppChildController { |
DCHECK(platform_channel.is_valid()); |
DCHECK(!app_context->controller()); |
- app_context->set_controller( |
- make_scoped_ptr(new AppChildControllerImpl(app_context, unblocker))); |
- app_context->controller()->CreateChannel(platform_channel.Pass()); |
- } |
- void Shutdown() { |
- DVLOG(2) << "AppChildControllerImpl::Shutdown()"; |
- DCHECK(thread_checker_.CalledOnValidThread()); |
+ scoped_ptr<AppChildControllerImpl> impl( |
+ new AppChildControllerImpl(app_context, unblocker)); |
- // TODO(vtl): Pass in the result from |MainMain()|. |
- controller_client_->AppCompleted(MOJO_RESULT_UNIMPLEMENTED); |
+ ScopedMessagePipeHandle host_message_pipe(embedder::CreateChannel( |
+ platform_channel.Pass(), |
+ app_context->io_runner(), |
+ base::Bind(&AppChildControllerImpl::DidCreateChannel, |
+ base::Unretained(impl.get())), |
+ base::MessageLoopProxy::current())); |
- // TODO(vtl): Drain then destroy the channel (on the I/O thread). |
+ BindToPipe(impl.get(), host_message_pipe.Pass()); |
- // This will destroy this object. |
- app_context_->set_controller(scoped_ptr<AppChildControllerImpl>()); |
+ app_context->set_controller(impl.Pass()); |
+ } |
+ |
+ virtual void OnConnectionError() OVERRIDE { |
+ // TODO(darin): How should we handle a connection error here? |
+ } |
+ |
+ // |AppChildController| methods: |
+ |
+ virtual void SetClient(AppChildControllerClient* client) OVERRIDE { |
+ controller_client_ = client; |
} |
- // |AppChildController| method: |
virtual void StartApp(const String& app_path, |
ScopedMessagePipeHandle service) OVERRIDE { |
DVLOG(2) << "AppChildControllerImpl::StartApp(" |
<< app_path.To<std::string>() << ", ...)"; |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ // TODO(darin): Add TypeConverter for FilePath <-> mojo::String. |
unblocker_.Unblock(base::Bind(&AppChildControllerImpl::StartAppOnMainThread, |
base::FilePath::FromUTF8Unsafe( |
app_path.To<std::string>()), |
@@ -197,25 +217,10 @@ class AppChildControllerImpl : public mojo_shell::AppChildController { |
const Blocker::Unblocker& unblocker) |
: app_context_(app_context), |
unblocker_(unblocker), |
+ controller_client_(NULL), |
channel_info_(NULL) { |
} |
- void CreateChannel(embedder::ScopedPlatformHandle platform_channel) { |
- DVLOG(2) << "AppChildControllerImpl::CreateChannel()"; |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- |
- ScopedMessagePipeHandle host_message_pipe(embedder::CreateChannel( |
- platform_channel.Pass(), |
- app_context_->io_runner(), |
- base::Bind(&AppChildControllerImpl::DidCreateChannel, |
- base::Unretained(this)), |
- base::MessageLoopProxy::current())); |
- controller_client_.reset( |
- mojo_shell::ScopedAppChildControllerClientHandle( |
- mojo_shell::AppChildControllerClientHandle( |
- host_message_pipe.release().value())), this); |
- } |
- |
// Callback for |embedder::CreateChannel()|. |
void DidCreateChannel(embedder::ChannelInfo* channel_info) { |
DVLOG(2) << "AppChildControllerImpl::DidCreateChannel()"; |
@@ -262,7 +267,7 @@ class AppChildControllerImpl : public mojo_shell::AppChildController { |
AppContext* const app_context_; |
Blocker::Unblocker unblocker_; |
- RemotePtr<mojo_shell::AppChildControllerClient> controller_client_; |
+ AppChildControllerClient* controller_client_; |
embedder::ChannelInfo* channel_info_; |
DISALLOW_COPY_AND_ASSIGN(AppChildControllerImpl); |
@@ -292,10 +297,7 @@ void AppChildProcess::Main() { |
// This will block, then run whatever the controller wants. |
blocker.Block(); |
- app_context.controller_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&AppChildControllerImpl::Shutdown, |
- base::Unretained(app_context.controller()))); |
+ app_context.Shutdown(); |
} |
} // namespace shell |