81e129ac1d6e61701087656b280247d483769805
[platform/framework/web/crosswalk.git] / src / mojo / service_manager / service_manager.h
1 // Copyright 2013 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 #ifndef MOJO_SERVICE_MANAGER_SERVICE_MANAGER_H_
6 #define MOJO_SERVICE_MANAGER_SERVICE_MANAGER_H_
7
8 #include <map>
9
10 #include "base/basictypes.h"
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "mojo/public/interfaces/shell/shell.mojom.h"
14 #include "mojo/service_manager/service_loader.h"
15 #include "mojo/service_manager/service_manager_export.h"
16 #include "url/gurl.h"
17
18 namespace mojo {
19
20 class MOJO_SERVICE_MANAGER_EXPORT ServiceManager {
21  public:
22   // API for testing.
23   class MOJO_SERVICE_MANAGER_EXPORT TestAPI {
24    public:
25     explicit TestAPI(ServiceManager* manager);
26     ~TestAPI();
27
28     // Returns a handle to a unique shell instance.
29     ScopedMessagePipeHandle GetShellHandle();
30
31     // Returns true if the shared instance has been created.
32     static bool HasCreatedInstance();
33     // Returns true if there is a ServiceFactory for this URL.
34     bool HasFactoryForURL(const GURL& url) const;
35
36    private:
37     class TestShellConnection;
38
39     ServiceManager* manager_;
40     scoped_ptr<TestShellConnection> shell_;
41
42     DISALLOW_COPY_AND_ASSIGN(TestAPI);
43   };
44
45   // Interface class for debugging only.
46   class Interceptor {
47    public:
48     virtual ~Interceptor() {}
49     // Called when ServiceManager::Connect is called.
50     virtual ScopedMessagePipeHandle OnConnectToClient(
51         const GURL& url, ScopedMessagePipeHandle handle) = 0;
52   };
53
54   ServiceManager();
55   ~ServiceManager();
56
57   // Returns a shared instance, creating it if necessary.
58   static ServiceManager* GetInstance();
59
60   // Loads a service if necessary and establishes a new client connection.
61   void Connect(const GURL& url, ScopedMessagePipeHandle client_handle);
62
63   // Sets the default Loader to be used if not overridden by SetLoaderForURL()
64   // or SetLoaderForScheme().
65   void set_default_loader(scoped_ptr<ServiceLoader> loader) {
66     default_loader_ = loader.Pass();
67   }
68   // Sets a Loader to be used for a specific url.
69   void SetLoaderForURL(scoped_ptr<ServiceLoader> loader, const GURL& url);
70   // Sets a Loader to be used for a specific url scheme.
71   void SetLoaderForScheme(scoped_ptr<ServiceLoader> loader,
72                           const std::string& scheme);
73   // Allows to interpose a debugger to service connections.
74   void SetInterceptor(Interceptor* interceptor);
75
76  private:
77   class ServiceFactory;
78   typedef std::map<std::string, ServiceLoader*> SchemeToLoaderMap;
79   typedef std::map<GURL, ServiceLoader*> URLToLoaderMap;
80   typedef std::map<GURL, ServiceFactory*> URLToServiceFactoryMap;
81
82   // Returns the Loader to use for a url (using default if not overridden.)
83   // The preference is to use a loader that's been specified for an url first,
84   // then one that's been specified for a scheme, then the default.
85   ServiceLoader* GetLoaderForURL(const GURL& url);
86
87   // Removes a ServiceFactory when it encounters an error.
88   void OnServiceFactoryError(ServiceFactory* service_factory);
89
90   // Loader management.
91   URLToLoaderMap url_to_loader_;
92   SchemeToLoaderMap scheme_to_loader_;
93   scoped_ptr<ServiceLoader> default_loader_;
94   Interceptor* interceptor_;
95
96   URLToServiceFactoryMap url_to_service_factory_;
97   DISALLOW_COPY_AND_ASSIGN(ServiceManager);
98 };
99
100 }  // namespace mojo
101
102 #endif  // MOJO_SERVICE_MANAGER_SERVICE_MANAGER_H_