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

Unified Diff: chrome/browser/chromeos/extensions/zip_file_creator.cc

Issue 11309014: File manager: support for zipping selected files. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix compiler warning: declare base::FileDescriptor a struct, not a class. The struct is put after t… Created 8 years, 1 month 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
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
« no previous file with comments | « chrome/browser/chromeos/extensions/zip_file_creator.h ('k') | chrome/browser/extensions/extension_function_registry.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698