| Index: chrome/browser/chromeos/extensions/zip_file_creator.cc
|
| diff --git a/chrome/browser/chromeos/extensions/zip_file_creator.cc b/chrome/browser/chromeos/extensions/zip_file_creator.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8682173590772145269a9590b6775f961d7895e6
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/extensions/zip_file_creator.cc
|
| @@ -0,0 +1,117 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/chromeos/extensions/zip_file_creator.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/command_line.h"
|
| +#include "base/file_util.h"
|
| +#include "base/file_util_proxy.h"
|
| +#include "base/memory/scoped_handle.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/path_service.h"
|
| +#include "chrome/common/chrome_paths.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "chrome/common/chrome_utility_messages.h"
|
| +#include "chrome/common/extensions/extension_file_util.h"
|
| +#include "chrome/common/extensions/extension_manifest_constants.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/utility_process_host.h"
|
| +#include "grit/generated_resources.h"
|
| +
|
| +using content::BrowserThread;
|
| +using content::UtilityProcessHost;
|
| +
|
| +namespace extensions {
|
| +
|
| +ZipFileCreator::ZipFileCreator(
|
| + Observer* observer,
|
| + const FilePath& src_dir,
|
| + const std::vector<FilePath>& src_relative_paths,
|
| + const FilePath& dest_file)
|
| + : thread_identifier_(BrowserThread::ID_COUNT),
|
| + observer_(observer),
|
| + src_dir_(src_dir),
|
| + src_relative_paths_(src_relative_paths),
|
| + dest_file_(dest_file) {
|
| +}
|
| +
|
| +void ZipFileCreator::Start() {
|
| + CHECK(BrowserThread::GetCurrentThreadIdentifier(&thread_identifier_));
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(
|
| + &ZipFileCreator::StartProcessOnIOThread,
|
| + this));
|
| +}
|
| +
|
| +ZipFileCreator::~ZipFileCreator() {
|
| +}
|
| +
|
| +bool ZipFileCreator::OnMessageReceived(const IPC::Message& message) {
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP(ZipFileCreator, message)
|
| + IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_CreateZipFile_Succeeded,
|
| + OnCreateZipFileSucceeded)
|
| + IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_CreateZipFile_Failed,
|
| + OnCreateZipFileFailed)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| +}
|
| +
|
| +void ZipFileCreator::OnProcessCrashed(int exit_code) {
|
| + // Don't report crashes if they happen after we got a response.
|
| + if (got_response_)
|
| + return;
|
| +
|
| + // Utility process crashed while trying to create the zip file.
|
| + ReportDone(false);
|
| +}
|
| +
|
| +void ZipFileCreator::StartProcessOnIOThread() {
|
| + // Create the destination zip file only if it does not already exist.
|
| + int flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE;
|
| + base::PlatformFileError error_code = base::PLATFORM_FILE_OK;
|
| + base::PlatformFile dest_file =
|
| + base::CreatePlatformFile(dest_file_, flags, NULL, &error_code);
|
| +
|
| + if (error_code != base::PLATFORM_FILE_OK) {
|
| + LOG(ERROR) << "Failed to create dest zip file " << dest_file_.value();
|
| + ReportDone(false);
|
| + return;
|
| + }
|
| +
|
| + base::FileDescriptor dest_fd;
|
| + dest_fd.fd = dest_file;
|
| + dest_fd.auto_close = true;
|
| +
|
| + UtilityProcessHost* host = UtilityProcessHost::Create(
|
| + this, BrowserThread::GetMessageLoopProxyForThread(thread_identifier_));
|
| + host->Send(new ChromeUtilityMsg_CreateZipFile(src_dir_, src_relative_paths_,
|
| + dest_fd));
|
| +}
|
| +
|
| +void ZipFileCreator::OnCreateZipFileSucceeded() {
|
| + // Skip check for unittests.
|
| + if (thread_identifier_ != BrowserThread::ID_COUNT)
|
| + CHECK(BrowserThread::CurrentlyOn(thread_identifier_));
|
| + got_response_ = true;
|
| +
|
| + ReportDone(true);
|
| +}
|
| +
|
| +void ZipFileCreator::OnCreateZipFileFailed() {
|
| + // Skip check for unittests.
|
| + if (thread_identifier_ != BrowserThread::ID_COUNT)
|
| + CHECK(BrowserThread::CurrentlyOn(thread_identifier_));
|
| + got_response_ = true;
|
| + ReportDone(false);
|
| +}
|
| +
|
| +void ZipFileCreator::ReportDone(bool success) {
|
| + observer_->OnZipDone(success);
|
| +}
|
| +
|
| +} // namespace extensions
|
|
|