#ifndef AWS_IO_STREAM_H
#define AWS_IO_STREAM_H
#include <aws/common/ref_count.h>
#include <aws/io/io.h>
struct aws_input_stream;
struct aws_byte_buf;
enum aws_stream_seek_basis { AWS_SSB_BEGIN = 0, AWS_SSB_END = 2 };
struct aws_stream_status {
bool is_end_of_stream;
bool is_valid;
};
struct aws_input_stream_vtable {
int (*seek)(struct aws_input_stream *stream, int64_t offset, enum aws_stream_seek_basis basis);
int (*read)(struct aws_input_stream *stream, struct aws_byte_buf *dest);
int (*get_status)(struct aws_input_stream *stream, struct aws_stream_status *status);
int (*get_length)(struct aws_input_stream *stream, int64_t *out_length);
void (*acquire)(struct aws_input_stream *stream);
void (*release)(struct aws_input_stream *stream);
};
struct aws_input_stream {
void *impl;
const struct aws_input_stream_vtable *vtable;
struct aws_ref_count ref_count;
};
AWS_EXTERN_C_BEGIN
AWS_IO_API struct aws_input_stream *aws_input_stream_acquire(struct aws_input_stream *stream);
AWS_IO_API struct aws_input_stream *aws_input_stream_release(struct aws_input_stream *stream);
AWS_IO_API int aws_input_stream_seek(struct aws_input_stream *stream, int64_t offset, enum aws_stream_seek_basis basis);
AWS_IO_API int aws_input_stream_read(struct aws_input_stream *stream, struct aws_byte_buf *dest);
AWS_IO_API int aws_input_stream_get_status(struct aws_input_stream *stream, struct aws_stream_status *status);
AWS_IO_API int aws_input_stream_get_length(struct aws_input_stream *stream, int64_t *out_length);
AWS_IO_API void aws_input_stream_destroy(struct aws_input_stream *stream);
AWS_IO_API struct aws_input_stream *aws_input_stream_new_from_cursor(
struct aws_allocator *allocator,
const struct aws_byte_cursor *cursor);
AWS_IO_API struct aws_input_stream *aws_input_stream_new_from_file(
struct aws_allocator *allocator,
const char *file_name);
AWS_IO_API struct aws_input_stream *aws_input_stream_new_from_open_file(struct aws_allocator *allocator, FILE *file);
AWS_EXTERN_C_END
#endif