1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/file_manager/zip_file_creator.h"
8 #include "base/command_line.h"
9 #include "base/files/file_util_proxy.h"
10 #include "base/memory/scoped_handle.h"
11 #include "base/message_loop/message_loop.h"
12 #include "base/path_service.h"
13 #include "base/threading/sequenced_worker_pool.h"
14 #include "chrome/common/chrome_paths.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "chrome/common/chrome_utility_messages.h"
17 #include "chrome/common/extensions/extension_file_util.h"
18 #include "content/public/browser/browser_thread.h"
19 #include "content/public/browser/utility_process_host.h"
20 #include "grit/generated_resources.h"
22 using content::BrowserThread
;
23 using content::UtilityProcessHost
;
25 namespace file_manager
{
27 ZipFileCreator::ZipFileCreator(
29 const base::FilePath
& src_dir
,
30 const std::vector
<base::FilePath
>& src_relative_paths
,
31 const base::FilePath
& dest_file
)
32 : thread_identifier_(BrowserThread::ID_COUNT
),
35 src_relative_paths_(src_relative_paths
),
36 dest_file_(dest_file
),
37 got_response_(false) {
40 void ZipFileCreator::Start() {
41 CHECK(BrowserThread::GetCurrentThreadIdentifier(&thread_identifier_
));
42 BrowserThread::GetBlockingPool()->PostTask(
44 base::Bind(&ZipFileCreator::OpenFileHandleOnBlockingThreadPool
, this));
47 ZipFileCreator::~ZipFileCreator() {
50 bool ZipFileCreator::OnMessageReceived(const IPC::Message
& message
) {
52 IPC_BEGIN_MESSAGE_MAP(ZipFileCreator
, message
)
53 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_CreateZipFile_Succeeded
,
54 OnCreateZipFileSucceeded
)
55 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_CreateZipFile_Failed
,
56 OnCreateZipFileFailed
)
57 IPC_MESSAGE_UNHANDLED(handled
= false)
62 void ZipFileCreator::OnProcessCrashed(int exit_code
) {
63 // Don't report crashes if they happen after we got a response.
67 // Utility process crashed while trying to create the zip file.
71 void ZipFileCreator::OpenFileHandleOnBlockingThreadPool() {
72 // Create the destination zip file only if it does not already exist.
73 int flags
= base::PLATFORM_FILE_CREATE
| base::PLATFORM_FILE_WRITE
;
74 base::PlatformFileError error_code
= base::PLATFORM_FILE_OK
;
75 base::PlatformFile dest_file
=
76 base::CreatePlatformFile(dest_file_
, flags
, NULL
, &error_code
);
78 if (error_code
!= base::PLATFORM_FILE_OK
) {
79 LOG(ERROR
) << "Failed to create dest zip file " << dest_file_
.value();
81 BrowserThread::GetMessageLoopProxyForThread(thread_identifier_
)->PostTask(
83 base::Bind(&ZipFileCreator::ReportDone
, this, false));
87 BrowserThread::PostTask(
88 BrowserThread::IO
, FROM_HERE
,
89 base::Bind(&ZipFileCreator::StartProcessOnIOThread
, this, dest_file
));
92 void ZipFileCreator::StartProcessOnIOThread(base::PlatformFile dest_file
) {
93 base::FileDescriptor dest_fd
;
94 dest_fd
.fd
= dest_file
;
95 dest_fd
.auto_close
= true;
97 UtilityProcessHost
* host
= UtilityProcessHost::Create(
99 BrowserThread::GetMessageLoopProxyForThread(thread_identifier_
).get());
100 host
->SetExposedDir(src_dir_
);
101 host
->Send(new ChromeUtilityMsg_CreateZipFile(src_dir_
, src_relative_paths_
,
105 void ZipFileCreator::OnCreateZipFileSucceeded() {
109 void ZipFileCreator::OnCreateZipFileFailed() {
113 void ZipFileCreator::ReportDone(bool success
) {
114 // Skip check for unittests.
115 if (thread_identifier_
!= BrowserThread::ID_COUNT
)
116 DCHECK(BrowserThread::CurrentlyOn(thread_identifier_
));
118 // Guard against calling observer multiple times.
122 got_response_
= true;
123 observer_
->OnZipDone(success
);
126 } // namespace file_manager