pack_extension_job.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1// Copyright (c) 2009 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.
4
5#include "chrome/browser/extensions/pack_extension_job.h"
6
7#include "app/l10n_util.h"
8#include "base/message_loop.h"
9#include "base/utf_string_conversions.h"
10#include "base/task.h"
11#include "chrome/browser/extensions/extension_creator.h"
12#include "chrome/common/chrome_constants.h"
13#include "grit/generated_resources.h"
14
15PackExtensionJob::PackExtensionJob(Client* client,
16                                   const FilePath& root_directory,
17                                   const FilePath& key_file)
18    : client_(client), key_file_(key_file) {
19  root_directory_ = root_directory.StripTrailingSeparators();
20  CHECK(ChromeThread::GetCurrentThreadIdentifier(&client_thread_id_));
21}
22
23void PackExtensionJob::Start() {
24  ChromeThread::PostTask(
25      ChromeThread::FILE, FROM_HERE,
26      NewRunnableMethod(this, &PackExtensionJob::RunOnFileThread));
27}
28
29void PackExtensionJob::ClearClient() {
30  client_ = NULL;
31}
32
33void PackExtensionJob::RunOnFileThread() {
34  crx_file_out_ = FilePath(root_directory_.value() +
35                           chrome::kExtensionFileExtension);
36
37  if (key_file_.empty())
38    key_file_out_ = FilePath(root_directory_.value() +
39                             chrome::kExtensionKeyFileExtension);
40
41  // TODO(aa): Need to internationalize the errors that ExtensionCreator
42  // returns. See bug 20734.
43  ExtensionCreator creator;
44  if (creator.Run(root_directory_, crx_file_out_, key_file_, key_file_out_)) {
45    ChromeThread::PostTask(
46        client_thread_id_, FROM_HERE,
47        NewRunnableMethod(this,
48                          &PackExtensionJob::ReportSuccessOnClientThread));
49  } else {
50    ChromeThread::PostTask(
51        client_thread_id_, FROM_HERE,
52        NewRunnableMethod(
53            this, &PackExtensionJob::ReportFailureOnClientThread,
54            creator.error_message()));
55  }
56}
57
58void PackExtensionJob::ReportSuccessOnClientThread() {
59  if (client_)
60    client_->OnPackSuccess(crx_file_out_, key_file_out_);
61}
62
63void PackExtensionJob::ReportFailureOnClientThread(const std::string& error) {
64  if (client_)
65    client_->OnPackFailure(error);
66}
67
68// static
69std::wstring PackExtensionJob::StandardSuccessMessage(const FilePath& crx_file,
70                                                      const FilePath& key_file)
71{
72  // TODO(isherman): we should use string16 instead of wstring.
73  // See crbug.com/23581 and crbug.com/24672
74  std::wstring message;
75  if (key_file.empty()) {
76    return l10n_util::GetStringF(
77        IDS_EXTENSION_PACK_DIALOG_SUCCESS_BODY_UPDATE,
78        crx_file.ToWStringHack());
79  } else {
80    return l10n_util::GetStringF(
81        IDS_EXTENSION_PACK_DIALOG_SUCCESS_BODY_NEW,
82        crx_file.ToWStringHack(),
83        key_file.ToWStringHack());
84  }
85}
86