summaryrefslogtreecommitdiffstats
path: root/libgimpthumb/gimp-thumbnail-list.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--libgimpthumb/gimp-thumbnail-list.c251
1 files changed, 251 insertions, 0 deletions
diff --git a/libgimpthumb/gimp-thumbnail-list.c b/libgimpthumb/gimp-thumbnail-list.c
new file mode 100644
index 0000000..2086af2
--- /dev/null
+++ b/libgimpthumb/gimp-thumbnail-list.c
@@ -0,0 +1,251 @@
+/*
+ * gimp-thumbnail-list.c
+ */
+
+#include <string.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <libgimpthumb/gimpthumb.h>
+
+
+#define STATE_NONE -1
+#define STATE_ERROR -2
+
+
+static gboolean parse_option_state (const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error);
+static gboolean parse_option_path (const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error);
+static void process_folder (const gchar *folder);
+static void process_thumbnail (const gchar *filename);
+
+
+static GimpThumbState option_state = STATE_NONE;
+static gboolean option_verbose = FALSE;
+static gchar *option_path = NULL;
+
+
+static const GOptionEntry main_entries[] =
+{
+ {
+ "state", 's', 0,
+ G_OPTION_ARG_CALLBACK, parse_option_state,
+ "Filter by thumbnail state "
+ "(unknown|remote|folder|special|not-found|exists|old|failed|ok|error)",
+ "<state>"
+ },
+ {
+ "path", 'p', 0,
+ G_OPTION_ARG_CALLBACK, parse_option_path,
+ "Filter by original file's path",
+ "<path>"
+ },
+ {
+ "verbose", 'v', 0,
+ G_OPTION_ARG_NONE, &option_verbose,
+ "Print additional info per matched file", NULL
+ },
+ { NULL }
+};
+
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GOptionContext *context;
+ GDir *dir;
+ const gchar *thumb_folder;
+ const gchar *folder;
+ GError *error = NULL;
+
+ gimp_thumb_init ("gimp-thumbnail-list", NULL);
+
+ thumb_folder = gimp_thumb_get_thumb_base_dir ();
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, main_entries, NULL);
+
+ if (! g_option_context_parse (context, &argc, &argv, &error))
+ {
+ g_printerr ("%s\n", error->message);
+ return -1;
+ }
+
+ dir = g_dir_open (thumb_folder, 0, &error);
+
+ if (! dir)
+ g_error ("Error opening %s: %s", thumb_folder, error->message);
+
+ while ((folder = g_dir_read_name (dir)))
+ {
+ gchar *filename;
+
+ filename = g_build_filename (thumb_folder, folder, NULL);
+
+ if (g_file_test (filename, G_FILE_TEST_IS_DIR))
+ process_folder (filename);
+
+ g_free (filename);
+ }
+
+ g_dir_close (dir);
+
+ return 0;
+}
+
+static gboolean
+parse_option_state (const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error)
+{
+ if (strcmp (value, "unknown") == 0)
+ option_state = GIMP_THUMB_STATE_UNKNOWN;
+ else if (strcmp (value, "remote") == 0)
+ option_state = GIMP_THUMB_STATE_REMOTE;
+ else if (strcmp (value, "folder") == 0)
+ option_state = GIMP_THUMB_STATE_FOLDER;
+ else if (strcmp (value, "special") == 0)
+ option_state = GIMP_THUMB_STATE_SPECIAL;
+ else if (strcmp (value, "not-found") == 0)
+ option_state = GIMP_THUMB_STATE_NOT_FOUND;
+ else if (strcmp (value, "exists") == 0)
+ option_state = GIMP_THUMB_STATE_EXISTS;
+ else if (strcmp (value, "old") == 0)
+ option_state = GIMP_THUMB_STATE_OLD;
+ else if (strcmp (value, "failed") == 0)
+ option_state = GIMP_THUMB_STATE_FAILED;
+ else if (strcmp (value, "ok") == 0)
+ option_state = GIMP_THUMB_STATE_OK;
+ else if (strcmp (value, "error") == 0)
+ option_state = STATE_ERROR;
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+parse_option_path (const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error)
+{
+ option_path = g_strdup (value);
+
+ return TRUE;
+}
+
+static void
+process_folder (const gchar *folder)
+{
+ GDir *dir;
+ const gchar *name;
+ GError *error = NULL;
+
+#if 0
+ g_print ("processing folder: %s\n", folder);
+#endif
+
+ dir = g_dir_open (folder, 0, &error);
+
+ if (! dir)
+ {
+ g_printerr ("Error opening '%s': %s", folder, error->message);
+ return;
+ }
+
+ while ((name = g_dir_read_name (dir)))
+ {
+ gchar *filename;
+
+ filename = g_build_filename (folder, name, NULL);
+
+ if (g_file_test (filename, G_FILE_TEST_IS_DIR))
+ process_folder (filename);
+ else
+ process_thumbnail (filename);
+
+ g_free (filename);
+ }
+
+ g_dir_close (dir);
+}
+
+static void
+process_thumbnail (const gchar *filename)
+{
+ GimpThumbnail *thumbnail;
+ GError *error = NULL;
+
+ thumbnail = gimp_thumbnail_new ();
+
+ if (! gimp_thumbnail_set_from_thumb (thumbnail, filename, &error))
+ {
+ if (option_state == STATE_ERROR)
+ {
+ if (option_verbose)
+ g_print ("%s '%s'\n", filename, error->message);
+ else
+ g_print ("%s\n", filename);
+ }
+
+ g_clear_error (&error);
+ }
+ else
+ {
+ GimpThumbState state = gimp_thumbnail_peek_image (thumbnail);
+
+ if ((option_state == STATE_NONE || state == option_state)
+
+ &&
+
+ (option_path == NULL ||
+ strstr (thumbnail->image_uri, option_path)))
+ {
+ if (option_verbose)
+ g_print ("%s '%s'\n", filename, thumbnail->image_uri);
+ else
+ g_print ("%s\n", filename);
+ }
+
+#if 0
+ switch (foo)
+ {
+ case GIMP_THUMB_STATE_REMOTE:
+ g_print ("%s Remote image '%s'\n", filename, thumbnail->image_uri);
+ break;
+
+ case GIMP_THUMB_STATE_FOLDER:
+ g_print ("%s Folder '%s'\n", filename, thumbnail->image_uri);
+ break;
+
+ case GIMP_THUMB_STATE_SPECIAL:
+ g_print ("%s Special file '%s'\n", filename, thumbnail->image_uri);
+ break;
+
+ case GIMP_THUMB_STATE_NOT_FOUND:
+ g_print ("%s Image not found '%s'\n", filename, thumbnail->image_uri);
+ break;
+
+ case GIMP_THUMB_STATE_OLD:
+ g_print ("%s Thumbnail old '%s'\n", filename, thumbnail->image_uri);
+ break;
+
+ case GIMP_THUMB_STATE_FAILED:
+ g_print ("%s EEEEEEEEK '%s'\n", filename, thumbnail->image_uri);
+ break;
+
+ default:
+ g_print ("%s '%s'\n", filename, thumbnail->image_uri);
+ break;
+ }
+#endif
+ }
+
+ g_object_unref (thumbnail);
+}