#pragma once
#include "../Fs.h"
#include "../Streamer.h"
#include <deque>
namespace panda { namespace unievent { namespace streamer {
struct FileInput : Streamer::IInput {
FileInput (string_view path, size_t chunk_size = 1000000) : path(string(path)), chunk_size(chunk_size) {}
ErrorCode start (const LoopSP&) override;
void stop () override;
ErrorCode start_reading () override;
void stop_reading () override;
private:
string path;
size_t chunk_size;
LoopSP loop;
fd_t fd;
Fs::RequestSP fsreq;
bool opened = false;
bool pause = false;
void do_read ();
};
struct FileOutput : Streamer::IOutput {
FileOutput (string_view path, int mode = Fs::DEFAULT_FILE_MODE) : path(string(path)), mode(mode) {}
ErrorCode start (const LoopSP&) override;
void stop () override;
ErrorCode write (const string& data) override;
size_t write_queue_size () const override { return bufsz; }
private:
string path;
int mode;
LoopSP loop;
fd_t fd;
Fs::RequestSP fsreq;
bool opened = false;
std::deque<string> bufs;
size_t bufsz = 0;
void do_write ();
};
}}}