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/instance.h" | 5 #include "services/catalog/instance.h" |
6 | 6 |
7 #include <memory> | |
8 | |
9 #include "base/bind.h" | 7 #include "base/bind.h" |
10 #include "base/values.h" | |
11 #include "services/catalog/entry.h" | 8 #include "services/catalog/entry.h" |
12 #include "services/catalog/entry_cache.h" | 9 #include "services/catalog/entry_cache.h" |
13 #include "services/catalog/manifest_provider.h" | 10 #include "services/catalog/manifest_provider.h" |
| 11 #include "services/catalog/reader.h" |
14 | 12 |
15 namespace catalog { | 13 namespace catalog { |
16 namespace { | 14 namespace { |
17 | 15 |
18 void AddEntry(const Entry& entry, std::vector<mojom::EntryPtr>* ary) { | 16 void AddEntry(const Entry& entry, std::vector<mojom::EntryPtr>* ary) { |
19 mojom::EntryPtr entry_ptr(mojom::Entry::New()); | 17 mojom::EntryPtr entry_ptr(mojom::Entry::New()); |
20 entry_ptr->name = entry.name(); | 18 entry_ptr->name = entry.name(); |
21 entry_ptr->display_name = entry.display_name(); | 19 entry_ptr->display_name = entry.display_name(); |
22 ary->push_back(std::move(entry_ptr)); | 20 ary->push_back(std::move(entry_ptr)); |
23 } | 21 } |
24 | 22 |
25 } // namespace | 23 } // namespace |
26 | 24 |
27 Instance::Instance(EntryCache* system_cache, | 25 Instance::Instance(Reader* system_reader) : system_reader_(system_reader) {} |
28 ManifestProvider* service_manifest_provider) | |
29 : system_cache_(system_cache), | |
30 service_manifest_provider_(service_manifest_provider) {} | |
31 | 26 |
32 Instance::~Instance() {} | 27 Instance::~Instance() {} |
33 | 28 |
34 void Instance::BindResolver(service_manager::mojom::ResolverRequest request) { | 29 void Instance::BindResolver(service_manager::mojom::ResolverRequest request) { |
35 resolver_bindings_.AddBinding(this, std::move(request)); | 30 if (system_cache_) |
| 31 resolver_bindings_.AddBinding(this, std::move(request)); |
| 32 else |
| 33 pending_resolver_requests_.push_back(std::move(request)); |
36 } | 34 } |
37 | 35 |
38 void Instance::BindCatalog(mojom::CatalogRequest request) { | 36 void Instance::BindCatalog(mojom::CatalogRequest request) { |
39 catalog_bindings_.AddBinding(this, std::move(request)); | 37 if (system_cache_) |
| 38 catalog_bindings_.AddBinding(this, std::move(request)); |
| 39 else |
| 40 pending_catalog_requests_.push_back(std::move(request)); |
| 41 } |
| 42 |
| 43 void Instance::CacheReady(EntryCache* cache) { |
| 44 system_cache_ = cache; |
| 45 for (auto& request : pending_resolver_requests_) |
| 46 BindResolver(std::move(request)); |
| 47 for (auto& request : pending_catalog_requests_) |
| 48 BindCatalog(std::move(request)); |
40 } | 49 } |
41 | 50 |
42 void Instance::ResolveServiceName(const std::string& service_name, | 51 void Instance::ResolveServiceName(const std::string& service_name, |
43 const ResolveServiceNameCallback& callback) { | 52 const ResolveServiceNameCallback& callback) { |
44 DCHECK(system_cache_); | 53 DCHECK(system_cache_); |
45 | 54 |
46 // TODO(beng): per-user catalogs. | 55 // TODO(beng): per-user catalogs. |
47 const Entry* entry = system_cache_->GetEntry(service_name); | 56 const Entry* entry = system_cache_->GetEntry(service_name); |
48 if (entry) { | 57 if (entry) { |
49 callback.Run(service_manager::mojom::ResolveResult::From(entry), | 58 callback.Run(service_manager::mojom::ResolveResult::From(entry), |
50 service_manager::mojom::ResolveResult::From(entry->parent())); | 59 service_manager::mojom::ResolveResult::From(entry->parent())); |
51 return; | 60 return; |
52 } else if (service_manifest_provider_) { | |
53 auto manifest = service_manifest_provider_->GetManifest(service_name); | |
54 if (manifest) { | |
55 auto entry = Entry::Deserialize(*manifest); | |
56 if (entry) { | |
57 callback.Run( | |
58 service_manager::mojom::ResolveResult::From( | |
59 const_cast<const Entry*>(entry.get())), | |
60 service_manager::mojom::ResolveResult::From(entry->parent())); | |
61 | |
62 bool added = system_cache_->AddRootEntry(std::move(entry)); | |
63 DCHECK(added); | |
64 return; | |
65 } else { | |
66 LOG(ERROR) << "Received malformed manifest for " << service_name; | |
67 } | |
68 } | |
69 } | 61 } |
70 | 62 |
71 LOG(ERROR) << "Unable to locate service manifest for " << service_name; | 63 system_reader_->CreateEntryForName(service_name, system_cache_, callback); |
72 callback.Run(nullptr, nullptr); | |
73 } | 64 } |
74 | 65 |
75 void Instance::GetEntries(const base::Optional<std::vector<std::string>>& names, | 66 void Instance::GetEntries(const base::Optional<std::vector<std::string>>& names, |
76 const GetEntriesCallback& callback) { | 67 const GetEntriesCallback& callback) { |
77 DCHECK(system_cache_); | 68 DCHECK(system_cache_); |
78 | 69 |
79 std::vector<mojom::EntryPtr> entries; | 70 std::vector<mojom::EntryPtr> entries; |
80 if (!names.has_value()) { | 71 if (!names.has_value()) { |
81 // TODO(beng): user catalog. | 72 // TODO(beng): user catalog. |
82 for (const auto& entry : system_cache_->entries()) | 73 for (const auto& entry : system_cache_->entries()) |
(...skipping 25 matching lines...) Expand all Loading... |
108 // TODO(beng): implement. | 99 // TODO(beng): implement. |
109 } | 100 } |
110 | 101 |
111 void Instance::GetEntriesSupportingScheme( | 102 void Instance::GetEntriesSupportingScheme( |
112 const std::string& scheme, | 103 const std::string& scheme, |
113 const GetEntriesSupportingSchemeCallback& callback) { | 104 const GetEntriesSupportingSchemeCallback& callback) { |
114 // TODO(beng): implement. | 105 // TODO(beng): implement. |
115 } | 106 } |
116 | 107 |
117 } // namespace catalog | 108 } // namespace catalog |
OLD | NEW |