aboutsummaryrefslogtreecommitdiffstats
path: root/autoarchive/autoar-extract.c
diff options
context:
space:
mode:
Diffstat (limited to 'autoarchive/autoar-extract.c')
-rw-r--r--autoarchive/autoar-extract.c215
1 files changed, 57 insertions, 158 deletions
diff --git a/autoarchive/autoar-extract.c b/autoarchive/autoar-extract.c
index a06bd065f..e7c4c7e61 100644
--- a/autoarchive/autoar-extract.c
+++ b/autoarchive/autoar-extract.c
@@ -26,6 +26,8 @@
#include "config.h"
#include "autoar-extract.h"
+
+#include "autoar-common.h"
#include "autoar-pref.h"
#include <archive.h>
@@ -59,8 +61,6 @@ G_DEFINE_TYPE (AutoarExtract, autoar_extract, G_TYPE_OBJECT)
#define BUFFER_SIZE (64 * 1024)
#define NOT_AN_ARCHIVE_ERRNO 2013
-typedef struct _AutoarExtractSignalEmitData AutoarExtractSignalEmitData;
-
struct _AutoarExtractPrivate
{
char *source;
@@ -80,14 +80,6 @@ struct _AutoarExtractPrivate
GError *error;
};
-struct _AutoarExtractSignalEmitData
-{
- GValue instance_and_params[3]; /* Maximum number of parameters + 1 */
- gssize used_values; /* Number of GValues to be unset */
- guint signal_id;
- GQuark detail;
-};
-
enum
{
SCANNED,
@@ -457,133 +449,13 @@ libarchive_read_skip_cb (struct archive *ar_read,
return 0;
}
-static char*
-_g_filename_get_extension (const char *filename)
-{
- char *dot_location;
-
- dot_location = strrchr (filename, '.');
- if (dot_location == NULL || dot_location == filename) {
- return (char*)filename;
- }
-
- if (dot_location - 4 > filename && strncmp (dot_location - 4, ".tar", 4) == 0)
- dot_location -= 4;
- else if (dot_location - 5 > filename && strncmp (dot_location - 5, ".cpio", 5) == 0)
- dot_location -= 5;
-
- return dot_location;
-}
-
-static char*
-_g_filename_basename_remove_extension (const char *filename)
-{
- char *dot_location;
- char *basename;
-
- if (filename == NULL) {
- return NULL;
- }
-
- /* filename must not be directory, so we do not get a bad basename. */
- basename = g_path_get_basename (filename);
-
- dot_location = _g_filename_get_extension (basename);
- *dot_location = '\0';
-
- g_debug ("_g_filename_basename_remove_extension: %s => %s",
- filename,
- basename);
- return basename;
-}
-
static void
-_g_pattern_spec_free (void *pattern_compiled)
+g_pattern_spec_free_safe (void *pattern_compiled)
{
if (pattern_compiled != NULL)
g_pattern_spec_free (pattern_compiled);
}
-static void
-autoar_extract_signal_emit_data_free (AutoarExtractSignalEmitData *emit_data)
-{
- int i;
-
- for (i = 0; i < emit_data->used_values; i++)
- g_value_unset (emit_data->instance_and_params + i);
-
- g_free (emit_data);
-}
-
-static gboolean
-_g_signal_emit_main_context (void *data)
-{
- AutoarExtractSignalEmitData *emit_data = data;
- g_signal_emitv (emit_data->instance_and_params,
- emit_data->signal_id,
- emit_data->detail,
- NULL);
- autoar_extract_signal_emit_data_free (emit_data);
- return FALSE;
-}
-
-static void
-_g_signal_emit (gboolean in_thread,
- gpointer instance,
- guint signal_id,
- GQuark detail,
- ...)
-{
- va_list ap;
-
- va_start (ap, detail);
- if (in_thread) {
- int i;
- gchar *error;
- GSignalQuery query;
- AutoarExtractSignalEmitData *emit_data;
-
- error = NULL;
- emit_data = g_new0 (AutoarExtractSignalEmitData, 1);
- emit_data->signal_id = signal_id;
- emit_data->detail = detail;
- emit_data->used_values = 1;
- g_value_init (emit_data->instance_and_params, G_TYPE_FROM_INSTANCE (instance));
- g_value_set_instance (emit_data->instance_and_params, instance);
-
- g_signal_query (signal_id, &query);
- if (query.signal_id == 0) {
- autoar_extract_signal_emit_data_free (emit_data);
- va_end (ap);
- return;
- }
-
- for (i = 0; i < query.n_params; i++) {
- G_VALUE_COLLECT_INIT (emit_data->instance_and_params + i + 1,
- query.param_types[i],
- ap,
- 0,
- &error);
- if (error != NULL)
- break;
- emit_data->used_values++;
- }
-
- if (error == NULL) {
- g_main_context_invoke (NULL, _g_signal_emit_main_context, emit_data);
- } else {
- autoar_extract_signal_emit_data_free (emit_data);
- g_debug ("G_VALUE_COLLECT_INIT: Error: %s", error);
- g_free (error);
- va_end (ap);
- return;
- }
- } else {
- g_signal_emit_valist (instance, signal_id, detail, ap);
- }
- va_end (ap);
-}
-
static gboolean
autoar_extract_do_pattern_check (const char *path,
GPtrArray *pattern)
@@ -779,12 +651,14 @@ autoar_extract_do_write_entry (AutoarExtract *arextract,
return;
}
arextract->priv->completed_size += written;
- _g_signal_emit (in_thread,
- arextract,
- autoar_extract_signals[PROGRESS],
- 0,
- ((double)(arextract->priv->completed_size)) / ((double)(arextract->priv->size)),
- ((double)(arextract->priv->completed_files)) / ((double)(arextract->priv->files)));
+ autoar_common_g_signal_emit (in_thread,
+ arextract,
+ autoar_extract_signals[PROGRESS],
+ 0,
+ ((double)(arextract->priv->completed_size)) /
+ ((double)(arextract->priv->size)),
+ ((double)(arextract->priv->completed_files)) /
+ ((double)(arextract->priv->files)));
}
}
g_output_stream_close (ostream, NULL, NULL);
@@ -1096,7 +970,7 @@ autoar_extract_run (AutoarExtract *arextract,
arextract->priv->completed_files = 0;
pattern = autoar_pref_get_pattern_to_ignore (arextract->priv->arpref);
- pattern_compiled = g_ptr_array_new_with_free_func (_g_pattern_spec_free);
+ pattern_compiled = g_ptr_array_new_with_free_func (g_pattern_spec_free_safe);
if (pattern != NULL) {
for (i = 0; pattern[i] != NULL; i++)
g_ptr_array_add (pattern_compiled, g_pattern_spec_new (pattern[i]));
@@ -1155,7 +1029,9 @@ autoar_extract_run (AutoarExtract *arextract,
"not an archive");
}
}
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[ERROR], 0, arextract->priv->error);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[ERROR],
+ 0, arextract->priv->error);
archive_read_free (a);
g_ptr_array_unref (pattern_compiled);
return;
@@ -1210,7 +1086,9 @@ autoar_extract_run (AutoarExtract *arextract,
arextract->priv->source,
archive_error_string (a));
}
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[ERROR], 0, arextract->priv->error);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[ERROR],
+ 0, arextract->priv->error);
g_free (pathname_prefix);
g_free (pathname_basename);
g_ptr_array_unref (pattern_compiled);
@@ -1225,13 +1103,17 @@ autoar_extract_run (AutoarExtract *arextract,
archive_read_close (a);
archive_read_free (a);
if (arextract->priv->error != NULL) {
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[ERROR], 0, arextract->priv->error);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[ERROR],
+ 0, arextract->priv->error);
g_hash_table_unref (bad_filename);
return;
}
g_debug ("autoar_extract_run: has_top_level_dir = %s",
has_top_level_dir ? "TRUE" : "FALSE");
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[SCANNED], 0, arextract->priv->files);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[SCANNED],
+ 0, arextract->priv->files);
/* Step 2: Create necessary directories
* If the archive contains only one file, we don't create the directory */
@@ -1239,11 +1121,11 @@ autoar_extract_run (AutoarExtract *arextract,
source = g_file_new_for_commandline_arg (arextract->priv->source);
source_basename = g_file_get_basename (source);
g_object_unref (source);
- top_level_dir_basename = _g_filename_basename_remove_extension (source_basename);
+ top_level_dir_basename = autoar_common_get_basename_remove_extension (source_basename);
top_level_parent_dir = g_file_new_for_commandline_arg (arextract->priv->output);
top_level_dir = g_file_get_child (top_level_parent_dir, top_level_dir_basename);
- pathname_extension = _g_filename_get_extension (pathname_basename);
+ pathname_extension = autoar_common_get_filename_extension (pathname_basename);
if (has_only_one_file && (pathname_extension != pathname_basename)) {
/* If we only have one file, we have to add the file extension.
* Although we use the variable `top_level_dir', it may be a regular
@@ -1284,14 +1166,18 @@ autoar_extract_run (AutoarExtract *arextract,
g_object_unref (top_level_parent_dir);
if (arextract->priv->error != NULL) {
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[ERROR], 0, arextract->priv->error);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[ERROR],
+ 0, arextract->priv->error);
g_object_unref (top_level_dir);
g_hash_table_unref (bad_filename);
archive_read_free (a);
return;
}
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[DECIDE_DEST], 0, top_level_dir);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[DECIDE_DEST],
+ 0, top_level_dir);
/* Step 3: Extract files
* We have to re-open the archive to extract files */
@@ -1317,7 +1203,9 @@ autoar_extract_run (AutoarExtract *arextract,
arextract->priv->source,
archive_error_string (a));
}
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[ERROR], 0, arextract->priv->error);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[ERROR],
+ 0, arextract->priv->error);
g_object_unref (top_level_dir);
g_hash_table_unref (bad_filename);
archive_read_free (a);
@@ -1380,7 +1268,9 @@ autoar_extract_run (AutoarExtract *arextract,
use_raw_format);
if (arextract->priv->error != NULL) {
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[ERROR], 0, arextract->priv->error);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[ERROR],
+ 0, arextract->priv->error);
g_object_unref (extracted_filename);
g_object_unref (top_level_dir);
g_hash_table_unref (userhash);
@@ -1392,12 +1282,14 @@ autoar_extract_run (AutoarExtract *arextract,
}
arextract->priv->completed_files++;
- _g_signal_emit (in_thread,
- arextract,
- autoar_extract_signals[PROGRESS],
- 0,
- ((double)(arextract->priv->completed_size)) / ((double)(arextract->priv->size)),
- ((double)(arextract->priv->completed_files)) / ((double)(arextract->priv->files)));
+ autoar_common_g_signal_emit (in_thread,
+ arextract,
+ autoar_extract_signals[PROGRESS],
+ 0,
+ ((double)(arextract->priv->completed_size)) /
+ ((double)(arextract->priv->size)),
+ ((double)(arextract->priv->completed_files)) /
+ ((double)(arextract->priv->files)));
g_object_unref (extracted_filename);
}
if (r != ARCHIVE_EOF) {
@@ -1408,7 +1300,9 @@ autoar_extract_run (AutoarExtract *arextract,
arextract->priv->source,
archive_error_string (a));
}
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[ERROR], 0, arextract->priv->error);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[ERROR],
+ 0, arextract->priv->error);
g_object_unref (top_level_dir);
g_hash_table_unref (userhash);
g_hash_table_unref (grouphash);
@@ -1425,13 +1319,17 @@ autoar_extract_run (AutoarExtract *arextract,
archive_read_close (a);
archive_read_free (a);
if (arextract->priv->error != NULL) {
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[ERROR], 0, arextract->priv->error);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[ERROR],
+ 0, arextract->priv->error);
return;
}
/* If the extraction is completed successfully, remove the source file.
* Errors are not fatal because we have completed our work. */
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[PROGRESS], 0, 1.0, 1.0);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[PROGRESS],
+ 0, 1.0, 1.0);
g_debug ("autoar_extract_run: Finalize");
if (autoar_pref_get_delete_if_succeed (arextract->priv->arpref)) {
g_debug ("autoar_extract_run: Delete");
@@ -1439,7 +1337,8 @@ autoar_extract_run (AutoarExtract *arextract,
g_file_delete (source, NULL, NULL);
g_object_unref (source);
}
- _g_signal_emit (in_thread, arextract, autoar_extract_signals[COMPLETED], 0);
+ autoar_common_g_signal_emit (in_thread, arextract,
+ autoar_extract_signals[COMPLETED], 0);
}
void