X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=blobdiff_plain;f=src%2Fmetadata.c;h=5842e74fce6167b1d80956ca128b339ef7a3a844;hp=88c9cadebd1969bd485f00a5bec322a93b19dc32;hb=db38d12f83128e9890ce2d2c7acc5ad62062bc7e;hpb=e436ea53511e1dadab981af18b237fee83fde39b diff --git a/src/metadata.c b/src/metadata.c index 88c9cade..5842e74f 100644 --- a/src/metadata.c +++ b/src/metadata.c @@ -75,13 +75,13 @@ static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **commen static void metadata_cache_update(FileData *fd, const gchar *key, const GList *values) { GList *work; - + work = fd->cached_metadata; while (work) { GList *entry = work->data; gchar *entry_key = entry->data; - + if (strcmp(entry_key, key) == 0) { /* key found - just replace values */ @@ -95,7 +95,7 @@ static void metadata_cache_update(FileData *fd, const gchar *key, const GList *v } work = work->next; } - + /* key not found - prepend new entry */ fd->cached_metadata = g_list_prepend(fd->cached_metadata, g_list_prepend(string_list_copy(values), g_strdup(key))); @@ -106,13 +106,13 @@ static void metadata_cache_update(FileData *fd, const gchar *key, const GList *v static const GList *metadata_cache_get(FileData *fd, const gchar *key) { GList *work; - + work = fd->cached_metadata; while (work) { GList *entry = work->data; gchar *entry_key = entry->data; - + if (strcmp(entry_key, key) == 0) { /* key found */ @@ -128,13 +128,13 @@ static const GList *metadata_cache_get(FileData *fd, const gchar *key) static void metadata_cache_remove(FileData *fd, const gchar *key) { GList *work; - + work = fd->cached_metadata; while (work) { GList *entry = work->data; gchar *entry_key = entry->data; - + if (strcmp(entry_key, key) == 0) { /* key found */ @@ -152,13 +152,13 @@ void metadata_cache_free(FileData *fd) { GList *work; if (fd->cached_metadata) DEBUG_1("freed %s\n", fd->path); - + work = fd->cached_metadata; while (work) { GList *entry = work->data; string_list_free(entry); - + work = work->next; } g_list_free(fd->cached_metadata); @@ -185,7 +185,7 @@ static void metadata_write_queue_add(FileData *fd) { metadata_write_queue = g_list_prepend(metadata_write_queue, fd); file_data_ref(fd); - + layout_util_status_update_write_all(); } @@ -194,7 +194,7 @@ static void metadata_write_queue_add(FileData *fd) g_source_remove(metadata_write_idle_id); metadata_write_idle_id = 0; } - + if (options->metadata.confirm_after_timeout) { metadata_write_idle_id = g_timeout_add(options->metadata.confirm_timeout * 1000, metadata_write_queue_idle_cb, NULL); @@ -208,7 +208,7 @@ gboolean metadata_write_queue_remove(FileData *fd) fd->modified_xmp = NULL; metadata_write_queue = g_list_remove(metadata_write_queue, fd); - + file_data_increment_version(fd); file_data_send_notification(fd, NOTIFY_REREAD); @@ -222,7 +222,7 @@ gboolean metadata_write_queue_remove_list(GList *list) { GList *work; gboolean ret = TRUE; - + work = list; while (work) { @@ -238,7 +238,7 @@ void metadata_notify_cb(FileData *fd, NotifyType type, gpointer data) if (type & (NOTIFY_REREAD | NOTIFY_CHANGE)) { metadata_cache_free(fd); - + if (g_list_find(metadata_write_queue, fd)) { DEBUG_1("Notify metadata: %s %04x", fd->path, type); @@ -255,27 +255,27 @@ gboolean metadata_write_queue_confirm(gboolean force_dialog, FileUtilDoneFunc do { GList *work; GList *to_approve = NULL; - + work = metadata_write_queue; while (work) { FileData *fd = work->data; work = work->next; - + if (!isname(fd->path)) { /* ignore deleted files */ metadata_write_queue_remove(fd); continue; } - + if (fd->change) continue; /* another operation in progress, skip this file for now */ - + to_approve = g_list_prepend(to_approve, file_data_ref(fd)); } file_util_write_metadata(NULL, to_approve, NULL, force_dialog, done_func, done_data); - + return (metadata_write_queue != NULL); } @@ -290,9 +290,9 @@ gboolean metadata_write_perform(FileData *fd) { gboolean success; ExifData *exif; - + g_assert(fd->change); - + if (fd->change->dest && strcmp(extension_from_path(fd->change->dest), GQ_CACHE_EXT_METADATA) == 0) { @@ -319,7 +319,7 @@ gboolean metadata_write_perform(FileData *fd) FIXME: this does not catch new sidecars created by independent external programs */ file_data_unref(file_data_new_group(fd->change->dest)); - + if (success) metadata_legacy_delete(fd, fd->change->dest); return success; } @@ -332,7 +332,7 @@ gint metadata_queue_length(void) static gboolean metadata_check_key(const gchar *keys[], const gchar *key) { const gchar **k = keys; - + while (*k) { if (strcmp(key, *k) == 0) return TRUE; @@ -344,9 +344,9 @@ static gboolean metadata_check_key(const gchar *keys[], const gchar *key) gboolean metadata_write_revert(FileData *fd, const gchar *key) { if (!fd->modified_xmp) return FALSE; - + g_hash_table_remove(fd->modified_xmp, key); - + if (g_hash_table_size(fd->modified_xmp) == 0) { metadata_write_queue_remove(fd); @@ -367,9 +367,9 @@ gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values fd->modified_xmp = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)string_list_free); } g_hash_table_insert(fd->modified_xmp, g_strdup(key), string_list_copy((GList *)values)); - + metadata_cache_remove(fd, key); - + if (fd->exif) { exif_update_metadata(fd->exif, key, values); @@ -381,12 +381,12 @@ gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values if (options->metadata.sync_grouped_files && metadata_check_key(group_keys, key)) { GList *work = fd->sidecar_files; - + while (work) { FileData *sfd = work->data; work = work->next; - + if (filter_file_class(sfd->extension, FORMAT_CLASS_META)) continue; metadata_write_list(sfd, key, values); @@ -396,7 +396,7 @@ gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values return TRUE; } - + gboolean metadata_write_string(FileData *fd, const gchar *key, const char *value) { GList *list = g_list_append(NULL, g_strdup(value)); @@ -408,7 +408,7 @@ gboolean metadata_write_string(FileData *fd, const gchar *key, const char *value gboolean metadata_write_int(FileData *fd, const gchar *key, guint64 value) { gchar string[50]; - + g_snprintf(string, sizeof(string), "%llu", (unsigned long long) value); return metadata_write_string(fd, key, string); } @@ -469,9 +469,9 @@ static gboolean metadata_legacy_write(FileData *fd) have_keywords = g_hash_table_lookup_extended(fd->modified_xmp, KEYWORD_KEY, NULL, &keywords); have_comment = g_hash_table_lookup_extended(fd->modified_xmp, COMMENT_KEY, NULL, &comment_l); comment = (have_comment && comment_l) ? ((GList *)comment_l)->data : NULL; - + if (!have_keywords || !have_comment) metadata_file_read(metadata_pathl, &orig_keywords, &orig_comment); - + success = metadata_file_write(metadata_pathl, have_keywords ? (GList *)keywords : orig_keywords, have_comment ? comment : orig_comment); @@ -479,7 +479,7 @@ static gboolean metadata_legacy_write(FileData *fd) g_free(metadata_pathl); g_free(orig_comment); string_list_free(orig_keywords); - + return success; } @@ -502,10 +502,10 @@ static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **commen if (*ptr == '[' && key != MK_COMMENT) { gchar *keystr = ++ptr; - + key = MK_NONE; while (*ptr != ']' && *ptr != '\n' && *ptr != '\0') ptr++; - + if (*ptr == ']') { *ptr = '\0'; @@ -516,7 +516,7 @@ static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **commen } continue; } - + switch (key) { case MK_NONE: @@ -539,7 +539,7 @@ static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **commen break; } } - + fclose(f); if (keywords) @@ -550,7 +550,7 @@ static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **commen { string_list_free(list); } - + if (comment_build) { if (comment) @@ -611,7 +611,7 @@ static gboolean metadata_legacy_read(FileData *fd, GList **keywords, gchar **com gchar *metadata_path; gchar *metadata_pathl; gboolean success = FALSE; - + if (!fd) return FALSE; metadata_path = cache_find_location(CACHE_TYPE_METADATA, fd->path); @@ -699,17 +699,17 @@ GList *metadata_read_list(FileData *fd, const gchar *key, MetadataFormat format) { return g_list_append(NULL, metadata_file_info(fd, key, format)); } - + exif = exif_read_fd(fd); /* this is cached, thus inexpensive */ if (!exif) return NULL; list = exif_get_metadata(exif, key, format); exif_free_fd(fd, exif); - + if (format == METADATA_PLAIN && strcmp(key, KEYWORD_KEY) == 0) { metadata_cache_update(fd, key, list); } - + return list; } @@ -732,7 +732,7 @@ guint64 metadata_read_int(FileData *fd, const gchar *key, guint64 fallback) gchar *endptr; gchar *string = metadata_read_string(fd, key, METADATA_PLAIN); if (!string) return fallback; - + ret = g_ascii_strtoull(string, &endptr, 10); if (string == endptr) ret = fallback; g_free(string); @@ -747,7 +747,7 @@ gdouble metadata_read_GPS_coord(FileData *fd, const gchar *key, gdouble fallback gboolean ok = FALSE; gchar *string = metadata_read_string(fd, key, METADATA_PLAIN); if (!string) return fallback; - + deg = g_ascii_strtod(string, &endptr); if (*endptr == ',') { @@ -756,8 +756,8 @@ gdouble metadata_read_GPS_coord(FileData *fd, const gchar *key, gdouble fallback sec = g_ascii_strtod(endptr + 1, &endptr); else sec = 0.0; - - + + if (*endptr == 'S' || *endptr == 'W' || *endptr == 'N' || *endptr == 'E') { coord = deg + min /60.0 + sec / 3600.0; @@ -765,21 +765,21 @@ gdouble metadata_read_GPS_coord(FileData *fd, const gchar *key, gdouble fallback if (*endptr == 'S' || *endptr == 'W') coord = -coord; } } - + if (!ok) { coord = fallback; log_printf("unable to parse GPS coordinate '%s'\n", string); } - + g_free(string); return coord; } - + gboolean metadata_append_string(FileData *fd, const gchar *key, const char *value) { gchar *str = metadata_read_string(fd, key, METADATA_PLAIN); - + if (!str) { return metadata_write_string(fd, key, value); @@ -797,7 +797,7 @@ gboolean metadata_append_string(FileData *fd, const gchar *key, const char *valu gboolean metadata_append_list(FileData *fd, const gchar *key, const GList *values) { GList *list = metadata_read_list(fd, key, METADATA_PLAIN); - + if (!list) { return metadata_write_list(fd, key, values); @@ -807,7 +807,7 @@ gboolean metadata_append_list(FileData *fd, const gchar *key, const GList *value gboolean ret; list = g_list_concat(list, string_list_copy(values)); list = remove_duplicate_strings_from_list(list); - + ret = metadata_write_list(fd, key, list); string_list_free(list); return ret; @@ -929,7 +929,7 @@ GList *string_to_keywords_list(const gchar *text) /* * keywords to marks */ - + gboolean meta_data_get_keyword_mark(FileData *fd, gint n, gpointer data) { @@ -954,7 +954,7 @@ gboolean meta_data_set_keyword_mark(FileData *fd, gint n, gboolean value, gpoint GList *path = data; GList *keywords = NULL; GtkTreeIter iter; - + if (!keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path)) return FALSE; keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN); @@ -994,7 +994,7 @@ void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, GtkTreeIter { GtkTreeIter old_kw_iter; GList *old_path = mark_func_data; - + if (keyword_tree_get_iter(keyword_tree, &old_kw_iter, old_path) && (i == mark || /* release any previous connection of given mark */ keyword_compare(keyword_tree, &old_kw_iter, kw_iter) == 0)) /* or given keyword */ @@ -1012,7 +1012,7 @@ void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, GtkTreeIter gchar *mark_str; path = keyword_tree_get_path(keyword_tree, kw_iter); file_data_register_mark_func(mark, meta_data_get_keyword_mark, meta_data_set_keyword_mark, path, (GDestroyNotify)string_list_free); - + mark_str = g_strdup_printf("%d", mark + 1); gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), kw_iter, KEYWORD_COLUMN_MARK, mark_str, -1); g_free(mark_str); @@ -1075,7 +1075,7 @@ gboolean keyword_same_parent(GtkTreeModel *keyword_tree, GtkTreeIter *a, GtkTree { GtkTreeIter parent_a; GtkTreeIter parent_b; - + gboolean valid_pa = gtk_tree_model_iter_parent(keyword_tree, &parent_a, a); gboolean valid_pb = gtk_tree_model_iter_parent(keyword_tree, &parent_b, b); @@ -1096,7 +1096,7 @@ gboolean keyword_exists(GtkTreeModel *keyword_tree, GtkTreeIter *parent_ptr, Gtk gboolean toplevel = FALSE; gboolean ret; gchar *casefold; - + if (parent_ptr) { parent = *parent_ptr; @@ -1109,12 +1109,12 @@ gboolean keyword_exists(GtkTreeModel *keyword_tree, GtkTreeIter *parent_ptr, Gtk { toplevel = TRUE; } - + if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &iter, toplevel ? NULL : &parent)) return FALSE; - + casefold = g_utf8_casefold(name, -1); ret = FALSE; - + while (TRUE) { if (!(exclude_sibling && sibling && keyword_compare(keyword_tree, &iter, sibling) == 0)) @@ -1168,11 +1168,11 @@ void keyword_copy(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from void keyword_copy_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from) { GtkTreeIter from_child; - + keyword_copy(keyword_tree, to, from); - + if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &from_child, from)) return; - + while (TRUE) { GtkTreeIter to_child; @@ -1192,7 +1192,7 @@ GList *keyword_tree_get_path(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr) { GList *path = NULL; GtkTreeIter iter = *iter_ptr; - + while (TRUE) { GtkTreeIter parent; @@ -1208,7 +1208,7 @@ gboolean keyword_tree_get_iter(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr GtkTreeIter iter; if (!gtk_tree_model_get_iter_first(keyword_tree, &iter)) return FALSE; - + while (TRUE) { GtkTreeIter children; @@ -1225,7 +1225,7 @@ gboolean keyword_tree_get_iter(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr *iter_ptr = iter; return TRUE; } - + if (!gtk_tree_model_iter_children(keyword_tree, &children, &iter)) return FALSE; iter = children; } @@ -1249,7 +1249,7 @@ static gboolean keyword_tree_is_set_casefold(GtkTreeModel *keyword_tree, GtkTree if (!gtk_tree_model_iter_next(keyword_tree, &child)) return FALSE; } } - + while (TRUE) { GtkTreeIter parent; @@ -1273,7 +1273,7 @@ static gboolean keyword_tree_is_set_casefold(GtkTreeModel *keyword_tree, GtkTree g_free(iter_casefold); if (!found) return FALSE; } - + if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return TRUE; iter = parent; } @@ -1421,7 +1421,7 @@ static void keyword_tree_reset_recursive(GtkTreeModel *keyword_tree, GtkTreeIter { GtkTreeIter child; keyword_tree_reset1(keyword_tree, iter, kw_list); - + if (!gtk_tree_model_iter_children(keyword_tree, &child, iter)) return; while (TRUE) @@ -1434,7 +1434,7 @@ static void keyword_tree_reset_recursive(GtkTreeModel *keyword_tree, GtkTreeIter static gboolean keyword_tree_check_empty_children(GtkTreeModel *keyword_tree, GtkTreeIter *parent, GList *kw_list) { GtkTreeIter iter; - + if (!gtk_tree_model_iter_children(keyword_tree, &iter, parent)) return TRUE; /* this should happen only on empty helpers */ @@ -1453,7 +1453,7 @@ void keyword_tree_reset(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return; iter = parent; - + while (keyword_tree_check_empty_children(keyword_tree, &iter, *kw_list)) { GtkTreeIter parent; @@ -1471,12 +1471,12 @@ void keyword_delete(GtkTreeStore *keyword_tree, GtkTreeIter *iter_ptr) { keyword_delete(keyword_tree, &child); } - + meta_data_connect_mark_with_keyword(GTK_TREE_MODEL(keyword_tree), iter_ptr, -1); gtk_tree_model_get(GTK_TREE_MODEL(keyword_tree), iter_ptr, KEYWORD_COLUMN_HIDE_IN, &list, -1); g_list_free(list); - + gtk_tree_store_remove(keyword_tree, iter_ptr); } @@ -1578,7 +1578,7 @@ void keyword_show_set_in(GtkTreeStore *keyword_tree, gpointer id, GList *keyword void keyword_tree_new(void) { if (keyword_tree) return; - + keyword_tree = gtk_tree_store_new(KEYWORD_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_POINTER); } @@ -1693,7 +1693,7 @@ void keyword_tree_write_config(GString *outstr, gint indent) GtkTreeIter iter; WRITE_NL(); WRITE_STRING(""); indent++; - + if (keyword_tree && gtk_tree_model_get_iter_first(GTK_TREE_MODEL(keyword_tree), &iter)) { keyword_tree_node_write_config(GTK_TREE_MODEL(keyword_tree), &iter, outstr, indent);