diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2010-08-17 18:19:05 +0200 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2010-08-17 18:19:05 +0200 |
commit | e1f9e3c41c315b01b977a7caaa47afd0e4994d61 (patch) | |
tree | 80473817d0c82f501eb425826860ccd1e32a2399 /encode_converter.c | |
parent | 63ce7ed7a6849e85d3a87f1b6a4eab43720d705e (diff) |
Added encoder and decoder stream converters.
Diffstat (limited to 'encode_converter.c')
-rw-r--r-- | encode_converter.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/encode_converter.c b/encode_converter.c new file mode 100644 index 0000000..e113351 --- /dev/null +++ b/encode_converter.c @@ -0,0 +1,87 @@ +#include "encode_converter.h" + +#include <gio/gio.h> + +static void encode_converter_interface_init(GConverterIface *iface); +static void encode_converter_finalize(GObject *object); + +static GConverterResult encoder_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 encode_converter_reset(GConverter *converter); + +static GObjectClass *parent_class = NULL; + +G_DEFINE_TYPE_WITH_CODE(EncodeConverter, encode_converter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_CONVERTER, + encode_converter_interface_init)); + +static void encode_converter_class_init(EncodeConverterClass *klass) { + GObjectClass *object_class; + + parent_class = (GObjectClass*)g_type_class_peek_parent(klass); + object_class = (GObjectClass*)klass; + object_class->finalize = encode_converter_finalize; +} + +static void encode_converter_interface_init(GConverterIface *iface) { + iface->convert = encoder_converter_convert; + iface->reset = encode_converter_reset; +} + +static void encode_converter_init(EncodeConverter *self) { +} + +static void encode_converter_finalize(GObject *object) { + EncodeConverter *dc; + + g_assert(CONVERTER_IS_ENCODE(object)); + + dc = ENCODE_CONVERTER(object); + + dc->encoder.encoder->close(dc->encoder.data); +} + +static GConverterResult encoder_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) { + EncodeConverter *dc; + + dc = (EncodeConverter*)converter; + + gssize size = dc->encoder.encoder->encode(dc->encoder.data, inbuf, inbuf_size, outbuf, outbuf_size); + + if(size < 0) { + *error = g_error_new(g_quark_from_string("EncodeConverter"), + size, "encode() 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 encode_converter_reset(GConverter *converter) { + EncodeConverter *ec; + + ec = (EncodeConverter*)converter; + + ec->encoder.encoder->close(&ec->encoder.data); +} + +EncodeConverter *encode_converter_new(const struct encoder_plugin *encoder_plugin) { + EncodeConverter *dc; + + dc = (EncodeConverter*)g_object_new(CONVERTER_TYPE_ENCODE, NULL); + + g_assert(dc != NULL); + + dc->encoder.encoder = encoder_plugin; + dc->encoder.encoder->init(&dc->encoder.data); + + return dc; +} |