/*
 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
 *
 * Created in Samsung Ukraine R&D Center (SRK) under a contract between
 * LLC "Samsung Electronics Ukraine Company" (Kiev, Ukraine)
 * and "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
 *
 * Created on: Dec 15, 2017
 * Author: Kostiantyn Volobuiev <k.volobuyev@samsung.com>
 * Brief: Module that responds for SFS (Secure File System) operations.
 */

#ifndef TZWSTORAGE_H
#define TZWSTORAGE_H

#include "TzwMisc.h"

/**
 * Struct to operate with SFS object
 */
struct __TzwSfsObject;

typedef struct __TzwSfsObject* TzwSfsObject_t; /* Opaque handle like in GP */

/**
 * @brief Create SFS object
 * @param[in] objectID - object ID
 * @param[in] objectIDLen - length of object ID
 * @param[in] flags - file mode
 * @param[out] handle - SFS object handle
 * @return TEE error code
 */
TzwErrorCode_t tzwCreateSfsObject(void* objectID, size_t objectIDLen, uint32_t flags, TzwSfsObject_t* handle);

/**
 * @brief Open SFS object
 * @param[in] objectID - object ID
 * @param[in] objectIDLen - length of object ID
 * @param[in] flags - file mode
 * @param[out] handle - SFS object handle
 * @return TEE error code
 */
TzwErrorCode_t tzwOpenSfsObject(void* objectID, size_t objectIDLen, uint32_t flags, TzwSfsObject_t* handle);

/**
 * @brief Close SFS object
 * @param[in] handle - SFS object handle
 */
void tzwCloseSfsObject(TzwSfsObject_t handle);

/**
 * @brief Close and delete SFS object
 * @param[in] handle - SFS object handle
 */
void tzwCloseAndDeleteSfsObject(TzwSfsObject_t handle);

/**
 * @brief Write to SFS object
 * @param[in] handle - SFS object handle
 * @param[in] buf - pointer to the buffer to be written
 * @param[in] buflen - number of bytes to write to the file
 * @return TEE error code
 */
TzwErrorCode_t tzwWriteToSfsObject(TzwSfsObject_t handle, void* buf, size_t buflen);

/**
 * @brief Read from SFS object
 * @param[in] handle - SFS object handle
 * @param[in] buf - pointer to the buffer to hold the bytes read
 * @param[in] buflen - number of bytes to read from the file
 * @param[in] outCount - the number of bytes read from an SFS file
 * @return TEE error code
 */
TzwErrorCode_t tzwReadFromSfsObject(TzwSfsObject_t handle, void* buf, size_t buflen, uint32_t* outCount);

/**
 * @brief Seek into SFS object
 * @param[in] handle - SFS object handle
 * @param[in] offset - file offset to seek in bytes
 * @param[in] whence - indicates start, end, or current position
 *                   - SEEK_SET - Start of the file.
 *                   - SEEK_CUR - Current file point.
 *                   - SEEK_END - End of the file.
 * @return TEE error code
 */
TzwErrorCode_t tzwSeekIntoSfsObject(TzwSfsObject_t handle, int32_t offset, TEE_Whence whence);

/**
 * @brief Get SFS object information
 * @param[in] object - SFS object handle
 * @param[out] objectInfo - object information
 * @return TEE error code
 */
TzwErrorCode_t tzwGetSfsObjectInfo(TzwSfsObject_t object, TEE_ObjectInfo *objectInfo);

/**
 * @brief Truncate SFS object data
 * @param[in] object - SFS object handle
 * @param[in] size - truncate size
 * @return TEE error code
 */
TzwErrorCode_t tzwTruncateSfsObjectData(TzwSfsObject_t object, uint32_t size);

/**
 * @brief SFS object list
 */
struct __TzwSfsObjectList;

typedef struct __TzwSfsObjectList* TzwSfsObjectList_t; /* Opaque handle like in GP */

/**
 * @brief Allocate SFS object list
 * @param[out] objectEnumerator - SFS object list
 * @return TEE error code
 */
TzwErrorCode_t tzwAllocateSfsObjectList(TzwSfsObjectList_t* objectEnumerator);

/**
 * @brief Start SFS object list
 * @param[in] objectEnumerator - SFS object list
 * @return TEE error code
 */
TzwErrorCode_t tzwStartSfsObjectList(TzwSfsObjectList_t objectEnumerator);

/**
 * @brief Get next SFS object
 * @param[in] objectEnumerator - SFS object list
 * @return TEE error code
 */
TzwErrorCode_t tzwGetNextSfsObject(TzwSfsObjectList_t objectEnumerator,
                                   void* objectID, uint32_t* objectIDLen);

/**
 * @brief Free SFS object list
 * @param[in] objectEnumerator - SFS object list
 */
void tzwFreeSfsObjectList(TzwSfsObjectList_t objectEnumerator);

#endif // TZWSTORAGE_H
