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/reader.h" | 5 #include "services/catalog/reader.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/files/file_enumerator.h" | 8 #include "base/files/file_enumerator.h" |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/json/json_file_value_serializer.h" | 10 #include "base/json/json_file_value_serializer.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 } | 114 } |
115 | 115 |
116 original_thread_task_runner->PostTask( | 116 original_thread_task_runner->PostTask( |
117 FROM_HERE, | 117 FROM_HERE, |
118 base::Bind(read_manifest_callback, base::Passed(&entry))); | 118 base::Bind(read_manifest_callback, base::Passed(&entry))); |
119 } | 119 } |
120 | 120 |
121 original_thread_task_runner->PostTask(FROM_HERE, read_complete_closure); | 121 original_thread_task_runner->PostTask(FROM_HERE, read_complete_closure); |
122 } | 122 } |
123 | 123 |
124 std::unique_ptr<Entry> ReadManifest(const base::FilePath& package_dir, | 124 std::unique_ptr<Entry> ReadManifest( |
125 const std::string& mojo_name) { | 125 const base::FilePath& package_dir, |
126 std::unique_ptr<Entry> entry = CreateEntryForManifestAt( | 126 const std::string& mojo_name, |
127 GetManifestPath(package_dir, mojo_name), package_dir); | 127 const base::FilePath& manifest_path_override) { |
| 128 base::FilePath manifest_path; |
| 129 if (manifest_path_override.empty()) |
| 130 manifest_path = GetManifestPath(package_dir, mojo_name); |
| 131 else |
| 132 manifest_path = manifest_path_override; |
| 133 |
| 134 std::unique_ptr<Entry> entry = CreateEntryForManifestAt(manifest_path, |
| 135 package_dir); |
128 if (!entry) { | 136 if (!entry) { |
129 entry.reset(new Entry(mojo_name)); | 137 entry.reset(new Entry(mojo_name)); |
130 entry->set_path(GetExecutablePath( | 138 entry->set_path(GetExecutablePath( |
131 package_dir.AppendASCII(kPackagesDirName), mojo_name)); | 139 package_dir.AppendASCII(kPackagesDirName), mojo_name)); |
132 } | 140 } |
133 return entry; | 141 return entry; |
134 } | 142 } |
135 | 143 |
136 void AddEntryToCache(EntryCache* cache, std::unique_ptr<Entry> entry) { | 144 void AddEntryToCache(EntryCache* cache, std::unique_ptr<Entry> entry) { |
137 std::vector<std::unique_ptr<Entry>> children = entry->TakeChildren(); | 145 std::vector<std::unique_ptr<Entry>> children = entry->TakeChildren(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 if (manifest_root) { | 193 if (manifest_root) { |
186 base::PostTaskAndReplyWithResult( | 194 base::PostTaskAndReplyWithResult( |
187 file_task_runner_.get(), FROM_HERE, | 195 file_task_runner_.get(), FROM_HERE, |
188 base::Bind(&ProcessManifest, base::Passed(&manifest_root), | 196 base::Bind(&ProcessManifest, base::Passed(&manifest_root), |
189 system_package_dir_), | 197 system_package_dir_), |
190 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache, | 198 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache, |
191 entry_created_callback)); | 199 entry_created_callback)); |
192 return; | 200 return; |
193 } | 201 } |
194 } | 202 } |
| 203 |
| 204 base::FilePath manifest_path_override; |
| 205 auto override_iter = manifest_path_overrides_.find(mojo_name); |
| 206 if (override_iter != manifest_path_overrides_.end()) |
| 207 manifest_path_override = override_iter->second; |
| 208 |
195 base::PostTaskAndReplyWithResult( | 209 base::PostTaskAndReplyWithResult( |
196 file_task_runner_.get(), FROM_HERE, | 210 file_task_runner_.get(), FROM_HERE, |
197 base::Bind(&ReadManifest, system_package_dir_, mojo_name), | 211 base::Bind(&ReadManifest, system_package_dir_, mojo_name, |
| 212 manifest_path_override), |
198 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache, | 213 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache, |
199 entry_created_callback)); | 214 entry_created_callback)); |
200 } | 215 } |
201 | 216 |
| 217 void Reader::OverrideManifestPath(const std::string& service_name, |
| 218 const base::FilePath& path) { |
| 219 manifest_path_overrides_.insert(std::make_pair(service_name, path)); |
| 220 } |
| 221 |
202 Reader::Reader(ManifestProvider* manifest_provider) | 222 Reader::Reader(ManifestProvider* manifest_provider) |
203 : manifest_provider_(manifest_provider), weak_factory_(this) { | 223 : manifest_provider_(manifest_provider), weak_factory_(this) { |
204 PathService::Get(base::DIR_MODULE, &system_package_dir_); | 224 PathService::Get(base::DIR_MODULE, &system_package_dir_); |
205 } | 225 } |
206 | 226 |
207 void Reader::OnReadManifest( | 227 void Reader::OnReadManifest( |
208 EntryCache* cache, | 228 EntryCache* cache, |
209 const CreateEntryForNameCallback& entry_created_callback, | 229 const CreateEntryForNameCallback& entry_created_callback, |
210 std::unique_ptr<Entry> entry) { | 230 std::unique_ptr<Entry> entry) { |
211 if (!entry) | 231 if (!entry) |
212 return; | 232 return; |
213 shell::mojom::ResolveResultPtr result = | 233 shell::mojom::ResolveResultPtr result = |
214 shell::mojom::ResolveResult::From(*entry); | 234 shell::mojom::ResolveResult::From(*entry); |
215 AddEntryToCache(cache, std::move(entry)); | 235 AddEntryToCache(cache, std::move(entry)); |
216 entry_created_callback.Run(std::move(result)); | 236 entry_created_callback.Run(std::move(result)); |
217 } | 237 } |
218 | 238 |
219 } // namespace catalog | 239 } // namespace catalog |
OLD | NEW |