summaryrefslogtreecommitdiffstats
path: root/mojo/service_manager/service_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'mojo/service_manager/service_manager.cc')
-rw-r--r--mojo/service_manager/service_manager.cc79
1 files changed, 42 insertions, 37 deletions
diff --git a/mojo/service_manager/service_manager.cc b/mojo/service_manager/service_manager.cc
index b62c6e14b..0a526fa 100644
--- a/mojo/service_manager/service_manager.cc
+++ b/mojo/service_manager/service_manager.cc
@@ -11,8 +11,6 @@
#include "base/macros.h"
#include "base/stl_util.h"
#include "mojo/public/cpp/bindings/allocation_scope.h"
-#include "mojo/public/cpp/bindings/error_handler.h"
-#include "mojo/public/cpp/bindings/remote_ptr.h"
#include "mojo/service_manager/service_loader.h"
namespace mojo {
@@ -22,74 +20,74 @@ namespace {
bool has_created_instance = false;
}
-class ServiceManager::ServiceFactory : public Shell, public ErrorHandler {
+class ServiceManager::ServiceFactory : public InterfaceImpl<Shell> {
public:
ServiceFactory(ServiceManager* manager, const GURL& url)
: manager_(manager),
- url_(url) {
- InterfacePipe<Shell> pipe;
- shell_client_.reset(pipe.handle_to_peer.Pass(), this, this);
- manager_->GetLoaderForURL(url)->LoadService(manager_,
- url,
- pipe.handle_to_self.Pass());
+ url_(url),
+ client_(NULL) {
}
- virtual ~ServiceFactory() {}
+ virtual ~ServiceFactory() {
+ }
void ConnectToClient(ScopedMessagePipeHandle handle) {
- if (handle.is_valid()) {
- AllocationScope scope;
- shell_client_->AcceptConnection(url_.spec(), handle.Pass());
+ if (!handle.is_valid()) {
+ assert(false);
+ return;
}
+ AllocationScope scope;
+ client_->AcceptConnection(url_.spec(), handle.Pass());
}
+ // Shell implementation:
+ virtual void SetClient(ShellClient* client) OVERRIDE {
+ client_ = client;
+ }
virtual void Connect(const String& url,
ScopedMessagePipeHandle client_pipe) OVERRIDE {
manager_->Connect(GURL(url.To<std::string>()), client_pipe.Pass());
}
- virtual void OnError() OVERRIDE {
- manager_->OnServiceFactoryError(this);
- }
-
const GURL& url() const { return url_; }
private:
+ virtual void OnConnectionError() OVERRIDE {
+ manager_->OnServiceFactoryError(this);
+ }
+
ServiceManager* const manager_;
const GURL url_;
- RemotePtr<ShellClient> shell_client_;
+ ShellClient* client_;
DISALLOW_COPY_AND_ASSIGN(ServiceFactory);
};
class ServiceManager::TestAPI::TestShellConnection
- : public Shell,
- public ErrorHandler {
+ : public InterfaceImpl<Shell> {
public:
- explicit TestShellConnection(ServiceManager* manager) : manager_(manager) {
- InterfacePipe<Shell> pipe;
- shell_client_.reset(pipe.handle_to_peer.Pass(), this, this);
- shell_handle_ = pipe.handle_to_self.Pass();
+ explicit TestShellConnection(ServiceManager* manager)
+ : manager_(manager),
+ client_(NULL) {
}
virtual ~TestShellConnection() {}
- ScopedShellHandle GetShellHandle() {
- return shell_handle_.Pass();
+ virtual void OnConnectionError() OVERRIDE {
+ // TODO(darin): How should we handle this error?
}
// Shell:
+ virtual void SetClient(ShellClient* client) OVERRIDE {
+ client_ = client;
+ }
virtual void Connect(const String& url,
ScopedMessagePipeHandle client_pipe) OVERRIDE {
manager_->Connect(GURL(url.To<std::string>()), client_pipe.Pass());
}
- virtual void OnError() OVERRIDE {
- }
-
private:
ServiceManager* manager_;
- RemotePtr<ShellClient> shell_client_;
- ScopedShellHandle shell_handle_;
+ ShellClient* client_;
DISALLOW_COPY_AND_ASSIGN(TestShellConnection);
};
@@ -105,15 +103,16 @@ bool ServiceManager::TestAPI::HasCreatedInstance() {
return has_created_instance;
}
-ScopedShellHandle ServiceManager::TestAPI::GetShellHandle() {
- if (!shell_connection_.get())
- shell_connection_.reset(new TestShellConnection(manager_));
- return shell_connection_->GetShellHandle().Pass();
+ScopedMessagePipeHandle ServiceManager::TestAPI::GetShellHandle() {
+ MessagePipe pipe;
+ shell_.reset(
+ BindToPipe(new TestShellConnection(manager_), pipe.handle0.Pass()));
+ return pipe.handle1.Pass();
}
bool ServiceManager::TestAPI::HasFactoryForURL(const GURL& url) const {
return manager_->url_to_service_factory_.find(url) !=
- manager_->url_to_service_factory_.end();
+ manager_->url_to_service_factory_.end();
}
ServiceManager::ServiceManager()
@@ -142,7 +141,12 @@ void ServiceManager::Connect(const GURL& url,
if (service_it != url_to_service_factory_.end()) {
service_factory = service_it->second;
} else {
- service_factory = new ServiceFactory(this, url);
+ MessagePipe pipe;
+ GetLoaderForURL(url)->LoadService(this, url, pipe.handle0.Pass());
+
+ service_factory =
+ BindToPipe(new ServiceFactory(this, url), pipe.handle1.Pass());
+
url_to_service_factory_[url] = service_factory;
}
if (interceptor_) {
@@ -186,6 +190,7 @@ ServiceLoader* ServiceManager::GetLoaderForURL(const GURL& url) {
}
void ServiceManager::OnServiceFactoryError(ServiceFactory* service_factory) {
+ // Called from ~ServiceFactory, so we do not need to call Destroy here.
const GURL url = service_factory->url();
URLToServiceFactoryMap::iterator it = url_to_service_factory_.find(url);
DCHECK(it != url_to_service_factory_.end());