From e1f9e3c41c315b01b977a7caaa47afd0e4994d61 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Tue, 17 Aug 2010 18:19:05 +0200 Subject: Added encoder and decoder stream converters. --- decode_converter.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 decode_converter.c (limited to 'decode_converter.c') diff --git a/decode_converter.c b/decode_converter.c new file mode 100644 index 0000000..102d059 --- /dev/null +++ b/decode_converter.c @@ -0,0 +1,87 @@ +#include "decode_converter.h" + +#include + +static void decode_converter_interface_init(GConverterIface *iface); +static void decode_converter_finalize(GObject *object); + +static GConverterResult decoder_converter_convert(GConverter *converter, + const void *inbuf, gsize inbuf_size, void *outbuf, gsize outbuf_size, + GConverterFlags flags, gsize *bytes_read, gsize *bytes_written, + GError **error); +static void decode_converter_reset(GConverter *converter); + +static GObjectClass *parent_class = NULL; + +G_DEFINE_TYPE_WITH_CODE(DecodeConverter, decode_converter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_CONVERTER, + decode_converter_interface_init)); + +static void decode_converter_class_init(DecodeConverterClass *klass) { + GObjectClass *object_class; + + parent_class = (GObjectClass*)g_type_class_peek_parent(klass); + object_class = (GObjectClass*)klass; + object_class->finalize = decode_converter_finalize; +} + +static void decode_converter_interface_init(GConverterIface *iface) { + iface->convert = decoder_converter_convert; + iface->reset = decode_converter_reset; +} + +static void decode_converter_init(DecodeConverter *self) { +} + +static void decode_converter_finalize(GObject *object) { + DecodeConverter *dc; + + g_assert(CONVERTER_IS_DECODE(object)); + + dc = DECODE_CONVERTER(object); + + dc->decoder.decoder->close(dc->decoder.data); +} + +static GConverterResult decoder_converter_convert(GConverter *converter, + const void *inbuf, gsize inbuf_size, void *outbuf, gsize outbuf_size, + GConverterFlags flags, gsize *bytes_read, gsize *bytes_written, + GError **error) { + DecodeConverter *dc; + + dc = (DecodeConverter*)converter; + + gssize size = dc->decoder.decoder->decode(dc->decoder.data, inbuf, inbuf_size, outbuf, outbuf_size); + + if(size < 0) { + *error = g_error_new(g_quark_from_string("DecodeConverter"), + size, "decode() returned %ld", size); + return G_CONVERTER_ERROR; + } else if(size == 0) { + return G_CONVERTER_FINISHED; + } + *bytes_read = inbuf_size; + *bytes_written = size; + return G_CONVERTER_CONVERTED; +} + +static void decode_converter_reset(GConverter *converter) { + DecodeConverter *dc; + + dc = (DecodeConverter*)converter; + + dc->decoder.decoder->close(&dc->decoder.data); +} + +DecodeConverter *decode_converter_new(const struct decoder_plugin *decoder_plugin) { + DecodeConverter *dc; + + dc = (DecodeConverter*)g_object_new(CONVERTER_TYPE_DECODE, NULL); + + g_assert(dc != NULL); + + dc->decoder.decoder = decoder_plugin; + dc->decoder.decoder->init(&dc->decoder.data); + + return dc; +} -- cgit v1.2.3