From 980d778e396a24ecd7a557dd698b9aeffeab8f2f Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Fri, 17 Jul 2009 15:29:44 +0000 Subject: [PATCH] ethumbd_client. do the same as ethumb, but uses ethumbd for doing it. Yet another sample on ethumb usage. SVN revision: 41401 --- legacy/ethumb/src/bin/Makefile.am | 14 +- legacy/ethumb/src/bin/ethumb.c | 6 + legacy/ethumb/src/bin/ethumbd_client.c | 326 +++++++++++++++++++++++++ 3 files changed, 342 insertions(+), 4 deletions(-) create mode 100644 legacy/ethumb/src/bin/ethumbd_client.c diff --git a/legacy/ethumb/src/bin/Makefile.am b/legacy/ethumb/src/bin/Makefile.am index 5eccd9780b..f74c519ad6 100644 --- a/legacy/ethumb/src/bin/Makefile.am +++ b/legacy/ethumb/src/bin/Makefile.am @@ -10,8 +10,7 @@ noinst_HEADERS = ethumb_SOURCES = ethumb.c ethumb_LDADD = \ - @EINA_LIBS@ @EVAS_LIBS@ @ECORE_LIBS@ @ECORE_EVAS_LIBS@ @EDJE_LIBS@ \ - @ECORE_FILE_LIBS@ \ + @EINA_LIBS@ @ECORE_LIBS@ \ $(top_builddir)/src/lib/libethumb.la ethumb_DEPENDENCIES = $(top_builddir)/config.h @@ -20,12 +19,19 @@ ethumb_DEPENDENCIES = $(top_builddir)/config.h if USE_MODULE_ETHUMBD AM_CPPFLAGS += @EDBUS_CFLAGS@ -bin_PROGRAMS += ethumbd +bin_PROGRAMS += ethumbd ethumbd_client noinst_HEADERS += ethumbd_private.h + ethumbd_SOURCES = ethumbd.c ethumbd_child.c ethumbd_LDADD = \ - @EINA_LIBS@ @EVAS_LIBS@ @ECORE_LIBS@ @EDJE_LIBS@ @EDBUS_LIBS@ \ + @EINA_LIBS@ @ECORE_LIBS@ @EDBUS_LIBS@ \ $(top_builddir)/src/lib/libethumb.la ethumbd_DEPENDENCIES = $(top_builddir)/config.h +ethumbd_client_SOURCES = ethumbd_client.c +ethumbd_client_LDADD = \ + @EINA_LIBS@ @ECORE_LIBS@ \ + $(top_builddir)/src/lib/client/libethumb_client.la +ethumbd_client_DEPENDENCIES = $(top_builddir)/config.h + endif diff --git a/legacy/ethumb/src/bin/ethumb.c b/legacy/ethumb/src/bin/ethumb.c index 360fb54e4c..389fa20196 100644 --- a/legacy/ethumb/src/bin/ethumb.c +++ b/legacy/ethumb/src/bin/ethumb.c @@ -205,6 +205,12 @@ main(int argc, char *argv[]) if (quit_option) { + if (frame.file) + { + eina_stringshare_del(frame.file); + eina_stringshare_del(frame.group); + eina_stringshare_del(frame.swallow); + } ecore_shutdown(); ethumb_shutdown(); return 0; diff --git a/legacy/ethumb/src/bin/ethumbd_client.c b/legacy/ethumb/src/bin/ethumbd_client.c new file mode 100644 index 0000000000..a99bd7933b --- /dev/null +++ b/legacy/ethumb/src/bin/ethumbd_client.c @@ -0,0 +1,326 @@ +/** + * @file + * + * Copyright (C) 2009 by ProFUSION embedded systems + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 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 Lesser 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. + * + * @author Rafael Antognolli + * @author Gustavo Sverzut Barbieri + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char *aspect_opt[] = { "keep", "ignore", "crop", NULL }; +const char *format_opt[] = { "png", "jpg", "eet", NULL }; +struct frame +{ + const char *file; + const char *group; + const char *swallow; +}; + +struct options +{ + Eina_Rectangle geometry; + unsigned int format, aspect; + char *format_str; + char *aspect_str; + char *directory; + char *category; + struct frame frame; + char *src_path; + char *src_key; + const char *thumb_path; + const char *thumb_key; + double video_time; + int page; +}; + +static unsigned char +_ethumb_getopt_callback_frame_parse(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc __UNUSED__, const char *str, void *data __UNUSED__, Ecore_Getopt_Value *storage) +{ + struct frame *f = (struct frame *)storage->ptrp; + const char *tfile, *tgroup, *tswallow, *base, *sep; + + base = str; + sep = strchr(base, ':'); + if (!sep) + goto error; + tfile = eina_stringshare_add_length(base, sep - base); + base = sep + 1; + + sep = strchr(base, ':'); + if (!sep) + { + eina_stringshare_del(tfile); + goto error; + } + tgroup = eina_stringshare_add_length(base, sep - base); + base = sep + 1; + if (base[0] == '\0') + { + eina_stringshare_del(tfile); + eina_stringshare_del(tgroup); + goto error; + } + tswallow = eina_stringshare_add(base); + + f->file = tfile; + f->group = tgroup; + f->swallow = tswallow; + return 1; + + error: + fprintf(stderr, + "ERROR: invalid theme, not in format " + "'file:group:swallow_part': '%s'\n", + str); + return 0; +} + +const Ecore_Getopt optdesc = { + "ethumbd_client", + NULL, + PACKAGE_VERSION, + "(C) 2009 - ProFUSION embedded systems", + "LGPL v3 - GNU Lesser General Public License", + "Thumbnails generator client using DBus and ethumbd.\n" + "\n" + "This program uses ethumbd server to create thumbnails from pictures. " + "It's an example of use and a test for ethumbd.\n", + 0, + { + ECORE_GETOPT_CALLBACK_ARGS + ('s', "size", "thumbnail size expected.", + "WxH", ecore_getopt_callback_size_parse, NULL), + ECORE_GETOPT_CHOICE + ('f', "format", "file format to save.", format_opt), + ECORE_GETOPT_CHOICE + ('a', "aspect", "original image aspect ratio.", aspect_opt), + ECORE_GETOPT_STORE_STR + ('d', "directory", "directory to save thumbnails."), + ECORE_GETOPT_STORE_STR + ('c', "category", "thumbnails category."), + ECORE_GETOPT_CALLBACK_ARGS + ('t', "theme", "path to theme file, group and swallow part.", + "file:group:swallow_part", _ethumb_getopt_callback_frame_parse, NULL), + ECORE_GETOPT_STORE_STR + ('k', "key", "key inside eet file to read image from."), + ECORE_GETOPT_STORE_DOUBLE + ('v', "video_time", "time of video frame to use as thumbnail."), + ECORE_GETOPT_STORE_INT + ('p', "document_page", "document page to use as thumbnail."), + ECORE_GETOPT_STORE_INT('D', "debug", "debug level (see -Q and -V)"), + ECORE_GETOPT_COUNT('Q', "quiet", "print out less information"), + ECORE_GETOPT_COUNT('V', "verbose", "print out more information"), + ECORE_GETOPT_LICENSE('L', "license"), + ECORE_GETOPT_COPYRIGHT('C', "copyright"), + ECORE_GETOPT_VERSION('V', "version"), + ECORE_GETOPT_HELP('h', "help"), + ECORE_GETOPT_SENTINEL + } +}; + +static void +_thumb_report(const char *mode, const char *src_path, const char *src_key, const char *thumb_path, const char *thumb_key) +{ + printf("%s '%s' '%s' => '%s' '%s'\n", + mode, + src_path, src_key ? src_key : "", + thumb_path, thumb_key ? thumb_key : ""); +} + +static void +_finished_thumb(long id __UNUSED__, const char *src_path, const char *src_key, const char *thumb_path, const char *thumb_key, Eina_Bool success, void *data __UNUSED__) +{ + const char *mode = success ? "GENERATED" : "FAILED"; + _thumb_report(mode, src_path, src_key, thumb_path, thumb_key); + ecore_main_loop_quit(); +} + +static void +_connected(Ethumb_Client *c, Eina_Bool success, void *data) +{ + struct options *opts = data; + const char *thumb_path, *thumb_key; + long id; + + if (!success) + { + fputs("ERROR: could not connect to DBus server.\n", stderr); + ecore_main_loop_quit(); + return; + } + + fputs("connected to DBus server, setup parameters...\n", stdout); + + ethumb_client_format_set(c, opts->format); + ethumb_client_aspect_set(c, opts->aspect); + + if (opts->directory) ethumb_client_dir_path_set(c, opts->directory); + if (opts->category) ethumb_client_category_set(c, opts->category); + if (opts->geometry.w > 0 && opts->geometry.h > 0) + ethumb_client_size_set(c, opts->geometry.w, opts->geometry.h); + if (opts->frame.file) + ethumb_client_frame_set + (c, opts->frame.file, opts->frame.group, opts->frame.swallow); + if (opts->video_time > 0) + ethumb_client_video_time_set(c, opts->video_time); + if (opts->page > 0) + ethumb_client_document_page_set(c, opts->page); + + if (!ethumb_client_file_set(c, opts->src_path, opts->src_key)) + { + fprintf(stderr, "ERROR: could not set file '%s', key '%s'\n", + opts->src_path, opts->src_key ? opts->src_key : ""); + ecore_main_loop_quit(); + return; + } + + ethumb_client_thumb_path_set(c, opts->thumb_path, opts->thumb_key); + ethumb_client_thumb_path_get(c, &thumb_path, &thumb_key); + if (ethumb_client_thumb_exists(c)) + { + _thumb_report + ("EXISTS", opts->src_path, opts->src_key, thumb_path, thumb_key); + ecore_main_loop_quit(); + return; + } + + id = ethumb_client_generate(c, _finished_thumb, NULL, NULL); + if (id < 0) + { + fputs("ERROR: could not request thumbnail to be generated.\n", stderr); + ecore_main_loop_quit(); + return; + } + printf("request id=%ld, file='%s', key='%s'\n", + id, opts->src_path, opts->src_key ? opts->src_key : ""); +} + +int +main(int argc, char *argv[]) +{ + Ethumb_Client *c; + Eina_Bool quit_option = 0; + int debug_level = EINA_ERROR_LEVEL_WARN; + const char *format_str, *aspect_str; + struct options opts = { + {-1, -1, -1, -1}, + 0, 0, + NULL, NULL, NULL, NULL, + {NULL, NULL, NULL}, + NULL, NULL, NULL, NULL, + 0.0, + 0 + }; + int arg_index; + int i, ret = 0; + + ethumb_client_init(); + ecore_init(); + + Ecore_Getopt_Value values[] = { + ECORE_GETOPT_VALUE_PTR_CAST(opts.geometry), + ECORE_GETOPT_VALUE_PTR_CAST(format_str), + ECORE_GETOPT_VALUE_PTR_CAST(aspect_str), + ECORE_GETOPT_VALUE_STR(opts.directory), + ECORE_GETOPT_VALUE_STR(opts.category), + ECORE_GETOPT_VALUE_PTR_CAST(opts.frame), + ECORE_GETOPT_VALUE_STR(opts.src_key), + ECORE_GETOPT_VALUE_DOUBLE(opts.video_time), + ECORE_GETOPT_VALUE_INT(opts.page), + ECORE_GETOPT_VALUE_INT(debug_level), + ECORE_GETOPT_VALUE_INT(debug_level), + ECORE_GETOPT_VALUE_INT(debug_level), + ECORE_GETOPT_VALUE_BOOL(quit_option), + ECORE_GETOPT_VALUE_BOOL(quit_option), + ECORE_GETOPT_VALUE_BOOL(quit_option), + ECORE_GETOPT_VALUE_BOOL(quit_option), + ECORE_GETOPT_VALUE_NONE + }; + + arg_index = ecore_getopt_parse(&optdesc, values, argc, argv); + if ((arg_index < 0) || (arg_index == argc)) + { + if (arg_index < 0) + fprintf(stderr, "Could not parse arguments.\n"); + else + fprintf(stderr, "Missing source file to thumbnail.\n"); + + ret = 1; + goto end; + } + + if (quit_option) + { + ret = 0; + goto end; + } + + for (i = 0; i < 3; i++) + if (format_opt[i] == format_str) + { + opts.format = i; + break; + } + + for (i = 0; i < 3; i++) + if (aspect_opt[i] == aspect_str) + { + opts.aspect = i; + break; + } + + opts.src_path = argv[arg_index++]; + if (arg_index < argc) + { + opts.thumb_path = argv[arg_index++]; + if (arg_index < argc) + opts.thumb_key = argv[arg_index]; + } + + c = ethumb_client_connect(_connected, &opts, NULL); + if (!c) + { + fputs("ERROR: could not connect to server.\n", stderr); + ret = 2; + goto end; + } + + ecore_main_loop_begin(); + ethumb_client_disconnect(c); + + end: + if (opts.frame.file) + { + eina_stringshare_del(opts.frame.file); + eina_stringshare_del(opts.frame.group); + eina_stringshare_del(opts.frame.swallow); + } + ecore_shutdown(); + ethumb_client_shutdown(); + + return ret; +}