From 3b3a025ed445c99bf2a429222ffd1b845e51540e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 12 Feb 2015 17:23:49 +0800 Subject: [PATCH] Move GetsOrCreateAsarArchive to asar_util.h --- atom.gyp | 2 ++ .../browser/net/asar/asar_protocol_handler.cc | 16 ++------- atom/browser/net/asar/asar_protocol_handler.h | 8 ----- atom/browser/net/asar/url_request_asar_job.cc | 2 +- atom/browser/net/asar/url_request_asar_job.h | 5 +-- atom/common/asar/asar_util.cc | 35 +++++++++++++++++++ atom/common/asar/asar_util.h | 23 ++++++++++++ 7 files changed, 66 insertions(+), 25 deletions(-) create mode 100644 atom/common/asar/asar_util.cc create mode 100644 atom/common/asar/asar_util.h diff --git a/atom.gyp b/atom.gyp index a01d89fa9c7d..826248c54d37 100644 --- a/atom.gyp +++ b/atom.gyp @@ -216,6 +216,8 @@ 'atom/common/api/object_life_monitor.h', 'atom/common/asar/archive.cc', 'atom/common/asar/archive.h', + 'atom/common/asar/asar_util.cc', + 'atom/common/asar/asar_util.h', 'atom/common/asar/scoped_temporary_file.cc', 'atom/common/asar/scoped_temporary_file.h', 'atom/common/common_message_generator.cc', diff --git a/atom/browser/net/asar/asar_protocol_handler.cc b/atom/browser/net/asar/asar_protocol_handler.cc index b2c16b896e1a..1e600feaa4fb 100644 --- a/atom/browser/net/asar/asar_protocol_handler.cc +++ b/atom/browser/net/asar/asar_protocol_handler.cc @@ -6,6 +6,7 @@ #include "atom/browser/net/asar/url_request_asar_job.h" #include "atom/common/asar/archive.h" +#include "atom/common/asar/asar_util.h" #include "net/base/filename_util.h" #include "net/base/net_errors.h" #include "net/url_request/url_request_error_job.h" @@ -49,19 +50,6 @@ AsarProtocolHandler::AsarProtocolHandler( AsarProtocolHandler::~AsarProtocolHandler() { } -Archive* AsarProtocolHandler::GetOrCreateAsarArchive( - const base::FilePath& path) const { - if (!archives_.contains(path)) { - scoped_ptr archive(new Archive(path)); - if (!archive->Init()) - return nullptr; - - archives_.set(path, archive.Pass()); - } - - return archives_.get(path); -} - net::URLRequestJob* AsarProtocolHandler::MaybeCreateJob( net::URLRequest* request, net::NetworkDelegate* network_delegate) const { @@ -75,7 +63,7 @@ net::URLRequestJob* AsarProtocolHandler::MaybeCreateJob( return new net::URLRequestFileJob(request, network_delegate, full_path, file_task_runner_); - Archive* archive = GetOrCreateAsarArchive(asar_path); + std::shared_ptr archive = GetOrCreateAsarArchive(asar_path); if (!archive) return new net::URLRequestErrorJob(request, network_delegate, net::ERR_FILE_NOT_FOUND); diff --git a/atom/browser/net/asar/asar_protocol_handler.h b/atom/browser/net/asar/asar_protocol_handler.h index cbfc95b8f778..e0cb74d5d1bf 100644 --- a/atom/browser/net/asar/asar_protocol_handler.h +++ b/atom/browser/net/asar/asar_protocol_handler.h @@ -5,8 +5,6 @@ #ifndef ATOM_BROWSER_NET_ASAR_ASAR_PROTOCOL_HANDLER_H_ #define ATOM_BROWSER_NET_ASAR_ASAR_PROTOCOL_HANDLER_H_ -#include "base/containers/scoped_ptr_hash_map.h" -#include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "net/url_request/url_request_job_factory.h" @@ -16,16 +14,12 @@ class TaskRunner; namespace asar { -class Archive; - class AsarProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { public: explicit AsarProtocolHandler( const scoped_refptr& file_task_runner); virtual ~AsarProtocolHandler(); - Archive* GetOrCreateAsarArchive(const base::FilePath& path) const; - // net::URLRequestJobFactory::ProtocolHandler: net::URLRequestJob* MaybeCreateJob( net::URLRequest* request, @@ -35,8 +29,6 @@ class AsarProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { private: const scoped_refptr file_task_runner_; - mutable base::ScopedPtrHashMap archives_; - DISALLOW_COPY_AND_ASSIGN(AsarProtocolHandler); }; diff --git a/atom/browser/net/asar/url_request_asar_job.cc b/atom/browser/net/asar/url_request_asar_job.cc index aeaab646a9d4..82cade53c6f7 100644 --- a/atom/browser/net/asar/url_request_asar_job.cc +++ b/atom/browser/net/asar/url_request_asar_job.cc @@ -17,7 +17,7 @@ namespace asar { URLRequestAsarJob::URLRequestAsarJob( net::URLRequest* request, net::NetworkDelegate* network_delegate, - Archive* archive, + std::shared_ptr archive, const base::FilePath& file_path, const scoped_refptr& file_task_runner) : net::URLRequestJob(request, network_delegate), diff --git a/atom/browser/net/asar/url_request_asar_job.h b/atom/browser/net/asar/url_request_asar_job.h index 899976471f0e..dc23e327cdff 100644 --- a/atom/browser/net/asar/url_request_asar_job.h +++ b/atom/browser/net/asar/url_request_asar_job.h @@ -5,6 +5,7 @@ #ifndef ATOM_BROWSER_NET_ASAR_URL_REQUEST_ASAR_JOB_H_ #define ATOM_BROWSER_NET_ASAR_URL_REQUEST_ASAR_JOB_H_ +#include #include #include "atom/common/asar/archive.h" @@ -27,7 +28,7 @@ class URLRequestAsarJob : public net::URLRequestJob { public: URLRequestAsarJob(net::URLRequest* request, net::NetworkDelegate* network_delegate, - Archive* archive, + std::shared_ptr archive, const base::FilePath& file_path, const scoped_refptr& file_task_runner); @@ -53,7 +54,7 @@ class URLRequestAsarJob : public net::URLRequestJob { // Callback after data is asynchronously read from the file into |buf|. void DidRead(scoped_refptr buf, int result); - Archive* archive_; + std::shared_ptr archive_; Archive::FileInfo file_info_; base::FilePath file_path_; diff --git a/atom/common/asar/asar_util.cc b/atom/common/asar/asar_util.cc new file mode 100644 index 000000000000..256992c95899 --- /dev/null +++ b/atom/common/asar/asar_util.cc @@ -0,0 +1,35 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/common/asar/asar_util.h" + +#include + +#include "atom/common/asar/archive.h" +#include "base/files/file_path.h" +#include "base/lazy_instance.h" +#include "base/stl_util.h" + +namespace asar { + +typedef std::map> ArchiveMap; + +namespace { + +static base::LazyInstance g_archive_map = LAZY_INSTANCE_INITIALIZER; + +} // namespace + +std::shared_ptr GetOrCreateAsarArchive(const base::FilePath& path) { + ArchiveMap& archive_map = *g_archive_map.Pointer(); + if (!ContainsKey(archive_map, path)) { + std::shared_ptr archive(new Archive(path)); + if (!archive->Init()) + return nullptr; + archive_map[path] = archive; + } + return archive_map[path]; +} + +} // namespace asar diff --git a/atom/common/asar/asar_util.h b/atom/common/asar/asar_util.h new file mode 100644 index 000000000000..f44204b2f763 --- /dev/null +++ b/atom/common/asar/asar_util.h @@ -0,0 +1,23 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_COMMON_ASAR_ASAR_UTIL_H_ +#define ATOM_COMMON_ASAR_ASAR_UTIL_H_ + +#include + +namespace base { +class FilePath; +} + +namespace asar { + +class Archive; + +// Gets or creates a new Archive from the path. +std::shared_ptr GetOrCreateAsarArchive(const base::FilePath& path); + +} // namespace asar + +#endif // ATOM_COMMON_ASAR_ASAR_UTIL_H_