/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2001-2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "gth-duplicate-task.h" struct _GthDuplicateTaskPrivate { GList *file_list; GList *current; GFile *destination; }; G_DEFINE_TYPE_WITH_CODE (GthDuplicateTask, gth_duplicate_task, GTH_TYPE_TASK, G_ADD_PRIVATE (GthDuplicateTask)) static void gth_duplicate_task_finalize (GObject *object) { GthDuplicateTask *self; self = GTH_DUPLICATE_TASK (object); _g_object_list_unref (self->priv->file_list); _g_object_unref (self->priv->destination); G_OBJECT_CLASS (gth_duplicate_task_parent_class)->finalize (object); } static void copy_progress_cb (GObject *object, const char *description, const char *details, gboolean pulse, double fraction, gpointer user_data) { GthDuplicateTask *self = user_data; gth_task_progress (GTH_TASK (self), description, details, pulse, fraction); } static void copy_dialog_cb (gboolean opened, GtkWidget *dialog, gpointer user_data) { GthDuplicateTask *self = user_data; gth_task_dialog (GTH_TASK (self), opened, dialog); } static void duplicate_current_file (GthDuplicateTask *self); static void copy_ready_cb (GthOverwriteResponse response, GList *other_files, GError *error, gpointer user_data) { GthDuplicateTask *self = user_data; if (error != NULL) { if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) { g_clear_error (&error); duplicate_current_file (self); } else gth_task_completed (GTH_TASK (self), error); return; } self->priv->current = self->priv->current->next; _g_clear_object (&self->priv->destination); duplicate_current_file (self); } static void duplicate_current_file (GthDuplicateTask *self) { GthFileData *file_data; if (self->priv->current == NULL) { gth_task_completed (GTH_TASK (self), NULL); return; } file_data = self->priv->current->data; if (self->priv->destination == NULL) { self->priv->destination = _g_file_get_duplicated (file_data->file); } else { GFile *tmp = self->priv->destination; self->priv->destination = _g_file_get_duplicated (tmp); g_object_unref (tmp); } _gth_file_data_copy_async (file_data, self->priv->destination, FALSE, GTH_FILE_COPY_ALL_METADATA, GTH_OVERWRITE_RESPONSE_ALWAYS_NO, G_PRIORITY_DEFAULT, gth_task_get_cancellable (GTH_TASK (self)), copy_progress_cb, self, copy_dialog_cb, self, copy_ready_cb, self); } static void gth_duplicate_task_exec (GthTask *task) { GthDuplicateTask *self; g_return_if_fail (GTH_IS_DUPLICATE_TASK (task)); self = GTH_DUPLICATE_TASK (task); self->priv->current = self->priv->file_list; duplicate_current_file (self); } static void gth_duplicate_task_class_init (GthDuplicateTaskClass *klass) { GObjectClass *object_class; GthTaskClass *task_class; object_class = G_OBJECT_CLASS (klass); object_class->finalize = gth_duplicate_task_finalize; task_class = GTH_TASK_CLASS (klass); task_class->exec = gth_duplicate_task_exec; } static void gth_duplicate_task_init (GthDuplicateTask *self) { self->priv = gth_duplicate_task_get_instance_private (self); self->priv->destination = NULL; } GthTask * gth_duplicate_task_new (GList *file_list) { GthDuplicateTask *self; self = GTH_DUPLICATE_TASK (g_object_new (GTH_TYPE_DUPLICATE_TASK, NULL)); self->priv->file_list = _g_object_list_ref (file_list); return (GthTask *) self; }