Index: trunk/src/mojo/service_manager/service_manager.cc |
=================================================================== |
--- trunk/src/mojo/service_manager/service_manager.cc (revision 288042) |
+++ trunk/src/mojo/service_manager/service_manager.cc (working copy) |
@@ -2,21 +2,18 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "mojo/service_manager/service_manager.h" |
- |
#include <stdio.h> |
-#include "base/bind.h" |
+#include "mojo/service_manager/service_manager.h" |
+ |
#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/macros.h" |
#include "base/stl_util.h" |
#include "mojo/common/common_type_converters.h" |
-#include "mojo/public/cpp/application/connect.h" |
#include "mojo/public/interfaces/application/application.mojom.h" |
#include "mojo/public/interfaces/application/shell.mojom.h" |
#include "mojo/service_manager/service_loader.h" |
-#include "mojo/services/public/interfaces/content_handler/content_handler.mojom.h" |
namespace mojo { |
@@ -36,53 +33,8 @@ |
ScopedMessagePipeHandle client_handle) MOJO_OVERRIDE {} |
}; |
-} // namespace |
+} |
-class ServiceManager::LoadCallbacksImpl : public ServiceLoader::LoadCallbacks { |
- public: |
- LoadCallbacksImpl(base::WeakPtr<ServiceManager> manager, |
- const GURL& requested_url, |
- const GURL& requestor_url, |
- ServiceProviderPtr service_provider) |
- : manager_(manager), |
- requested_url_(requested_url), |
- requestor_url_(requestor_url), |
- service_provider_(service_provider.Pass()) { |
- } |
- |
- private: |
- virtual ~LoadCallbacksImpl() { |
- } |
- |
- // LoadCallbacks implementation |
- virtual ScopedMessagePipeHandle RegisterApplication() OVERRIDE { |
- ScopedMessagePipeHandle shell_handle; |
- if (manager_) { |
- manager_->RegisterLoadedApplication(requested_url_, |
- requestor_url_, |
- service_provider_.Pass(), |
- &shell_handle); |
- } |
- return shell_handle.Pass(); |
- } |
- |
- virtual void LoadWithContentHandler(const GURL& content_handler_url, |
- URLResponsePtr content) OVERRIDE { |
- if (manager_) { |
- manager_->LoadWithContentHandler(requested_url_, |
- requestor_url_, |
- content_handler_url, |
- content.Pass(), |
- service_provider_.Pass()); |
- } |
- } |
- |
- base::WeakPtr<ServiceManager> manager_; |
- GURL requested_url_; |
- GURL requestor_url_; |
- ServiceProviderPtr service_provider_; |
-}; |
- |
class ServiceManager::ShellImpl : public InterfaceImpl<Shell> { |
public: |
ShellImpl(ServiceManager* manager, const GURL& url) |
@@ -124,21 +76,6 @@ |
DISALLOW_COPY_AND_ASSIGN(ShellImpl); |
}; |
-struct ServiceManager::ContentHandlerConnection { |
- ContentHandlerConnection(ServiceManager* manager, |
- const GURL& content_handler_url) { |
- ServiceProviderPtr service_provider; |
- BindToProxy(&service_provider_impl, &service_provider); |
- manager->ConnectToApplication(content_handler_url, |
- GURL(), |
- service_provider.Pass()); |
- mojo::ConnectToService(service_provider_impl.client(), &content_handler); |
- } |
- |
- StubServiceProvider service_provider_impl; |
- ContentHandlerPtr content_handler; |
-}; |
- |
// static |
ServiceManager::TestAPI::TestAPI(ServiceManager* manager) : manager_(manager) { |
} |
@@ -155,13 +92,10 @@ |
manager_->url_to_shell_impl_.end(); |
} |
-ServiceManager::ServiceManager() |
- : interceptor_(NULL), |
- weak_ptr_factory_(this) { |
+ServiceManager::ServiceManager() : interceptor_(NULL) { |
} |
ServiceManager::~ServiceManager() { |
- STLDeleteValues(&url_to_content_handler_); |
TerminateShellConnections(); |
STLDeleteValues(&url_to_loader_); |
STLDeleteValues(&scheme_to_loader_); |
@@ -183,24 +117,15 @@ |
const GURL& requestor_url, |
ServiceProviderPtr service_provider) { |
URLToShellImplMap::const_iterator shell_it = url_to_shell_impl_.find(url); |
+ ShellImpl* shell_impl; |
if (shell_it != url_to_shell_impl_.end()) { |
- ConnectToClient(shell_it->second, url, requestor_url, |
- service_provider.Pass()); |
- return; |
+ shell_impl = shell_it->second; |
+ } else { |
+ MessagePipe pipe; |
+ GetLoaderForURL(url)->LoadService(this, url, pipe.handle0.Pass()); |
+ shell_impl = WeakBindToPipe(new ShellImpl(this, url), pipe.handle1.Pass()); |
+ url_to_shell_impl_[url] = shell_impl; |
} |
- |
- scoped_refptr<LoadCallbacksImpl> callbacks( |
- new LoadCallbacksImpl(weak_ptr_factory_.GetWeakPtr(), |
- url, |
- requestor_url, |
- service_provider.Pass())); |
- GetLoaderForURL(url)->Load(this, url, callbacks); |
-} |
- |
-void ServiceManager::ConnectToClient(ShellImpl* shell_impl, |
- const GURL& url, |
- const GURL& requestor_url, |
- ServiceProviderPtr service_provider) { |
if (interceptor_) { |
shell_impl->ConnectToClient( |
requestor_url, |
@@ -210,48 +135,6 @@ |
} |
} |
-void ServiceManager::RegisterLoadedApplication( |
- const GURL& url, |
- const GURL& requestor_url, |
- ServiceProviderPtr service_provider, |
- ScopedMessagePipeHandle* shell_handle) { |
- ShellImpl* shell_impl = NULL; |
- URLToShellImplMap::iterator iter = url_to_shell_impl_.find(url); |
- if (iter != url_to_shell_impl_.end()) { |
- // This can happen because services are loaded asynchronously. So if we get |
- // two requests for the same service close to each other, we might get here |
- // and find that we already have it. |
- shell_impl = iter->second; |
- } else { |
- MessagePipe pipe; |
- shell_impl = WeakBindToPipe(new ShellImpl(this, url), pipe.handle1.Pass()); |
- url_to_shell_impl_[url] = shell_impl; |
- *shell_handle = pipe.handle0.Pass(); |
- } |
- |
- ConnectToClient(shell_impl, url, requestor_url, service_provider.Pass()); |
-} |
- |
-void ServiceManager::LoadWithContentHandler( |
- const GURL& content_url, |
- const GURL& requestor_url, |
- const GURL& content_handler_url, |
- URLResponsePtr content, |
- ServiceProviderPtr service_provider) { |
- ContentHandlerConnection* connection = NULL; |
- URLToContentHandlerMap::iterator iter = |
- url_to_content_handler_.find(content_handler_url); |
- if (iter != url_to_content_handler_.end()) { |
- connection = iter->second; |
- } else { |
- connection = new ContentHandlerConnection(this, content_handler_url); |
- url_to_content_handler_[content_handler_url] = connection; |
- } |
- connection->content_handler->OnConnect(content_url.spec(), |
- content.Pass(), |
- service_provider.Pass()); |
-} |
- |
void ServiceManager::SetLoaderForURL(scoped_ptr<ServiceLoader> loader, |
const GURL& url) { |
URLToLoaderMap::iterator it = url_to_loader_.find(url); |