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