Commit a0166724 authored by Paolo Bacchilega's avatar Paolo Bacchilega
Browse files

[photo importer] added code to copy the files to the destination

parent 4638194c
......@@ -93,14 +93,23 @@ destroy_dialog (gpointer user_data)
eel_gconf_set_boolean (PREF_PHOTO_IMPORT_DELETE, delete_imported);
if (data->import) {
GthTask *task;
task = gth_import_task_new (destination,
GthFileStore *file_store;
GList *files;
GthTask *task;
file_store = (GthFileStore *) gth_file_view_get_model (GTH_FILE_VIEW (gth_file_list_get_view (GTH_FILE_LIST (data->file_list))));
files = gth_file_store_get_checked (file_store);
task = gth_import_task_new (data->browser,
files,
destination,
subfolder_type,
single_subfolder,
gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("tags_entry"))),
delete_imported);
gth_browser_exec_task (data->browser, task, FALSE);
g_object_unref (task);
_g_object_list_unref (files);
}
_g_object_unref (destination);
......@@ -460,15 +469,39 @@ select_none_button_clicked_cb (GtkButton *button,
}
static GthFileData *
create_example_file_data (void)
{
GFile *file;
GFileInfo *info;
GthFileData *file_data;
GthMetadata *metadata;
file = g_file_new_for_uri ("file://home/user/document.txt");
info = g_file_info_new ();
file_data = gth_file_data_new (file, info);
metadata = g_object_new (GTH_TYPE_METADATA,
"raw", "2005:03:09 13:23:51",
"formatted", "2005:03:09 13:23:51",
NULL);
g_file_info_set_attribute_object (info, "Embedded::Image::DateTime", G_OBJECT (metadata));
g_object_unref (metadata);
g_object_unref (info);
g_object_unref (file);
return file_data;
}
static void
update_destination (DialogData *data)
{
GFile *destination;
GTimeVal timeval;
GthSubfolderType subfolder_type;
GDate *date;
char **parts = NULL;
char *child;
gboolean single_subfolder;
GthFileData *example_data;
GFile *destination_example;
char *uri;
char *example;
......@@ -478,34 +511,11 @@ update_destination (DialogData *data)
return;
subfolder_type = gtk_combo_box_get_active (GTK_COMBO_BOX (data->subfolder_type_list));
if (subfolder_type == GTH_SUBFOLDER_TYPE_CURRENT_DATE)
g_get_current_time (&timeval);
else
_g_time_val_from_exif_date ("2005:04:03 11:34:18", &timeval);
date = g_date_new ();
g_date_set_time_val (date, &timeval);
switch (subfolder_type) {
case GTH_SUBFOLDER_TYPE_NONE:
break;
case GTH_SUBFOLDER_TYPE_FILE_DATE:
case GTH_SUBFOLDER_TYPE_CURRENT_DATE:
parts = g_new0 (char *, 4);
parts[0] = g_strdup_printf ("%04d", g_date_get_year (date));
parts[1] = g_strdup_printf ("%02d", g_date_get_month (date));
parts[2] = g_strdup_printf ("%02d", g_date_get_day (date));
break;
}
single_subfolder = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("single_subfolder_checkbutton")));
if (parts == NULL)
child = NULL;
else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("single_subfolder_checkbutton"))))
child = g_strjoinv ("-", parts);
else
child = g_strjoinv ("/", parts);
example_data = create_example_file_data ();
destination_example = gth_import_task_get_file_destination (example_data, destination, subfolder_type, single_subfolder);
destination_example = _g_file_append_path (destination, child);
uri = g_file_get_uri (destination_example);
example = g_strdup_printf (_("example: %s"), uri);
gtk_label_set_text (GTK_LABEL (GET_WIDGET ("example_label")), example);
......@@ -515,8 +525,7 @@ update_destination (DialogData *data)
g_free (example);
g_free (uri);
g_object_unref (destination_example);
g_strfreev (parts);
g_date_free (date);
g_object_unref (example_data);
g_object_unref (destination);
}
......
......@@ -25,7 +25,19 @@
struct _GthImportTaskPrivate {
GCancellable *cancellable;
GthBrowser *browser;
GList *files;
GFile *destination;
GthSubfolderType subfolder_type;
gboolean single_subfolder;
char *tags;
gboolean delete_imported;
GCancellable *cancellable;
gsize tot_size;
gsize copied_size;
gsize current_file_size;
GList *current;
};
......@@ -39,23 +51,142 @@ gth_import_task_finalize (GObject *object)
self = GTH_IMPORT_TASK (object);
_g_object_list_unref (self->priv->files);
g_object_unref (self->priv->destination);
g_free (self->priv->tags);
g_object_unref (self->priv->cancellable);
g_object_unref (self->priv->browser);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void import_current_file (GthImportTask *self);
static void
gth_import_task_exec (GthTask *task)
copy_ready_cb (GError *error,
gpointer user_data)
{
/* FIXME */
GthImportTask *self = user_data;
GthFileData *file_data;
if (error != NULL) {
gth_task_completed (GTH_TASK (self), error);
return;
}
/*
* adjust orientation
* add tags
*/
file_data = self->priv->current->data;
self->priv->copied_size += self->priv->current_file_size;
self->priv->current = self->priv->current->next;
import_current_file (self);
}
static void
gth_import_task_cancel (GthTask *task)
copy_progress_cb (GObject *object,
const char *description,
const char *details,
gboolean pulse,
double fraction,
gpointer user_data)
{
g_cancellable_cancel (GTH_IMPORT_TASK (task)->priv->cancellable);
GthImportTask *self = user_data;
fraction = (((double) self->priv->current_file_size * fraction) + self->priv->copied_size) / self->priv->tot_size;
gth_task_progress (GTH_TASK (self), description, details, pulse, fraction);
}
static void
file_info_ready_cb (GList *files,
GError *error,
gpointer user_data)
{
GthImportTask *self = user_data;
GthFileData *file_data;
GFile *destination;
GFile *destination_file;
if (error != NULL) {
gth_task_completed (GTH_TASK (self), error);
return;
}
file_data = self->priv->current->data;
self->priv->current_file_size = g_file_info_get_size (file_data->info);
destination = gth_import_task_get_file_destination (file_data,
self->priv->destination,
self->priv->subfolder_type,
self->priv->single_subfolder);
if (! g_file_make_directory_with_parents (destination, self->priv->cancellable, &error)) {
if (! g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
gth_task_completed (GTH_TASK (self), error);
return;
}
}
destination_file = _g_file_get_destination (file_data->file, NULL, destination);
_g_copy_file_async (file_data,
destination_file,
FALSE /*self->priv->delete_imported*/,
G_FILE_COPY_ALL_METADATA | G_FILE_COPY_TARGET_DEFAULT_PERMS,
G_PRIORITY_DEFAULT,
self->priv->cancellable,
copy_progress_cb,
self,
copy_ready_cb,
self);
g_object_unref (destination_file);
g_object_unref (destination);
}
static void
import_current_file (GthImportTask *self)
{
GthFileData *file_data;
GList *list;
if (self->priv->current == NULL) {
gth_browser_go_to (self->priv->browser, self->priv->destination);
gth_task_completed (GTH_TASK (self), NULL);
return;
}
file_data = self->priv->current->data;
list = g_list_prepend (NULL, file_data);
_g_query_metadata_async (list,
"Exif::Image::DateTime",
self->priv->cancellable,
file_info_ready_cb,
self);
g_list_free (list);
}
static void
gth_import_task_exec (GthTask *base)
{
GthImportTask *self = (GthImportTask *) base;
self->priv->current = self->priv->files;
import_current_file (self);
}
static void
gth_import_task_cancel (GthTask *base)
{
g_cancellable_cancel (GTH_IMPORT_TASK (base)->priv->cancellable);
}
......@@ -114,7 +245,9 @@ gth_import_task_get_type (void)
GthTask *
gth_import_task_new (GFile *destination,
gth_import_task_new (GthBrowser *browser,
GList *files,
GFile *destination,
GthSubfolderType subfolder_type,
gboolean single_subfolder,
const char *tags,
......@@ -123,6 +256,72 @@ gth_import_task_new (GFile *destination,
GthImportTask *self;
self = GTH_IMPORT_TASK (g_object_new (GTH_TYPE_IMPORT_TASK, NULL));
self->priv->browser = g_object_ref (browser);
self->priv->files = _g_object_list_ref (files);
self->priv->destination = g_file_dup (destination);
self->priv->subfolder_type = subfolder_type;
self->priv->single_subfolder = single_subfolder;
self->priv->tags = g_strdup (tags);
self->priv->delete_imported = delete_imported;
return (GthTask *) self;
}
GFile *
gth_import_task_get_file_destination (GthFileData *file_data,
GFile *destination,
GthSubfolderType subfolder_type,
gboolean single_subfolder)
{
GFile *file_destination;
GTimeVal timeval;
GDate *date;
char **parts = NULL;
char *child;
if (subfolder_type == GTH_SUBFOLDER_TYPE_CURRENT_DATE) {
g_get_current_time (&timeval);
}
else if (subfolder_type == GTH_SUBFOLDER_TYPE_FILE_DATE) {
GthMetadata *metadata;
metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "Embedded::Image::DateTime");
if (metadata != NULL)
_g_time_val_from_exif_date (gth_metadata_get_raw (metadata), &timeval);
else
subfolder_type = GTH_SUBFOLDER_TYPE_NONE;
}
date = g_date_new ();
switch (subfolder_type) {
case GTH_SUBFOLDER_TYPE_FILE_DATE:
case GTH_SUBFOLDER_TYPE_CURRENT_DATE:
g_date_set_time_val (date, &timeval);
parts = g_new0 (char *, 4);
parts[0] = g_strdup_printf ("%04d", g_date_get_year (date));
parts[1] = g_strdup_printf ("%02d", g_date_get_month (date));
parts[2] = g_strdup_printf ("%02d", g_date_get_day (date));
break;
case GTH_SUBFOLDER_TYPE_NONE:
break;
}
if (parts == NULL)
child = NULL;
else if (single_subfolder)
child = g_strjoinv ("-", parts);
else
child = g_strjoinv ("/", parts);
file_destination = _g_file_append_path (destination, child);
g_free (child);
g_strfreev (parts);
g_date_free (date);
return file_destination;
}
......@@ -49,12 +49,18 @@ struct _GthImportTaskClass {
GthTaskClass __parent;
};
GType gth_import_task_get_type (void);
GthTask * gth_import_task_new (GFile *destination,
GthSubfolderType subfolder_type,
gboolean single_subfolder,
const char *tags,
gboolean delete_imported);
GType gth_import_task_get_type (void);
GthTask * gth_import_task_new (GthBrowser *browser,
GList *files, /* GthFileData list */
GFile *destination,
GthSubfolderType subfolder_type,
gboolean single_subfolder,
const char *tags,
gboolean delete_imported);
GFile * gth_import_task_get_file_destination (GthFileData *file_data,
GFile *destination,
GthSubfolderType subfolder_type,
gboolean single_subfolder);
G_END_DECLS
......
......@@ -1461,41 +1461,6 @@ copy_data__copy_current_file_ready_cb (GError *error,
}
static GFile *
get_destination_file (GFile *source,
GFile *source_base,
GFile *destination_folder)
{
char *source_uri;
const char *source_suffix;
char *destination_folder_uri;
char *destination_uri;
GFile *destination;
source_uri = g_file_get_uri (source);
if (source_base != NULL) {
char *source_base_uri;
source_base_uri = g_file_get_uri (source_base);
source_suffix = source_uri + strlen (source_base_uri);
g_free (source_base_uri);
}
else
source_suffix = _g_uri_get_basename (source_uri);
destination_folder_uri = g_file_get_uri (destination_folder);
destination_uri = g_strconcat (destination_folder_uri, "/", source_suffix, NULL);
destination = g_file_new_for_uri (destination_uri);
g_free (destination_uri);
g_free (destination_folder_uri);
g_free (source_uri);
return destination;
}
static void
copy_data__copy_current_file (CopyData *copy_data)
{
......@@ -1513,7 +1478,7 @@ copy_data__copy_current_file (CopyData *copy_data)
_g_object_unref (copy_data->source_base);
copy_data->source_base = g_file_get_parent (source->file);
}
destination = get_destination_file (source->file, copy_data->source_base, copy_data->destination);
destination = _g_file_get_destination (source->file, copy_data->source_base, copy_data->destination);
flags = copy_data->flags;
if ((flags & G_FILE_COPY_ALL_METADATA) && (g_hash_table_lookup (copy_data->source_hash, source->file) == NULL))
......
......@@ -1616,6 +1616,41 @@ _g_file_get_standard_type (GFile *file)
}
GFile *
_g_file_get_destination (GFile *source,
GFile *source_base,
GFile *destination_folder)
{
char *source_uri;
const char *source_suffix;
char *destination_folder_uri;
char *destination_uri;
GFile *destination;
source_uri = g_file_get_uri (source);
if (source_base != NULL) {
char *source_base_uri;
source_base_uri = g_file_get_uri (source_base);
source_suffix = source_uri + strlen (source_base_uri);
g_free (source_base_uri);
}
else
source_suffix = _g_uri_get_basename (source_uri);
destination_folder_uri = g_file_get_uri (destination_folder);
destination_uri = g_strconcat (destination_folder_uri, "/", source_suffix, NULL);
destination = g_file_new_for_uri (destination_uri);
g_free (destination_uri);
g_free (destination_folder_uri);
g_free (source_uri);
return destination;
}
GFile *
_g_file_get_child (GFile *file,
...)
......
......@@ -216,6 +216,9 @@ gboolean _g_file_equal (GFile *file1,
GFile *file2);
char * _g_file_get_display_name (GFile *file);
GFileType _g_file_get_standard_type (GFile *file);
GFile * _g_file_get_destination (GFile *source,
GFile *source_base,
GFile *destination_folder);
GFile * _g_file_get_child (GFile *file,
...);
GIcon * _g_file_get_icon (GFile *file);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment