blob: ad3bd9eaab8eca6d55767c38673b3e4793b0e30f [file] [log] [blame]
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -07001// Copyright (c) 2010 The Chromium OS 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 "update_engine/update_attempter.h"
6#include <tr1/memory>
7#include <string>
8#include <vector>
9#include <glib.h>
10#include "update_engine/download_action.h"
11#include "update_engine/filesystem_copier_action.h"
12#include "update_engine/libcurl_http_fetcher.h"
13#include "update_engine/omaha_request_prep_action.h"
14#include "update_engine/omaha_response_handler_action.h"
15#include "update_engine/postinstall_runner_action.h"
16#include "update_engine/set_bootable_flag_action.h"
17#include "update_engine/update_check_action.h"
18
19using std::tr1::shared_ptr;
20using std::string;
21using std::vector;
22
23namespace chromeos_update_engine {
24
25void UpdateAttempter::Update(bool force_full_update) {
26 full_update_ = force_full_update;
27 CHECK(!processor_.IsRunning());
28 processor_.set_delegate(this);
29
30 // Actions:
31 shared_ptr<OmahaRequestPrepAction> request_prep_action(
32 new OmahaRequestPrepAction(force_full_update));
33 shared_ptr<UpdateCheckAction> update_check_action(
34 new UpdateCheckAction(new LibcurlHttpFetcher));
35 shared_ptr<OmahaResponseHandlerAction> response_handler_action(
36 new OmahaResponseHandlerAction);
37 shared_ptr<FilesystemCopierAction> filesystem_copier_action(
Andrew de los Reyesf9185172010-05-03 11:07:05 -070038 new FilesystemCopierAction(false));
Andrew de los Reyesf9714432010-05-04 10:21:23 -070039 shared_ptr<FilesystemCopierAction> kernel_filesystem_copier_action(
Andrew de los Reyesf9185172010-05-03 11:07:05 -070040 new FilesystemCopierAction(true));
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070041 shared_ptr<DownloadAction> download_action(
42 new DownloadAction(new LibcurlHttpFetcher));
Andrew de los Reyesf9714432010-05-04 10:21:23 -070043 shared_ptr<PostinstallRunnerAction> postinstall_runner_action_precommit(
44 new PostinstallRunnerAction(true));
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070045 shared_ptr<SetBootableFlagAction> set_bootable_flag_action(
46 new SetBootableFlagAction);
Andrew de los Reyesf9714432010-05-04 10:21:23 -070047 shared_ptr<PostinstallRunnerAction> postinstall_runner_action_postcommit(
48 new PostinstallRunnerAction(false));
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070049
50 response_handler_action_ = response_handler_action;
51
52 actions_.push_back(shared_ptr<AbstractAction>(request_prep_action));
53 actions_.push_back(shared_ptr<AbstractAction>(update_check_action));
54 actions_.push_back(shared_ptr<AbstractAction>(response_handler_action));
55 actions_.push_back(shared_ptr<AbstractAction>(filesystem_copier_action));
Andrew de los Reyesf9185172010-05-03 11:07:05 -070056 actions_.push_back(shared_ptr<AbstractAction>(
Andrew de los Reyesf9714432010-05-04 10:21:23 -070057 kernel_filesystem_copier_action));
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070058 actions_.push_back(shared_ptr<AbstractAction>(download_action));
Andrew de los Reyesf9714432010-05-04 10:21:23 -070059 actions_.push_back(shared_ptr<AbstractAction>(
60 postinstall_runner_action_precommit));
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070061 actions_.push_back(shared_ptr<AbstractAction>(set_bootable_flag_action));
Andrew de los Reyesf9714432010-05-04 10:21:23 -070062 actions_.push_back(shared_ptr<AbstractAction>(
63 postinstall_runner_action_postcommit));
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070064
65 // Enqueue the actions
66 for (vector<shared_ptr<AbstractAction> >::iterator it = actions_.begin();
67 it != actions_.end(); ++it) {
68 processor_.EnqueueAction(it->get());
69 }
70
71 // Bond them together. We have to use the leaf-types when calling
72 // BondActions().
Andrew de los Reyesf98bff82010-05-06 13:33:25 -070073 BondActions(request_prep_action.get(),
74 update_check_action.get());
75 BondActions(update_check_action.get(),
76 response_handler_action.get());
Andrew de los Reyesf9185172010-05-03 11:07:05 -070077 BondActions(response_handler_action.get(),
Andrew de los Reyesf98bff82010-05-06 13:33:25 -070078 filesystem_copier_action.get());
79 BondActions(filesystem_copier_action.get(),
Andrew de los Reyesf9714432010-05-04 10:21:23 -070080 kernel_filesystem_copier_action.get());
81 BondActions(kernel_filesystem_copier_action.get(),
Andrew de los Reyesf9185172010-05-03 11:07:05 -070082 download_action.get());
Andrew de los Reyesf98bff82010-05-06 13:33:25 -070083 BondActions(download_action.get(),
84 postinstall_runner_action_precommit.get());
Andrew de los Reyesf9714432010-05-04 10:21:23 -070085 BondActions(postinstall_runner_action_precommit.get(),
86 set_bootable_flag_action.get());
87 BondActions(set_bootable_flag_action.get(),
88 postinstall_runner_action_postcommit.get());
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070089
90 processor_.StartProcessing();
91}
92
93// Delegate method:
94void UpdateAttempter::ProcessingDone(const ActionProcessor* processor,
95 bool success) {
96 CHECK(response_handler_action_);
97 if (response_handler_action_->GotNoUpdateResponse()) {
98 // All done.
99 g_main_loop_quit(loop_);
100 return;
101 }
102 if (!success) {
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700103 LOG(INFO) << "Update failed.";
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700104 }
105 g_main_loop_quit(loop_);
106}
107
108// Stop updating. An attempt will be made to record status to the disk
109// so that updates can be resumed later.
110void UpdateAttempter::Terminate() {
111 // TODO(adlr): implement this method.
112 NOTIMPLEMENTED();
113}
114
115// Try to resume from a previously Terminate()d update.
116void UpdateAttempter::ResumeUpdating() {
117 // TODO(adlr): implement this method.
118 NOTIMPLEMENTED();
119}
120
121bool UpdateAttempter::GetStatus(int64_t* last_checked_time,
122 double* progress,
123 std::string* current_operation,
124 std::string* new_version,
125 int64_t* new_size) {
126 // TODO(adlr): Return actual status.
127 *last_checked_time = 123;
128 *progress = 0.2223;
129 *current_operation = "DOWNLOADING";
130 *new_version = "0.2.3.8";
131 *new_size = 10002;
132 return true;
133}
134
135
136} // namespace chromeos_update_engine