Index: configure.in =================================================================== RCS file: /cvs/gnome/tracker/configure.in,v retrieving revision 1.44 diff -u -p -r1.44 configure.in --- configure.in 30 Nov 2006 01:06:56 -0000 1.44 +++ configure.in 7 Dec 2006 14:33:50 -0000 @@ -530,6 +530,10 @@ AC_CONFIG_FILES([ src/trackerd/Makefile src/libtracker/Makefile src/tracker-search-tool/Makefile + src/external-services/Makefile + src/external-services/IndexManPages/Makefile + src/external-services/IndexLiferea/Makefile + src/external-services/IndexTomboy/Makefile po/Makefile.in ]) Index: src/Makefile.am =================================================================== RCS file: /cvs/gnome/tracker/src/Makefile.am,v retrieving revision 1.13 diff -u -p -r1.13 Makefile.am --- src/Makefile.am 30 Nov 2006 01:06:58 -0000 1.13 +++ src/Makefile.am 7 Dec 2006 14:37:53 -0000 @@ -9,5 +9,5 @@ sqlite_dir = sqlite3 endif -SUBDIRS = libstemmer $(sqlite_dir) text-filters trackerd libtracker tracker-extract tracker-thumbnailer $(tracker_gui_dir) +SUBDIRS = libstemmer $(sqlite_dir) text-filters trackerd libtracker tracker-extract tracker-thumbnailer $(tracker_gui_dir) external-services Index: src/trackerd/Makefile.am =================================================================== RCS file: /cvs/gnome/tracker/src/trackerd/Makefile.am,v retrieving revision 1.24 diff -u -p -r1.24 Makefile.am --- src/trackerd/Makefile.am 30 Nov 2006 01:47:44 -0000 1.24 +++ src/trackerd/Makefile.am 7 Dec 2006 14:38:09 -0000 @@ -110,6 +110,8 @@ trackerd_SOURCES = \ tracker-mbox-kmail.h \ tracker-mbox.c \ tracker-mbox.h \ + tracker-external-services.c \ + tracker-external-services.h \ tracker-metadata.c \ tracker-metadata.h \ tracker-rdf-query.c \ Index: src/trackerd/tracker-utils.h =================================================================== RCS file: /cvs/gnome/tracker/src/trackerd/tracker-utils.h,v retrieving revision 1.31 diff -u -p -r1.31 tracker-utils.h --- src/trackerd/tracker-utils.h 20 Nov 2006 00:53:55 -0000 1.31 +++ src/trackerd/tracker-utils.h 7 Dec 2006 14:38:28 -0000 @@ -130,6 +130,12 @@ typedef struct { gboolean index_kmail_emails; GSList *additional_mboxes_to_index; + /* external application support */ + GSList *active_services; + GHashTable *app_explicit_dir; + GHashTable *app_explicit_file; + GSList *app_implicit_dir; + /* nfs options */ gboolean use_nfs_safe_locking; /* use safer but much slower external lock file when users home dir is on an nfs systems */ @@ -277,6 +283,9 @@ typedef struct { +typedef struct { + gchar *service_key; +} ExternalService; typedef struct { @@ -293,19 +302,21 @@ typedef struct { WatchTypes watch_type; gboolean is_directory; + ExternalService *app; + /* symlink info - File ID of link might not be in DB so need to store path/filename too */ gboolean is_link; - gint32 link_id; + gint32 link_id; char *link_path; char *link_name; char *mime; int service_type_id; - guint32 file_size; + guint32 file_size; char *permissions; - gint32 mtime; - gint32 atime; - gint32 indextime; + gint32 mtime; + gint32 atime; + gint32 indextime; /* options */ char *move_from_uri; Index: src/trackerd/tracker-utils.c =================================================================== RCS file: /cvs/gnome/tracker/src/trackerd/tracker-utils.c,v retrieving revision 1.45 diff -u -p -r1.45 tracker-utils.c --- src/trackerd/tracker-utils.c 28 Nov 2006 18:37:07 -0000 1.45 +++ src/trackerd/tracker-utils.c 7 Dec 2006 14:38:54 -0000 @@ -32,6 +32,7 @@ #include "tracker-dbus.h" #include "tracker-utils.h" +#include "tracker-external-services.h" #include "xdgmime.h" @@ -48,7 +49,8 @@ char *file_service_array[] = {"Files", char *service_index_array[] = { "Files", "Folders", "Documents", "Images", "Music", "Videos", "Text Files", "Development Files", "Other Files", "VFS Files", "VFS Folders", "VFS Documents", "VFS Images", "VFS Music", "VFS Videos", "VFS Text Files", "VFS Development Files", "VFS Other Files", "Conversations", "Playlists", "Applications", "Contacts", "Emails", "EmailAttachments", "Notes", "Appointments", - "Tasks", "Bookmarks", "History", "Projects", NULL}; + "Tasks", "Bookmarks", "History", "Projects", "Web Pages", "Web Channels", + "Man Pages", NULL}; char *tracker_actions[] = { @@ -838,6 +840,8 @@ tracker_create_file_info (const char *ur info->watch_type = watch; info->is_directory = FALSE; + info->app = NULL; + info->is_link = FALSE; info->link_id = 0; info->link_path = NULL; @@ -859,7 +863,6 @@ tracker_create_file_info (const char *ur return info; } - FileInfo * tracker_free_file_info (FileInfo *info) { @@ -1277,7 +1280,7 @@ tracker_get_mime_type (const char* uri) result = xdg_mime_get_mime_type_for_file (uri, NULL); - if (result != NULL && result != XDG_MIME_TYPE_UNKNOWN) { + if (result != NULL && strcmp (result, XDG_MIME_TYPE_UNKNOWN) != 0 && strlen (result) > 0) { return g_strdup (result); } else { if (is_text_file (uri)) { @@ -1793,6 +1796,9 @@ tracker_load_config_file () "IndexEvolutionEmails=false\n", "IndexThunderbirdEmails=false\n", "IndexKmailEmails=false\n\n", + "IndexManPages=false\n", + "IndexLiferea=false\n", + "IndexTomboy=false\n", "[Emails]\n", "AdditionalMBoxesToIndex=;\n\n", "[Performance]\n", @@ -1978,6 +1984,7 @@ tracker_load_config_file () } + tracker->active_services = tracker_external_services_get_active (key_file); g_free (filename); --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/trackerd/tracker-external-services.h 2006-12-07 07:42:54.000000000 -0500 @@ -0,0 +1,39 @@ + +/* + * Copyright (C) 2006, Edward Duffy + * + * This library 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 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * + */ + +#ifndef TRACKER_EXTERNAL_SERVICES_H +#define TRACKER_EXTERNAL_SERVICES_H + +#include +#include "tracker-utils.h" + +GSList *tracker_external_services_get_active (GKeyFile *key_file); + +gchar **tracker_external_services_get_watch_list (gchar *service_key); + +gint tracker_external_services_get_part_count (gchar *service_key, gchar *path); + +gchar *tracker_external_services_get_service_type (FileInfo *info); + +gchar *tracker_external_services_get_text_file (FileInfo *info); + +void tracker_external_services_get_metadata (FileInfo *info, GHashTable *table); + +#endif /* TRACKER_EXTERNAL_SERVICES_H */ --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/trackerd/tracker-external-services.c 2006-12-07 07:42:52.000000000 -0500 @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2006, Edward Duffy + * + * This library 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 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * + */ + +#include +#include +#include "tracker-external-services.h" + +#define SERVICE_PATH LIBDIR "/tracker/external-services" + +extern Tracker *tracker; + +static void +setup_child_cb (gpointer user_data) +{ + alarm (GPOINTER_TO_INT (user_data)); + nice (19); +} + +static gboolean +tracker_external_services_check_deps (gchar *service_key) +{ + gchar *args[2]; + gchar *stderr; + gint exit_code; + gboolean result = TRUE; + + args[0] = g_build_filename (SERVICE_PATH, service_key, "check-deps", NULL); + args[1] = NULL; + + if (g_file_test (args[0], G_FILE_TEST_IS_EXECUTABLE)) { + if (g_spawn_sync (SERVICE_PATH, args, NULL, + G_SPAWN_STDOUT_TO_DEV_NULL, + setup_child_cb, GINT_TO_POINTER (10), + NULL, &stderr, &exit_code, NULL)) { + + if (exit_code != EXIT_SUCCESS) { + tracker_log ("Error loading service %s. Reason given: \"%s\"", service_key, stderr); + result = FALSE; + } + g_free (stderr); + } + } + g_free (args[0]); + return result; +} + +GSList * +tracker_external_services_get_active (GKeyFile *key_file) +{ + GSList *result; + gchar **services; + gsize n_services, i; + + result = NULL; + services = g_key_file_get_keys (key_file, "Services", &n_services, NULL); + for (i = 0; i < n_services; i++) { + gchar *path; + if (!g_key_file_get_boolean (key_file, "Services", services[i], NULL)) { + tracker_log ("%s disabled", services[i]); + continue; + } + path = g_strconcat (SERVICE_PATH, "/", services[i], NULL); + if (g_file_test (path, G_FILE_TEST_IS_DIR)) { + if (tracker_external_services_check_deps (services[i])) { + result = g_slist_append (result, g_strdup (services[i])); + } + } + g_free (path); + } + g_strfreev (services); + return result; +} + +gchar ** +tracker_external_services_get_watch_list (gchar *service_key) +{ + gchar *args[2]; + gchar *watch_list; + gint exit_code; + gchar **result = NULL; + + args[0] = g_build_filename (SERVICE_PATH, service_key, "watch-list", NULL); + args[1] = NULL; + + if (g_file_test (args[0], G_FILE_TEST_IS_EXECUTABLE)) { + if (g_spawn_sync (NULL, args, NULL, + G_SPAWN_STDERR_TO_DEV_NULL, + setup_child_cb, GINT_TO_POINTER (10), + &watch_list, NULL, &exit_code, NULL)) { + + if (exit_code == EXIT_SUCCESS) { + result = g_strsplit (watch_list, "\n", -1); + } + g_free (watch_list); + } + } + g_free (args[0]); + return result; +} + +#if 0 +gint +tracker_external_services_get_part_count (gchar *service_key, gchar *path) +{ + gchar *args[3]; + gchar *count; + gint exit_code; + gint result = 1; + + args[0] = g_build_filename (SERVICE_PATH, service_key, "count-parts", NULL); + args[1] = g_strdup (path); + args[2] = NULL; + + if (g_file_test (args[0], G_FILE_TEST_IS_EXECUTABLE)) { + if (g_spawn_sync (NULL, args, NULL, + G_SPAWN_STDERR_TO_DEV_NULL, + setup_child_cb, GINT_TO_POINTER (10), + &count, NULL, &exit_code, NULL)) { + + if (exit_code == EXIT_SUCCESS) { + result = atoi (count); + } + g_free (count); + } + } + g_free (args[1]); + g_free (args[0]); + return result; +} +#endif + +gchar * +tracker_external_services_get_service_type (FileInfo *info) +{ + gchar *args[4]; + gchar *service_type; + gint exit_code; + gchar *result = NULL; + + args[0] = g_build_filename (SERVICE_PATH, info->app->service_key, "service-type", NULL); + args[1] = g_strdup (info->uri); + args[2] = g_strdup (info->mime); + args[3] = NULL; + + if (g_file_test (args[0], G_FILE_TEST_IS_EXECUTABLE)) { + if (g_spawn_sync (NULL, args, NULL, + G_SPAWN_STDERR_TO_DEV_NULL, + setup_child_cb, GINT_TO_POINTER (10), + &service_type, NULL, &exit_code, NULL)) { + + if (exit_code == EXIT_SUCCESS) { + result = g_strstrip (service_type); + } + } + } + g_free (args[2]); + g_free (args[1]); + g_free (args[0]); + return result; +} + +gchar * +tracker_external_services_get_text_file (FileInfo *info) +{ + gchar *args[5]; + gchar *temp_file_name; + gint fd, exit_code; + gchar *result = NULL; + + temp_file_name = g_build_filename (tracker->sys_tmp_root_dir, "tmp_text_file_XXXXXX", NULL); + fd = g_mkstemp (temp_file_name); + if (fd == -1) { + tracker_log ("Error creating temporary file %s", temp_file_name); + } + else { + close (fd); + + args[0] = g_build_filename (SERVICE_PATH, info->app->service_key, "filter-text", NULL); + args[1] = g_strdup (info->uri); + args[2] = g_strdup (info->mime); + args[3] = temp_file_name; + args[4] = NULL; + + if (g_file_test (args[0], G_FILE_TEST_IS_EXECUTABLE)) { + if (g_spawn_sync (NULL, args, NULL, + G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, + setup_child_cb, GINT_TO_POINTER (30), + NULL, NULL, &exit_code, NULL)) { + + if (exit_code == EXIT_SUCCESS) { + result = g_strdup (temp_file_name); + } + } + } + g_free (args[2]); + g_free (args[1]); + g_free (args[0]); + } + g_free (temp_file_name); + return result; +} + +static void +print_table_cb (gpointer key, gpointer value, gpointer user_data) +{ + tracker_log("%s = \"%s\"", (gchar *)key, (gchar *)value); +} + +void +tracker_external_services_get_metadata (FileInfo *info, GHashTable *table) +{ + gchar *args[4]; + gchar *value; + gint exit_code; + + args[0] = g_build_filename (SERVICE_PATH, info->app->service_key, "extract-metadata", NULL); + args[1] = g_strdup (info->uri); + args[2] = g_strdup (info->mime); + args[3] = NULL; + + if (g_file_test (args[0], G_FILE_TEST_IS_EXECUTABLE)) { + if (g_spawn_sync (NULL, args, NULL, + G_SPAWN_STDERR_TO_DEV_NULL, + setup_child_cb, GINT_TO_POINTER (30), + &value, NULL, &exit_code, NULL)) { + + if (exit_code == EXIT_SUCCESS) { + tracker_parse_metadata (value, table); + } + g_free (value); + } + } + g_free (args[2]); + g_free (args[1]); + g_free (args[0]); + g_hash_table_foreach (table, print_table_cb, NULL); +} Index: src/trackerd/trackerd.c =================================================================== RCS file: /cvs/gnome/tracker/src/trackerd/trackerd.c,v retrieving revision 1.60 diff -u -p -r1.60 trackerd.c --- src/trackerd/trackerd.c 30 Nov 2006 13:26:51 -0000 1.60 +++ src/trackerd/trackerd.c 7 Dec 2006 14:40:48 -0000 @@ -63,6 +63,7 @@ #include "tracker-dbus-files.h" #include "tracker-indexer.h" +#include "tracker-external-services.h" Tracker *tracker; DBConnection *main_thread_db_con; @@ -116,7 +117,6 @@ static void delete_file (DBConnection *d static void scan_directory (const char *uri, DBConnection *db_con); - #ifdef POLL_ONLY gboolean tracker_start_watching (void){tracker->watch_limit = 0; return TRUE;} @@ -950,12 +950,13 @@ index_file (DBConnection *db_con, DBConn service_name = g_strdup ("Emails"); } else if (is_an_email_attachment) { service_name = g_strdup ("EmailAttachments"); + } else if (info->is_directory) { + service_name = g_strdup ("Folders"); + } else if (info->app) { + service_name = tracker_external_services_get_service_type (info); + // tracker_log ("%s is a %s", info->uri, service_name); } else { - if (info->is_directory) { - service_name = g_strdup ("Folders"); - } else { - service_name = tracker_get_service_type_for_mime (info->mime); - } + service_name = tracker_get_service_type_for_mime (info->mime); } if (!info->mime) { @@ -1006,7 +1007,7 @@ index_file (DBConnection *db_con, DBConn //info->file_id = tracker_db_get_file_id (db_con, info->uri); - //tracker_log ("created new service ID %d for %s with mime %s and service %s and mtime %d", info->file_id, info->uri, info->mime, service_name, info->mtime); + tracker_log ("created new service ID %d for %s with mime %s and service %s and mtime %d", info->file_id, info->uri, info->mime, service_name, info->mtime); g_free (service_name); @@ -1065,6 +1066,9 @@ index_file (DBConnection *db_con, DBConn tracker_close_mbox_and_free_memory (mb); + } else if (info->app) { + tracker_external_services_get_metadata (info, meta_table); + tracker_db_save_metadata (db_con, meta_table, info->file_id, info->is_new); } else { if (info->is_new) { @@ -1075,8 +1079,8 @@ index_file (DBConnection *db_con, DBConn tracker_db_save_metadata (db_con, meta_table, info->file_id, info->is_new); - g_hash_table_destroy (meta_table); } + g_hash_table_destroy (meta_table); } g_free (name); @@ -1093,7 +1097,7 @@ index_file (DBConnection *db_con, DBConn is_file_known = (info->file_id != 0 && (strcmp (info->mime, "unknown") != 0) && (strcmp (info->mime, "symlink") != 0)); is_file_indexable = (tracker_file_is_indexable (info->uri) && !is_a_mbox && !info->is_directory); - service_has_metadata = (((info->service_type_id <= 7) && (info->service_type_id >= 2)) || (info->service_type_id == 18 ) || (info->service_type_id == 23)); + service_has_metadata = (((info->service_type_id <= 7) && (info->service_type_id >= 2)) || (info->service_type_id == 18 ) || (info->service_type_id == 23) || (info->app != NULL)); if (is_file_known && is_file_indexable && service_has_metadata) { tracker_db_add_to_extract_queue (db_con, info); @@ -1142,6 +1146,7 @@ schedule_file_check (const char *uri, DB if (!tracker->is_running) { return; } + g_return_if_fail (uri && (uri[0] == '/')); g_return_if_fail (db_con); @@ -1177,6 +1182,29 @@ scan_directory (const char *uri, DBConne schedule_file_check (uri, db_con); } +static void +add_service_watches (gpointer data, gpointer user_data) +{ + gchar *service; + gchar **watch_list, **p; + + service = (gchar *)data; + watch_list = tracker_external_services_get_watch_list (service); + + for (p = watch_list; *p != NULL; ++p) { + if (strlen (*p) == 0) + continue; + if (g_file_test (*p, G_FILE_TEST_IS_DIR)) { + g_hash_table_insert (tracker->app_explicit_dir, g_strdup (*p), service); + } + else { + g_hash_table_insert (tracker->app_explicit_file, g_strdup (*p), service); + } + tracker_add_watch_dir (*p, main_thread_db_con); + schedule_file_check (*p, main_thread_db_con); + } + g_strfreev (watch_list); +} static gboolean @@ -1197,6 +1225,9 @@ start_watching (gpointer data) tracker_watch_emails (main_thread_db_con); } + /* add application support */ + g_slist_foreach (tracker->active_services, add_service_watches, NULL); + if (data) { char *watch_folder; int len; @@ -1453,7 +1484,6 @@ extract_metadata_thread (void) /* refresh stat data in case its changed */ info = tracker_get_file_info (info); - if (info->file_id == 0) { info->file_id = tracker_db_get_file_id (db_con, info->uri); } @@ -1488,7 +1518,10 @@ extract_metadata_thread (void) } - file_as_text = tracker_metadata_get_text_file (info->uri, info->mime); + if (info->app) + file_as_text = tracker_external_services_get_text_file (info); + else + file_as_text = tracker_metadata_get_text_file (info->uri, info->mime); if (tracker->enable_content_indexing && file_as_text) { const char *tmp_dir; @@ -1843,6 +1876,22 @@ process_files_thread (void) info = tracker_get_file_info (info); } + if (info->app == NULL && g_file_test (info->uri, G_FILE_TEST_IS_REGULAR)) { + gchar *service = NULL; + + /* should this be handled by an external module, or tracker? */ + service = g_hash_table_lookup (tracker->app_explicit_file, info->uri); + if (!service) { + gchar *dir = g_path_get_dirname (info->uri); + service = g_hash_table_lookup (tracker->app_explicit_dir, dir); + g_free (dir); + } + if (service) { + info->app = g_new(ExternalService, 1); + info->app->service_key = service; + } + } + /* check if file needs indexing */ need_index = (info->mtime > info->indextime); @@ -2568,6 +2617,7 @@ main (int argc, char **argv) setlocale (LC_ALL, ""); + g_type_init (); bindtextdomain (GETTEXT_PACKAGE, TRACKER_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); @@ -2638,6 +2688,10 @@ main (int argc, char **argv) tracker->is_running = FALSE; tracker->first_time_index = FALSE; + + tracker->app_explicit_dir = g_hash_table_new (g_str_hash, g_str_equal); + tracker->app_explicit_file = g_hash_table_new (g_str_hash, g_str_equal); + tracker->app_implicit_dir = NULL; tracker->poll_access_mutex = g_mutex_new (); Index: src/trackerd/tracker-metadata.c =================================================================== RCS file: /cvs/gnome/tracker/src/trackerd/tracker-metadata.c,v retrieving revision 1.23 diff -u -p -r1.23 tracker-metadata.c --- src/trackerd/tracker-metadata.c 30 Nov 2006 01:47:44 -0000 1.23 +++ src/trackerd/tracker-metadata.c 7 Dec 2006 14:42:07 -0000 @@ -371,6 +371,74 @@ tracker_metadata_get_thumbnail (const ch void +tracker_parse_metadata (gchar *value, GHashTable *table) +{ + if (value && strchr (value, '=') && strchr (value, ';')) { + char **values, **values_p; + + values = g_strsplit_set (value, ";", -1); + + for (values_p = values; *values_p; values_p++) { + char *meta_data, *sep; + + meta_data = g_strdup (g_strstrip (*values_p)); + + sep = strchr (meta_data, '='); + + if (sep) { + char *meta_name; + + meta_name = g_strndup (meta_data, sep - meta_data); + + if (meta_name) { + char *meta_value; + + meta_value = g_strdup (sep + 1); + + if (meta_value) { + char *st; + + //tracker_log ("testing %s = %s", meta_name, meta_value); + st = g_hash_table_lookup (table, meta_name); + + if (st == NULL) { + char *utf_value; + + if (!g_utf8_validate (meta_value, -1, NULL)) { + + utf_value = g_locale_to_utf8 (meta_value, -1, NULL, NULL, NULL); + } else { + utf_value = g_strdup (meta_value); + } + + if (utf_value) { + guint32 length = strlen (utf_value); + + if ((length > 0) && (length >= strlen (meta_value))) { + + g_debug ("%s = %s", meta_name, utf_value); + g_hash_table_insert (table, g_strdup (meta_name), g_strdup (utf_value)); + } + + g_free (utf_value); + } + } + + g_free (meta_value); + } + + g_free (meta_name); + } + } + + g_free (meta_data); + } + + g_strfreev (values); + } +} + +void tracker_metadata_get_embedded (const char *uri, const char *mime, GHashTable *table) { MetadataFileType meta_type; @@ -420,70 +488,7 @@ tracker_metadata_get_embedded (const cha NULL)) { /* parse returned stdout (value) and extract keys and associated metadata values */ - - if (value && strchr (value, '=') && strchr (value, ';')) { - char **values, **values_p; - - values = g_strsplit_set (value, ";", -1); - - for (values_p = values; *values_p; values_p++) { - char *meta_data, *sep; - - meta_data = g_strdup (g_strstrip (*values_p)); - - sep = strchr (meta_data, '='); - - if (sep) { - char *meta_name; - - meta_name = g_strndup (meta_data, sep - meta_data); - - if (meta_name) { - char *meta_value; - - meta_value = g_strdup (sep + 1); - - if (meta_value) { - char *st; - - //tracker_log ("testing %s = %s", meta_name, meta_value); - st = g_hash_table_lookup (table, meta_name); - - if (st == NULL) { - char *utf_value; - - if (!g_utf8_validate (meta_value, -1, NULL)) { - - utf_value = g_locale_to_utf8 (meta_value, -1, NULL, NULL, NULL); - } else { - utf_value = g_strdup (meta_value); - } - - if (utf_value) { - guint32 length = strlen (utf_value); - - if ((length > 0) && (length >= strlen (meta_value))) { - - g_debug ("%s = %s", meta_name, utf_value); - g_hash_table_insert (table, g_strdup (meta_name), g_strdup (utf_value)); - } - - g_free (utf_value); - } - } - - g_free (meta_value); - } - - g_free (meta_name); - } - } - - g_free (meta_data); - } - - g_strfreev (values); - } + tracker_parse_metadata (value, table); if (value) { g_free (value); --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/Makefile.am 2006-12-07 07:43:11.000000000 -0500 @@ -0,0 +1,8 @@ +SUBDIRS = \ + IndexManPages \ + IndexLiferea \ + IndexTomboy + +exservbindir = $(libdir)/tracker/external-services +exservbin_SCRIPTS = services.rc +EXTRA_DIST = $(exservbin_SCRIPTS) --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/services.rc 2006-12-07 07:43:12.000000000 -0500 @@ -0,0 +1,8 @@ +#!/bin/bash + +function require { + which $1 || { + echo "Cannot find $1" >/dev/stderr + exit 1 + } +} --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexManPages/Makefile.am 2006-12-07 07:43:07.000000000 -0500 @@ -0,0 +1,10 @@ +servicebindir = $(libdir)/tracker/external-services/IndexManPages + +servicebin_SCRIPTS = \ + check-deps \ + extract-metadata \ + filter-text \ + service-type \ + watch-list + +EXTRA_DIST = $(servicebin_SCRIPTS) --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexManPages/check-deps 2006-12-07 07:43:09.000000000 -0500 @@ -0,0 +1,11 @@ +#!/bin/bash + +source services.rc + +require cat +require grep +require zgrep +require troff +require gunzip +require manpath +require find --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexManPages/extract-metadata 2006-12-07 07:43:08.000000000 -0500 @@ -0,0 +1,16 @@ +#!/bin/bash + +# See "man 7 man" for help on this function +function print_metadata { + [ -n "$2" ] && echo "Man.Title=$2;" + [ -n "$3" ] && echo "Man.Section=$3;" + [ -n "$4" ] && echo "Man.Date=$4;" + [ -n "$5" ] && echo "Man.Source=$5;" + [ -n "$6" ] && echo "Man.Manual=$6;" + # TODO: Language? +} + +[ $2 == "application/x-gzip" ] && GREP=zgrep || GREP=grep + +eval print_metadata $($GREP --max-count=1 '^\.TH' $1) +exit 0 --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexManPages/filter-text 2006-12-07 07:43:08.000000000 -0500 @@ -0,0 +1,5 @@ +#!/bin/bash + +([ $2 == "application/x-gzip" ] \ + && gunzip --to-stdout "$1" \ + || cat $1) | troff -a > $3 --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexManPages/service-type 2006-12-07 07:43:06.000000000 -0500 @@ -0,0 +1,3 @@ +#!/bin/bash + +echo Man Pages --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexManPages/watch-list 2006-12-07 07:43:07.000000000 -0500 @@ -0,0 +1,15 @@ +#!/bin/bash + +# This will only give us English man pages. Remove the while loop for all +# languages. + +for dir in $(manpath | tr ':' ' ') +do + find $dir -type d | + while read x + do + parent_dir=$(basename $(dirname $x)) + dirname=$(basename $x) + [ $parent_dir == "man" -a ${dirname:0:3} == "man" ] && echo $x + done +done --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexTomboy/Makefile.am 2006-12-07 07:43:18.000000000 -0500 @@ -0,0 +1,10 @@ +servicebindir = $(libdir)/tracker/external-services/IndexTomboy + +servicebin_SCRIPTS = \ + check-deps \ + extract-metadata \ + filter-text \ + service-type \ + watch-list + +EXTRA_DIST = $(servicebin_SCRIPTS) --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexTomboy/check-deps 2006-12-07 07:43:20.000000000 -0500 @@ -0,0 +1,5 @@ +#!/bin/bash + +source services.rc + +require xsltproc --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexTomboy/extract-metadata 2006-12-07 07:43:18.000000000 -0500 @@ -0,0 +1,28 @@ +#!/bin/bash + +xsltproc - "$1" < + + + + + + + + + + + + + + + Note.Title= + + ; + + + +EOF --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexTomboy/filter-text 2006-12-07 07:43:18.000000000 -0500 @@ -0,0 +1,28 @@ +#!/bin/bash + +xsltproc - "$1" > $3 < + + + + + + + + + + + + + + + + + + + +EOF + --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexTomboy/service-type 2006-12-07 07:43:17.000000000 -0500 @@ -0,0 +1,3 @@ +#!/bin/bash + +echo Notes --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexTomboy/watch-list 2006-12-07 07:43:17.000000000 -0500 @@ -0,0 +1,3 @@ +#!/bin/bash + +echo ~/.tomboy --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexLiferea/Makefile.am 2006-12-07 10:48:26.000000000 -0500 @@ -0,0 +1,10 @@ +servicebindir = $(libdir)/tracker/external-services/IndexLiferea + +servicebin_SCRIPTS = \ + check-deps \ + extract-metadata \ + filter-text \ + service-type \ + watch-list + +EXTRA_DIST = $(servicebin_SCRIPTS) --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexLiferea/check-deps 2006-12-07 07:43:13.000000000 -0500 @@ -0,0 +1,7 @@ +#!/bin/bash + +source services.rc + +require cat +require xsltproc +require w3m --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexLiferea/count-parts 2006-12-07 07:43:15.000000000 -0500 @@ -0,0 +1,22 @@ +#!/bin/bash + +xsltproc - "$1" < + + + + + + + + + + + + + + + +EOF --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexLiferea/extract-metadata 2006-12-07 10:46:16.000000000 -0500 @@ -0,0 +1,42 @@ +#!/bin/bash + +xsltproc - "$1" < + + + + + + + + + + + + + + + + + + RSS.Title= + + ; + + + + RSS.Source= + + ; + + + + RSS.Description= + + ; + + + +EOF --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexLiferea/filter-text 2006-12-07 10:44:35.000000000 -0500 @@ -0,0 +1,31 @@ +#!/bin/bash + +xsltproc - "$1" > $3 < + + + + + + + + + + + + + + + + + + + + + + + +EOF +) | w3m -T text/html -dump > $3 --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexLiferea/watch-list 2006-12-07 07:43:13.000000000 -0500 @@ -0,0 +1,3 @@ +#!/bin/bash + +echo ~/.liferea/cache/feeds Index: data/sqlite-tracker.sql =================================================================== RCS file: /cvs/gnome/tracker/data/sqlite-tracker.sql,v retrieving revision 1.11 diff -u -p -r1.11 sqlite-tracker.sql --- data/sqlite-tracker.sql 10 Nov 2006 22:24:13 -0000 1.11 +++ data/sqlite-tracker.sql 7 Dec 2006 15:50:18 -0000 @@ -51,6 +51,8 @@ insert Into ServiceTypes (TypeID, TypeNa insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (28, 'History', 'History', 'history only', 0); insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (29, 'Projects', 'Project', 'projects only', 0); insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (30, 'Web Pages', 'Web', 'Visited web pages only', 0); +insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (31, 'Web Channels', 'RSS', 'Web channels subscribed too', 0); +insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (32, 'Man Pages', 'Man, File', 'manual page', 0); /* store volume and HAL info here for files */ CREATE TABLE Volumes @@ -320,6 +322,18 @@ insert Into MetaDataTypes (MetaName, Dat insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Email.Sender', 4, 1, 0, 10); insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Email.SentTo', 4, 1, 0, 10); insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Email.Subject', 0, 1, 0, 30); + +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Note.Title', 0, 1, 0, 1); + +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('RSS.Title', 0, 1, 0, 10); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('RSS.Source', 0, 1, 0, 100); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('RSS.Description', 0, 1, 0, 20); + +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Man.Title', 0, 1, 0, 1); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Man.Section', 0, 1, 0, 100); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Man.Date', 0, 1, 0, 100); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Man.Source', 0, 1, 0, 100); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Man.Manual', 0, 1, 0, 50); end transaction; Index: src/libtracker/tracker.h =================================================================== RCS file: /cvs/gnome/tracker/src/libtracker/tracker.h,v retrieving revision 1.10 diff -u -p -r1.10 tracker.h --- src/libtracker/tracker.h 19 Oct 2006 01:30:19 -0000 1.10 +++ src/libtracker/tracker.h 7 Dec 2006 15:51:43 -0000 @@ -60,11 +60,15 @@ typedef enum { SERVICE_CONTACTS, SERVICE_EMAILS, SERVICE_EMAILATTACHMENTS, + SERVICE_NOTES, SERVICE_APPOINTMENTS, SERVICE_TASKS, SERVICE_BOOKMARKS, SERVICE_HISTORY, - SERVICE_PROJECTS + SERVICE_PROJECTS, + SERVICE_WEB_PAGES, + SERVICE_WEB_CHANNELS, + SERVICE_MAN_PAGES, } ServiceType; Index: src/libtracker/tracker.c =================================================================== RCS file: /cvs/gnome/tracker/src/libtracker/tracker.c,v retrieving revision 1.11 diff -u -p -r1.11 tracker.c --- src/libtracker/tracker.c 5 Nov 2006 23:31:39 -0000 1.11 +++ src/libtracker/tracker.c 7 Dec 2006 15:52:04 -0000 @@ -103,11 +103,15 @@ char *service_types[] = { "Contacts", "Emails", "EmailAttachments", +"Notes", "Appointments", "Tasks", "Bookmarks", "History", -"Projects" +"Projects", +"Web Pages", +"Web Channels", +"Man Pages" }; Index: src/libtracker/tracker-search.c =================================================================== RCS file: /cvs/gnome/tracker/src/libtracker/tracker-search.c,v retrieving revision 1.20 diff -u -p -r1.20 tracker-search.c --- src/libtracker/tracker-search.c 21 Nov 2006 08:19:21 -0000 1.20 +++ src/libtracker/tracker-search.c 7 Dec 2006 15:52:11 -0000 @@ -153,6 +153,10 @@ main (int argc, char **argv) type = SERVICE_TEXT_FILES; } else if (g_ascii_strcasecmp (service, "Development") == 0) { type = SERVICE_DEVELOPMENT_FILES; + } else if (g_ascii_strcasecmp (service, "Notes") == 0) { + type = SERVICE_NOTES; + } else if (g_ascii_strcasecmp (service, "Man Pages") == 0) { + type = SERVICE_MAN_PAGES; } else { g_printerr (_("Service not recognized, searching in Other Files...\n")); type = SERVICE_OTHER_FILES; --- /dev/null 2006-10-23 12:36:11.000000000 -0400 +++ src/external-services/IndexLiferea/service-type 2006-12-07 07:43:13.000000000 -0500 @@ -0,0 +1,3 @@ +#!/bin/bash + +echo Web Channels