static gboolean process_rename_data_list (gpointer user_data) { BrowserData *data = user_data; GList *scan; g_source_remove (data->update_renamed_files_id); data->update_renamed_files_id = 0; for (scan = data->rename_data_list; scan; scan = scan->next) { RenameData *rename_data = scan->data; GthCatalog *catalog; GList *scan_files; GList *scan_new_files; GFile *gio_file; char *catalog_data; gsize catalog_data_size; GError *error = NULL; catalog = gth_catalog_load_from_file (rename_data->location); for (scan_files = rename_data->files, scan_new_files = rename_data->new_files; scan_files && scan_new_files; scan_files = scan_files->next, scan_new_files = scan_new_files->next) { GFile *file = scan_files->data; GFile *new_file = scan_new_files->data; int pos; pos = gth_catalog_remove_file (catalog, file); gth_catalog_insert_file (catalog, new_file, pos); } gio_file = gth_catalog_file_to_gio_file (rename_data->location); catalog_data = gth_catalog_to_data (catalog, &catalog_data_size); if (! _g_file_write (gio_file, FALSE, G_FILE_CREATE_NONE, catalog_data, catalog_data_size, NULL, &error)) { g_warning ("%s", error->message); g_clear_error (&error); } g_free (catalog_data); g_object_unref (gio_file); g_object_unref (catalog); } rename_data_list_free (data); return FALSE; }
static void for_each_file_func (GFile *file, GFileInfo *info, gpointer user_data) { GthOrganizeTask *self = user_data; GthFileData *file_data; char *key; GTimeVal timeval; GthCatalog *catalog; if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR) return; key = NULL; file_data = gth_file_data_new (file, info); switch (self->priv->group_policy) { case GTH_GROUP_POLICY_DIGITALIZED_DATE: { GObject *metadata; metadata = g_file_info_get_attribute_object (info, "Embedded::Photo::DateTimeOriginal"); if (metadata != NULL) { if (_g_time_val_from_exif_date (gth_metadata_get_raw (GTH_METADATA (metadata)), &timeval)) key = _g_time_val_strftime (&timeval, KEY_FORMAT); } } break; case GTH_GROUP_POLICY_MODIFIED_DATE: timeval = *gth_file_data_get_modification_time (file_data); key = _g_time_val_strftime (&timeval, KEY_FORMAT); break; } if (key == NULL) return; catalog = g_hash_table_lookup (self->priv->catalogs, key); if (catalog == NULL) { GthDateTime *date_time; GFile *catalog_file; char *name; GtkTreeIter iter; date_time = gth_datetime_new (); gth_datetime_from_timeval (date_time, &timeval); catalog_file = gth_catalog_get_file_for_date (date_time); catalog = gth_catalog_load_from_file (catalog_file); if (catalog == NULL) catalog = gth_catalog_new (); gth_catalog_set_for_date (catalog, date_time); g_hash_table_insert (self->priv->catalogs, g_strdup (key), catalog); name = gth_datetime_strftime (date_time, "%x"); gtk_list_store_append (self->priv->results_liststore, &iter); gtk_list_store_set (self->priv->results_liststore, &iter, KEY_COLUMN, key, NAME_COLUMN, name, CARDINALITY_COLUMN, 0, CREATE_CATALOG_COLUMN, TRUE, ICON_COLUMN, self->priv->icon_pixbuf, -1); self->priv->n_catalogs++; g_free (name); g_object_unref (catalog_file); gth_datetime_free (date_time); } if (catalog != NULL) { GtkTreeIter iter; int n = 0; if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (self->priv->results_liststore), &iter)) { do { char *k; gtk_tree_model_get (GTK_TREE_MODEL (self->priv->results_liststore), &iter, KEY_COLUMN, &k, CARDINALITY_COLUMN, &n, -1); if (g_strcmp0 (k, key) == 0) { gtk_list_store_set (self->priv->results_liststore, &iter, CARDINALITY_COLUMN, n + 1, -1); self->priv->n_files++; g_free (k); break; } g_free (k); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (self->priv->results_liststore), &iter)); } gth_catalog_insert_file (catalog, file_data->file, -1); } g_object_unref (file_data); g_free (key); }