- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / image_writer_private / operation_chromeos.cc
1 // Copyright 2013 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/api/image_writer_private/error_messages.h"
6 #include "chrome/browser/extensions/api/image_writer_private/operation.h"
7 #include "chromeos/dbus/dbus_thread_manager.h"
8 #include "chromeos/dbus/image_burner_client.h"
9 #include "content/public/browser/browser_thread.h"
10
11 namespace extensions {
12 namespace image_writer {
13
14 using chromeos::ImageBurnerClient;
15 using content::BrowserThread;
16
17 namespace {
18
19 void ClearImageBurner() {
20   if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
21     BrowserThread::PostTask(BrowserThread::UI,
22                             FROM_HERE,
23                             base::Bind(&ClearImageBurner));
24     return;
25   }
26
27   chromeos::DBusThreadManager::Get()->
28       GetImageBurnerClient()->
29       ResetEventHandlers();
30 }
31
32 }  // namespace
33
34 void Operation::WriteStart() {
35   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
36   SetStage(image_writer_api::STAGE_WRITE);
37
38   BrowserThread::PostTask(BrowserThread::UI,
39                           FROM_HERE,
40                           base::Bind(&Operation::StartWriteOnUIThread, this));
41
42   AddCleanUpFunction(base::Bind(&ClearImageBurner));
43 }
44
45 void Operation::StartWriteOnUIThread() {
46   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
47   DVLOG(1) << "Starting burn.";
48
49   ImageBurnerClient* burner =
50       chromeos::DBusThreadManager::Get()->GetImageBurnerClient();
51
52   burner->SetEventHandlers(
53       base::Bind(&Operation::OnBurnFinished, this),
54       base::Bind(&Operation::OnBurnProgress, this));
55
56   burner->BurnImage(image_path_.value(),
57                     storage_unit_id_,
58                     base::Bind(&Operation::OnBurnError, this));
59 }
60
61 void Operation::OnBurnFinished(const std::string& target_path,
62                     bool success,
63                     const std::string& error) {
64   DVLOG(1) << "Burn finished: " << success;
65
66   if (success) {
67     SetProgress(kProgressComplete);
68     Finish();
69   } else {
70     Error(error);
71   }
72 }
73
74 void Operation::OnBurnProgress(const std::string& target_path,
75                     int64 num_bytes_burnt,
76                     int64 total_size) {
77   int progress = kProgressComplete * num_bytes_burnt / total_size;
78   SetProgress(progress);
79 }
80
81 void Operation::OnBurnError() {
82   Error(error::kImageBurnerError);
83 }
84
85 }  // namespace image_writer
86 }  // namespace extensions