Index: src/trackerd/tracker-apps.h =================================================================== --- src/trackerd/tracker-apps.h (revision 0) +++ src/trackerd/tracker-apps.h (revision 0) @@ -0,0 +1,33 @@ +/* Tracker + * routines for applications + * Copyright (C) 2007, Marcus Rosell (mudflap75 gmail com) + * + * This library 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 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef _TRACKER_APPS_H_ +#define _TRACKER_APPS_H_ + +#include "tracker-utils.h" + +#include "config.h" + +#include "tracker-db-sqlite.h" + +void tracker_applications_add_service_directories(void); +void tracker_db_index_application (DBConnection *db_con, FileInfo *info); + +#endif Index: src/trackerd/tracker-metadata.c =================================================================== --- src/trackerd/tracker-metadata.c (revision 514) +++ src/trackerd/tracker-metadata.c (working copy) @@ -138,9 +138,6 @@ "text/x-tcl" }; - - - static MetadataFileType tracker_get_metadata_type (const char *mime) { Index: src/trackerd/trackerd.c =================================================================== --- src/trackerd/trackerd.c (revision 514) +++ src/trackerd/trackerd.c (working copy) @@ -61,6 +61,7 @@ #include "tracker-dbus-files.h" #include "tracker-email.h" #include "tracker-indexer.h" +#include "tracker-apps.h" Tracker *tracker; DBConnection *main_thread_db_con; @@ -932,6 +933,7 @@ if (tracker->enable_indexing) { tracker_email_add_service_directories (db_con->emails); + tracker_applications_add_service_directories(); tracker->status = STATUS_WATCHING; Index: src/trackerd/tracker-db.c =================================================================== --- src/trackerd/tracker-db.c (revision 514) +++ src/trackerd/tracker-db.c (working copy) @@ -22,11 +22,14 @@ #include #include +#include +#include + #include "tracker-db.h" #include "tracker-email.h" #include "tracker-metadata.h" +#include "tracker-apps.h" - extern Tracker *tracker; @@ -1029,11 +1032,3 @@ } -void -tracker_db_index_application (DBConnection *db_con, FileInfo *info) -{ - -/* todo */ -} - - Index: src/trackerd/Makefile.am =================================================================== --- src/trackerd/Makefile.am (revision 514) +++ src/trackerd/Makefile.am (working copy) @@ -78,6 +78,8 @@ $(fam_sources) \ $(qdbm_sources) \ $(db_sources) \ + tracker-apps.c \ + tracker-apps.h \ tracker-db.c \ tracker-db.h \ tracker-dbus.c \ Index: src/trackerd/tracker-utils.c =================================================================== --- src/trackerd/tracker-utils.c (revision 514) +++ src/trackerd/tracker-utils.c (working copy) @@ -102,7 +102,6 @@ return g_strdup (def->parent); } - int tracker_get_id_for_service (const char *service) { Index: src/trackerd/tracker-apps.c =================================================================== --- src/trackerd/tracker-apps.c (revision 0) +++ src/trackerd/tracker-apps.c (revision 0) @@ -0,0 +1,189 @@ +/* Tracker + * routines for applications + * Copyright (C) 2007, Marcus Rosell (mudflap75 gmail com) + * + * This library 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 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include + +#include "tracker-apps.h" +#include "tracker-db.h" + +/* Sets up service directories for application indexing + TODO: configuration to switch application indexing ON/OFF ? +*/ + +void +tracker_applications_add_service_directories(void) +{ + if (1) { /* TODO: configurable.. tracker->index_applications? */ + + char *value; + gchar *dir = NULL; + + value = getenv("XDG_DATA_HOME"); + if (value != NULL) { + dir = g_strdup_printf("%s/applications", value); + } + else { + char *home; + home = getenv("HOME"); + if (home != NULL) { + dir = g_strdup_printf("%s/.local/share/applications", home); + } + } + + /* Add user defined applications path to service directory list */ + if (dir != NULL) + { + tracker_log ("Registering path %s as belonging to service Applications", dir); + tracker_add_service_path("Applications", dir); + g_free(dir); + } + + /* Add system defined applications path to service directory list */ + value = getenv("XDG_DATA_DIRS"); + if (value != NULL) { + gchar **dir_array; + dir_array = g_strsplit (value, ":", 0); + + gint i; + for (i = 0; dir_array[i] != NULL; ++i) { + dir = g_strdup_printf("%s/applications", dir_array[i]); + tracker_log ("Registering path %s as belonging to service Applications", dir); + tracker_add_service_path("Applications", dir); + g_free(dir); + } + g_strfreev(dir_array); + } + else { + tracker_log ("Registering path %s as belonging to service Applications", "/usr/local/share/applications"); + tracker_log ("Registering path %s as belonging to service Applications", "/usr/share/applications"); + tracker_add_service_path("Applications", "/usr/local/share/applications"); + tracker_add_service_path("Applications", "/usr/share/applications"); + } + } +} + + +void +tracker_db_index_application (DBConnection *db_con, FileInfo *info) +{ + /* Index application metadata from .desktop files */ + + GHashTable *meta_table; + + GError *error = NULL; + GKeyFile *key_file = NULL; + + gchar *type = NULL; + gchar *hidden = NULL; + gchar *tmp_str = NULL; + gchar desktop_entry[] = { "Desktop Entry" }; + + /* Check (to be sure) if this is a .desktop file */ + if (g_str_has_suffix (info->uri, ".desktop") == FALSE) + return; + + const gchar * const *locale_array; + locale_array = g_get_language_names(); + + key_file = g_key_file_new(); + + if ( g_key_file_load_from_file( key_file, info->uri, G_KEY_FILE_NONE, &error) == TRUE) { + + type = g_key_file_get_string(key_file, desktop_entry, "Type", NULL); + hidden = g_key_file_get_string(key_file, desktop_entry, "Hidden", NULL); + + /* We're only interested in (non deleted) apps */ + gboolean do_entry = TRUE; + if (type == NULL) + do_entry = FALSE; + else if(strcmp(type, "Application") != 0 ) + do_entry = FALSE; + + if (hidden != NULL) { + if(g_ascii_strcasecmp(hidden, "true") == 0 ) + do_entry = FALSE; + } + + if (do_entry == TRUE) { + + meta_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free); + + g_hash_table_insert (meta_table, "App:LocaleName", g_strdup(locale_array[0])); + + if((tmp_str = g_key_file_get_locale_string( + key_file, + desktop_entry, + "Name", + locale_array[0], + NULL)) != NULL) { + + g_hash_table_insert (meta_table, "App:Name", tmp_str); + } + + if((tmp_str = g_key_file_get_locale_string( + key_file, + desktop_entry, + "GenericName", + locale_array[0], + NULL)) != NULL) { + + g_hash_table_insert (meta_table, "App:GenericName", tmp_str); + } + + if((tmp_str = g_key_file_get_locale_string( + key_file, + desktop_entry, + "Comment", + locale_array[0], + NULL)) != NULL) { + + g_hash_table_insert (meta_table, "App:Comment", tmp_str); + } + + if((tmp_str = g_key_file_get_locale_string( + key_file, + desktop_entry, + "Categories", + locale_array[0], + NULL)) != NULL) { + + g_hash_table_insert (meta_table, "App:Categories", tmp_str); + } + + if((tmp_str = g_key_file_get_locale_string( + key_file, + desktop_entry, + "Exec", + locale_array[0], + NULL)) != NULL) { + + g_hash_table_insert (meta_table, "App:Exec", tmp_str); + } + + tracker_db_index_service (db_con, info, "Applications", meta_table, NULL, FALSE, TRUE, FALSE, FALSE); + + g_hash_table_destroy (meta_table); + } + + g_key_file_free(key_file); + g_free(type); + } +} + Index: src/tracker-extract/tracker-extract.c =================================================================== --- src/tracker-extract/tracker-extract.c (revision 514) +++ src/tracker-extract/tracker-extract.c (working copy) @@ -134,6 +134,7 @@ { "image/jpeg", tracker_extract_exif }, #endif { "image/*", tracker_extract_imagemagick }, + { "", NULL } }; Index: data/sqlite-service-types.sql =================================================================== --- data/sqlite-service-types.sql (revision 514) +++ data/sqlite-service-types.sql (working copy) @@ -56,4 +56,5 @@ insert Into ServiceTypes (TypeID, MinID, MaxID, TypeClass, TypeName, Description, MainService) values (41,41,41, 'Conversations', 'GaimConversations', 'Gaim Conversations', 0); insert Into ServiceTypes (TypeID, MinID, MaxID, TypeClass, TypeName, Description, MainService) values (42,42,42, 'Conversations', 'XChatConversations', 'XChat Conversations', 0); + insert Into ServiceTypes (TypeID, MinID, MaxID, TypeClass, TypeName, Description, MainService) values (50,50,50, 'Applications', 'Applications', 'Applications', 1); Index: data/sqlite-metadata.sql =================================================================== --- data/sqlite-metadata.sql (revision 514) +++ data/sqlite-metadata.sql (working copy) @@ -202,4 +202,18 @@ insert Into MetaDataChildren (MetaDataID, ChildID) select P.ID, C.ID from MetaDataTypes P, MetaDataTypes C where P.MetaName = 'Email:Recipient' and C.MetaName = 'Email:SentTo'; insert Into MetaDataChildren (MetaDataID, ChildID) select P.ID, C.ID from MetaDataTypes P, MetaDataTypes C where P.MetaName = 'Email:Recipient' and C.MetaName = 'Email:CC'; +/* Application metadata */ + +insert Into MetaDataTypes (MetaName, DatatypeID, MultipleValues, Weight) values ('App:Name', 0, 0, 20); +insert Into MetaDataTypes (MetaName, DatatypeID, MultipleValues, Weight) values ('App:GenericName', 0, 0, 15); +insert Into MetaDataTypes (MetaName, DatatypeID, MultipleValues, Weight) values ('App:Comment', 0, 0, 10); +insert Into MetaDataTypes (MetaName, DatatypeID, MultipleValues, Weight) values ('App:Exec', 0, 0, 10); +insert Into MetaDataTypes (MetaName, DatatypeID, MultipleValues, Weight) values ('App:Categories', 5, 0, 1); +insert Into MetaDataTypes (MetaName, DatatypeID, MultipleValues, Weight) values ('App:LocaleName', 0, 0, 0); + +insert Into MetaDataChildren (MetaDataID, ChildID) select P.ID, C.ID from MetaDataTypes P, MetaDataTypes C where P.MetaName = 'DC:Title' and C.MetaName = 'App:Name'; +insert Into MetaDataChildren (MetaDataID, ChildID) select P.ID, C.ID from MetaDataTypes P, MetaDataTypes C where P.MetaName = 'DC:Description' and C.MetaName = 'App:GenericName'; +insert Into MetaDataChildren (MetaDataID, ChildID) select P.ID, C.ID from MetaDataTypes P, MetaDataTypes C where P.MetaName = 'DC:Comments' and C.MetaName = 'App:Comment'; + + end transaction;