/* Copyright 2019 The Fuchsia Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef LIB_ABR_OPS_H_
#define LIB_ABR_OPS_H_

#include "data.h"
#include "sysdeps.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Operations called by libabr that require platform-dependent implementation. */
typedef struct AbrOps {
  /* Available for use by the AbrOps implementation. This is passed by libabr to every AbrOps call,
   * but libabr does not use this value. If this is not used by an implementation, it can be safely
   * set to NULL.
   */
  void* context;

  /* Reads |size| bytes of A/B/R metadata from persistent storage into |buffer|.
   *
   * On success, populates |buffer| and returns true. This function must fail if fewer than |size|
   * bytes are read.
   *
   * Either read_abr_metadata or read_abr_metadata_custom must be provided, and the other must be
   * NULL.
   */
  bool (*read_abr_metadata)(void* context, size_t size, uint8_t* buffer);

  /* Writes |size| bytes of A/B/R metadata from |buffer| to persistent storage.
   *
   * Returns true on success. This function must fail if fewer than |size| bytes are written.
   *
   * Either write_abr_metadata or write_abr_metadata_custom may be provided, but not both. In
   * read-only environments, they may both be NULL.
   */
  bool (*write_abr_metadata)(void* context, const uint8_t* buffer, size_t size);

  /* Reads ABR data into |a_slot_data|, |b_slot_data|, and |one_shot_recovery|.
   *
   * Returns true on success. This function must fail if any metadata fails to read.
   * The client is responsible for ensuring the integrity of the data.
   *
   * Either read_abr_metadata or read_abr_metadata_custom must be provided, and the other must be
   * NULL.
   */
  bool (*read_abr_metadata_custom)(void* context, AbrSlotData* a_slot_data,
                                   AbrSlotData* b_slot_data, uint8_t* one_shot_recovery);

  /* Writes ABR data from |a_slot_data|, |b_slot_data|, and |one_shot_recovery| to disk.
   *
   * Returns true on success. This function must fail if any metadata fails to write.
   * The client is responsible for ensuring the integrity of the data.
   *
   * Either write_abr_metadata or write_abr_metadata_custom may be provided, but not both. In
   * read-only environments, they may both be NULL.
   */
  bool (*write_abr_metadata_custom)(void* context, const AbrSlotData* a_slot_data,
                                    const AbrSlotData* b_slot_data, uint8_t one_shot_recovery);
} AbrOps;

#ifdef __cplusplus
}
#endif

#endif  // LIB_ABR_OPS_H_
