Newer
Older
Import / research / framework / source / DataSource.hpp
/************************************************
*
*  Data Source
*  Copyright (C) 2020
*  John Ryland
*  All rights reserved
*
************************************************/
#pragma once
#ifndef DATA_SOURCE_HPP
#define DATA_SOURCE_HPP

#include <string>
#include <cstdint>
#include <functional>
#include "VectorSlice.hpp"

/*
// Instead of std::function callbacks, could be done this way
class DataConsumer
{
public:
    enum class ReadResult
    {
        eSuccess,
        eEndOfData,
        eReadAgain,
        eReadError
    };
    enum class OpenResult
    {
        eSuccess,
        eOpenError
    };
    virtual void Opened(OpenResult aResult, OpenedDataSource& fd) = 0;
    virtual void ReadCompletion(ReadResult aResult, VectorSlice<uint8_t> aBytesRead) = 0;
};
*/

class OpenedDataSource
{
public:
    enum class ReadResult
    {
        eSuccess,
        eEndOfData,
        eReadAgain,
        eReadError
    };

    using ReadCompletionCallback = std::function<void(ReadResult aResult, VectorSlice<uint8_t> aBytesRead)>;

    virtual ~OpenedDataSource() = default;
    virtual bool ReadBytes(size_t aNumberOfBytes, ReadCompletionCallback aCallback) = 0;
    virtual bool ReadLine(ReadCompletionCallback aCallback) = 0;
    virtual bool ReadAll(ReadCompletionCallback aCallback) = 0;
};

// Interface - could be a local file or might be a URL etc
class DataSource
{
public:
    using OpenedCallback = std::function<void(OpenedDataSource* aOpenedDataSource)>;

    virtual ~DataSource() = default;
    virtual void Open(const char* aResourceLocator, OpenedCallback aCallback) = 0;
};

#endif // DATA_SOURCE_HPP