• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 using views::Window;
19 
20 ////////////////////////////////////////////////////////////////////////////////
21 // GoogleUpdate, public:
22 
GoogleUpdate()23 GoogleUpdate::GoogleUpdate()
24     : listener_(NULL) {
25   chromeos::CrosLibrary::Get()->EnsureLoaded();
26 }
27 
~GoogleUpdate()28 GoogleUpdate::~GoogleUpdate() {
29 }
30 
31 ////////////////////////////////////////////////////////////////////////////////
32 // GoogleUpdate, views::DialogDelegate implementation:
33 
CheckForUpdate(bool install_if_newer,Window * window)34 void 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 
InitiateGoogleUpdateCheck(bool install_if_newer,Window * window,MessageLoop * main_loop)47 bool 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 
ReportResults(GoogleUpdateUpgradeResult results,GoogleUpdateErrorCode error_code)106 void 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