Index: mojo/services/catalog/catalog.cc |
diff --git a/mojo/services/catalog/catalog.cc b/mojo/services/catalog/catalog.cc |
index bb7285765e19996cf3ef0f11a0fe6eea9a8f30b5..3b8f8e65d79953aa4b117461dfb12fb3cbfcfec8 100644 |
--- a/mojo/services/catalog/catalog.cc |
+++ b/mojo/services/catalog/catalog.cc |
@@ -6,10 +6,13 @@ |
#include "base/bind.h" |
#include "base/json/json_file_value_serializer.h" |
+#include "base/json/json_reader.h" |
#include "base/strings/string_split.h" |
#include "base/task_runner_util.h" |
+#include "base/thread_task_runner_handle.h" |
#include "mojo/common/url_type_converters.h" |
#include "mojo/services/catalog/entry.h" |
+#include "mojo/services/catalog/manifest_provider.h" |
#include "mojo/services/catalog/store.h" |
#include "mojo/shell/public/cpp/names.h" |
#include "url/gurl.h" |
@@ -49,18 +52,36 @@ base::FilePath GetPackagePath(const base::FilePath& package_dir, |
return base::FilePath(); |
} |
+scoped_ptr<ReadManifestResult> ProcessManifest( |
+ const base::FilePath& package_dir, |
+ const std::string& name, |
+ scoped_ptr<base::Value> manifest_root) { |
+ scoped_ptr<Entry> entry(new Entry(name)); |
+ if (manifest_root) { |
+ const base::DictionaryValue* dictionary = nullptr; |
+ CHECK(manifest_root->GetAsDictionary(&dictionary)); |
+ entry = Entry::Deserialize(*dictionary); |
+ } |
+ entry->set_path(GetPackagePath(package_dir, name)); |
+ |
+ scoped_ptr<ReadManifestResult> result(new ReadManifestResult); |
+ // NOTE: This TypeConverter must run on a thread which allows IO. |
+ result->resolve_result = mojo::shell::mojom::ResolveResult::From(*entry); |
+ result->catalog_entry = std::move(entry); |
+ return result; |
+} |
+ |
scoped_ptr<ReadManifestResult> ReadManifest(const base::FilePath& package_dir, |
const std::string& name) { |
base::FilePath manifest_path = GetManifestPath(package_dir, name); |
JSONFileValueDeserializer deserializer(manifest_path); |
int error = 0; |
std::string message; |
+ |
// TODO(beng): probably want to do more detailed error checking. This should |
// be done when figuring out if to unblock connection completion. |
- scoped_ptr<ReadManifestResult> result(new ReadManifestResult); |
- result->manifest_root = deserializer.Deserialize(&error, &message); |
- result->package_dir = package_dir; |
- return result; |
+ return ProcessManifest(package_dir, name, |
+ deserializer.Deserialize(&error, &message)); |
} |
} // namespace |
@@ -71,8 +92,11 @@ ReadManifestResult::~ReadManifestResult() {} |
//////////////////////////////////////////////////////////////////////////////// |
// Catalog, public: |
-Catalog::Catalog(scoped_ptr<Store> store, base::TaskRunner* file_task_runner) |
- : store_(std::move(store)), |
+Catalog::Catalog(scoped_ptr<Store> store, |
+ base::TaskRunner* file_task_runner, |
+ ManifestProvider* manifest_provider) |
+ : manifest_provider_(manifest_provider), |
+ store_(std::move(store)), |
file_task_runner_(file_task_runner), |
weak_factory_(this) { |
PathService::Get(base::DIR_MODULE, &system_package_dir_); |
@@ -134,11 +158,25 @@ void Catalog::ResolveMojoName(const mojo::String& mojo_name, |
if (entry != catalog_.end()) { |
callback.Run(mojo::shell::mojom::ResolveResult::From(*entry->second)); |
} else { |
- base::PostTaskAndReplyWithResult( |
- file_task_runner_, FROM_HERE, |
- base::Bind(&ReadManifest, system_package_dir_, mojo_name), |
- base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), |
- mojo_name, callback)); |
+ std::string manifest_contents; |
+ if (manifest_provider_ && |
+ manifest_provider_->GetApplicationManifest(mojo_name.To<std::string>(), |
+ &manifest_contents)) { |
+ scoped_ptr<base::Value> manifest_root = |
+ base::JSONReader::Read(manifest_contents); |
+ base::PostTaskAndReplyWithResult( |
+ file_task_runner_, FROM_HERE, |
+ base::Bind(&ProcessManifest, system_package_dir_, mojo_name, |
+ base::Passed(&manifest_root)), |
+ base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), |
+ mojo_name, callback)); |
+ } else { |
+ base::PostTaskAndReplyWithResult( |
+ file_task_runner_, FROM_HERE, |
+ base::Bind(&ReadManifest, system_package_dir_, mojo_name), |
+ base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), |
+ mojo_name, callback)); |
+ } |
} |
} |
@@ -192,17 +230,9 @@ void Catalog::OnReadManifest(base::WeakPtr<Catalog> catalog, |
const std::string& name, |
const ResolveMojoNameCallback& callback, |
scoped_ptr<ReadManifestResult> result) { |
- scoped_ptr<Entry> entry(new Entry(name)); |
- if (result->manifest_root) { |
- const base::DictionaryValue* dictionary = nullptr; |
- CHECK(result->manifest_root->GetAsDictionary(&dictionary)); |
- entry = Entry::Deserialize(*dictionary); |
- } |
- entry->set_path(GetPackagePath(result->package_dir, name)); |
- |
- callback.Run(mojo::shell::mojom::ResolveResult::From(*entry)); |
+ callback.Run(std::move(result ->resolve_result)); |
if (catalog) |
- catalog->AddEntryToCatalog(std::move(entry)); |
+ catalog->AddEntryToCatalog(std::move(result->catalog_entry)); |
} |
void Catalog::AddEntryToCatalog(scoped_ptr<Entry> entry) { |