//
// Copyright (C) 2015 The Android Open Source Project
//
// 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 UPDATE_ENGINE_BOOT_CONTROL_CHROMEOS_H_
#define UPDATE_ENGINE_BOOT_CONTROL_CHROMEOS_H_

#include <string>

#include <base/callback.h>
#include <gtest/gtest_prod.h>  // for FRIEND_TEST

#include "update_engine/boot_control_interface.h"

namespace chromeos_update_engine {

// The Chrome OS implementation of the BootControlInterface. This interface
// assumes the partition names and numbers used in Chrome OS devices.
class BootControlChromeOS : public BootControlInterface {
 public:
  BootControlChromeOS() = default;
  ~BootControlChromeOS() = default;

  // Initialize the BootControl instance loading the constant values. Returns
  // whether the operation succeeded. In case of failure, normally meaning
  // some critical failure such as we couldn't determine the slot that we
  // booted from, the implementation will pretend that there's only one slot and
  // therefore A/B updates are disabled.
  bool Init();

  // BootControlInterface overrides.
  unsigned int GetNumSlots() const override;
  BootControlInterface::Slot GetCurrentSlot() const override;
  bool GetPartitionDevice(const std::string& partition_name,
                          BootControlInterface::Slot slot,
                          std::string* device) const override;
  bool IsSlotBootable(BootControlInterface::Slot slot) const override;
  bool MarkSlotUnbootable(BootControlInterface::Slot slot) override;
  bool SetActiveBootSlot(BootControlInterface::Slot slot) override;
  bool MarkBootSuccessfulAsync(base::Callback<void(bool)> callback) override;

 private:
  friend class BootControlChromeOSTest;
  FRIEND_TEST(BootControlChromeOSTest, SysfsBlockDeviceTest);
  FRIEND_TEST(BootControlChromeOSTest, GetPartitionNumberTest);

  // Returns the sysfs block device for a root block device. For example,
  // SysfsBlockDevice("/dev/sda") returns "/sys/block/sda". Returns an empty
  // string if the input device is not of the "/dev/xyz" form.
  static std::string SysfsBlockDevice(const std::string& device);

  // Returns true if the root |device| (e.g., "/dev/sdb") is known to be
  // removable, false otherwise.
  static bool IsRemovableDevice(const std::string& device);

  // Return the hard-coded partition number used in Chrome OS for the passed
  // |partition_name| and |slot|. In case of invalid data, returns -1.
  int GetPartitionNumber(const std::string partition_name,
                         BootControlInterface::Slot slot) const;

  // Cached values for GetNumSlots() and GetCurrentSlot().
  BootControlInterface::Slot num_slots_{1};
  BootControlInterface::Slot current_slot_{BootControlInterface::kInvalidSlot};

  // The block device of the disk we booted from, without the partition number.
  std::string boot_disk_name_;

  DISALLOW_COPY_AND_ASSIGN(BootControlChromeOS);
};

}  // namespace chromeos_update_engine

#endif  // UPDATE_ENGINE_BOOT_CONTROL_CHROMEOS_H_
