From ee50ed54fdeef30aa5b4b41763b5a6ac84a56627 Mon Sep 17 00:00:00 2001 From: Ting-Wei Lan Date: Tue, 9 Jul 2013 14:41:00 +0800 Subject: Add AutoarExtract class files AutoarExtract class is used to handle automatic extraction of archives. Currently only boilerplate code is completed. --- Makefile.am | 2 +- autoarchive/Makefile.am | 23 +++ autoarchive/autoar-extract.c | 478 +++++++++++++++++++++++++++++++++++++++++++ autoarchive/autoar-extract.h | 88 ++++++++ configure.ac | 1 + 5 files changed, 591 insertions(+), 1 deletion(-) create mode 100644 autoarchive/Makefile.am create mode 100644 autoarchive/autoar-extract.c create mode 100644 autoarchive/autoar-extract.h diff --git a/Makefile.am b/Makefile.am index e71acc96f..92be81c14 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = lib embed src data po doc +SUBDIRS = lib embed src autoarchive data po doc if ENABLE_TESTS SUBDIRS += tests diff --git a/autoarchive/Makefile.am b/autoarchive/Makefile.am new file mode 100644 index 000000000..2dbe3d553 --- /dev/null +++ b/autoarchive/Makefile.am @@ -0,0 +1,23 @@ +NULL = + +noinst_LTLIBRARIES = libautoarchive.la + +NOINST_H_FILES = \ + autoar-extract.h \ + $(NULL) + +INST_H_FILES = \ + $(NULL) + +libautoarchive_la_SOURCES = \ + autoar-extract.c \ + $(INST_H_FILES) \ + $(NOINST_H_FILES) \ + $(NULL) + +libautoarchive_la_CPPFLAGS = \ + $(AM_CPPFLAGS) + +libautoarchive_la_CFLAGS = \ + $(DEPENDENCIES_CFLAGS) \ + $(AM_CFLAGS) diff --git a/autoarchive/autoar-extract.c b/autoarchive/autoar-extract.c new file mode 100644 index 000000000..2943058c6 --- /dev/null +++ b/autoarchive/autoar-extract.c @@ -0,0 +1,478 @@ +/* vim: set sw=2 ts=2 sts=2 et: */ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * autoar-extract.c + * Automatically extract archives in some GNOME programs + * + * Copyright (C) 2013 Ting-Wei Lan + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" + +#include "autoar-extract.h" + +#include +#include + +G_DEFINE_TYPE (AutoarExtract, autoar_extract, G_TYPE_OBJECT) + +#define AUTOAR_EXTRACT_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), AUTOAR_TYPE_EXTRACT, AutoarExtractPrivate)) + +struct _AutoarExtractPrivate +{ + char *source; + char *output; + + struct archive* ar_read; + + guint64 size; + guint64 completed_size; + + guint files; + guint completed_files; +}; + +enum +{ + PROP_0, + PROP_SOURCE, + PROP_OUTPUT, + PROP_SIZE, + PROP_COMPLETED_SIZE, + PROP_FILES, + PROP_COMPLETED_FILES +}; + +static void +autoar_extract_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + AutoarExtract *arextract; + AutoarExtractPrivate *priv; + + arextract = AUTOAR_EXTRACT (object); + priv = arextract->priv; + + switch (property_id) { + case PROP_SOURCE: + g_value_set_string (value, priv->source); + break; + case PROP_OUTPUT: + g_value_set_string (value, priv->output); + break; + case PROP_SIZE: + g_value_set_uint64 (value, priv->size); + break; + case PROP_COMPLETED_SIZE: + g_value_set_uint64 (value, priv->completed_size); + break; + case PROP_FILES: + g_value_set_uint (value, priv->files); + break; + case PROP_COMPLETED_FILES: + g_value_set_uint (value, priv->completed_files); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +autoar_extract_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + AutoarExtract *arextract; + AutoarExtractPrivate *priv; + + arextract = AUTOAR_EXTRACT (object); + priv = arextract->priv; + + switch (property_id) { + case PROP_SIZE: + autoar_extract_set_size (arextract, g_value_get_uint64 (value)); + break; + case PROP_COMPLETED_SIZE: + autoar_extract_set_completed_size (arextract, g_value_get_uint64 (value)); + break; + case PROP_FILES: + autoar_extract_set_files (arextract, g_value_get_uint (value)); + break; + case PROP_COMPLETED_FILES: + autoar_extract_set_completed_files (arextract, g_value_get_uint (value)); + break; + case PROP_SOURCE: + g_free (priv->source); + priv->source = g_value_dup_string (value); + break; + case PROP_OUTPUT: + g_free (priv->output); + priv->output = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +char* +autoar_extract_get_source (AutoarExtract *arextract) +{ + g_return_val_if_fail (AUTOAR_IS_EXTRACT (arextract), NULL); + return arextract->priv->source; +} + +char* +autoar_extract_get_output (AutoarExtract *arextract) +{ + g_return_val_if_fail (AUTOAR_IS_EXTRACT (arextract), NULL); + return arextract->priv->output; +} + +guint64 +autoar_extract_get_size (AutoarExtract *arextract) +{ + g_return_val_if_fail (AUTOAR_IS_EXTRACT (arextract), 0); + return arextract->priv->size; +} + +guint64 +autoar_extract_get_completed_size (AutoarExtract *arextract) +{ + g_return_val_if_fail (AUTOAR_IS_EXTRACT (arextract), 0); + return arextract->priv->completed_size; +} + +guint +autoar_extract_get_files (AutoarExtract *arextract) +{ + g_return_val_if_fail (AUTOAR_IS_EXTRACT (arextract), 0); + return arextract->priv->files; +} + +guint +autoar_extract_get_completed_files (AutoarExtract *arextract) +{ + g_return_val_if_fail (AUTOAR_IS_EXTRACT (arextract), 0); + return arextract->priv->completed_files; +} + +void +autoar_extract_set_size (AutoarExtract *arextract, + guint64 size) +{ + g_return_if_fail (AUTOAR_IS_EXTRACT (arextract)); + arextract->priv->size = size; +} + +void +autoar_extract_set_completed_size (AutoarExtract *arextract, + guint64 completed_size) +{ + g_return_if_fail (AUTOAR_IS_EXTRACT (arextract)); + g_return_if_fail (completed_size <= arextract->priv->completed_size); + arextract->priv->completed_size = completed_size; +} + +void +autoar_extract_set_files (AutoarExtract *arextract, + guint files) +{ + g_return_if_fail (AUTOAR_IS_EXTRACT (arextract)); + arextract->priv->files = files; +} + +void +autoar_extract_set_completed_files (AutoarExtract *arextract, + guint completed_files) +{ + g_return_if_fail (AUTOAR_IS_EXTRACT (arextract)); + g_return_if_fail (completed_files <= arextract->priv->completed_files); + arextract->priv->completed_files = completed_files; +} + +static void +autoar_extract_finalize (GObject *object) +{ + AutoarExtract *arextract; + AutoarExtractPrivate *priv; + + arextract = AUTOAR_EXTRACT (object); + priv = arextract->priv; + + if (priv->source != NULL) { + g_free (priv->source); + priv->source = NULL; + } + + if (priv->output != NULL) { + g_free (priv->output); + priv->output = NULL; + } + + if (priv->ar_read != NULL) { + archive_read_free (priv->ar_read); + priv->ar_read = NULL; + } + + G_OBJECT_CLASS (autoar_extract_parent_class)->finalize (object); +} + +/* Additional marshaller generated by glib-genmarshal + * Command: echo "VOID:DOUBLE,DOUBLE" | glib-genmarshal --header */ + +/* VOID:DOUBLE,DOUBLE (/dev/stdin:1) */ +extern void g_cclosure_user_marshal_VOID__DOUBLE_DOUBLE (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* Additional marshaller generated by glib-genmarshal + * Command: echo "VOID:DOUBLE,DOUBLE" | glib-genmarshal --body */ + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_schar (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#define g_marshal_value_peek_variant(v) g_value_get_variant (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:DOUBLE,DOUBLE (/dev/stdin:1) */ +void +g_cclosure_user_marshal_VOID__DOUBLE_DOUBLE (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__DOUBLE_DOUBLE) (gpointer data1, + gdouble arg_1, + gdouble arg_2, + gpointer data2); + register GMarshalFunc_VOID__DOUBLE_DOUBLE callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__DOUBLE_DOUBLE) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_double (param_values + 1), + g_marshal_value_peek_double (param_values + 2), + data2); +} + + +static void +autoar_extract_class_init (AutoarExtractClass *klass) +{ + GObjectClass *object_class; + GType type; + + object_class = G_OBJECT_CLASS (klass); + type = G_TYPE_FROM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (AutoarExtractPrivate)); + + object_class->get_property = autoar_extract_get_property; + object_class->set_property = autoar_extract_set_property; + object_class->finalize = autoar_extract_finalize; + + g_object_class_install_property (object_class, PROP_SOURCE, + g_param_spec_string ("source", + "Source archive", + "The archive file to be extracted", + NULL, + G_PARAM_READABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (object_class, PROP_OUTPUT, + g_param_spec_string ("output", + "Output directory", + "Output directory of extracted archive", + NULL, + G_PARAM_READABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (object_class, PROP_SIZE, + g_param_spec_uint64 ("size", + "File size", + "Size of the archive file", + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (object_class, PROP_COMPLETED_SIZE, + g_param_spec_uint64 ("completed-size", + "Read file size", + "Bytes read from the archive", + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (object_class, PROP_COMPLETED_FILES, + g_param_spec_uint ("completed-files", + "Written files", + "Number of files has been written", + 0, G_MAXUINT32, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); + + g_signal_new ("scaned", + type, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (AutoarExtractClass, scaned), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + 1, + G_TYPE_UINT); + + g_signal_new ("progress", + type, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (AutoarExtractClass, progress), + NULL, NULL, + g_cclosure_user_marshal_VOID__DOUBLE_DOUBLE, + G_TYPE_NONE, + 2, + G_TYPE_DOUBLE, + G_TYPE_DOUBLE); + + g_signal_new ("completed", + type, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (AutoarExtractClass, completed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + g_signal_new ("error", + type, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (AutoarExtractClass, error), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); +} + +static void +autoar_extract_init (AutoarExtract *arextract) +{ + AutoarExtractPrivate *priv; + + priv = AUTOAR_EXTRACT_GET_PRIVATE (arextract); + arextract->priv = priv; + + priv->source = NULL; + priv->output = NULL; + + priv->ar_read = NULL; + + priv->size = 0; + priv->completed_size = 0; + + priv->completed_files = 0; +} + +AutoarExtract* +autoar_extract_new (const char *source, + const char *output) +{ + AutoarExtract *arextract = g_object_new (AUTOAR_TYPE_EXTRACT, + "source", + source, + "output", + output, + NULL); + return arextract; +} diff --git a/autoarchive/autoar-extract.h b/autoarchive/autoar-extract.h new file mode 100644 index 000000000..c76853107 --- /dev/null +++ b/autoarchive/autoar-extract.h @@ -0,0 +1,88 @@ +/* vim: set sw=2 ts=2 sts=2 et: */ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * autoar-extract.h + * Automatically extract archives in some GNOME programs + * + * Copyright (C) 2013 Ting-Wei Lan + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef AUTOAR_EXTRACT_H +#define AUTOAR_EXTRACT_H + +#include + +G_BEGIN_DECLS + +#define AUTOAR_TYPE_EXTRACT autoar_extract_get_type() +#define AUTOAR_EXTRACT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), AUTOAR_TYPE_EXTRACT, AutoarExtract)) +#define AUTOAR_EXTRACT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), AUTOAR_TYPE_EXTRACT, AutoarExtractClass)) +#define AUTOAR_IS_EXTRACT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AUTOAR_TYPE_EXTRACT)) +#define AUTOAR_IS_EXTRACT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), AUTOAR_TYPE_EXTRACT)) +#define AUTOAR_EXTRACT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AUTOAR_TYPE_EXTRACT, AutoarExtractClass)) + +typedef struct _AutoarExtract AutoarExtract; +typedef struct _AutoarExtractClass AutoarExtractClass; +typedef struct _AutoarExtractPrivate AutoarExtractPrivate; + +struct _AutoarExtract +{ + GObject parent; + + AutoarExtractPrivate *priv; +}; + +struct _AutoarExtractClass +{ + GObjectClass parent_class; + + void (* scaned) (AutoarExtract *arextract, + guint files); + void (* progress) (AutoarExtract *arextract, + gdouble fraction_size, + gdouble fraction_files); + void (* completed) (AutoarExtract *arextract); + void (* error) (AutoarExtract *arextract, + gint error_code); +}; + +GType autoar_extract_get_type (void) G_GNUC_CONST; + +AutoarExtract *autoar_extract_new (const char *source, + const char *output); + +char *autoar_extract_get_source (AutoarExtract *arextract); +char *autoar_extract_get_output (AutoarExtract *arextract); +guint64 autoar_extract_get_size (AutoarExtract *arextract); +guint64 autoar_extract_get_completed_size (AutoarExtract *arextract); +guint autoar_extract_get_files (AutoarExtract *arextract); +guint autoar_extract_get_completed_files (AutoarExtract *arextract); + +void autoar_extract_set_size (AutoarExtract *arextract, + guint64 size); +void autoar_extract_set_completed_size (AutoarExtract *arextract, + guint64 completed_size); +void autoar_extract_set_files (AutoarExtract *arextract, + guint files); +void autoar_extract_set_completed_files (AutoarExtract *arextract, + guint completed_files); + +G_END_DECLS + +#endif /* __AUTOARCHIVE_EXTRACT_H__ */ diff --git a/configure.ac b/configure.ac index ec8f22e6a..403b281c4 100644 --- a/configure.ac +++ b/configure.ac @@ -250,6 +250,7 @@ lib/history/Makefile lib/widgets/Makefile embed/Makefile embed/web-extension/Makefile +autoarchive/Makefile src/Makefile src/bookmarks/Makefile po/Makefile.in -- cgit v1.2.3