|  | // Copyright 2020 The Cobalt Authors. All Rights Reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | #ifndef COMPONENTS_UPDATE_CLIENT_COBALT_SLOT_MANAGEMENT_H_ | 
|  | #define COMPONENTS_UPDATE_CLIENT_COBALT_SLOT_MANAGEMENT_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/version.h" | 
|  | #include "starboard/extension/installation_manager.h" | 
|  |  | 
|  | namespace update_client { | 
|  |  | 
|  | // Installation slot management logic for the Cobalt Updater. | 
|  | // Multiple apps share the same installation slots on the file | 
|  | // system but do keep individual metadata for the slot selection. | 
|  | // Locking of the slots is performed through timestamped drain files. | 
|  | // And each app marks the slot installation as good by using a | 
|  | // good file. | 
|  | class CobaltSlotManagement { | 
|  | public: | 
|  | CobaltSlotManagement(); | 
|  |  | 
|  | // Initialize with the |installation_api| extension. | 
|  | bool Init(const CobaltExtensionInstallationManagerApi* installation_api); | 
|  |  | 
|  | // Selects the slot to use for the installation. The selected |dir| is | 
|  | // populated if the selection was successful. | 
|  | bool SelectSlot(base::FilePath* dir); | 
|  |  | 
|  | // The slot selection will be confirmed if the function returns true. | 
|  | // The |dir| path will be used to perform the installation. | 
|  | bool ConfirmSlot(const base::FilePath& dir); | 
|  |  | 
|  | CobaltSlotManagement(const CobaltSlotManagement&) = delete; | 
|  | CobaltSlotManagement& operator=(CobaltSlotManagement&&) = delete; | 
|  | void operator=(const CobaltSlotManagement&) = delete; | 
|  |  | 
|  | // Returns the selected index for the installation slot. | 
|  | int GetInstallationIndex(); | 
|  |  | 
|  | // Cleanup all drain files of the current app. | 
|  | void CleanupAllDrainFiles(); | 
|  |  | 
|  | private: | 
|  | int installation_index_ = IM_EXT_INVALID_INDEX; | 
|  | const CobaltExtensionInstallationManagerApi* installation_api_; | 
|  | std::string app_key_; | 
|  | bool initialized_ = false; | 
|  | }; | 
|  |  | 
|  | // Creates a good file and rolls forward to the installation in | 
|  | // the specified |installation_index| and |dir| for the app | 
|  | // identified by |app_key|. | 
|  | bool CobaltFinishInstallation( | 
|  | const CobaltExtensionInstallationManagerApi* installation_api, | 
|  | int installation_index, | 
|  | const std::string& dir, | 
|  | const std::string& app_key); | 
|  |  | 
|  | // Performs a quick installation for the current app by | 
|  | // upgrading it locally to the latest Cobalt version successfully | 
|  | // installed by a different app. | 
|  | bool CobaltQuickUpdate( | 
|  | const CobaltExtensionInstallationManagerApi* installation_api, | 
|  | const base::Version& current_version); | 
|  |  | 
|  | // Computes whether Cobalt should skip the update based on the | 
|  | // |min_free_space_bytes|, the |free_space_bytes| and the amount of | 
|  | // space that can be recovered from |installation_cleanup_size|. | 
|  | // The default behavior is to NOT skip unless the measurements | 
|  | // show that there isn't enough space to perform the update. | 
|  | bool CobaltSkipUpdate( | 
|  | const CobaltExtensionInstallationManagerApi* installation_api, | 
|  | uint64_t min_free_space_bytes, | 
|  | int64_t free_space_bytes, | 
|  | uint64_t installation_cleanup_size); | 
|  |  | 
|  | // Computes the installation cleanup size by taking the min space | 
|  | // from all the installation slots excluding the system slot 0. | 
|  | uint64_t CobaltInstallationCleanupSize( | 
|  | const CobaltExtensionInstallationManagerApi* installation_api); | 
|  |  | 
|  | }  // namespace update_client | 
|  |  | 
|  | #endif  // COMPONENTS_UPDATE_CLIENT_COBALT_SLOT_MANAGEMENT_H_ |