1*00c7fec1SAndroid Build Coastguard Worker // 2*00c7fec1SAndroid Build Coastguard Worker // Copyright (C) 2020 The Android Open Source Project 3*00c7fec1SAndroid Build Coastguard Worker // 4*00c7fec1SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 5*00c7fec1SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 6*00c7fec1SAndroid Build Coastguard Worker // You may obtain a copy of the License at 7*00c7fec1SAndroid Build Coastguard Worker // 8*00c7fec1SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 9*00c7fec1SAndroid Build Coastguard Worker // 10*00c7fec1SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 11*00c7fec1SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 12*00c7fec1SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*00c7fec1SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 14*00c7fec1SAndroid Build Coastguard Worker // limitations under the License. 15*00c7fec1SAndroid Build Coastguard Worker // 16*00c7fec1SAndroid Build Coastguard Worker #pragma once 17*00c7fec1SAndroid Build Coastguard Worker 18*00c7fec1SAndroid Build Coastguard Worker #include <string> 19*00c7fec1SAndroid Build Coastguard Worker 20*00c7fec1SAndroid Build Coastguard Worker #include "super_flash_helper.h" 21*00c7fec1SAndroid Build Coastguard Worker #include "util.h" 22*00c7fec1SAndroid Build Coastguard Worker 23*00c7fec1SAndroid Build Coastguard Worker struct FlashingPlan; 24*00c7fec1SAndroid Build Coastguard Worker struct Image; 25*00c7fec1SAndroid Build Coastguard Worker using ImageEntry = std::pair<const Image*, std::string>; 26*00c7fec1SAndroid Build Coastguard Worker 27*00c7fec1SAndroid Build Coastguard Worker class FlashTask; 28*00c7fec1SAndroid Build Coastguard Worker class RebootTask; 29*00c7fec1SAndroid Build Coastguard Worker class UpdateSuperTask; 30*00c7fec1SAndroid Build Coastguard Worker class OptimizedFlashSuperTask; 31*00c7fec1SAndroid Build Coastguard Worker class WipeTask; 32*00c7fec1SAndroid Build Coastguard Worker class ResizeTask; 33*00c7fec1SAndroid Build Coastguard Worker class Task { 34*00c7fec1SAndroid Build Coastguard Worker public: 35*00c7fec1SAndroid Build Coastguard Worker Task() = default; 36*00c7fec1SAndroid Build Coastguard Worker virtual void Run() = 0; 37*00c7fec1SAndroid Build Coastguard Worker virtual std::string ToString() const = 0; 38*00c7fec1SAndroid Build Coastguard Worker AsFlashTask()39*00c7fec1SAndroid Build Coastguard Worker virtual FlashTask* AsFlashTask() { return nullptr; } AsRebootTask()40*00c7fec1SAndroid Build Coastguard Worker virtual RebootTask* AsRebootTask() { return nullptr; } AsUpdateSuperTask()41*00c7fec1SAndroid Build Coastguard Worker virtual UpdateSuperTask* AsUpdateSuperTask() { return nullptr; } AsOptimizedFlashSuperTask()42*00c7fec1SAndroid Build Coastguard Worker virtual OptimizedFlashSuperTask* AsOptimizedFlashSuperTask() { return nullptr; } AsWipeTask()43*00c7fec1SAndroid Build Coastguard Worker virtual WipeTask* AsWipeTask() { return nullptr; } AsResizeTask()44*00c7fec1SAndroid Build Coastguard Worker virtual ResizeTask* AsResizeTask() { return nullptr; } 45*00c7fec1SAndroid Build Coastguard Worker 46*00c7fec1SAndroid Build Coastguard Worker virtual ~Task() = default; 47*00c7fec1SAndroid Build Coastguard Worker }; 48*00c7fec1SAndroid Build Coastguard Worker 49*00c7fec1SAndroid Build Coastguard Worker class FlashTask : public Task { 50*00c7fec1SAndroid Build Coastguard Worker public: 51*00c7fec1SAndroid Build Coastguard Worker FlashTask(const std::string& slot, const std::string& pname, const std::string& fname, 52*00c7fec1SAndroid Build Coastguard Worker const bool apply_vbmeta, const FlashingPlan* fp); AsFlashTask()53*00c7fec1SAndroid Build Coastguard Worker virtual FlashTask* AsFlashTask() override { return this; } 54*00c7fec1SAndroid Build Coastguard Worker 55*00c7fec1SAndroid Build Coastguard Worker static bool IsDynamicPartition(const ImageSource* source, const FlashTask* task); 56*00c7fec1SAndroid Build Coastguard Worker void Run() override; 57*00c7fec1SAndroid Build Coastguard Worker std::string ToString() const override; GetPartition()58*00c7fec1SAndroid Build Coastguard Worker std::string GetPartition() const { return pname_; } GetImageName()59*00c7fec1SAndroid Build Coastguard Worker std::string GetImageName() const { return fname_; } GetSlot()60*00c7fec1SAndroid Build Coastguard Worker std::string GetSlot() const { return slot_; } 61*00c7fec1SAndroid Build Coastguard Worker std::string GetPartitionAndSlot() const; 62*00c7fec1SAndroid Build Coastguard Worker 63*00c7fec1SAndroid Build Coastguard Worker private: 64*00c7fec1SAndroid Build Coastguard Worker const std::string pname_; 65*00c7fec1SAndroid Build Coastguard Worker const std::string fname_; 66*00c7fec1SAndroid Build Coastguard Worker const std::string slot_; 67*00c7fec1SAndroid Build Coastguard Worker const bool apply_vbmeta_; 68*00c7fec1SAndroid Build Coastguard Worker const FlashingPlan* fp_; 69*00c7fec1SAndroid Build Coastguard Worker }; 70*00c7fec1SAndroid Build Coastguard Worker 71*00c7fec1SAndroid Build Coastguard Worker class RebootTask : public Task { 72*00c7fec1SAndroid Build Coastguard Worker public: 73*00c7fec1SAndroid Build Coastguard Worker RebootTask(const FlashingPlan* fp); 74*00c7fec1SAndroid Build Coastguard Worker RebootTask(const FlashingPlan* fp, const std::string& reboot_target); AsRebootTask()75*00c7fec1SAndroid Build Coastguard Worker virtual RebootTask* AsRebootTask() override { return this; } 76*00c7fec1SAndroid Build Coastguard Worker void Run() override; 77*00c7fec1SAndroid Build Coastguard Worker std::string ToString() const override; GetTarget()78*00c7fec1SAndroid Build Coastguard Worker std::string GetTarget() const { return reboot_target_; }; 79*00c7fec1SAndroid Build Coastguard Worker 80*00c7fec1SAndroid Build Coastguard Worker private: 81*00c7fec1SAndroid Build Coastguard Worker const std::string reboot_target_ = ""; 82*00c7fec1SAndroid Build Coastguard Worker const FlashingPlan* fp_; 83*00c7fec1SAndroid Build Coastguard Worker }; 84*00c7fec1SAndroid Build Coastguard Worker 85*00c7fec1SAndroid Build Coastguard Worker class OptimizedFlashSuperTask : public Task { 86*00c7fec1SAndroid Build Coastguard Worker public: 87*00c7fec1SAndroid Build Coastguard Worker OptimizedFlashSuperTask(const std::string& super_name, std::unique_ptr<SuperFlashHelper> helper, 88*00c7fec1SAndroid Build Coastguard Worker SparsePtr sparse_layout, uint64_t super_size, const FlashingPlan* fp); AsOptimizedFlashSuperTask()89*00c7fec1SAndroid Build Coastguard Worker virtual OptimizedFlashSuperTask* AsOptimizedFlashSuperTask() override { return this; } 90*00c7fec1SAndroid Build Coastguard Worker 91*00c7fec1SAndroid Build Coastguard Worker static std::unique_ptr<OptimizedFlashSuperTask> Initialize( 92*00c7fec1SAndroid Build Coastguard Worker const FlashingPlan* fp, std::vector<std::unique_ptr<Task>>& tasks); 93*00c7fec1SAndroid Build Coastguard Worker static bool CanOptimize(const ImageSource* source, 94*00c7fec1SAndroid Build Coastguard Worker const std::vector<std::unique_ptr<Task>>& tasks); 95*00c7fec1SAndroid Build Coastguard Worker 96*00c7fec1SAndroid Build Coastguard Worker void Run() override; 97*00c7fec1SAndroid Build Coastguard Worker std::string ToString() const override; 98*00c7fec1SAndroid Build Coastguard Worker 99*00c7fec1SAndroid Build Coastguard Worker private: 100*00c7fec1SAndroid Build Coastguard Worker const std::string super_name_; 101*00c7fec1SAndroid Build Coastguard Worker std::unique_ptr<SuperFlashHelper> helper_; 102*00c7fec1SAndroid Build Coastguard Worker SparsePtr sparse_layout_; 103*00c7fec1SAndroid Build Coastguard Worker uint64_t super_size_; 104*00c7fec1SAndroid Build Coastguard Worker const FlashingPlan* fp_; 105*00c7fec1SAndroid Build Coastguard Worker }; 106*00c7fec1SAndroid Build Coastguard Worker 107*00c7fec1SAndroid Build Coastguard Worker class UpdateSuperTask : public Task { 108*00c7fec1SAndroid Build Coastguard Worker public: 109*00c7fec1SAndroid Build Coastguard Worker UpdateSuperTask(const FlashingPlan* fp); AsUpdateSuperTask()110*00c7fec1SAndroid Build Coastguard Worker virtual UpdateSuperTask* AsUpdateSuperTask() override { return this; } 111*00c7fec1SAndroid Build Coastguard Worker 112*00c7fec1SAndroid Build Coastguard Worker void Run() override; 113*00c7fec1SAndroid Build Coastguard Worker std::string ToString() const override; 114*00c7fec1SAndroid Build Coastguard Worker 115*00c7fec1SAndroid Build Coastguard Worker private: 116*00c7fec1SAndroid Build Coastguard Worker const FlashingPlan* fp_; 117*00c7fec1SAndroid Build Coastguard Worker }; 118*00c7fec1SAndroid Build Coastguard Worker 119*00c7fec1SAndroid Build Coastguard Worker class ResizeTask : public Task { 120*00c7fec1SAndroid Build Coastguard Worker public: 121*00c7fec1SAndroid Build Coastguard Worker ResizeTask(const FlashingPlan* fp, const std::string& pname, const std::string& size, 122*00c7fec1SAndroid Build Coastguard Worker const std::string& slot); 123*00c7fec1SAndroid Build Coastguard Worker void Run() override; 124*00c7fec1SAndroid Build Coastguard Worker std::string ToString() const override; AsResizeTask()125*00c7fec1SAndroid Build Coastguard Worker virtual ResizeTask* AsResizeTask() override { return this; } 126*00c7fec1SAndroid Build Coastguard Worker 127*00c7fec1SAndroid Build Coastguard Worker private: 128*00c7fec1SAndroid Build Coastguard Worker const FlashingPlan* fp_; 129*00c7fec1SAndroid Build Coastguard Worker const std::string pname_; 130*00c7fec1SAndroid Build Coastguard Worker const std::string size_; 131*00c7fec1SAndroid Build Coastguard Worker const std::string slot_; 132*00c7fec1SAndroid Build Coastguard Worker }; 133*00c7fec1SAndroid Build Coastguard Worker 134*00c7fec1SAndroid Build Coastguard Worker class DeleteTask : public Task { 135*00c7fec1SAndroid Build Coastguard Worker public: 136*00c7fec1SAndroid Build Coastguard Worker DeleteTask(const FlashingPlan* fp, const std::string& pname); 137*00c7fec1SAndroid Build Coastguard Worker void Run() override; 138*00c7fec1SAndroid Build Coastguard Worker std::string ToString() const override; 139*00c7fec1SAndroid Build Coastguard Worker 140*00c7fec1SAndroid Build Coastguard Worker private: 141*00c7fec1SAndroid Build Coastguard Worker const FlashingPlan* fp_; 142*00c7fec1SAndroid Build Coastguard Worker const std::string pname_; 143*00c7fec1SAndroid Build Coastguard Worker }; 144*00c7fec1SAndroid Build Coastguard Worker 145*00c7fec1SAndroid Build Coastguard Worker class WipeTask : public Task { 146*00c7fec1SAndroid Build Coastguard Worker public: 147*00c7fec1SAndroid Build Coastguard Worker WipeTask(const FlashingPlan* fp, const std::string& pname); AsWipeTask()148*00c7fec1SAndroid Build Coastguard Worker virtual WipeTask* AsWipeTask() override { return this; } 149*00c7fec1SAndroid Build Coastguard Worker void Run() override; 150*00c7fec1SAndroid Build Coastguard Worker std::string ToString() const override; 151*00c7fec1SAndroid Build Coastguard Worker 152*00c7fec1SAndroid Build Coastguard Worker private: 153*00c7fec1SAndroid Build Coastguard Worker const FlashingPlan* fp_; 154*00c7fec1SAndroid Build Coastguard Worker const std::string pname_; 155*00c7fec1SAndroid Build Coastguard Worker }; 156