45
44
#define WRITABLE_PATH_KEY "gimp-data-factory-writable-path"
48
static void gimp_data_factory_class_init (GimpDataFactoryClass *klass);
49
static void gimp_data_factory_init (GimpDataFactory *factory);
51
static void gimp_data_factory_finalize (GObject *object);
53
static gint64 gimp_data_factory_get_memsize (GimpObject *object,
56
static gchar * gimp_data_factory_get_save_dir (GimpDataFactory *factory);
57
static void gimp_data_factory_load_data (const GimpDatafileData *file_data,
61
static GimpObjectClass *parent_class = NULL;
65
gimp_data_factory_get_type (void)
67
static GType factory_type = 0;
71
static const GTypeInfo factory_info =
73
sizeof (GimpDataFactoryClass),
75
(GBaseFinalizeFunc) NULL,
76
(GClassInitFunc) gimp_data_factory_class_init,
77
NULL, /* class_finalize */
78
NULL, /* class_data */
79
sizeof (GimpDataFactory),
81
(GInstanceInitFunc) gimp_data_factory_init,
84
factory_type = g_type_register_static (GIMP_TYPE_OBJECT,
47
static void gimp_data_factory_finalize (GObject *object);
49
static void gimp_data_factory_data_load (GimpDataFactory *factory,
52
static gint64 gimp_data_factory_get_memsize (GimpObject *object,
55
static gchar * gimp_data_factory_get_save_dir (GimpDataFactory *factory);
57
static void gimp_data_factory_load_data (const GimpDatafileData *file_data,
61
G_DEFINE_TYPE (GimpDataFactory, gimp_data_factory, GIMP_TYPE_OBJECT)
63
#define parent_class gimp_data_factory_parent_class
93
67
gimp_data_factory_class_init (GimpDataFactoryClass *klass)
158
130
GimpDataFactory *
159
131
gimp_data_factory_new (Gimp *gimp,
161
const gchar *path_property_name,
133
const gchar *path_property_name,
162
134
const gchar *writable_property_name,
163
const GimpDataFactoryLoaderEntry *loader_entries,
164
gint n_loader_entries,
165
GimpDataNewFunc new_func,
166
GimpDataGetStandardFunc standard_func)
135
const GimpDataFactoryLoaderEntry *loader_entries,
136
gint n_loader_entries,
137
GimpDataNewFunc new_func,
138
GimpDataGetStandardFunc standard_func)
168
140
GimpDataFactory *factory;
197
169
gimp_data_factory_data_init (GimpDataFactory *factory,
198
gboolean no_data /* FIXME */)
172
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
174
/* Freeze and thaw the container even if no_data,
175
* this creates the standard data that serves as fallback.
177
gimp_container_freeze (factory->container);
181
if (factory->gimp->be_verbose)
183
const gchar *name = gimp_object_get_name (GIMP_OBJECT (factory));
185
g_print ("Loading '%s' data\n", name ? name : "???");
188
gimp_data_factory_data_load (factory, NULL);
191
gimp_container_thaw (factory->container);
196
GimpDataFactory *factory;
198
} GimpDataLoadContext;
201
gimp_data_factory_refresh_cache_remove (gpointer key,
205
g_list_foreach (value, (GFunc) g_object_unref, NULL);
212
gimp_data_factory_data_move_to_cache (GimpDataFactory *factory,
216
GHashTable *cache = data;
218
const gchar *filename = GIMP_DATA (object)->filename;
220
g_object_ref (object);
222
gimp_container_remove (factory->container, GIMP_OBJECT (object));
224
list = g_hash_table_lookup (cache, filename);
225
list = g_list_prepend (list, object);
227
g_hash_table_insert (cache, (gpointer) filename, list);
231
gimp_data_factory_data_foreach (GimpDataFactory *factory,
232
void (*callback) (GimpDataFactory *factory,
239
if (gimp_container_is_empty (factory->container))
242
list = GIMP_LIST (factory->container);
244
gimp_container_freeze (factory->container);
248
if (GIMP_DATA (list->list->data)->internal)
250
/* if there are internal objects in the list, skip them */
253
for (glist = list->list; glist; glist = g_list_next (glist))
255
if (glist->next && ! GIMP_DATA (glist->next->data)->internal)
258
callback (factory, glist->next->data, context);
266
/* otherwise delete everything */
268
callback (factory, list->list->data, context);
272
gimp_container_thaw (factory->container);
276
gimp_data_factory_data_load (GimpDataFactory *factory,
201
280
gchar *writable_path;
203
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
205
gimp_container_freeze (factory->container);
207
gimp_data_factory_data_free (factory);
209
282
g_object_get (factory->gimp->config,
210
283
factory->path_property_name, &path,
211
284
factory->writable_property_name, &writable_path,
229
306
writable_list = gimp_path_parse (writable_path, 16, TRUE, NULL);
231
g_object_set_data (G_OBJECT (factory), WRITABLE_PATH_KEY,
308
g_object_set_data (G_OBJECT (factory),
309
WRITABLE_PATH_KEY, writable_list);
235
gimp_datafiles_read_directories (path,
237
gimp_data_factory_load_data,
312
gimp_datafiles_read_directories (path, G_FILE_TEST_EXISTS,
313
gimp_data_factory_load_data, &context);
240
315
if (writable_path)
248
323
g_free (writable_path);
327
gimp_data_factory_data_reload (GimpDataFactory *factory)
332
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
334
cache = g_hash_table_new (g_str_hash, g_str_equal);
336
gimp_data_factory_data_foreach (factory,
337
gimp_data_factory_data_move_to_cache, cache);
339
/* Now the cache contains a filename => list-of-objects mapping of
340
* the old objects. So we should now traverse the directory and for
341
* each file load it only if it's mtime is newer.
343
* Once a file was added, it is removed from the cache, so the only
344
* objects remaining there will be those that are not present on the
345
* disk (that have to be destroyed)
347
gimp_data_factory_data_load (factory, cache);
349
/* Now all the data is loaded. Free what remains in the cache. */
350
g_hash_table_foreach_remove (cache,
351
gimp_data_factory_refresh_cache_remove, NULL);
352
g_hash_table_destroy (cache);
356
gimp_data_factory_data_refresh (GimpDataFactory *factory)
358
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
360
gimp_container_freeze (factory->container);
362
gimp_data_factory_data_save (factory);
364
gimp_data_factory_data_reload (factory);
250
366
gimp_container_thaw (factory->container);
301
418
g_free (writable_dir);
422
gimp_data_factory_remove_cb (GimpDataFactory *factory,
426
gimp_container_remove (factory->container, GIMP_OBJECT (data));
305
430
gimp_data_factory_data_free (GimpDataFactory *factory)
309
432
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
311
if (gimp_container_num_children (factory->container) == 0)
314
list = GIMP_LIST (factory->container);
316
gimp_container_freeze (factory->container);
320
if (GIMP_DATA (list->list->data)->internal)
322
/* if there are internal objects in the list, skip them */
326
for (glist = list->list; glist; glist = g_list_next (glist))
328
if (glist->next && ! GIMP_DATA (glist->next->data)->internal)
332
gimp_container_remove (factory->container,
333
GIMP_OBJECT (glist->next->data));
342
/* otherwise delete everything */
346
gimp_container_remove (factory->container,
347
GIMP_OBJECT (list->list->data));
352
gimp_container_thaw (factory->container);
434
gimp_data_factory_data_foreach (factory, gimp_data_factory_remove_cb, NULL);
356
438
gimp_data_factory_data_new (GimpDataFactory *factory,
359
441
g_return_val_if_fail (GIMP_IS_DATA_FACTORY (factory), NULL);
360
442
g_return_val_if_fail (name != NULL, NULL);
387
464
gimp_data_factory_data_duplicate (GimpDataFactory *factory,
390
GimpBaseConfig *base_config;
393
469
g_return_val_if_fail (GIMP_IS_DATA_FACTORY (factory), NULL);
394
470
g_return_val_if_fail (GIMP_IS_DATA (data), NULL);
396
base_config = GIMP_BASE_CONFIG (factory->gimp->config);
398
new_data = gimp_data_duplicate (data, base_config->stingy_memory_use);
472
new_data = gimp_data_duplicate (data);
476
gimp_data_factory_data_save_single (GimpDataFactory *factory,
548
gimp_data_factory_data_save_single (GimpDataFactory *factory,
479
GError *error = NULL;
481
552
g_return_val_if_fail (GIMP_IS_DATA_FACTORY (factory), FALSE);
482
553
g_return_val_if_fail (GIMP_IS_DATA (data), FALSE);
554
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
484
556
if (! data->dirty)
487
559
if (! data->filename)
491
writable_dir = gimp_data_factory_get_save_dir (factory);
561
gchar *writable_dir = gimp_data_factory_get_save_dir (factory);
493
563
if (! writable_dir)
565
g_set_error (error, GIMP_DATA_ERROR, 0,
566
_("Failed to save data:\n\n%s"),
567
_("You don't have a writable data folder configured."));
496
571
gimp_data_create_filename (data, writable_dir);
501
576
if (! data->writable)
504
if (! gimp_data_save (data, &error))
579
if (! gimp_data_save (data, error))
506
581
/* check if there actually was an error (no error
507
582
* means the data class does not implement save)
511
g_message (_("Warning: Failed to save data:\n\n%s"),
513
g_clear_error (&error);
585
g_set_error (error, GIMP_DATA_ERROR, 0,
586
_("Failed to save data:\n\n%s"),
587
"Data class does not implement saving");
575
646
gimp_data_factory_load_data (const GimpDatafileData *file_data,
578
GimpDataFactory *factory = GIMP_DATA_FACTORY (user_data);
649
GimpDataLoadContext *context = data;
650
GimpDataFactory *factory = context->factory;
651
GHashTable *cache = context->cache;
581
654
for (i = 0; i < factory->n_loader_entries; i++)
583
if (factory->loader_entries[i].extension)
585
if (gimp_datafiles_check_extension (file_data->filename,
586
factory->loader_entries[i].extension))
656
if (! factory->loader_entries[i].extension ||
657
gimp_datafiles_check_extension (file_data->filename,
658
factory->loader_entries[i].extension))
601
GimpBaseConfig *base_config;
603
GError *error = NULL;
605
base_config = GIMP_BASE_CONFIG (factory->gimp->config);
608
(* factory->loader_entries[i].load_func) (file_data->filename,
609
base_config->stingy_memory_use,
667
gboolean load_from_disk = TRUE;
670
(cached_data = g_hash_table_lookup (cache, file_data->filename)))
614
g_message (_("Warning: Failed to load data:\n\n%s"),
616
g_clear_error (&error);
672
GimpData *data = cached_data->data;
674
load_from_disk = (data->mtime == 0 || data->mtime != file_data->mtime);
676
if (! load_from_disk)
680
for (list = cached_data; list; list = g_list_next (list))
681
gimp_container_add (factory->container, GIMP_OBJECT (list->data));
620
GList *writable_list;
625
writable_list = g_object_get_data (G_OBJECT (factory),
628
deletable = (g_list_length (data_list) == 1 &&
629
g_list_find_custom (writable_list, file_data->dirname,
630
(GCompareFunc) strcmp) != NULL);
632
writable = (deletable && factory->loader_entries[i].writable);
634
for (list = data_list; list; list = g_list_next (list))
636
GimpData *data = list->data;
638
gimp_data_set_filename (data, file_data->filename,
639
writable, deletable);
642
gimp_container_add (factory->container, GIMP_OBJECT (data));
643
g_object_unref (data);
646
g_list_free (data_list);
688
GError *error = NULL;
690
data_list = factory->loader_entries[i].load_func (file_data->filename,
693
if (G_LIKELY (data_list))
695
GList *writable_list;
700
writable_list = g_object_get_data (G_OBJECT (factory),
703
deletable = (g_list_length (data_list) == 1 &&
704
g_list_find_custom (writable_list, file_data->dirname,
705
(GCompareFunc) strcmp) != NULL);
707
writable = (deletable && factory->loader_entries[i].writable);
709
for (list = data_list; list; list = g_list_next (list))
711
GimpData *data = list->data;
713
gimp_data_set_filename (data, file_data->filename,
714
writable, deletable);
715
data->mtime = file_data->mtime;
718
gimp_container_add (factory->container, GIMP_OBJECT (data));
719
g_object_unref (data);
722
g_list_free (data_list);
726
gimp_message (factory->gimp, NULL, GIMP_MESSAGE_ERROR,
727
_("Failed to load data:\n\n%s"), error->message);
728
g_clear_error (&error);