X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcstream.h;h=b6d82d90009489e0b050ba1beaafa3c47a4a2bd5;hb=40729be849e8ca96bc129a35c1122286aa5f8705;hp=3067313ba946d5a04ff4b84235497fc65d6309d6;hpb=6b558e0cc2b268c238ac4ec2beae62f3ba1fe8dd;p=runtime.git diff --git a/lib/silcutil/silcstream.h b/lib/silcutil/silcstream.h index 3067313b..b6d82d90 100644 --- a/lib/silcutil/silcstream.h +++ b/lib/silcutil/silcstream.h @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2005 - 2007 Pekka Riikonen + Copyright (C) 2005 - 2008 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ */ -/****h* silcutil/SILC Stream Interface +/****h* silcutil/Stream Interface * * DESCRIPTION * @@ -26,6 +26,10 @@ * other stream API derived from this API can use this same interface for * reading and writing. * + * The SilcStream is an abstraction. It can represent any stream; socket + * stream, file descriptor stream, packet stream, etc. See examples in + * silcsocketstream.h and silcfdstream.h. + * * Note that stream implementations usually are not thread-safe. Always * verify whether a stream implementation is thread-safe by checking their * corresponding documentation. @@ -35,7 +39,7 @@ #ifndef SILCSTREAM_H #define SILCSTREAM_H -/****s* silcutil/SilcStreamAPI/SilcStream +/****s* silcutil/SilcStream * * NAME * @@ -51,7 +55,7 @@ ***/ typedef void *SilcStream; -/****d* silcutil/SilcStreamAPI/SilcStreamStatus +/****d* silcutil/SilcStreamStatus * * NAME * @@ -68,15 +72,10 @@ typedef void *SilcStream; typedef enum { SILC_STREAM_CAN_READ, /* Data available for reading */ SILC_STREAM_CAN_WRITE, /* Stream ready for writing */ - SILC_STREAM_EOS, /* End of stream */ - SILC_STREAM_CLOSED, /* Stream is closed */ - SILC_STREAM_INVALID, /* Stream is invalid */ - SILC_STREAM_NO_MEMORY, /* System out of memory */ - SILC_STREAM_ERROR, /* Unknown error */ } SilcStreamStatus; /***/ -/****f* silcutil/SilcStreamAPI/SilcStreamNotifier +/****f* silcutil/SilcStreamNotifier * * SYNOPSIS * @@ -96,7 +95,7 @@ typedef void (*SilcStreamNotifier)(SilcStream stream, SilcStreamStatus status, void *context); -/****s* silcutil/SilcStreamAPI/SilcStreamOps +/****s* silcutil/SilcStreamOps * * NAME * @@ -122,7 +121,7 @@ typedef void (*SilcStreamNotifier)(SilcStream stream, * } *SilcFooStream; * * SilcFooStream foo; - * silc_stream_write(foo, data, data_len); + * silc_stream_write((SilcStream)foo, data, data_len); * * SOURCE */ @@ -158,7 +157,12 @@ typedef struct { } SilcStreamOps; /***/ -/****f* silcutil/SilcStreamAPI/silc_stream_read +/* Stream header */ +typedef struct SilcStreamHeaderObject { + SilcStreamOps *ops; +} *SilcStreamHeader, SilcStreamHeaderStruct; + +/****f* silcutil/silc_stream_read * * SYNOPSIS * @@ -174,11 +178,18 @@ typedef struct { * the notifier callback will later be called with SILC_STREAM_CAN_READ * status when stream is again ready for reading. * + * If error occurred the error code can be retrieved with silc_errno. + * ***/ +static inline int silc_stream_read(SilcStream stream, unsigned char *buf, - SilcUInt32 buf_len); + SilcUInt32 buf_len) +{ + SilcStreamHeader h = stream; + return h->ops->read(stream, buf, buf_len); +} -/****f* silcutil/SilcStreamAPI/silc_stream_write +/****f* silcutil/silc_stream_write * * SYNOPSIS * @@ -194,11 +205,18 @@ int silc_stream_read(SilcStream stream, unsigned char *buf, * notifier callback will later be called with SILC_STREAM_CAN_WRITE * status when stream is again ready for writing. * + * If error occurred the error code can be retrieved with silc_errno. + * ***/ +static inline int silc_stream_write(SilcStream stream, const unsigned char *data, - SilcUInt32 data_len); + SilcUInt32 data_len) +{ + SilcStreamHeader h = stream; + return h->ops->write(stream, data, data_len); +} -/****f* silcutil/SilcStreamAPI/silc_stream_close +/****f* silcutil/silc_stream_close * * SYNOPSIS * @@ -212,9 +230,14 @@ int silc_stream_write(SilcStream stream, const unsigned char *data, * callback may be called with an error status. * ***/ -SilcBool silc_stream_close(SilcStream stream); +static inline +SilcBool silc_stream_close(SilcStream stream) +{ + SilcStreamHeader h = stream; + return h->ops->close(stream); +} -/****f* silcutil/SilcStreamAPI/silc_stream_destroy +/****f* silcutil/silc_stream_destroy * * SYNOPSIS * @@ -229,9 +252,14 @@ SilcBool silc_stream_close(SilcStream stream); * function will call it. * ***/ -void silc_stream_destroy(SilcStream stream); +static inline +void silc_stream_destroy(SilcStream stream) +{ + SilcStreamHeader h = stream; + h->ops->destroy(stream); +} -/****f* silcutil/SilcStreamAPI/silc_stream_set_notifier +/****f* silcutil/silc_stream_set_notifier * * SYNOPSIS * @@ -252,15 +280,19 @@ void silc_stream_destroy(SilcStream stream); * If `notifier' is set to NULL no callback will be called for the stream, * and the stream is not scheduled anymore. * - * This function returns FALSE if the `schedule' was provided and the - * stream could not be scheduled. The actual API for `stream' may provide - * access to the actual error information. Returns TRUE on success. + * This function returns FALSE if the stream could not be scheduled. + * Returns TRUE on success. The `schedule' must always be non-NULL. * ***/ +static inline SilcBool silc_stream_set_notifier(SilcStream stream, SilcSchedule schedule, - SilcStreamNotifier notifier, void *context); + SilcStreamNotifier notifier, void *context) +{ + SilcStreamHeader h = stream; + return h->ops->notifier(stream, schedule, notifier, context); +} -/****f* silcutil/SilcStreamAPI/silc_stream_get_schedule +/****f* silcutil/silc_stream_get_schedule * * SYNOPSIS * @@ -272,6 +304,11 @@ SilcBool silc_stream_set_notifier(SilcStream stream, SilcSchedule schedule, * NULL if one has not been set for the `stream'. * ***/ -SilcSchedule silc_stream_get_schedule(SilcStream stream); +static inline +SilcSchedule silc_stream_get_schedule(SilcStream stream) +{ + SilcStreamHeader h = stream; + return h->ops->get_schedule(stream); +} #endif /* SILCSTREAM_H */