summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2013-07-09 14:41:00 +0800
committerLAN-TW <lantw44@gmail.com>2013-07-09 22:32:18 +0800
commit0a711b9dd29dae3294aabfbf1a65b67f90334409 (patch)
tree2dbd888f6c436874038024b1016737d98f89ed0c
downloadgsoc2013-libgnome-autoar-0a711b9dd29dae3294aabfbf1a65b67f90334409.tar
gsoc2013-libgnome-autoar-0a711b9dd29dae3294aabfbf1a65b67f90334409.tar.gz
gsoc2013-libgnome-autoar-0a711b9dd29dae3294aabfbf1a65b67f90334409.tar.bz2
gsoc2013-libgnome-autoar-0a711b9dd29dae3294aabfbf1a65b67f90334409.tar.lz
gsoc2013-libgnome-autoar-0a711b9dd29dae3294aabfbf1a65b67f90334409.tar.xz
gsoc2013-libgnome-autoar-0a711b9dd29dae3294aabfbf1a65b67f90334409.tar.zst
gsoc2013-libgnome-autoar-0a711b9dd29dae3294aabfbf1a65b67f90334409.zip
Add AutoarExtract class files
AutoarExtract class is used to handle automatic extraction of archives. Currently only boilerplate code is completed.
-rw-r--r--Makefile.am23
-rw-r--r--autoar-extract.c478
-rw-r--r--autoar-extract.h88
3 files changed, 589 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..2dbe3d5
--- /dev/null
+++ b/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/autoar-extract.c b/autoar-extract.c
new file mode 100644
index 0000000..2943058
--- /dev/null
+++ b/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 <archive.h>
+#include <archive_entry.h>
+
+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/autoar-extract.h b/autoar-extract.h
new file mode 100644
index 0000000..c768531
--- /dev/null
+++ b/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 <glib-object.h>
+
+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__ */