#ifndef __GSK_STREAM_H_
#define __GSK_STREAM_H_
#include "gskbuffer.h"
#include "gskio.h"
G_BEGIN_DECLS
/* --- typedefs --- */
typedef struct _GskStream GskStream;
typedef struct _GskStreamClass GskStreamClass;
/* --- type macros --- */
GType gsk_stream_get_type(void) G_GNUC_CONST;
#define GSK_TYPE_STREAM (gsk_stream_get_type ())
#define GSK_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSK_TYPE_STREAM, GskStream))
#define GSK_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSK_TYPE_STREAM, GskStreamClass))
#define GSK_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSK_TYPE_STREAM, GskStreamClass))
#define GSK_IS_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSK_TYPE_STREAM))
#define GSK_IS_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSK_TYPE_STREAM))
/* Convention:
*
*
* The ends of a stream are the 'read-end' and the 'write-end'.
* The read-end is drawn-from using gsk_stream_read()
* and the write-end is affected by gsk_stream_write().
*
* Note that it might be tempting to call the 'read-end' the "output end",
* since that is where data is "output" -- that's confusing though --
* just avoid reference to output if you want to understand what's
* going on. Likewise thinking of the 'write-end' as "for input" is more
* likely to confuse than clarify.
*/
/* --- structures --- */
struct _GskStreamClass
{
GskIOClass base_class;
/* --- virtuals --- */
guint (*raw_read) (GskStream *stream,
gpointer data,
guint length,
GError **error);
guint (*raw_write) (GskStream *stream,
gconstpointer data,
guint length,
GError **error);
guint (*raw_read_buffer) (GskStream *stream,
GskBuffer *buffer,
GError **error);
guint (*raw_write_buffer)(GskStream *stream,
GskBuffer *buffer,
GError **error);
};
struct _GskStream
{
GskIO base_io;
/*< protected >*/
guint never_partial_reads : 1;
guint never_partial_writes : 1;
};
/* --- prototypes --- */
/* read-from/write-to a stream */
gsize gsk_stream_read (GskStream *stream,
gpointer buffer,
gsize buffer_length,
GError **error);
gsize gsk_stream_write (GskStream *stream,
gconstpointer buffer,
gsize buffer_length,
GError **error);
/* read into buffer from stream */
gsize gsk_stream_read_buffer (GskStream *stream,
GskBuffer *buffer,
GError **error);
/* write out of buffer to stream */
gsize gsk_stream_write_buffer (GskStream *stream,
GskBuffer *buffer,
GError **error);
/* connections from the output of one stream to the input of another. */
gboolean gsk_stream_attach (GskStream *input_stream,
GskStream *output_stream,
GError **error);
gboolean gsk_stream_attach_pair (GskStream *stream_a,
GskStream *stream_b,
GError **error);
/* public */
#define gsk_stream_get_is_connecting(stream) gsk_io_get_is_connecting(stream)
#define gsk_stream_get_is_readable(stream) gsk_io_get_is_readable(stream)
#define gsk_stream_get_is_writable(stream) gsk_io_get_is_writable(stream)
#define gsk_stream_get_never_blocks_write(stream) gsk_io_get_never_blocks_write(stream)
#define gsk_stream_get_never_blocks_read(stream) gsk_io_get_never_blocks_read(stream)
#define gsk_stream_get_idle_notify_write(stream) gsk_io_get_idle_notify_write(stream)
#define gsk_stream_get_idle_notify_read(stream) gsk_io_get_idle_notify_read(stream)
#define gsk_stream_get_is_open(stream) gsk_io_get_is_open (stream)
#define gsk_stream_get_never_partial_reads(stream) (GSK_STREAM (stream)->never_partial_reads != 0)
#define gsk_stream_get_never_partial_writes(stream) (GSK_STREAM (stream)->never_partial_writes != 0)
#define gsk_stream_trap_readable gsk_io_trap_readable
#define gsk_stream_trap_writable gsk_io_trap_writable
#define gsk_stream_untrap_readable gsk_io_untrap_readable
#define gsk_stream_untrap_writable gsk_io_untrap_writable
/* protected */
#define gsk_stream_mark_is_connecting(stream) gsk_io_mark_is_connecting(stream)
#define gsk_stream_mark_is_readable(stream) gsk_io_mark_is_readable(stream)
#define gsk_stream_mark_is_writable(stream) gsk_io_mark_is_writable(stream)
#define gsk_stream_mark_never_blocks_write(stream) gsk_io_mark_never_blocks_write(stream)
#define gsk_stream_mark_never_blocks_read(stream) gsk_io_mark_never_blocks_read(stream)
#define gsk_stream_mark_idle_notify_write(stream) gsk_io_mark_idle_notify_write(stream)
#define gsk_stream_mark_idle_notify_read(stream) gsk_io_mark_idle_notify_read(stream)
#define gsk_stream_mark_is_open(stream) gsk_io_mark_is_open (stream)
#define gsk_stream_mark_never_partial_reads(stream) G_STMT_START{ GSK_STREAM (stream)->never_partial_reads = 1; }G_STMT_END
#define gsk_stream_mark_never_partial_writes(stream) G_STMT_START{ GSK_STREAM (stream)->never_partial_writes = 1; }G_STMT_END
#define gsk_stream_clear_is_readable(stream) gsk_io_clear_is_readable(stream)
#define gsk_stream_clear_is_writable(stream) gsk_io_clear_is_writable(stream)
#define gsk_stream_clear_is_open(stream) gsk_io_clear_is_open (stream)
#define gsk_stream_clear_idle_notify_write(stream) gsk_io_clear_idle_notify_write(stream)
#define gsk_stream_clear_idle_notify_read(stream) gsk_io_clear_idle_notify_read(stream)
#define gsk_stream_clear_never_partial_reads(stream) G_STMT_START{ GSK_STREAM (stream)->never_partial_reads = 0; }G_STMT_END
#define gsk_stream_clear_never_partial_writes(stream) G_STMT_START{ GSK_STREAM (stream)->never_partial_writes = 0; }G_STMT_END
G_END_DECLS
#endif
syntax highlighted by Code2HTML, v. 0.9.1