diff options
Diffstat (limited to 'example/example.cpp')
-rw-r--r-- | example/example.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/example/example.cpp b/example/example.cpp new file mode 100644 index 0000000..de05f00 --- /dev/null +++ b/example/example.cpp @@ -0,0 +1,167 @@ +#include "example/example.hpp" + +#include <algorithm> +#include <string> +#include <vector> + +namespace blobs +{ + +constexpr char ExampleBlobHandler::supportedPath[]; + +ExampleBlob* ExampleBlobHandler::getSession(uint16_t id) +{ + auto search = sessions.find(id); + if (search == sessions.end()) + { + return nullptr; + } + /* Not thread-safe, however, the blob handler deliberately assumes serial + * execution. */ + return &search->second; +} + +bool ExampleBlobHandler::canHandleBlob(const std::string& path) +{ + return (path == supportedPath); +} + +std::vector<std::string> ExampleBlobHandler::getBlobIds() +{ + return {supportedPath}; +} + +bool ExampleBlobHandler::deleteBlob(const std::string& path) +{ + return false; +} + +bool ExampleBlobHandler::stat(const std::string& path, struct BlobMeta* meta) +{ + return false; +} + +bool ExampleBlobHandler::open(uint16_t session, uint16_t flags, + const std::string& path) +{ + if (!canHandleBlob(path)) + { + return false; + } + + auto findSess = sessions.find(session); + if (findSess != sessions.end()) + { + /* This session is already active. */ + return false; + } + sessions[session] = ExampleBlob(session, flags); + return true; +} + +std::vector<uint8_t> ExampleBlobHandler::read(uint16_t session, uint32_t offset, + uint32_t requestedSize) +{ + ExampleBlob* sess = getSession(session); + if (!sess) + { + return std::vector<uint8_t>(); + } + + /* Is the offset beyond the array? */ + if (offset >= sizeof(sess->buffer)) + { + return std::vector<uint8_t>(); + } + + /* Determine how many bytes we can read from the offset. + * In this case, if they read beyond "size" we allow it. + */ + uint32_t remain = sizeof(sess->buffer) - offset; + uint32_t numBytes = std::min(remain, requestedSize); + /* Copy the bytes! */ + std::vector<uint8_t> result(numBytes); + std::memcpy(result.data(), &sess->buffer[offset], numBytes); + return result; +} + +bool ExampleBlobHandler::write(uint16_t session, uint32_t offset, + const std::vector<uint8_t>& data) +{ + ExampleBlob* sess = getSession(session); + if (!sess) + { + return false; + } + /* Is the offset beyond the array? */ + if (offset >= sizeof(sess->buffer)) + { + return false; + } + /* Determine whether all their bytes will fit. */ + uint32_t remain = sizeof(sess->buffer) - offset; + if (data.size() > remain) + { + return false; + } + sess->length = + std::max(offset + data.size(), + static_cast<std::vector<uint8_t>::size_type>(sess->length)); + std::memcpy(&sess->buffer[offset], data.data(), data.size()); + return true; +} + +bool ExampleBlobHandler::commit(uint16_t session, + const std::vector<uint8_t>& data) +{ + ExampleBlob* sess = getSession(session); + if (!sess) + { + return false; + } + + /* Do something with the staged data!. */ + + return false; +} + +bool ExampleBlobHandler::close(uint16_t session) +{ + ExampleBlob* sess = getSession(session); + if (!sess) + { + return false; + } + + sessions.erase(session); + return true; +} + +bool ExampleBlobHandler::stat(uint16_t session, struct BlobMeta* meta) +{ + ExampleBlob* sess = getSession(session); + if (!sess) + { + return false; + } + if (!meta) + { + return false; + } + meta->size = sess->length; + meta->blobState = sess->state; + return true; +} + +bool ExampleBlobHandler::expire(uint16_t session) +{ + ExampleBlob* sess = getSession(session); + if (!sess) + { + return false; + } + /* TODO: implement session expiration behavior. */ + return false; +} + +} // namespace blobs |