Commit f6aeabca authored by Martyn James Russell's avatar Martyn James Russell

Check file size is non-zero before trying to extract metadata from it.

	* src/tracker-extract/tracker-extract.c: Check file size is
	non-zero before trying to extract metadata from it. This saves us
	time and warnings in the log.

	* src/tracker-extract/tracker-main.c: Added GOption based command
	line argument handling. Also added -m for mime -f for filename and
	-v to set the verbosity to something other than the default config.

svn path=/trunk/; revision=2910
parent 485a1f0a
2009-02-10 Martyn Russell <martyn@imendio.com>
* src/tracker-extract/tracker-extract.c: Check file size is
non-zero before trying to extract metadata from it. This saves us
time and warnings in the log.
* src/tracker-extract/tracker-main.c: Added GOption based command
line argument handling. Also added -m for mime -f for filename and
-v to set the verbosity to something other than the default config.
2009-02-09 Martyn Russell <martyn@imendio.com>
* Release 0.6.90.
......
......@@ -195,81 +195,114 @@ get_file_metadata (TrackerExtract *extract,
const gchar *mime)
{
GHashTable *values;
GFile *file;
GFileInfo *info;
GError *error = NULL;
const gchar *attributes = NULL;
gchar *path_in_locale;
gchar *path_used;
gchar *mime_used = NULL;
goffset size = 0;
path_used = g_strdup (path);
g_strstrip (path_used);
path_in_locale = g_filename_from_utf8 (path_used, -1, NULL, NULL, NULL);
g_free (path_used);
if (!path_in_locale) {
g_warning ("Could not convert path:'%s' from UTF-8 to locale", path_used);
g_warning ("Could not convert path from UTF-8 to locale");
g_free (path_used);
return NULL;
}
if (!g_file_test (path_in_locale, G_FILE_TEST_EXISTS)) {
file = g_file_new_for_path (path_in_locale);
if (!file) {
g_warning ("Could not create GFile for path:'%s'",
path_in_locale);
g_free (path_in_locale);
return NULL;
}
/* Blocks */
if (!g_file_query_exists (file, NULL)) {
g_warning ("File does not exist '%s'", path_in_locale);
g_object_unref (file);
g_free (path_in_locale);
return NULL;
}
if (mime && *mime) {
mime_used = g_strdup (mime);
g_strstrip (mime_used);
/* Do we get size and mime? or just size? */
if (mime && *mime) {
attributes =
G_FILE_ATTRIBUTE_STANDARD_SIZE;
} else {
GFile *file;
/* Try to guess mime type */
file = g_file_new_for_path (path_in_locale);
if (file) {
GFileInfo *info;
GError *error = NULL;
const gchar *attributes;
attributes =
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE;
info = g_file_query_info (file,
attributes,
G_FILE_QUERY_INFO_NONE,
NULL,
&error);
if (error) {
tracker_dbus_request_comment (request_id,
" Could not create GFileInfo for path:'%s', %s",
path_in_locale,
error ? error->message : "no error given");
g_error_free (error);
}
if (info) {
mime_used = g_strdup (g_file_info_get_content_type (info));
g_object_unref (info);
}
tracker_dbus_request_comment (request_id,
" Guessing mime type as '%s' for path:'%s'",
mime_used,
path_in_locale);
g_object_unref (file);
} else {
tracker_dbus_request_comment (request_id,
" Could not create GFile for path:'%s'",
path_in_locale);
}
attributes =
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
G_FILE_ATTRIBUTE_STANDARD_SIZE;
}
info = g_file_query_info (file,
attributes,
G_FILE_QUERY_INFO_NONE,
NULL,
&error);
if (error || !info) {
tracker_dbus_request_comment (request_id,
" Could not create GFileInfo for file size check, %s",
error ? error->message : "no error given");
g_error_free (error);
if (info) {
g_object_unref (info);
}
g_object_unref (file);
g_free (path_in_locale);
return NULL;
}
/* Create hash table to send back */
values = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
g_free);
/* Check the size is actually non-zero */
size = g_file_info_get_size (info);
if (size < 1) {
tracker_dbus_request_comment (request_id,
" File size is 0 bytes, ignoring file");
g_object_unref (info);
g_object_unref (file);
g_free (path_in_locale);
return values;
}
/* We know the mime */
if (mime && *mime) {
mime_used = g_strdup (mime);
g_strstrip (mime_used);
} else {
mime_used = g_strdup (g_file_info_get_content_type (info));
tracker_dbus_request_comment (request_id,
" Guessing mime type as '%s' for path:'%s'",
mime_used,
path_in_locale);
}
g_object_unref (file);
/* Now we have sanity checked everything, actually get the
* data we need from the extractors.
*/
if (mime_used) {
TrackerExtractPrivate *priv;
TrackerExtractData *data;
......@@ -292,7 +325,6 @@ get_file_metadata (TrackerExtract *extract,
g_hash_table_size (values));
g_free (path_in_locale);
g_free (path_used);
g_free (mime_used);
return values;
......@@ -307,7 +339,6 @@ get_file_metadata (TrackerExtract *extract,
}
g_free (path_in_locale);
g_free (path_used);
return values;
}
......@@ -358,7 +389,7 @@ tracker_extract_get_metadata (TrackerExtract *object,
tracker_dbus_request_debug (request_id,
" Resetting shutdown timeout");
tracker_main_shutdown_timeout_reset ();
tracker_main_quit_timeout_reset ();
values = get_file_metadata (object, request_id, path, mime);
if (values) {
......
......@@ -41,28 +41,63 @@
#include "tracker-dbus.h"
#include "tracker-extract.h"
#define ABOUT \
"Tracker " PACKAGE_VERSION "\n" \
"Copyright (c) 2005-2008 Jamie McCracken (jamiemcc@gnome.org)\n"
#define LICENSE \
"This program is free software and comes without any warranty.\n" \
"It is licensed under version 2 or later of the General Public " \
"License which can be viewed at:\n" \
"\n" \
" http://www.gnu.org/licenses/gpl.txt\n"
#define QUIT_TIMEOUT 30 /* 1/2 minutes worth of seconds */
static GMainLoop *main_loop;
static guint shutdown_timeout_id;
static guint quit_timeout_id;
static gint verbosity = -1;
static gchar *filename;
static gchar *mime_type;
static GOptionEntry entries[] = {
{ "verbosity", 'v', 0,
G_OPTION_ARG_INT, &verbosity,
N_("Logging, 0 = errors only, "
"1 = minimal, 2 = detailed and 3 = debug (default = 0)"),
NULL },
{ "file", 'f', 0,
G_OPTION_ARG_STRING, &filename,
N_("File to extract metadata for"),
N_("FILE") },
{ "file", 'm', 0,
G_OPTION_ARG_STRING, &mime_type,
N_("MIME type for file (if not provided, this will be guessed)"),
N_("MIME") },
{ NULL }
};
static gboolean
shutdown_timeout_cb (gpointer user_data)
quit_timeout_cb (gpointer user_data)
{
shutdown_timeout_id = 0;
quit_timeout_id = 0;
g_main_loop_quit (main_loop);
return FALSE;
}
void
tracker_main_shutdown_timeout_reset (void)
tracker_main_quit_timeout_reset (void)
{
if (shutdown_timeout_id != 0) {
g_source_remove (shutdown_timeout_id);
if (quit_timeout_id != 0) {
g_source_remove (quit_timeout_id);
}
shutdown_timeout_id = g_timeout_add_seconds (30,
shutdown_timeout_cb,
NULL);
quit_timeout_id = g_timeout_add_seconds (QUIT_TIMEOUT,
quit_timeout_cb,
NULL);
}
static void
......@@ -88,6 +123,7 @@ int
main (int argc, char *argv[])
{
GOptionContext *context;
GError *error = NULL;
gchar *summary;
TrackerConfig *config;
gchar *log_filename;
......@@ -100,23 +136,26 @@ main (int argc, char *argv[])
/* usage string - Usage: COMMAND [OPTION]... <THIS_MESSAGE> */
context = g_option_context_new (_("- Extract file meta data"));
/* Translators: this message will appear after the usage string */
/* and before the list of options. */
summary = g_strconcat (_("This command works two ways:"),
"\n",
"\n",
_(" - Calling the DBus API once running"),
"\n",
_(" - Passing arguments:"),
"\n",
" tracker-extract [filename] [mime-type]\n",
NULL);
g_option_context_set_summary (context, summary);
g_option_context_parse (context, &argc, &argv, NULL);
g_option_context_add_main_entries (context, entries, NULL);
g_option_context_parse (context, &argc, &argv, &error);
if (!filename && mime_type) {
gchar *help;
g_printerr ("%s\n\n",
_("Filename and mime type must be provided together"));
help = g_option_context_get_help (context, TRUE, NULL);
g_option_context_free (context);
g_printerr ("%s", help);
g_free (help);
return EXIT_FAILURE;
}
g_option_context_free (context);
g_free (summary);
g_print ("\n" ABOUT "\n" LICENSE "\n");
tracker_memory_setrlimits ();
......@@ -132,7 +171,7 @@ main (int argc, char *argv[])
setlocale (LC_ALL, "");
if (argc >= 2) {
if (filename) {
TrackerExtract *object;
object = tracker_extract_new ();
......@@ -140,11 +179,7 @@ main (int argc, char *argv[])
return EXIT_FAILURE;
}
if (argc >= 3) {
tracker_extract_get_metadata_by_cmdline (object, argv[1], argv[2]);
} else {
tracker_extract_get_metadata_by_cmdline (object, argv[1], NULL);
}
tracker_extract_get_metadata_by_cmdline (object, filename, mime_type);
g_object_unref (object);
......@@ -159,6 +194,11 @@ main (int argc, char *argv[])
"tracker-extract.log",
NULL);
/* Extractor command line arguments */
if (verbosity > -1) {
tracker_config_set_verbosity (config, verbosity);
}
/* Initialize subsystems */
initialize_directories ();
......@@ -178,7 +218,7 @@ main (int argc, char *argv[])
/* Main loop */
main_loop = g_main_loop_new (NULL, FALSE);
tracker_main_shutdown_timeout_reset ();
tracker_main_quit_timeout_reset ();
g_main_loop_run (main_loop);
g_main_loop_unref (main_loop);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment