Index: mojo/tools/package_manager/package_manager_application.cc |
diff --git a/mojo/tools/package_manager/package_manager_application.cc b/mojo/tools/package_manager/package_manager_application.cc |
index 39a784262edb21376a71dfadbed90054e0f63084..ae4d4a4d3f17503c23a9f9953e1aabdfc518ad51 100644 |
--- a/mojo/tools/package_manager/package_manager_application.cc |
+++ b/mojo/tools/package_manager/package_manager_application.cc |
@@ -5,12 +5,21 @@ |
#include "mojo/tools/package_manager/package_manager_application.h" |
#include "base/files/file_util.h" |
+#include "mojo/tools/package_manager/manifest.h" |
+#include "mojo/tools/package_manager/unpacker.h" |
#include "base/message_loop/message_loop.h" |
#include "base/stl_util.h" |
#include "mojo/public/cpp/application/application_impl.h" |
namespace mojo { |
+namespace { |
+ |
+const base::FilePath::CharType kManifestFileName[] = |
+ FILE_PATH_LITERAL("manifest.json"); |
+ |
+} // namespace |
+ |
PackageManagerApplication::PendingLoad::PendingLoad() { |
} |
@@ -21,7 +30,6 @@ PackageManagerApplication::PackageManagerApplication() { |
} |
PackageManagerApplication::~PackageManagerApplication() { |
- printf("APPLICATION EXITING\n"); |
STLDeleteContainerPairSecondPointers(pending_.begin(), pending_.end()); |
} |
@@ -42,15 +50,28 @@ void PackageManagerApplication::Initialize(ApplicationImpl* app) { |
return; |
} |
+ StartLoad(url); |
+} |
+ |
+void PackageManagerApplication::StartLoad(const GURL& url) { |
+ if (completed_.find(url) != completed_.end() || |
+ pending_.find(url) != pending_.end()) |
+ return; // Already loaded or are loading this one. |
+ |
PendingLoad* load = new PendingLoad; |
load->fetcher.reset(new mojo::PackageFetcher( |
network_service_.get(), this, url)); |
- |
pending_[url] = load; |
} |
+void PackageManagerApplication::LoadDeps(const Manifest& manifest) { |
+ for (size_t i = 0; i < manifest.deps().size(); i++) |
+ StartLoad(manifest.deps()[i]); |
+} |
+ |
void PackageManagerApplication::PendingLoadComplete(const GURL& url) { |
pending_.erase(pending_.find(url)); |
+ completed_.insert(url); |
if (pending_.empty()) |
base::MessageLoop::current()->Quit(); |
} |
@@ -58,16 +79,30 @@ void PackageManagerApplication::PendingLoadComplete(const GURL& url) { |
void PackageManagerApplication::FetchSucceeded( |
const GURL& url, |
const base::FilePath& name) { |
- PendingLoad* load = pending_.find(url)->second; |
- |
- if (!load->unpacker.Unpack(name)) { |
+ Unpacker unpacker; |
+ if (!unpacker.Unpack(name)) { |
base::DeleteFile(name, false); |
printf("Failed to unpack\n"); |
PendingLoadComplete(url); |
return; |
} |
+ // The downloaded .zip file is no longer necessary. |
base::DeleteFile(name, false); |
+ // Load the manifest. |
+ base::FilePath manifest_path = unpacker.dir().Append(kManifestFileName); |
+ Manifest manifest; |
+ std::string err_msg; |
+ if (!manifest.ParseFromFile(manifest_path, &err_msg)) { |
+ printf("%s\n", err_msg.c_str()); |
+ PendingLoadComplete(url); |
+ return; |
+ } |
+ |
+ // Enqueue loads for any deps. |
+ LoadDeps(manifest); |
+ |
+ printf("Loaded %s\n", url.spec().c_str()); |
PendingLoadComplete(url); |
} |