/* GIO - GLib Input, Output and Streaming Library * * SPDX-FileCopyrightText: 2009 Red Hat, Inc. * SPDX-FileCopyrightText: 2010 Christian Persch * SPDX-License-Identifier: LGPL-2.1-or-later */ #include "config.h" #include "gbase64decoder.h" #include #include #include "gioenums.h" #include "gioenumtypes.h" #include "gioerror.h" #include "glibintl.h" /** * GBase64Decoder: * * `GBase64Decoder` is an implementation of [iface@Gio.Converter] * that converts data from base64 encoding. * * Since: 2.82 */ struct _GBase64Decoder { GObject parent_instance; int state; guint save; }; static void g_base64_decoder_reset (GConverter *converter) { GBase64Decoder *decoder = G_BASE64_DECODER (converter); decoder->state = 0; decoder->save = 0; } static GConverterResult g_base64_decoder_convert (GConverter *converter, const void *inbuf, gsize inbuf_size, void *outbuf, gsize outbuf_size, GConverterFlags flags, gsize *bytes_read, gsize *bytes_written, GError **error) { GBase64Decoder *decoder = G_BASE64_DECODER (converter); if (outbuf_size < ((inbuf_size / 4) * 3 + 3)) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE, "Not enough space in dest"); return G_CONVERTER_ERROR; } *bytes_read = inbuf_size; *bytes_written = g_base64_decode_step (inbuf, inbuf_size, outbuf, &decoder->state, &decoder->save); if (flags & G_CONVERTER_FLUSH) return G_CONVERTER_FLUSHED; if (*bytes_read == inbuf_size && (flags & G_CONVERTER_INPUT_AT_END)) return G_CONVERTER_FINISHED; return G_CONVERTER_CONVERTED; } static void g_base64_decoder_iface_init (GConverterIface *iface) { iface->convert = g_base64_decoder_convert; iface->reset = g_base64_decoder_reset; } G_DEFINE_TYPE_WITH_CODE (GBase64Decoder, g_base64_decoder, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_CONVERTER, g_base64_decoder_iface_init)) static void g_base64_decoder_init (GBase64Decoder *decoder) { decoder->state = 0; decoder->save = 0; } static void g_base64_decoder_class_init (GBase64DecoderClass *klass) { } /** * g_base64_decoder_new: * * Creates a new `GBase64Decoder`. * * Returns: (transfer full): a new `GBase64Decoder` * * Since: 2.82 */ GConverter * g_base64_decoder_new (void) { return g_object_new (G_TYPE_BASE64_DECODER, NULL); }