1// Copyright (c) 2006-2008 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/google/google_update.h"
6
7#include "base/message_loop.h"
8#include "base/path_service.h"
9#include "base/string_util.h"
10#include "base/task.h"
11#include "base/threading/thread.h"
12#include "base/utf_string_conversions.h"
13#include "chrome/browser/chromeos/cros/cros_library.h"
14#include "content/browser/browser_thread.h"
15#include "third_party/cros/chromeos_update.h"
16#include "views/window/window.h"
17
18using views::Window;
19
20////////////////////////////////////////////////////////////////////////////////
21// GoogleUpdate, public:
22
23GoogleUpdate::GoogleUpdate()
24    : listener_(NULL) {
25  chromeos::CrosLibrary::Get()->EnsureLoaded();
26}
27
28GoogleUpdate::~GoogleUpdate() {
29}
30
31////////////////////////////////////////////////////////////////////////////////
32// GoogleUpdate, views::DialogDelegate implementation:
33
34void GoogleUpdate::CheckForUpdate(bool install_if_newer, Window* window) {
35  // We need to shunt this request over to InitiateGoogleUpdateCheck and have
36  // it run in the file thread.
37  BrowserThread::PostTask(
38      BrowserThread::FILE, FROM_HERE,
39      NewRunnableMethod(
40          this, &GoogleUpdate::InitiateGoogleUpdateCheck, install_if_newer,
41          window, MessageLoop::current()));
42}
43
44////////////////////////////////////////////////////////////////////////////////
45// GoogleUpdate, private:
46
47bool GoogleUpdate::InitiateGoogleUpdateCheck(bool install_if_newer,
48                                             Window* window,
49                                             MessageLoop* main_loop) {
50  chromeos::UpdateInformation result;
51  bool success = false;
52
53  if (install_if_newer) {
54    // Possible Results:
55    //  UPGRADE_SUCCESSFUL
56    //  UPGRADE_ALREADY_UP_TO_DATE
57    //  UPGRADE_ERROR
58    if (chromeos::Update) {
59      success = chromeos::Update(&result);
60    }
61  } else {
62    // Possible Results:
63    //  UPGRADE_ALREADY_UP_TO_DATE
64    //  UPGRADE_IS_AVAILABLE
65    //  UPGRADE_ERROR
66    if (chromeos::CheckForUpdate) {
67      success = chromeos::CheckForUpdate(&result);
68    }
69    if (result.version_) {
70      UTF8ToWide(result.version_, std::strlen(result.version_),
71                 &version_available_);
72    }
73  }
74
75  // Map chromeos::UpdateStatus to GoogleUpdateUpgradeResult
76
77  GoogleUpdateUpgradeResult final = UPGRADE_ERROR;
78
79  switch (result.status_) {
80    case chromeos::UPDATE_ERROR:
81      final = UPGRADE_ERROR;
82      break;
83    case chromeos::UPDATE_IS_AVAILABLE:
84      final = UPGRADE_IS_AVAILABLE;
85      break;
86    case chromeos::UPDATE_SUCCESSFUL:
87      final = UPGRADE_SUCCESSFUL;
88      break;
89    case chromeos::UPDATE_ALREADY_UP_TO_DATE:
90      final = UPGRADE_ALREADY_UP_TO_DATE;
91      break;
92    default:
93      // UPGRADE_ERROR
94      break;
95  }
96
97  // Post the results as a task since this is run on a thread.
98
99  main_loop->PostTask(FROM_HERE, NewRunnableMethod(this,
100      &GoogleUpdate::ReportResults, final, success
101      ?  GOOGLE_UPDATE_NO_ERROR : GOOGLE_UPDATE_ERROR_UPDATING));
102
103  return true;
104}
105
106void GoogleUpdate::ReportResults(GoogleUpdateUpgradeResult results,
107                                 GoogleUpdateErrorCode error_code) {
108  // If we get an error, then error code must not be blank, and vice versa.
109  DCHECK(results == UPGRADE_ERROR ? error_code != GOOGLE_UPDATE_NO_ERROR :
110                                    error_code == GOOGLE_UPDATE_NO_ERROR);
111  if (listener_)
112    listener_->OnReportResults(results, error_code, version_available_);
113}
114
115