blob: ab0b567ce758bb7f03e748d9e713a5694282b470 [file] [log] [blame]
#pragma once
#include <cstdint>
#include <memory>
#include <string>
#include <vector>
namespace blobs
{
enum class BlobOEMCommands : std::uint8_t
{
bmcBlobGetCount = 0,
bmcBlobEnumerate = 1,
bmcBlobOpen = 2,
bmcBlobRead = 3,
bmcBlobWrite = 4,
bmcBlobCommit = 5,
bmcBlobClose = 6,
bmcBlobDelete = 7,
bmcBlobStat = 8,
bmcBlobSessionStat = 9,
bmcBlobWriteMeta = 10,
};
enum OpenFlags
{
read = (1 << 0),
write = (1 << 1),
/* bits 3-7 reserved. */
/* bits 8-15 given blob-specific definitions */
};
enum StateFlags
{
open_read = (1 << 0),
open_write = (1 << 1),
committing = (1 << 2),
committed = (1 << 3),
commit_error = (1 << 4),
};
struct BlobMeta
{
uint16_t blobState;
uint32_t size;
std::vector<uint8_t> metadata;
bool operator==(const BlobMeta& rhs) const
{
return (this->blobState == rhs.blobState && this->size == rhs.size &&
this->metadata == rhs.metadata);
}
};
/*
* All blob specific objects implement this interface.
*/
class GenericBlobInterface
{
public:
virtual ~GenericBlobInterface() = default;
/**
* Checks if the handler will manage this file path.
*
* @param[in] blobId.
* @return bool whether it will manage the file path.
*/
virtual bool canHandleBlob(const std::string& path) = 0;
/**
* Return the name(s) of the blob(s). Used during GetCount.
*
* @return List of blobIds this handler manages.
*/
virtual std::vector<std::string> getBlobIds() = 0;
/**
* Attempt to delete the blob specified by the path.
*
* @param[in] path - the blobId to try and delete.
* @return bool - whether it was able to delete the blob.
*/
virtual bool deleteBlob(const std::string& path) = 0;
/**
* Return metadata about the blob.
*
* @param[in] path - the blobId for metadata.
* @param[in,out] meta - a pointer to a blobmeta.
* @return bool - true if it was successful.
*/
virtual bool stat(const std::string& path, BlobMeta* meta) = 0;
/* The methods below are per session. */
/**
* Attempt to open a session from this path.
*
* @param[in] session - the session id.
* @param[in] flags - the open flags.
* @param[in] path - the blob path.
* @return bool - was able to open the session.
*/
virtual bool open(uint16_t session, uint16_t flags,
const std::string& path) = 0;
/**
* Attempt to read from a blob.
*
* @param[in] session - the session id.
* @param[in] offset - offset into the blob.
* @param[in] requestedSize - number of bytes to read.
* @return Bytes read back (0 length on error).
*/
virtual std::vector<uint8_t> read(uint16_t session, uint32_t offset,
uint32_t requestedSize) = 0;
/**
* Attempt to write to a blob.
*
* @param[in] session - the session id.
* @param[in] offset - offset into the blob.
* @param[in] data - the data to write.
* @return bool - was able to write.
*/
virtual bool write(uint16_t session, uint32_t offset,
const std::vector<uint8_t>& data) = 0;
/**
* Attempt to write metadata to a blob.
*
* @param[in] session - the session id.
* @param[in] offset - offset into the blob.
* @param[in] data - the data to write.
* @return bool - was able to write.
*/
virtual bool writeMeta(uint16_t session, uint32_t offset,
const std::vector<uint8_t>& data) = 0;
/**
* Attempt to commit to a blob.
*
* @param[in] session - the session id.
* @param[in] data - optional commit data.
* @return bool - was able to start commit.
*/
virtual bool commit(uint16_t session, const std::vector<uint8_t>& data) = 0;
/**
* Attempt to close your session.
*
* @param[in] session - the session id.
* @return bool - was able to close session.
*/
virtual bool close(uint16_t session) = 0;
/**
* Attempt to return metadata for the session's view of the blob.
*
* @param[in] session - the session id.
* @param[in,out] meta - pointer to update with the BlobMeta.
* @return bool - wether it was successful.
*/
virtual bool stat(uint16_t session, BlobMeta* meta) = 0;
/**
* Attempt to expire a session. This is called when a session has been
* inactive for at least 10 minutes.
*
* @param[in] session - the session id.
* @return bool - whether the session was able to be closed.
*/
virtual bool expire(uint16_t session) = 0;
};
} // namespace blobs
#ifdef __cplusplus
extern "C" {
#endif
/**
* All Blob handlers need to implement this method. It is called after loading
* the library to then get a handle to the blob handler.
*
* @return a unique pointer to your blob handler instance.
*/
std::unique_ptr<blobs::GenericBlobInterface> createHandler();
#ifdef __cplusplus
}
#endif