forstio/source/forstio/io_helpers.h

54 lines
1.1 KiB
C++

#pragma once
#include "async.h"
#include "common.h"
#include <cstdint>
#include <optional>
namespace saw {
/*
* Helper classes for the specific driver implementations
*/
/*
* Since I don't want to repeat these implementations for tls on unix systems
* and gnutls doesn't let me write or read into buffers I have to have this kind
* of strange abstraction. This may also be reusable for windows/macOS though.
*/
class input_stream;
class read_task_and_step_helper {
public:
struct read_io_task {
void *buffer;
size_t min_length;
size_t max_length;
size_t already_read = 0;
};
std::optional<read_io_task> read_task;
own<conveyor_feeder<size_t>> read_done = nullptr;
own<conveyor_feeder<void>> on_read_disconnect = nullptr;
public:
void read_step(input_stream &reader);
};
class output_stream;
class write_task_and_step_helper {
public:
struct write_io_task {
const void *buffer;
size_t length;
size_t already_written = 0;
};
std::optional<write_io_task> write_task;
own<conveyor_feeder<size_t>> write_done = nullptr;
public:
void write_step(output_stream &writer);
};
} // namespace saw