OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdio.h> | 5 #include <stdio.h> |
6 | 6 |
7 #include "mojo/service_manager/service_manager.h" | 7 #include "mojo/service_manager/service_manager.h" |
8 | 8 |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 class ServiceManager::ServiceFactory : public InterfaceImpl<ServiceProvider> { | 22 class ServiceManager::ServiceFactory : public InterfaceImpl<ServiceProvider> { |
23 public: | 23 public: |
24 ServiceFactory(ServiceManager* manager, const GURL& url) | 24 ServiceFactory(ServiceManager* manager, const GURL& url) |
25 : manager_(manager), | 25 : manager_(manager), |
26 url_(url) { | 26 url_(url) { |
27 } | 27 } |
28 | 28 |
29 virtual ~ServiceFactory() { | 29 virtual ~ServiceFactory() { |
30 } | 30 } |
31 | 31 |
32 void ConnectToClient(ScopedMessagePipeHandle handle) { | 32 void ConnectToClient(const std::string& name, |
| 33 ScopedMessagePipeHandle handle) { |
33 if (handle.is_valid()) | 34 if (handle.is_valid()) |
34 client()->ConnectToService(url_.spec(), handle.Pass()); | 35 client()->ConnectToService(url_.spec(), name, handle.Pass()); |
35 } | 36 } |
36 | 37 |
37 // ServiceProvider implementation: | 38 // ServiceProvider implementation: |
38 virtual void ConnectToService(const String& url, | 39 virtual void ConnectToService(const String& url, |
| 40 const String& name, |
39 ScopedMessagePipeHandle client_pipe) OVERRIDE { | 41 ScopedMessagePipeHandle client_pipe) OVERRIDE { |
40 manager_->ConnectToService(GURL(url), client_pipe.Pass()); | 42 manager_->ConnectToService(GURL(url), name, client_pipe.Pass()); |
41 } | 43 } |
42 | 44 |
43 const GURL& url() const { return url_; } | 45 const GURL& url() const { return url_; } |
44 | 46 |
45 private: | 47 private: |
46 virtual void OnConnectionError() OVERRIDE { | 48 virtual void OnConnectionError() OVERRIDE { |
47 manager_->OnServiceFactoryError(this); | 49 manager_->OnServiceFactoryError(this); |
48 } | 50 } |
49 | 51 |
50 ServiceManager* const manager_; | 52 ServiceManager* const manager_; |
51 const GURL url_; | 53 const GURL url_; |
52 | 54 |
53 DISALLOW_COPY_AND_ASSIGN(ServiceFactory); | 55 DISALLOW_COPY_AND_ASSIGN(ServiceFactory); |
54 }; | 56 }; |
55 | 57 |
56 class ServiceManager::TestAPI::TestServiceProviderConnection | 58 class ServiceManager::TestAPI::TestServiceProviderConnection |
57 : public InterfaceImpl<ServiceProvider> { | 59 : public InterfaceImpl<ServiceProvider> { |
58 public: | 60 public: |
59 explicit TestServiceProviderConnection(ServiceManager* manager) | 61 explicit TestServiceProviderConnection(ServiceManager* manager) |
60 : manager_(manager) {} | 62 : manager_(manager) {} |
61 virtual ~TestServiceProviderConnection() {} | 63 virtual ~TestServiceProviderConnection() {} |
62 | 64 |
63 virtual void OnConnectionError() OVERRIDE { | 65 virtual void OnConnectionError() OVERRIDE { |
64 // TODO(darin): How should we handle this error? | 66 // TODO(darin): How should we handle this error? |
65 } | 67 } |
66 | 68 |
67 // ServiceProvider: | 69 // ServiceProvider: |
68 virtual void ConnectToService(const String& url, | 70 virtual void ConnectToService(const String& url, |
| 71 const String& name, |
69 ScopedMessagePipeHandle client_pipe) OVERRIDE { | 72 ScopedMessagePipeHandle client_pipe) OVERRIDE { |
70 manager_->ConnectToService(GURL(url), client_pipe.Pass()); | 73 manager_->ConnectToService(GURL(url), name, client_pipe.Pass()); |
71 } | 74 } |
72 | 75 |
73 private: | 76 private: |
74 ServiceManager* manager_; | 77 ServiceManager* manager_; |
75 | 78 |
76 DISALLOW_COPY_AND_ASSIGN(TestServiceProviderConnection); | 79 DISALLOW_COPY_AND_ASSIGN(TestServiceProviderConnection); |
77 }; | 80 }; |
78 | 81 |
79 // static | 82 // static |
80 ServiceManager::TestAPI::TestAPI(ServiceManager* manager) : manager_(manager) { | 83 ServiceManager::TestAPI::TestAPI(ServiceManager* manager) : manager_(manager) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 | 115 |
113 // static | 116 // static |
114 ServiceManager* ServiceManager::GetInstance() { | 117 ServiceManager* ServiceManager::GetInstance() { |
115 static base::LazyInstance<ServiceManager> instance = | 118 static base::LazyInstance<ServiceManager> instance = |
116 LAZY_INSTANCE_INITIALIZER; | 119 LAZY_INSTANCE_INITIALIZER; |
117 has_created_instance = true; | 120 has_created_instance = true; |
118 return &instance.Get(); | 121 return &instance.Get(); |
119 } | 122 } |
120 | 123 |
121 void ServiceManager::ConnectToService(const GURL& url, | 124 void ServiceManager::ConnectToService(const GURL& url, |
| 125 const std::string& name, |
122 ScopedMessagePipeHandle client_handle) { | 126 ScopedMessagePipeHandle client_handle) { |
123 URLToServiceFactoryMap::const_iterator service_it = | 127 URLToServiceFactoryMap::const_iterator service_it = |
124 url_to_service_factory_.find(url); | 128 url_to_service_factory_.find(url); |
125 ServiceFactory* service_factory; | 129 ServiceFactory* service_factory; |
126 if (service_it != url_to_service_factory_.end()) { | 130 if (service_it != url_to_service_factory_.end()) { |
127 service_factory = service_it->second; | 131 service_factory = service_it->second; |
128 } else { | 132 } else { |
129 MessagePipe pipe; | 133 MessagePipe pipe; |
130 GetLoaderForURL(url)->LoadService(this, url, pipe.handle0.Pass()); | 134 GetLoaderForURL(url)->LoadService(this, url, pipe.handle0.Pass()); |
131 | 135 |
132 service_factory = | 136 service_factory = |
133 BindToPipe(new ServiceFactory(this, url), pipe.handle1.Pass()); | 137 BindToPipe(new ServiceFactory(this, url), pipe.handle1.Pass()); |
134 | 138 |
135 url_to_service_factory_[url] = service_factory; | 139 url_to_service_factory_[url] = service_factory; |
136 } | 140 } |
137 if (interceptor_) { | 141 if (interceptor_) { |
138 service_factory->ConnectToClient( | 142 service_factory->ConnectToClient( |
139 interceptor_->OnConnectToClient(url, client_handle.Pass())); | 143 name, interceptor_->OnConnectToClient(url, client_handle.Pass())); |
140 } else { | 144 } else { |
141 service_factory->ConnectToClient(client_handle.Pass()); | 145 service_factory->ConnectToClient(name, client_handle.Pass()); |
142 } | 146 } |
143 } | 147 } |
144 | 148 |
145 void ServiceManager::SetLoaderForURL(scoped_ptr<ServiceLoader> loader, | 149 void ServiceManager::SetLoaderForURL(scoped_ptr<ServiceLoader> loader, |
146 const GURL& url) { | 150 const GURL& url) { |
147 URLToLoaderMap::iterator it = url_to_loader_.find(url); | 151 URLToLoaderMap::iterator it = url_to_loader_.find(url); |
148 if (it != url_to_loader_.end()) | 152 if (it != url_to_loader_.end()) |
149 delete it->second; | 153 delete it->second; |
150 url_to_loader_[url] = loader.release(); | 154 url_to_loader_[url] = loader.release(); |
151 } | 155 } |
(...skipping 26 matching lines...) Expand all Loading... |
178 // Called from ~ServiceFactory, so we do not need to call Destroy here. | 182 // Called from ~ServiceFactory, so we do not need to call Destroy here. |
179 const GURL url = service_factory->url(); | 183 const GURL url = service_factory->url(); |
180 URLToServiceFactoryMap::iterator it = url_to_service_factory_.find(url); | 184 URLToServiceFactoryMap::iterator it = url_to_service_factory_.find(url); |
181 DCHECK(it != url_to_service_factory_.end()); | 185 DCHECK(it != url_to_service_factory_.end()); |
182 delete it->second; | 186 delete it->second; |
183 url_to_service_factory_.erase(it); | 187 url_to_service_factory_.erase(it); |
184 GetLoaderForURL(url)->OnServiceError(this, url); | 188 GetLoaderForURL(url)->OnServiceError(this, url); |
185 } | 189 } |
186 | 190 |
187 } // namespace mojo | 191 } // namespace mojo |
OLD | NEW |