/*
- * Geeqie
- * (C) 2005 John Ellis
- * Copyright (C) 2008 The Geeqie Team
+ * Copyright (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2016 The Geeqie Team
*
* Author: John Ellis
*
- * This software is released under the GNU General Public License (GNU GPL).
- * Please read the included file COPYING for more information.
- * This software comes with no warranty of any kind, use at your own risk!
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "main.h"
#include "filedata.h"
#include "exif.h"
+#include "metadata.h"
#include "md5-util.h"
#include "ui_fileops.h"
-static gboolean cache_loader_process(CacheLoader *cl);
-
+static gboolean cache_loader_phase2_idle_cb(gpointer data);
-static void cache_loader_done_cb(ImageLoader *il, gpointer data)
+static void cache_loader_phase1_done_cb(ImageLoader *il, gpointer data)
{
CacheLoader *cl = data;
- cache_loader_process(cl);
+ cl->idle_id = g_idle_add(cache_loader_phase2_idle_cb, cl);
}
-static void cache_loader_error_cb(ImageLoader *il, gpointer data)
+static void cache_loader_phase1_error_cb(ImageLoader *il, gpointer data)
{
CacheLoader *cl = data;
cl->error = TRUE;
- cache_loader_done_cb(il, data);
+ cl->idle_id = g_idle_add(cache_loader_phase2_idle_cb, cl);
}
-static gboolean cache_loader_process(CacheLoader *cl)
+static gboolean cache_loader_phase1_process(CacheLoader *cl)
{
- if (cl->todo_mask & CACHE_LOADER_SIMILARITY &&
- !cl->cd->similarity)
+ if (cl->todo_mask & CACHE_LOADER_SIMILARITY && !cl->cd->similarity)
{
- GdkPixbuf *pixbuf;
if (!cl->il && !cl->error)
{
cl->il = image_loader_new(cl->fd);
- image_loader_set_error_func(cl->il, cache_loader_error_cb, cl);
- if (image_loader_start(cl->il, cache_loader_done_cb, cl))
+ g_signal_connect(G_OBJECT(cl->il), "error", (GCallback)cache_loader_phase1_error_cb, cl);
+ g_signal_connect(G_OBJECT(cl->il), "done", (GCallback)cache_loader_phase1_done_cb, cl);
+ if (image_loader_start(cl->il))
{
return FALSE;
}
cl->error = TRUE;
}
+ }
+ cl->idle_id = g_idle_add(cache_loader_phase2_idle_cb, cl);
+
+ return FALSE;
+}
+
+static gboolean cache_loader_phase2_process(CacheLoader *cl)
+{
+ if (cl->todo_mask & CACHE_LOADER_SIMILARITY && !cl->cd->similarity && cl->il)
+ {
+ GdkPixbuf *pixbuf;
pixbuf = image_loader_get_pixbuf(cl->il);
if (pixbuf)
{
cache_sim_data_set_similarity(cl->cd, sim);
image_sim_free(sim);
+ cl->todo_mask &= ~CACHE_LOADER_SIMILARITY;
cl->done_mask |= CACHE_LOADER_SIMILARITY;
}
!cl->cd->have_date)
{
time_t date = -1;
- ExifData *exif;
+ gchar *text;
- exif = exif_read_fd(cl->fd);
- if (exif)
+ text = metadata_read_string(cl->fd, "Exif.Image.DateTime", METADATA_FORMATTED);
+ if (text)
{
- gchar *text;
+ struct tm t;
- text = exif_get_data_as_text(exif, "formatted.DateTime");
- if (text)
- {
- struct tm t = { 0 };
+ memset(&t, 0, sizeof(t));
- if (sscanf(text, "%d:%d:%d %d:%d:%d", &t.tm_year, &t.tm_mon, &t.tm_mday,
- &t.tm_hour, &t.tm_min, &t.tm_sec) == 6)
- {
- t.tm_year -= 1900;
- t.tm_mon -= 1;
- t.tm_isdst = -1;
- date = mktime(&t);
- }
- g_free(text);
+ if (sscanf(text, "%d:%d:%d %d:%d:%d", &t.tm_year, &t.tm_mon, &t.tm_mday,
+ &t.tm_hour, &t.tm_min, &t.tm_sec) == 6)
+ {
+ t.tm_year -= 1900;
+ t.tm_mon -= 1;
+ t.tm_isdst = -1;
+ date = mktime(&t);
}
- exif_free(exif);
+ g_free(text);
}
cl->cd->date = date;
mode_t mode = 0755;
base = cache_get_location(CACHE_TYPE_SIM, cl->fd->path, FALSE, &mode);
- if (cache_ensure_dir_exists(base, mode))
+ if (recursive_mkdir_if_not_exists(base, mode))
{
g_free(cl->cd->path);
cl->cd->path = cache_get_location(CACHE_TYPE_SIM, cl->fd->path, TRUE, NULL);
g_free(base);
}
- cl->idle_id = -1;
+ cl->idle_id = 0;
if (cl->done_func)
{
return TRUE;
}
-static gboolean cache_loader_idle_cb(gpointer data)
+static gboolean cache_loader_phase1_idle_cb(gpointer data)
+{
+ CacheLoader *cl = data;
+
+ return cache_loader_phase1_process(cl);
+}
+
+static gboolean cache_loader_phase2_idle_cb(gpointer data)
{
CacheLoader *cl = data;
- return cache_loader_process(cl);
+ return cache_loader_phase2_process(cl);
}
CacheLoader *cache_loader_new(FileData *fd, CacheDataType load_mask,
cl->done_mask = CACHE_LOADER_NONE;
cl->il = NULL;
- cl->idle_id = g_idle_add(cache_loader_idle_cb, cl);
+ cl->idle_id = g_idle_add(cache_loader_phase1_idle_cb, cl);
cl->error = FALSE;
{
if (!cl) return;
- if (cl->idle_id != -1)
+ if (cl->idle_id)
{
- g_source_remove(cl->idle_id);
- cl->idle_id = -1;
+ g_source_remove_by_user_data(cl);
+ cl->idle_id = 0;
}
image_loader_free(cl->il);
file_data_unref(cl->fd);
g_free(cl);
}
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */