| Index: services/catalog/entry.cc
|
| diff --git a/services/catalog/entry.cc b/services/catalog/entry.cc
|
| index 96745149b65f9b39850438a744e5553e6bc0eab3..7a090156a5b6795c8b028dbfc1900b4cf42fd8fc 100644
|
| --- a/services/catalog/entry.cc
|
| +++ b/services/catalog/entry.cc
|
| @@ -110,30 +110,28 @@ std::unique_ptr<base::DictionaryValue> Entry::Serialize() const {
|
| value->SetString(Store::kQualifierKey, qualifier_);
|
|
|
| auto specs = base::MakeUnique<base::DictionaryValue>();
|
| - auto connection_spec = base::MakeUnique<base::DictionaryValue>();
|
| -
|
| - auto provides = base::MakeUnique<base::DictionaryValue>();
|
| - for (const auto& i : connection_spec_.provides) {
|
| - auto interfaces = base::MakeUnique<base::ListValue>();
|
| - for (const auto& interface_name : i.second)
|
| - interfaces->AppendString(interface_name);
|
| - provides->Set(i.first, std::move(interfaces));
|
| - }
|
| - connection_spec->Set(Store::kInterfaceProviderSpecs_ProvidesKey,
|
| - std::move(provides));
|
| -
|
| - auto requires = base::MakeUnique<base::DictionaryValue>();
|
| - for (const auto& i : connection_spec_.requires) {
|
| - auto capabilities = base::MakeUnique<base::ListValue>();
|
| - for (const auto& class_name : i.second)
|
| - capabilities->AppendString(class_name);
|
| - requires->Set(i.first, std::move(capabilities));
|
| - }
|
| - connection_spec->Set(Store::kInterfaceProviderSpecs_RequiresKey,
|
| - std::move(requires));
|
| + for (const auto& it : interface_provider_specs_) {
|
| + auto spec = base::MakeUnique<base::DictionaryValue>();
|
| +
|
| + auto provides = base::MakeUnique<base::DictionaryValue>();
|
| + for (const auto& i : it.second.provides) {
|
| + auto interfaces = base::MakeUnique<base::ListValue>();
|
| + for (const auto& interface_name : i.second)
|
| + interfaces->AppendString(interface_name);
|
| + provides->Set(i.first, std::move(interfaces));
|
| + }
|
| + spec->Set(Store::kInterfaceProviderSpecs_ProvidesKey, std::move(provides));
|
|
|
| - specs->Set(Store::kInterfaceProvider_ConnectionSpecKey,
|
| - std::move(connection_spec));
|
| + auto requires = base::MakeUnique<base::DictionaryValue>();
|
| + for (const auto& i : it.second.requires) {
|
| + auto capabilities = base::MakeUnique<base::ListValue>();
|
| + for (const auto& capability : i.second)
|
| + capabilities->AppendString(capability);
|
| + requires->Set(i.first, std::move(capabilities));
|
| + }
|
| + spec->Set(Store::kInterfaceProviderSpecs_RequiresKey, std::move(requires));
|
| + specs->Set(it.first, std::move(spec));
|
| + }
|
| value->Set(Store::kInterfaceProviderSpecsKey, std::move(specs));
|
| return value;
|
| }
|
| @@ -187,16 +185,22 @@ std::unique_ptr<Entry> Entry::Deserialize(const base::DictionaryValue& value) {
|
| return nullptr;
|
| }
|
|
|
| - const base::DictionaryValue* connection_spec = nullptr;
|
| - if (interface_provider_specs->GetDictionary(
|
| - Store::kInterfaceProvider_ConnectionSpecKey, &connection_spec)) {
|
| + base::DictionaryValue::Iterator it(*interface_provider_specs);
|
| + for (; !it.IsAtEnd(); it.Advance()) {
|
| + const base::DictionaryValue* spec_value = nullptr;
|
| + if (!interface_provider_specs->GetDictionary(it.key(), &spec_value)) {
|
| + LOG(ERROR) << "Entry::Deserialize: value of InterfaceProvider map for "
|
| + << "key: " << it.key() << " not a dictionary.";
|
| + return nullptr;
|
| + }
|
| +
|
| service_manager::InterfaceProviderSpec spec;
|
| - if (!BuildInterfaceProviderSpec(*connection_spec, &spec)) {
|
| + if (!BuildInterfaceProviderSpec(*spec_value, &spec)) {
|
| LOG(ERROR) << "Entry::Deserialize: failed to build InterfaceProvider "
|
| - << "spec for " << entry->name();
|
| + << "spec for key: " << it.key();
|
| return nullptr;
|
| }
|
| - entry->set_connection_spec(spec);
|
| + entry->AddInterfaceProviderSpec(it.key(), spec);
|
| }
|
|
|
| if (value.HasKey(Store::kServicesKey)) {
|
| @@ -217,21 +221,27 @@ std::unique_ptr<Entry> Entry::Deserialize(const base::DictionaryValue& value) {
|
| return entry;
|
| }
|
|
|
| -bool Entry::ProvidesClass(const std::string& clazz) const {
|
| - return connection_spec_.provides.find(clazz) !=
|
| - connection_spec_.provides.end();
|
| +bool Entry::ProvidesCapability(const std::string& capability) const {
|
| + auto it = interface_provider_specs_.find(
|
| + service_manager::mojom::kServiceManager_ConnectorSpec);
|
| + if (it == interface_provider_specs_.end())
|
| + return false;
|
| +
|
| + auto connection_spec = it->second;
|
| + return connection_spec.provides.find(capability) !=
|
| + connection_spec.provides.end();
|
| }
|
|
|
| bool Entry::operator==(const Entry& other) const {
|
| return other.name_ == name_ && other.qualifier_ == qualifier_ &&
|
| other.display_name_ == display_name_ &&
|
| - other.connection_spec_ == connection_spec_;
|
| + other.interface_provider_specs_ == interface_provider_specs_;
|
| }
|
|
|
| -bool Entry::operator<(const Entry& other) const {
|
| - return std::tie(name_, qualifier_, display_name_, connection_spec_) <
|
| - std::tie(other.name_, other.qualifier_, other.display_name_,
|
| - other.connection_spec_);
|
| +void Entry::AddInterfaceProviderSpec(
|
| + const std::string& name,
|
| + const service_manager::InterfaceProviderSpec& spec) {
|
| + interface_provider_specs_[name] = spec;
|
| }
|
|
|
| } // catalog
|
| @@ -248,7 +258,7 @@ TypeConverter<service_manager::mojom::ResolveResultPtr,
|
| const catalog::Entry& package = input.package() ? *input.package() : input;
|
| result->resolved_name = package.name();
|
| result->qualifier = input.qualifier();
|
| - result->connection_spec = input.connection_spec();
|
| + result->interface_provider_specs = input.interface_provider_specs();
|
| result->package_path = package.path();
|
| return result;
|
| }
|
|
|