From 3678f13dfb0e1266f06b247535039393b820fa5c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 12 Feb 2015 19:34:21 +0800 Subject: [PATCH] Make NativeImage work with asar archive --- atom/common/api/atom_api_native_image.cc | 4 ++-- atom/common/asar/asar_util.cc | 23 +++++++++++++++++++++++ atom/common/asar/asar_util.h | 3 +++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index 6b873fa7f55a..a57ff221a424 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -7,11 +7,11 @@ #include #include +#include "atom/common/asar/asar_util.h" #include "atom/common/native_mate_converters/file_path_converter.h" #include "atom/common/native_mate_converters/gfx_converter.h" #include "atom/common/native_mate_converters/gurl_converter.h" #include "base/base64.h" -#include "base/files/file_util.h" #include "base/strings/string_util.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" @@ -86,7 +86,7 @@ bool AddImageSkiaRep(gfx::ImageSkia* image, const base::FilePath& path, double scale_factor) { std::string file_contents; - if (!base::ReadFileToString(path, &file_contents)) + if (!asar::ReadFileToString(path, &file_contents)) return false; const unsigned char* data = diff --git a/atom/common/asar/asar_util.cc b/atom/common/asar/asar_util.cc index 241f230c55b3..7c35ddcc5c2c 100644 --- a/atom/common/asar/asar_util.cc +++ b/atom/common/asar/asar_util.cc @@ -8,6 +8,7 @@ #include "atom/common/asar/archive.h" #include "base/files/file_path.h" +#include "base/files/file_util.h" #include "base/lazy_instance.h" #include "base/stl_util.h" @@ -57,4 +58,26 @@ bool GetAsarArchivePath(const base::FilePath& full_path, return true; } +bool ReadFileToString(const base::FilePath& path, std::string* contents) { + base::FilePath asar_path, relative_path; + if (!GetAsarArchivePath(path, &asar_path, &relative_path)) + return base::ReadFileToString(path, contents); + + std::shared_ptr archive = GetOrCreateAsarArchive(asar_path); + if (!archive) + return false; + + Archive::FileInfo info; + if (!archive->GetFileInfo(relative_path, &info)) + return false; + + base::File src(asar_path, base::File::FLAG_OPEN | base::File::FLAG_READ); + if (!src.IsValid()) + return false; + + contents->resize(info.size); + return static_cast(info.size) == src.Read( + info.offset, const_cast(contents->data()), contents->size()); +} + } // namespace asar diff --git a/atom/common/asar/asar_util.h b/atom/common/asar/asar_util.h index 9df55da5f3cd..b3c60f679b52 100644 --- a/atom/common/asar/asar_util.h +++ b/atom/common/asar/asar_util.h @@ -23,6 +23,9 @@ bool GetAsarArchivePath(const base::FilePath& full_path, base::FilePath* asar_path, base::FilePath* relative_path); +// Same with base::ReadFileToString but supports asar Archive. +bool ReadFileToString(const base::FilePath& path, std::string* contents); + } // namespace asar #endif // ATOM_COMMON_ASAR_ASAR_UTIL_H_