//
// 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.
//

// This module abstracts the properties tied to the current running image. These
// properties are meant to be constant during the life of this daemon, but can
// be modified in dev-move or non-official builds.

#ifndef UPDATE_ENGINE_IMAGE_PROPERTIES_H_
#define UPDATE_ENGINE_IMAGE_PROPERTIES_H_

#include <string>

namespace chromeos_update_engine {

class SystemState;

// The read-only system properties of the running image.
struct ImageProperties {
  // The product id of the image used for all channels, except canary.
  std::string product_id;
  // The canary-channel product id.
  std::string canary_product_id;

  // The product version of this image.
  std::string version;

  // The board name this image was built for.
  std::string board;

  // The release channel this image was obtained from.
  std::string current_channel;

  // The Omaha URL this image should get updates from.
  std::string omaha_url;
};

// The mutable image properties are read-write image properties, initialized
// with values from the image but can be modified by storing them in the
// stateful partition.
struct MutableImageProperties {
  // The release channel we are tracking.
  std::string target_channel;

  // Whether powerwash is allowed when downloading an update for the selected
  // target_channel.
  bool is_powerwash_allowed{false};
};

// Loads all the image properties from the running system. In case of error
// loading any of these properties from the read-only system image a default
// value may be returned instead.
ImageProperties LoadImageProperties(SystemState* system_state);

// Loads the mutable image properties from the stateful partition if found or the
// system image otherwise.
MutableImageProperties LoadMutableImageProperties(SystemState* system_state);

// Stores the mutable image properties in the stateful partition. Returns
// whether the operation succeeded.
bool StoreMutableImageProperties(SystemState* system_state,
                                 const MutableImageProperties& properties);

// Sets the root_prefix used to load files from during unittests to
// |test_root_prefix|. Passing a nullptr value resets it to the default.
namespace test {
void SetImagePropertiesRootPrefix(const char* test_root_prefix);
}  // namespace test

}  // namespace chromeos_update_engine

#endif  // UPDATE_ENGINE_IMAGE_PROPERTIES_H_
