Home | History | Annotate | Download | only in lib
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "mojo/public/cpp/application/application_impl.h"
      6 
      7 #include "mojo/public/cpp/application/application_delegate.h"
      8 #include "mojo/public/cpp/application/lib/service_registry.h"
      9 #include "mojo/public/cpp/bindings/interface_ptr.h"
     10 #include "mojo/public/cpp/environment/logging.h"
     11 
     12 namespace mojo {
     13 
     14 class ApplicationImpl::ShellPtrWatcher : public ErrorHandler {
     15  public:
     16   ShellPtrWatcher(ApplicationImpl* impl)
     17     : impl_(impl) {}
     18 
     19   virtual ~ShellPtrWatcher() {}
     20 
     21   virtual void OnConnectionError() MOJO_OVERRIDE {
     22     impl_->OnShellError();
     23   }
     24 
     25  private:
     26   ApplicationImpl* impl_;
     27   MOJO_DISALLOW_COPY_AND_ASSIGN(ShellPtrWatcher);
     28 };
     29 
     30 ApplicationImpl::ApplicationImpl(ApplicationDelegate* delegate,
     31                                  ScopedMessagePipeHandle shell_handle)
     32     : initialized_(false), delegate_(delegate), shell_watch_(NULL) {
     33   BindShell(shell_handle.Pass());
     34 }
     35 
     36 ApplicationImpl::ApplicationImpl(ApplicationDelegate* delegate,
     37                                  MojoHandle shell_handle)
     38     : initialized_(false), delegate_(delegate), shell_watch_(NULL) {
     39   BindShell(MakeScopedHandle(MessagePipeHandle(shell_handle)));
     40 }
     41 
     42 void ApplicationImpl::ClearConnections() {
     43   for (ServiceRegistryList::iterator i(incoming_service_registries_.begin());
     44       i != incoming_service_registries_.end(); ++i)
     45     delete *i;
     46   for (ServiceRegistryList::iterator i(outgoing_service_registries_.begin());
     47       i != outgoing_service_registries_.end(); ++i)
     48     delete *i;
     49   incoming_service_registries_.clear();
     50   outgoing_service_registries_.clear();
     51 }
     52 
     53 ApplicationImpl::~ApplicationImpl() {
     54   ClearConnections();
     55   delete shell_watch_;
     56 }
     57 
     58 void ApplicationImpl::Initialize(Array<String> args) {
     59   MOJO_CHECK(!initialized_);
     60   initialized_ = true;
     61   args_ = args.Pass();
     62   delegate_->Initialize(this);
     63 }
     64 
     65 ApplicationConnection* ApplicationImpl::ConnectToApplication(
     66     const String& application_url) {
     67   MOJO_CHECK(initialized_);
     68   ServiceProviderPtr out_service_provider;
     69   shell_->ConnectToApplication(application_url, Get(&out_service_provider));
     70   internal::ServiceRegistry* registry = new internal::ServiceRegistry(
     71       this,
     72       application_url,
     73       out_service_provider.Pass());
     74   if (!delegate_->ConfigureOutgoingConnection(registry)) {
     75     delete registry;
     76     return NULL;
     77   }
     78   outgoing_service_registries_.push_back(registry);
     79   return registry;
     80 }
     81 
     82 void ApplicationImpl::BindShell(ScopedMessagePipeHandle shell_handle) {
     83   shell_watch_ = new ShellPtrWatcher(this);
     84   shell_.Bind(shell_handle.Pass());
     85   shell_.set_client(this);
     86   shell_.set_error_handler(shell_watch_);
     87 }
     88 
     89 void ApplicationImpl::AcceptConnection(const String& requestor_url,
     90                                        ServiceProviderPtr service_provider) {
     91   internal::ServiceRegistry* registry = new internal::ServiceRegistry(
     92       this, requestor_url, service_provider.Pass());
     93   if (!delegate_->ConfigureIncomingConnection(registry)) {
     94     delete registry;
     95     return;
     96   }
     97   incoming_service_registries_.push_back(registry);
     98 }
     99 
    100 }  // namespace mojo
    101