summaryrefslogtreecommitdiff
path: root/forstio/io/io_helpers.h
diff options
context:
space:
mode:
authorClaudius Holeksa <mail@keldu.de>2023-04-29 18:44:59 +0200
committerClaudius Holeksa <mail@keldu.de>2023-04-29 18:44:59 +0200
commitf07487ce8f0f3ebd5c4d1082a9521f09588fa34a (patch)
tree5cccd5e20d180cbe128dd0ae7759b50d26199af4 /forstio/io/io_helpers.h
parent47c44aab6cf54e4885de4138cab1aa3825f115e4 (diff)
Added io to new repo
Diffstat (limited to 'forstio/io/io_helpers.h')
-rw-r--r--forstio/io/io_helpers.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/forstio/io/io_helpers.h b/forstio/io/io_helpers.h
new file mode 100644
index 0000000..94e37f4
--- /dev/null
+++ b/forstio/io/io_helpers.h
@@ -0,0 +1,53 @@
+#pragma once
+
+#include <forstio/async/async.h>
+#include <forstio/core/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