Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(231)

Unified Diff: shell/dynamic_application_loader.cc

Issue 866383004: Fix skydb --gdb to always have symbols (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | sky/tools/mojo_cache_linker.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: shell/dynamic_application_loader.cc
diff --git a/shell/dynamic_application_loader.cc b/shell/dynamic_application_loader.cc
index 374484531eaba8ca9b5b7f9f5703bfdeeaf22309..632bf21f8adf2e4666eb36bb17616f9534860800 100644
--- a/shell/dynamic_application_loader.cc
+++ b/shell/dynamic_application_loader.cc
@@ -4,12 +4,14 @@
#include "shell/dynamic_application_loader.h"
+#include <fstream>
Aaron Boodman 2015/01/23 21:56:40 We don't typically use stl's stream support in Chr
eseidel 2015/01/23 22:12:21 Yeah, ComputeAppId is lifted directly from android
Aaron Boodman 2015/01/23 22:29:00 How about base::File::Read() and friends?
#include "base/bind.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/format_macros.h"
#include "base/logging.h"
+#include "base/md5.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop.h"
@@ -304,6 +306,55 @@ class DynamicApplicationLoader::NetworkLoader : public Loader {
base::AppendToFile(map_path, map_entry.data(), map_entry.length());
}
+ // Using MD5 because base/md5.h has an incremental API, any crypto would work.
Aaron Boodman 2015/01/23 21:56:41 Yeah it would be better to use sha256 I think, if
eseidel 2015/01/23 22:12:21 Agreed. I'll change it to say TODO, sadly md5 is
+ // Derived from android/md5sum.cc
+ static bool ComputeAppId(const base::FilePath& path,
+ std::string* digest_string) {
+ std::ifstream stream(path.value().data());
+ if (!stream.good()) {
+ LOG(ERROR) << "Failed to open " << path.value() << " for computing AppId";
+ return false;
+ }
+ base::MD5Context ctx;
+ base::MD5Init(&ctx);
+ char buf[1024];
+ while (stream.good()) {
+ std::streamsize bytes_read = stream.readsome(buf, sizeof(buf));
+ if (bytes_read == 0)
+ break;
+ base::MD5Update(&ctx, base::StringPiece(buf, bytes_read));
+ }
+ if (stream.fail()) {
+ LOG(ERROR) << "Error reading " << path.value();
+ return false;
+ }
+ base::MD5Digest digest;
+ base::MD5Final(&digest, &ctx);
+ *digest_string = base::MD5DigestToBase16(digest);
+ return true;
+ }
+
+ void RenameToAppId(base::Callback<void(const base::FilePath&, bool)> callback,
+ bool copy_success) {
+ // The copy has completed move to a predictable location $TMP/$APP_ID.mojo.
Aaron Boodman 2015/01/23 21:56:40 I don't think this comment is true .. we haven't m
eseidel 2015/01/23 22:12:21 Yeah, sorry I was trying to explain what the metho
+ if (copy_success) {
Aaron Boodman 2015/01/23 21:56:41 If the copy failed, we're SOL. Should not do anymo
eseidel 2015/01/23 22:12:21 We already send false if the copy failed (by skipp
Aaron Boodman 2015/01/23 22:29:00 I mean we should not call RecordCacheToURLMapping(
+ std::string app_id;
+ if (ComputeAppId(path_, &app_id)) {
+ base::FilePath temp_dir;
+ base::GetTempDir(&temp_dir);
+ std::string map_name = base::StringPrintf("%s.mojo", app_id.data());
Aaron Boodman 2015/01/23 21:56:40 app_id.c_str()
Aaron Boodman 2015/01/23 21:56:40 I think 'mapped_name' might be a better name for t
eseidel 2015/01/23 22:12:21 Done.
+ base::FilePath new_path = temp_dir.Append(map_name);
+ if (base::Move(path_, new_path))
+ path_ = new_path;
+ }
+ }
+ RecordCacheToURLMapping(path_, url_);
+
+ copy_success = copy_success && base::PathExists(path_);
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(callback, path_, copy_success));
+ }
+
void AsPath(
base::TaskRunner* task_runner,
base::Callback<void(const base::FilePath&, bool)> callback) override {
@@ -312,14 +363,12 @@ class DynamicApplicationLoader::NetworkLoader : public Loader {
FROM_HERE, base::Bind(callback, path_, base::PathExists(path_)));
return;
}
+
// We don't use the created file, just want the directory and random name.
Aaron Boodman 2015/01/23 21:56:41 I think this comment is incorrect ... we do use th
eseidel 2015/01/23 22:12:21 Well, CreateTempFile creates and empty file and th
Aaron Boodman 2015/01/23 22:29:00 I see. Can you just delete it then.
base::CreateTemporaryFile(&path_);
- base::DeleteFile(path_, false);
- path_ = path_.AddExtension(".mojo"); // Make libraries easy to spot.
common::CopyToFile(response_->body.Pass(), path_, task_runner,
- base::Bind(callback, path_));
-
- RecordCacheToURLMapping(path_, url_);
+ base::Bind(&NetworkLoader::RenameToAppId,
+ base::Unretained(this), callback));
Aaron Boodman 2015/01/23 21:56:40 Add a comment explaining why unretained is ok?
eseidel 2015/01/23 22:12:21 I'm not sure unretained is OK. If the copy for so
Aaron Boodman 2015/01/23 22:29:00 It actually looks to me like NetworkLoader cannot
}
std::string MimeType() override {
« no previous file with comments | « no previous file | sky/tools/mojo_cache_linker.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698