summaryrefslogtreecommitdiff
path: root/encode_converter.c
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2010-08-17 18:19:05 +0200
committerJon Bergli Heier <snakebite@jvnv.net>2010-08-17 18:19:05 +0200
commite1f9e3c41c315b01b977a7caaa47afd0e4994d61 (patch)
tree80473817d0c82f501eb425826860ccd1e32a2399 /encode_converter.c
parent63ce7ed7a6849e85d3a87f1b6a4eab43720d705e (diff)
Added encoder and decoder stream converters.
Diffstat (limited to 'encode_converter.c')
-rw-r--r--encode_converter.c87
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;
+}