Skip to content

Commit

Permalink
use the workflow in utilops.c for metadata approving and writting
Browse files Browse the repository at this point in the history
TODO: configuration
  • Loading branch information
nadvornik committed Dec 20, 2008
1 parent af283c6 commit 9643a25
Show file tree
Hide file tree
Showing 7 changed files with 210 additions and 35 deletions.
52 changes: 46 additions & 6 deletions src/filedata.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
#include "cache.h"
#include "thumb_standard.h"
#include "ui_fileops.h"
#include "metadata.h"


static GHashTable *file_data_pool = NULL;
static GHashTable *file_data_planned_change_hash = NULL;

static gint sidecar_file_priority(const gchar *path);
static void file_data_apply_ci(FileData *fd);


/*
Expand Down Expand Up @@ -1320,6 +1320,11 @@ gboolean file_data_sc_add_ci_unspecified(FileData *fd, const gchar *dest_path)
return TRUE;
}

gboolean file_data_add_ci_write_metadata(FileData *fd)
{
return file_data_add_ci(fd, FILEDATA_CHANGE_WRITE_METADATA, NULL, NULL);
}

void file_data_sc_free_ci(FileData *fd)
{
GList *work;
Expand Down Expand Up @@ -1409,6 +1414,37 @@ gboolean file_data_sc_add_ci_unspecified_list(GList *fd_list, const gchar *dest)
return file_data_sc_add_ci_list_call_func(fd_list, dest, file_data_sc_add_ci_unspecified);
}

gboolean file_data_add_ci_write_metadata_list(GList *fd_list)
{
GList *work;
gboolean ret = TRUE;

work = fd_list;
while (work)
{
FileData *fd = work->data;

if (!file_data_add_ci_write_metadata(fd)) ret = FALSE;
work = work->next;
}

return ret;
}

void file_data_free_ci_list(GList *fd_list)
{
GList *work;

work = fd_list;
while (work)
{
FileData *fd = work->data;

file_data_free_ci(fd);
work = work->next;
}
}

void file_data_sc_free_ci_list(GList *fd_list)
{
GList *work;
Expand Down Expand Up @@ -1796,7 +1832,7 @@ gchar *file_data_get_error_string(gint error)
return g_string_free(result, FALSE);
}

gint file_data_sc_verify_ci_list(GList *list, gchar **desc)
gint file_data_verify_ci_list(GList *list, gchar **desc, gboolean with_sidecars)
{
GList *work;
gint all_errors = 0;
Expand All @@ -1819,7 +1855,7 @@ gint file_data_sc_verify_ci_list(GList *list, gchar **desc)
fd = work->data;
work = work->next;

error = file_data_sc_verify_ci(fd);
error = with_sidecars ? file_data_sc_verify_ci(fd) : file_data_verify_ci(fd);
all_errors |= error;
common_errors &= error;

Expand Down Expand Up @@ -1896,7 +1932,7 @@ static gboolean file_data_perform_delete(FileData *fd)
return unlink_file(fd->path);
}

static gboolean file_data_perform_ci(FileData *fd)
gboolean file_data_perform_ci(FileData *fd)
{
FileDataChangeType type = fd->change->type;
switch (type)
Expand All @@ -1909,6 +1945,8 @@ static gboolean file_data_perform_ci(FileData *fd)
return file_data_perform_move(fd); /* the same as move */
case FILEDATA_CHANGE_DELETE:
return file_data_perform_delete(fd);
case FILEDATA_CHANGE_WRITE_METADATA:
return metadata_write_perform(fd);
case FILEDATA_CHANGE_UNSPECIFIED:
/* nothing to do here */
break;
Expand Down Expand Up @@ -1944,10 +1982,10 @@ gboolean file_data_sc_perform_ci(FileData *fd)
* updates FileData structure according to FileDataChangeInfo
*/

static void file_data_apply_ci(FileData *fd)
gint file_data_apply_ci(FileData *fd)
{
FileDataChangeType type = fd->change->type;

/* FIXME delete ?*/
if (type == FILEDATA_CHANGE_MOVE || type == FILEDATA_CHANGE_RENAME)
{
Expand All @@ -1970,6 +2008,8 @@ static void file_data_apply_ci(FileData *fd)
}
file_data_increment_version(fd);
file_data_send_notification(fd, NOTIFY_TYPE_CHANGE);

return TRUE;
}

gint file_data_sc_apply_ci(FileData *fd)
Expand Down
15 changes: 13 additions & 2 deletions src/filedata.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ gboolean file_data_sc_add_ci_copy_list(GList *fd_list, const gchar *dest);
gboolean file_data_sc_add_ci_move_list(GList *fd_list, const gchar *dest);
gboolean file_data_sc_add_ci_rename_list(GList *fd_list, const gchar *dest);
gboolean file_data_sc_add_ci_unspecified_list(GList *fd_list, const gchar *dest);
gboolean file_data_add_ci_write_metadata_list(GList *fd_list);

gboolean file_data_sc_update_ci_copy_list(GList *fd_list, const gchar *dest);
gboolean file_data_sc_update_ci_move_list(GList *fd_list, const gchar *dest);
Expand All @@ -95,9 +96,19 @@ gint file_data_sc_update_ci_copy(FileData *fd, const gchar *dest_path);
gint file_data_sc_update_ci_move(FileData *fd, const gchar *dest_path);
gint file_data_sc_update_ci_rename(FileData *fd, const gchar *dest_path);
gint file_data_sc_update_ci_unspecified(FileData *fd, const gchar *dest_path);
gint file_data_sc_verify_ci(FileData *fd);

gchar *file_data_get_error_string(gint error);
gint file_data_sc_verify_ci_list(GList *list, gchar **desc);

gint file_data_verify_ci(FileData *fd);
gint file_data_verify_ci_list(GList *list, gchar **desc, gboolean with_sidecars);

gboolean file_data_perform_ci(FileData *fd);
gint file_data_apply_ci(FileData *fd);
void file_data_free_ci(FileData *fd);
void file_data_free_ci_list(GList *fd_list);


gint file_data_sc_verify_ci(FileData *fd);

gboolean file_data_sc_perform_ci(FileData *fd);
gint file_data_sc_apply_ci(FileData *fd);
Expand Down
31 changes: 21 additions & 10 deletions src/metadata.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,32 +58,43 @@ static void metadata_write_queue_add(FileData *fd)
}


static void metadata_write_queue_commit(FileData *fd)
gboolean metadata_write_queue_remove(FileData *fd)
{
if (options->save_metadata_in_image_file &&
exif_write_fd(fd))
{
metadata_legacy_delete(fd);
}
else metadata_legacy_write(fd);

g_hash_table_destroy(fd->modified_xmp);
fd->modified_xmp = NULL;

metadata_write_queue = g_list_remove(metadata_write_queue, fd);
file_data_unref(fd);
return TRUE;
}


static gboolean metadata_write_queue_idle_cb(gpointer data)
{
metadata_write_queue_commit(metadata_write_queue->data); /* the first entry */
/* TODO: the queue should not be passed to file_util_write_metadata directly:
metatata under .geeqie/ can be written immediately,
for others we can decide if we write to the image file or to sidecar */

if (metadata_write_queue) return TRUE;

// if (metadata_write_queue) return TRUE;

/* confirm writting */
file_util_write_metadata(NULL, metadata_write_queue, NULL);

metadata_write_idle_id = -1;
return FALSE;
}

gboolean metadata_write_perform(FileData *fd)
{
if (options->save_metadata_in_image_file &&
exif_write_fd(fd))
{
metadata_legacy_delete(fd);
}
else metadata_legacy_write(fd);
return TRUE;
}

gint metadata_write_list(FileData *fd, const gchar *key, GList *values)
{
Expand Down
3 changes: 3 additions & 0 deletions src/metadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@

#ifndef METADATA_H
#define METADATA_H
gboolean metadata_write_queue_remove(FileData *fd);
gboolean metadata_write_perform(FileData *fd);


gint metadata_write(FileData *fd, GList *keywords, const gchar *comment);

Expand Down
3 changes: 2 additions & 1 deletion src/typedefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ typedef enum {
FILEDATA_CHANGE_MOVE,
FILEDATA_CHANGE_RENAME,
FILEDATA_CHANGE_COPY,
FILEDATA_CHANGE_UNSPECIFIED
FILEDATA_CHANGE_UNSPECIFIED,
FILEDATA_CHANGE_WRITE_METADATA
} FileDataChangeType;

typedef enum {
Expand Down
Loading

0 comments on commit 9643a25

Please sign in to comment.