1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * Copyright (C) 2009 Red Hat, Inc.
4 * Copyright (C) 2009 Shaun McCance <shaunm@gnome.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General
17 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 * Author: Shaun McCance <shaunm@gnome.org>
27 #include <glib/gi18n.h>
29 #include "yelp-bz2-decompressor.h"
31 static void yelp_bz2_decompressor_iface_init (GConverterIface
*iface
);
33 struct _YelpBz2Decompressor
35 GObject parent_instance
;
40 G_DEFINE_TYPE_WITH_CODE (YelpBz2Decompressor
, yelp_bz2_decompressor
, G_TYPE_OBJECT
,
41 G_IMPLEMENT_INTERFACE (G_TYPE_CONVERTER
,
42 yelp_bz2_decompressor_iface_init
))
45 yelp_bz2_decompressor_finalize (GObject
*object
)
47 YelpBz2Decompressor
*decompressor
;
49 decompressor
= YELP_BZ2_DECOMPRESSOR (object
);
51 BZ2_bzDecompressEnd (&decompressor
->bzstream
);
53 G_OBJECT_CLASS (yelp_bz2_decompressor_parent_class
)->finalize (object
);
57 yelp_bz2_decompressor_init (YelpBz2Decompressor
*decompressor
)
62 yelp_bz2_decompressor_constructed (GObject
*object
)
64 YelpBz2Decompressor
*decompressor
;
67 decompressor
= YELP_BZ2_DECOMPRESSOR (object
);
69 res
= BZ2_bzDecompressInit (&decompressor
->bzstream
, 0, FALSE
);
71 if (res
== BZ_MEM_ERROR
)
72 g_error ("YelpBz2Decompressor: Not enough memory for bzip2 use");
75 g_error ("YelpBz2Decompressor: Unexpected bzip2 error");
79 yelp_bz2_decompressor_class_init (YelpBz2DecompressorClass
*klass
)
81 GObjectClass
*gobject_class
= G_OBJECT_CLASS (klass
);
83 gobject_class
->finalize
= yelp_bz2_decompressor_finalize
;
84 gobject_class
->constructed
= yelp_bz2_decompressor_constructed
;
88 yelp_bz2_decompressor_new (void)
90 YelpBz2Decompressor
*decompressor
;
92 decompressor
= g_object_new (YELP_TYPE_BZ2_DECOMPRESSOR
, NULL
);
98 yelp_bz2_decompressor_reset (GConverter
*converter
)
100 YelpBz2Decompressor
*decompressor
= YELP_BZ2_DECOMPRESSOR (converter
);
103 /* libbzip2 doesn't have a reset function. Ending and reiniting
104 * might do the trick. But this is untested. If reset matters
107 BZ2_bzDecompressEnd (&decompressor
->bzstream
);
108 res
= BZ2_bzDecompressInit (&decompressor
->bzstream
, 0, FALSE
);
110 if (res
== BZ_MEM_ERROR
)
111 g_error ("YelpBz2Decompressor: Not enough memory for bzip2 use");
114 g_error ("YelpBz2Decompressor: Unexpected bzip2 error");
117 static GConverterResult
118 yelp_bz2_decompressor_convert (GConverter
*converter
,
123 GConverterFlags flags
,
125 gsize
*bytes_written
,
128 YelpBz2Decompressor
*decompressor
;
131 decompressor
= YELP_BZ2_DECOMPRESSOR (converter
);
133 decompressor
->bzstream
.next_in
= (void *)inbuf
;
134 decompressor
->bzstream
.avail_in
= inbuf_size
;
136 decompressor
->bzstream
.next_out
= outbuf
;
137 decompressor
->bzstream
.avail_out
= outbuf_size
;
139 res
= BZ2_bzDecompress (&decompressor
->bzstream
);
141 if (res
== BZ_DATA_ERROR
|| res
== BZ_DATA_ERROR_MAGIC
) {
142 g_set_error_literal (error
, G_IO_ERROR
, G_IO_ERROR_INVALID_DATA
,
143 _("Invalid compressed data"));
144 return G_CONVERTER_ERROR
;
147 if (res
== BZ_MEM_ERROR
) {
148 g_set_error_literal (error
, G_IO_ERROR
, G_IO_ERROR_FAILED
,
149 _("Not enough memory"));
150 return G_CONVERTER_ERROR
;
153 if (res
== BZ_OK
|| res
== BZ_STREAM_END
) {
154 *bytes_read
= inbuf_size
- decompressor
->bzstream
.avail_in
;
155 *bytes_written
= outbuf_size
- decompressor
->bzstream
.avail_out
;
157 if (res
== BZ_STREAM_END
)
158 return G_CONVERTER_FINISHED
;
159 return G_CONVERTER_CONVERTED
;
162 g_assert_not_reached ();
166 yelp_bz2_decompressor_iface_init (GConverterIface
*iface
)
168 iface
->convert
= yelp_bz2_decompressor_convert
;
169 iface
->reset
= yelp_bz2_decompressor_reset
;