OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "services/catalog/entry.h" | 5 #include "services/catalog/entry.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "services/catalog/store.h" | 9 #include "services/catalog/store.h" |
10 #include "services/service_manager/public/cpp/names.h" | 10 #include "services/service_manager/public/cpp/names.h" |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 display_name_(name) {} | 103 display_name_(name) {} |
104 Entry::~Entry() {} | 104 Entry::~Entry() {} |
105 | 105 |
106 std::unique_ptr<base::DictionaryValue> Entry::Serialize() const { | 106 std::unique_ptr<base::DictionaryValue> Entry::Serialize() const { |
107 auto value = base::MakeUnique<base::DictionaryValue>(); | 107 auto value = base::MakeUnique<base::DictionaryValue>(); |
108 value->SetString(Store::kNameKey, name_); | 108 value->SetString(Store::kNameKey, name_); |
109 value->SetString(Store::kDisplayNameKey, display_name_); | 109 value->SetString(Store::kDisplayNameKey, display_name_); |
110 value->SetString(Store::kQualifierKey, qualifier_); | 110 value->SetString(Store::kQualifierKey, qualifier_); |
111 | 111 |
112 auto specs = base::MakeUnique<base::DictionaryValue>(); | 112 auto specs = base::MakeUnique<base::DictionaryValue>(); |
113 auto connection_spec = base::MakeUnique<base::DictionaryValue>(); | 113 for (const auto& it : interface_provider_specs_) { |
| 114 auto spec = base::MakeUnique<base::DictionaryValue>(); |
114 | 115 |
115 auto provides = base::MakeUnique<base::DictionaryValue>(); | 116 auto provides = base::MakeUnique<base::DictionaryValue>(); |
116 for (const auto& i : connection_spec_.provides) { | 117 for (const auto& i : it.second.provides) { |
117 auto interfaces = base::MakeUnique<base::ListValue>(); | 118 auto interfaces = base::MakeUnique<base::ListValue>(); |
118 for (const auto& interface_name : i.second) | 119 for (const auto& interface_name : i.second) |
119 interfaces->AppendString(interface_name); | 120 interfaces->AppendString(interface_name); |
120 provides->Set(i.first, std::move(interfaces)); | 121 provides->Set(i.first, std::move(interfaces)); |
| 122 } |
| 123 spec->Set(Store::kInterfaceProviderSpecs_ProvidesKey, std::move(provides)); |
| 124 |
| 125 auto requires = base::MakeUnique<base::DictionaryValue>(); |
| 126 for (const auto& i : it.second.requires) { |
| 127 auto capabilities = base::MakeUnique<base::ListValue>(); |
| 128 for (const auto& capability : i.second) |
| 129 capabilities->AppendString(capability); |
| 130 requires->Set(i.first, std::move(capabilities)); |
| 131 } |
| 132 spec->Set(Store::kInterfaceProviderSpecs_RequiresKey, std::move(requires)); |
| 133 specs->Set(it.first, std::move(spec)); |
121 } | 134 } |
122 connection_spec->Set(Store::kInterfaceProviderSpecs_ProvidesKey, | |
123 std::move(provides)); | |
124 | |
125 auto requires = base::MakeUnique<base::DictionaryValue>(); | |
126 for (const auto& i : connection_spec_.requires) { | |
127 auto capabilities = base::MakeUnique<base::ListValue>(); | |
128 for (const auto& class_name : i.second) | |
129 capabilities->AppendString(class_name); | |
130 requires->Set(i.first, std::move(capabilities)); | |
131 } | |
132 connection_spec->Set(Store::kInterfaceProviderSpecs_RequiresKey, | |
133 std::move(requires)); | |
134 | |
135 specs->Set(Store::kInterfaceProvider_ConnectionSpecKey, | |
136 std::move(connection_spec)); | |
137 value->Set(Store::kInterfaceProviderSpecsKey, std::move(specs)); | 135 value->Set(Store::kInterfaceProviderSpecsKey, std::move(specs)); |
138 return value; | 136 return value; |
139 } | 137 } |
140 | 138 |
141 // static | 139 // static |
142 std::unique_ptr<Entry> Entry::Deserialize(const base::DictionaryValue& value) { | 140 std::unique_ptr<Entry> Entry::Deserialize(const base::DictionaryValue& value) { |
143 auto entry = base::MakeUnique<Entry>(); | 141 auto entry = base::MakeUnique<Entry>(); |
144 | 142 |
145 // Name. | 143 // Name. |
146 std::string name_string; | 144 std::string name_string; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 | 178 |
181 // InterfaceProvider specs. | 179 // InterfaceProvider specs. |
182 const base::DictionaryValue* interface_provider_specs = nullptr; | 180 const base::DictionaryValue* interface_provider_specs = nullptr; |
183 if (!value.GetDictionary(Store::kInterfaceProviderSpecsKey, | 181 if (!value.GetDictionary(Store::kInterfaceProviderSpecsKey, |
184 &interface_provider_specs)) { | 182 &interface_provider_specs)) { |
185 LOG(ERROR) << "Entry::Deserialize: dictionary has no " | 183 LOG(ERROR) << "Entry::Deserialize: dictionary has no " |
186 << Store::kInterfaceProviderSpecsKey << " key"; | 184 << Store::kInterfaceProviderSpecsKey << " key"; |
187 return nullptr; | 185 return nullptr; |
188 } | 186 } |
189 | 187 |
190 const base::DictionaryValue* connection_spec = nullptr; | 188 base::DictionaryValue::Iterator it(*interface_provider_specs); |
191 if (interface_provider_specs->GetDictionary( | 189 for (; !it.IsAtEnd(); it.Advance()) { |
192 Store::kInterfaceProvider_ConnectionSpecKey, &connection_spec)) { | 190 const base::DictionaryValue* spec_value = nullptr; |
193 service_manager::InterfaceProviderSpec spec; | 191 if (!interface_provider_specs->GetDictionary(it.key(), &spec_value)) { |
194 if (!BuildInterfaceProviderSpec(*connection_spec, &spec)) { | 192 LOG(ERROR) << "Entry::Deserialize: value of InterfaceProvider map for " |
195 LOG(ERROR) << "Entry::Deserialize: failed to build InterfaceProvider " | 193 << "key: " << it.key() << " not a dictionary."; |
196 << "spec for " << entry->name(); | |
197 return nullptr; | 194 return nullptr; |
198 } | 195 } |
199 entry->set_connection_spec(spec); | 196 |
| 197 service_manager::InterfaceProviderSpec spec; |
| 198 if (!BuildInterfaceProviderSpec(*spec_value, &spec)) { |
| 199 LOG(ERROR) << "Entry::Deserialize: failed to build InterfaceProvider " |
| 200 << "spec for key: " << it.key(); |
| 201 return nullptr; |
| 202 } |
| 203 entry->AddInterfaceProviderSpec(it.key(), spec); |
200 } | 204 } |
201 | 205 |
202 if (value.HasKey(Store::kServicesKey)) { | 206 if (value.HasKey(Store::kServicesKey)) { |
203 const base::ListValue* services = nullptr; | 207 const base::ListValue* services = nullptr; |
204 value.GetList(Store::kServicesKey, &services); | 208 value.GetList(Store::kServicesKey, &services); |
205 for (size_t i = 0; i < services->GetSize(); ++i) { | 209 for (size_t i = 0; i < services->GetSize(); ++i) { |
206 const base::DictionaryValue* service = nullptr; | 210 const base::DictionaryValue* service = nullptr; |
207 services->GetDictionary(i, &service); | 211 services->GetDictionary(i, &service); |
208 std::unique_ptr<Entry> child = Entry::Deserialize(*service); | 212 std::unique_ptr<Entry> child = Entry::Deserialize(*service); |
209 if (child) { | 213 if (child) { |
210 child->set_package(entry.get()); | 214 child->set_package(entry.get()); |
211 // Caller must assume ownership of these items. | 215 // Caller must assume ownership of these items. |
212 entry->children_.emplace_back(std::move(child)); | 216 entry->children_.emplace_back(std::move(child)); |
213 } | 217 } |
214 } | 218 } |
215 } | 219 } |
216 | 220 |
217 return entry; | 221 return entry; |
218 } | 222 } |
219 | 223 |
220 bool Entry::ProvidesClass(const std::string& clazz) const { | 224 bool Entry::ProvidesCapability(const std::string& capability) const { |
221 return connection_spec_.provides.find(clazz) != | 225 auto it = interface_provider_specs_.find( |
222 connection_spec_.provides.end(); | 226 service_manager::mojom::kServiceManager_ConnectorSpec); |
| 227 if (it == interface_provider_specs_.end()) |
| 228 return false; |
| 229 |
| 230 auto connection_spec = it->second; |
| 231 return connection_spec.provides.find(capability) != |
| 232 connection_spec.provides.end(); |
223 } | 233 } |
224 | 234 |
225 bool Entry::operator==(const Entry& other) const { | 235 bool Entry::operator==(const Entry& other) const { |
226 return other.name_ == name_ && other.qualifier_ == qualifier_ && | 236 return other.name_ == name_ && other.qualifier_ == qualifier_ && |
227 other.display_name_ == display_name_ && | 237 other.display_name_ == display_name_ && |
228 other.connection_spec_ == connection_spec_; | 238 other.interface_provider_specs_ == interface_provider_specs_; |
229 } | 239 } |
230 | 240 |
231 bool Entry::operator<(const Entry& other) const { | 241 void Entry::AddInterfaceProviderSpec( |
232 return std::tie(name_, qualifier_, display_name_, connection_spec_) < | 242 const std::string& name, |
233 std::tie(other.name_, other.qualifier_, other.display_name_, | 243 const service_manager::InterfaceProviderSpec& spec) { |
234 other.connection_spec_); | 244 interface_provider_specs_[name] = spec; |
235 } | 245 } |
236 | 246 |
237 } // catalog | 247 } // catalog |
238 | 248 |
239 namespace mojo { | 249 namespace mojo { |
240 | 250 |
241 // static | 251 // static |
242 service_manager::mojom::ResolveResultPtr | 252 service_manager::mojom::ResolveResultPtr |
243 TypeConverter<service_manager::mojom::ResolveResultPtr, | 253 TypeConverter<service_manager::mojom::ResolveResultPtr, |
244 catalog::Entry>::Convert(const catalog::Entry& input) { | 254 catalog::Entry>::Convert(const catalog::Entry& input) { |
245 service_manager::mojom::ResolveResultPtr result( | 255 service_manager::mojom::ResolveResultPtr result( |
246 service_manager::mojom::ResolveResult::New()); | 256 service_manager::mojom::ResolveResult::New()); |
247 result->name = input.name(); | 257 result->name = input.name(); |
248 const catalog::Entry& package = input.package() ? *input.package() : input; | 258 const catalog::Entry& package = input.package() ? *input.package() : input; |
249 result->resolved_name = package.name(); | 259 result->resolved_name = package.name(); |
250 result->qualifier = input.qualifier(); | 260 result->qualifier = input.qualifier(); |
251 result->connection_spec = input.connection_spec(); | 261 result->interface_provider_specs = input.interface_provider_specs(); |
252 result->package_path = package.path(); | 262 result->package_path = package.path(); |
253 return result; | 263 return result; |
254 } | 264 } |
255 | 265 |
256 // static | 266 // static |
257 catalog::mojom::EntryPtr | 267 catalog::mojom::EntryPtr |
258 TypeConverter<catalog::mojom::EntryPtr, catalog::Entry>::Convert( | 268 TypeConverter<catalog::mojom::EntryPtr, catalog::Entry>::Convert( |
259 const catalog::Entry& input) { | 269 const catalog::Entry& input) { |
260 catalog::mojom::EntryPtr result(catalog::mojom::Entry::New()); | 270 catalog::mojom::EntryPtr result(catalog::mojom::Entry::New()); |
261 result->name = input.name(); | 271 result->name = input.name(); |
262 result->display_name = input.display_name(); | 272 result->display_name = input.display_name(); |
263 return result; | 273 return result; |
264 } | 274 } |
265 | 275 |
266 } // namespace mojo | 276 } // namespace mojo |
OLD | NEW |