GNOME Bugzilla – Bug 523200
Refactoring Service type "cache"
Last modified: 2008-04-08 10:10:39 UTC
Right now trackerd loads the service type descriptions from the database and keep the information cached in some hash tables. I provide a patch to encapsulate that data and their operations in one independient (and testable) module.
Created attachment 107554 [details] [review] Refactor isolating ServiceType related code in an independient module This patch: 1) Create a gobject called tracker-service. It contains the previous ServiceDef public struct, and all access methods. 2) Create a tracker-service-manager module, with all logic to search service type for mime, convert between names<->id, get parent of a service type,... 3) Update the ontology, adding relevant (and previously hardcoded) information (HasMetadata, HasThumb, HasFullText) 4) Update the code to use the previous components.
Created attachment 108061 [details] [review] Isolating Service Type management (updated patch) The same patch updated to current HEAD.
Comment on attachment 108061 [details] [review] Isolating Service Type management (updated patch) >diff --git a/trunk/data/services/default.service b/trunk/data/services/default.service >index 5409887..c4a9c94 100644 >--- a/trunk/data/services/default.service >+++ b/trunk/data/services/default.service >@@ -33,6 +33,9 @@ Mimes=application/rtf;text/richtext;application/msword;application/pdf;applicati > MimePrefixes=application/vnd.oasis.opendocument;application/vnd.sun.xml;application/vnd.stardivision; > ShowServiceFiles=true > ShowServiceDirectories=true >+HasMetadata=true >+HasFullText=true >+HasThumbs=true > > [WebHistory] > DisplayName=Web History >@@ -47,7 +50,9 @@ TabularMetadata=File:Name;File:Mime;Doc:Title;Doc:URL;Doc:Author;File:Size;File: > TileMetadata=Doc:Title;Doc:URL;Doc:Subject;Doc:Author;Doc:Created;Doc:PageCount;File:Size; > ShowServiceFiles=false > ShowServiceDirectories=false >- >+HasMetadata=true >+HasFullText=true >+HasThumbs=true > > > [Images] >@@ -69,6 +74,9 @@ Mimes=application/vnd.oasis.opendocument.image;application/x-krita; > MimePrefixes=image/; > ShowServiceFiles=true > ShowServiceDirectories=true >+HasMetadata=true >+HasFullText=false >+HasThumbs=true > > > [Music] >@@ -95,6 +103,9 @@ Mimes=application/ogg; > MimePrefixes=audio/; > ShowServiceFiles=true > ShowServiceDirectories=true >+HasMetadata=true >+HasFullText=false >+HasThumbs=false > > > [Videos] >@@ -115,6 +126,9 @@ TileMetadata=Video:Title;Video:Author;Video:Height;Video:Width;Video:Duration;Vi > MimePrefixes=video/; > ShowServiceFiles=true > ShowServiceDirectories=true >+HasMetadata=true >+HasFullText=false >+HasThumbs=true > > > [Text] >@@ -127,6 +141,9 @@ ContentMetadata=File:Contents > Mimes=text/plain;text/x-authors;text/x-changelog;text/x-copying;text/x-credits;text/x-install;text/x-readme; > ShowServiceFiles=true > ShowServiceDirectories=true >+HasMetadata=false >+HasFullText=true >+HasThumbs=false > > > [Development] >@@ -139,6 +156,9 @@ ContentMetadata=File:Contents > Mimes=application/x-perl;application/x-shellscript;application/x-php;application/x-java;application/x-javascript;application/x-glade;application/x-csh;application/x-class-file;application/x-awk;application/x-asp;application/x-ruby;application/x-m4;text/x-m4;text/x-c++;text/x-adasrc;text/x-c;text/x-c++hdr;text/x-chdr;text/x-csharp;text/x-c++src;text/x-csrc;text/x-dcl;text/x-dsrc;text/x-emacs-lisp;text/x-fortran;text/x-haskell;text/x-literate-haskell;text/x-java;text/x-java-source" ,text/x-makefile;text/x-objcsrc;text/x-pascal;text/x-patch;text/x-python;text/x-scheme;text/x-sql;text/x-tcl; > ShowServiceFiles=true > ShowServiceDirectories=true >+HasMetadata=false >+HasFullText=true >+HasThumbs=false > > [Other] > DisplayName=Other Files >@@ -146,6 +166,9 @@ Description=All other files that do not belong in any other category > Parent=Files > ShowServiceFiles=true > ShowServiceDirectories=true >+HasMetadata=true >+HasFullText=true >+HasThumbs=true > > [Emails] > DisplayName=Emails >@@ -218,6 +241,9 @@ Description=Conversation log files > UIVisible=true > Icon=stock_help-chat > ShowServiceFiles=true >+HasMetadata=false >+HasFullText=true >+HasThumbs=false > > [GaimConversations] > DisplayName=Gaim Conversations >@@ -225,6 +251,9 @@ Description=All Gaim Conversation logs > Parent=Conversations > Icon=stock_help-chat > ShowServiceFiles=true >+HasMetadata=false >+HasFullText=true >+HasThumbs=false > > [Applications] > DisplayName=Applications >@@ -236,3 +265,6 @@ KeyMetadata1=App:DisplayName > KeyMetadata2=App:Exec > KeyMetadata3=App:Icon > TileMetadata=App:GenericName;AppComment;App:Categories >+HasMetadata=false >+HasFullText=false >+HasThumbs=false >diff --git a/trunk/data/sqlite-stored-procs.sql b/trunk/data/sqlite-stored-procs.sql >index f2edde9..c48e5cb 100644 >--- a/trunk/data/sqlite-stored-procs.sql >+++ b/trunk/data/sqlite-stored-procs.sql >@@ -123,6 +123,9 @@ GetServiceTable select M.MetaName, M.ID from MetaDataTypes M where M.ID in (sele > InsertMimes replace into FileMimes (Mime) Values (?); > InsertMimePrefixes replace into FileMimePrefixes (MimePrefix) Values (?); > >+GetMimeForServiceId select Mime from FileMimes where ServiceTypeId = ?; >+GetMimePrefixeForServiceId select MimePrefix from FileMimesPrefix where ServiceTypeId = ?; >+ > ExistsPendingFiles select count (*) from FilePending where Action <> 20; > InsertPendingFile INSERT INTO FilePending (FileID, Action, PendingDate, FileUri, MimeType, IsDir, IsNew, RefreshEmbedded, RefreshContents, ServiceTypeID) VALUES (?,?,?,?,?,?,?,?,?,?); > CountPendingMetadataFiles select count (*) from FilePending where Action = 20; >diff --git a/trunk/src/tracker-preferences/tracker-preferences.c b/trunk/src/tracker-preferences/tracker-preferences.c >index 246bc49..cc517ed 100644 >--- a/trunk/src/tracker-preferences/tracker-preferences.c >+++ b/trunk/src/tracker-preferences/tracker-preferences.c >@@ -206,7 +206,7 @@ tracker_preferences_init (GTypeInstance *instance, gpointer g_class) > } > > priv->tracker_proxy = dbus_g_proxy_new_for_name (priv->connection, >- TRACKER_SERVICE, >+ TRACKER_DBUS_SERVICE, > TRACKER_OBJECT, > TRACKER_INTERFACE); > >@@ -486,7 +486,7 @@ name_owner_changed (DBusGProxy *proxy, const gchar *name, > const gchar *prev_owner, const gchar *new_owner, > gpointer data) > { >- if (!g_str_equal (name, TRACKER_SERVICE)) >+ if (!g_str_equal (name, TRACKER_DBUS_SERVICE)) > return; > > if (!first_time) >diff --git a/trunk/src/trackerd/Makefile.am b/trunk/src/trackerd/Makefile.am >index d5cb6de..6c79ba7 100644 >--- a/trunk/src/trackerd/Makefile.am >+++ b/trunk/src/trackerd/Makefile.am >@@ -92,6 +92,10 @@ trackerd_SOURCES = \ > tracker-rdf-query.h \ > tracker-utils.c \ > tracker-utils.h \ >+ tracker-service.c \ >+ tracker-service.h \ >+ tracker-service-manager.c \ >+ tracker-service-manager.h \ > tracker-ioprio.c \ > tracker-ioprio.h \ > tracker-os-dependant.h \ >diff --git a/trunk/src/trackerd/tracker-db-email.c b/trunk/src/trackerd/tracker-db-email.c >index 7851b74..162582f 100644 >--- a/trunk/src/trackerd/tracker-db-email.c >+++ b/trunk/src/trackerd/tracker-db-email.c >@@ -529,7 +529,7 @@ tracker_db_email_save_email (DBConnection *db_con, MailMessage *mm) > > } > >- type_id = tracker_get_id_for_service (service); >+ type_id = tracker_service_manager_get_id_for_service (service); > if (type_id == -1) { > tracker_error ("ERROR: service %s not found", service); > g_free (attachment_service); >diff --git a/trunk/src/trackerd/tracker-db-sqlite.c b/trunk/src/trackerd/tracker-db-sqlite.c >index 3422d4c..fa247d2 100644 >--- a/trunk/src/trackerd/tracker-db-sqlite.c >+++ b/trunk/src/trackerd/tracker-db-sqlite.c >@@ -52,6 +52,7 @@ > #include "tracker-metadata.h" > #include "tracker-utils.h" > #include "tracker-watch.h" >+#include "tracker-service-manager.h" > > #define MAX_TEXT_BUFFER 65567 > #define MAX_COMPRESS_BUFFER 65565 >@@ -189,9 +190,9 @@ sqlite3_get_service_name (sqlite3_context *context, int argc, sqlite3_value **ar > } > > default:{ >- char *output; >+ gchar *output; > >- output = tracker_get_service_by_id (sqlite3_value_int (argv[0])); >+ output = tracker_service_manager_get_service_by_id (sqlite3_value_int (argv[0])); > sqlite3_result_text (context, output, strlen (output), g_free); > } > } >@@ -209,9 +210,11 @@ sqlite3_get_service_type (sqlite3_context *context, int argc, sqlite3_value **ar > } > > default:{ >- int output; >+ const gchar *service; >+ gint output; > >- output = tracker_get_id_for_service ((char *) sqlite3_value_text (argv[0])); >+ service = (const gchar*) sqlite3_value_text (argv[0]); >+ output = tracker_service_manager_get_id_for_service (service); > sqlite3_result_int (context, output); > } > } >@@ -229,9 +232,11 @@ sqlite3_get_max_service_type (sqlite3_context *context, int argc, sqlite3_value > } > > default:{ >- int output; >+ const gchar *service; >+ gint output; > >- output = tracker_get_id_for_service ((char *) sqlite3_value_text (argv[0])); >+ service = (const gchar*) sqlite3_value_text (argv[0]); >+ output = tracker_service_manager_get_id_for_service (service); > > if (output == 0) { > output = 8; >@@ -780,7 +785,7 @@ tracker_db_connect_common (void) > > open_common_db (db_con); > >- db_con->db_type = DB_COMMON; >+ db_con->db_type = TRACKER_DB_TYPE_COMMON; > > db_con->cache = NULL; > db_con->emails = NULL; >@@ -1029,7 +1034,7 @@ tracker_db_connect (void) > > g_free (dbname); > >- db_con->db_type = DB_DATA; >+ db_con->db_type = TRACKER_DB_TYPE_DATA; > db_con->db_category = DB_CATEGORY_FILES; > > sqlite3_busy_timeout (db_con->db, 10000000); >@@ -1128,7 +1133,7 @@ tracker_db_connect_file_meta (void) > > db_con = g_new0 (DBConnection, 1); > >- db_con->db_type = DB_INDEX; >+ db_con->db_type = TRACKER_DB_TYPE_INDEX; > db_con->db_category = DB_CATEGORY_FILES; > db_con->index = db_con; > >@@ -1157,7 +1162,7 @@ tracker_db_connect_email_meta (void) > > db_con = g_new0 (DBConnection, 1); > >- db_con->db_type = DB_INDEX; >+ db_con->db_type = TRACKER_DB_TYPE_INDEX; > db_con->db_category = DB_CATEGORY_EMAILS; > > db_con->index = db_con; >@@ -1198,7 +1203,7 @@ tracker_db_connect_file_content (void) > > db_con = g_new0 (DBConnection, 1); > >- db_con->db_type = DB_CONTENT; >+ db_con->db_type = TRACKER_DB_TYPE_CONTENT; > db_con->db_category = DB_CATEGORY_FILES; > db_con->blob = db_con; > >@@ -1237,7 +1242,7 @@ tracker_db_connect_email_content (void) > > db_con = g_new0 (DBConnection, 1); > >- db_con->db_type = DB_CONTENT; >+ db_con->db_type = TRACKER_DB_TYPE_CONTENT; > db_con->db_category = DB_CATEGORY_EMAILS; > db_con->blob = db_con; > >@@ -1342,7 +1347,7 @@ tracker_db_connect_cache (void) > > g_free (dbname); > >- db_con->db_type = DB_CACHE; >+ db_con->db_type = TRACKER_DB_TYPE_CACHE; > db_con->cache = db_con; > > sqlite3_busy_timeout (db_con->db, 10000000); >@@ -1397,7 +1402,7 @@ tracker_db_connect_emails (void) > g_free (dbname); > > >- db_con->db_type = DB_EMAIL; >+ db_con->db_type = TRACKER_DB_TYPE_EMAIL; > db_con->db_category = DB_CATEGORY_EMAILS; > > db_con->emails = db_con; >@@ -1461,8 +1466,11 @@ tracker_db_connect_emails (void) > char * > tracker_db_get_alias (const char *service) > { >- int id = tracker_get_id_for_parent_service (service); >- char *parent = tracker_get_service_by_id (id); >+ gchar *parent; >+ gint id; >+ >+ id = tracker_service_manager_get_id_for_parent_service (service); >+ parent = tracker_service_manager_get_service_by_id (id); > > if (strcmp (parent, "Files") == 0) { > g_free (parent); >@@ -2408,39 +2416,10 @@ tracker_update_db (DBConnection *db_con) > } > > >-int >-tracker_metadata_is_key (const char *service, const char *meta_name) >+gint >+tracker_metadata_is_key (const gchar *service, const gchar *meta_name) > { >- int i; >- >- char *name = g_utf8_strdown (service, -1); >- >- ServiceDef *def = g_hash_table_lookup (tracker->service_table, name); >- >- g_free (name); >- >- if (!def) { >- tracker_log ("WARNING: service %s not found", service); >- return 0; >- } >- >- GSList *list; >- i = 0; >- for (list=def->key_metadata; list; list=list->next) { >- >- i++; >- if (list->data) { >- char *meta = (char *) list->data; >- >- if (strcasecmp (meta, meta_name) == 0) { >- return i; >- } >- } >- >- } >- >- return 0; >- >+ return tracker_service_manager_metadata_in_service (service, meta_name); > } > > >@@ -3343,6 +3322,7 @@ static void > update_metadata_index (DBConnection *db_con, const char *id, const char *service, FieldDef *def, const char *old_value, const char *new_value) > { > GHashTable *old_table, *new_table; >+ gint sid; > > if (!def) { > tracker_error ("ERROR: cannot find details for metadata type"); >@@ -3354,7 +3334,11 @@ update_metadata_index (DBConnection *db_con, const char *id, const char *service > new_table = NULL; > > if (old_value) { >- old_table = tracker_parse_text (old_table, old_value, def->weight, def->filtered, def->delimited); >+ old_table = tracker_parse_text (old_table, >+ old_value, >+ def->weight, >+ def->filtered, >+ def->delimited); > } > > /* parse new metadata value */ >@@ -3363,10 +3347,7 @@ update_metadata_index (DBConnection *db_con, const char *id, const char *service > } > > /* we only do differential updates so only changed words scores are updated */ >- >- int sid; >- >- sid = tracker_get_id_for_service (service); >+ sid = tracker_service_manager_get_id_for_service (service); > tracker_db_update_differential_index (db_con, old_table, new_table, id, sid); > > tracker_word_table_free (old_table); >@@ -3808,7 +3789,9 @@ tracker_db_set_metadata (DBConnection *db_con, const char *service, const char * > tracker_exec_proc (db_con, "SetMetadataKeyword", 3, id, def->id, values[i]); > > /* backup non-embedded data for embedded services */ >- if (do_backup && !def->embedded && tracker_is_service_embedded (service)) { >+ if (do_backup && >+ !def->embedded && >+ tracker_service_manager_is_service_embedded (service)) { > backup_non_embedded_metadata (db_con, id, def->id, values[i]); > } > >@@ -3836,7 +3819,9 @@ tracker_db_set_metadata (DBConnection *db_con, const char *service, const char * > } > > /* backup non-embedded data for embedded services */ >- if (do_backup && !def->embedded && tracker_is_service_embedded (service)) { >+ if (do_backup && >+ !def->embedded && >+ tracker_service_manager_is_service_embedded (service)) { > backup_non_embedded_metadata (db_con, id, def->id, values[i]); > } > >@@ -3870,7 +3855,9 @@ tracker_db_set_metadata (DBConnection *db_con, const char *service, const char * > if (!values[i] || !values[i][0]) continue; > > /* backup non-embedded data for embedded services */ >- if (do_backup && !def->embedded && tracker_is_service_embedded (service)) { >+ if (do_backup && >+ !def->embedded && >+ tracker_service_manager_is_service_embedded (service)) { > backup_non_embedded_metadata (db_con, id, def->id, values[i]); > } > >@@ -3890,7 +3877,9 @@ tracker_db_set_metadata (DBConnection *db_con, const char *service, const char * > if (!values[i] || !values[i][0]) continue; > > /* backup non-embedded data for embedded services */ >- if (do_backup && !def->embedded && tracker_is_service_embedded (service)) { >+ if (do_backup && >+ !def->embedded && >+ tracker_service_manager_is_service_embedded (service)) { > backup_non_embedded_metadata (db_con, id, def->id, values[i]); > } > >@@ -3908,7 +3897,9 @@ tracker_db_set_metadata (DBConnection *db_con, const char *service, const char * > if (!values[i] || !values[i][0]) continue; > > /* backup non-embedded data for embedded services */ >- if (do_backup && !def->embedded && tracker_is_service_embedded (service)) { >+ if (do_backup && >+ !def->embedded && >+ tracker_service_manager_is_service_embedded (service)) { > backup_non_embedded_metadata (db_con, id, def->id, values[i]); > } > >@@ -3935,7 +3926,9 @@ tracker_db_set_metadata (DBConnection *db_con, const char *service, const char * > tracker_exec_proc (db_con, "SetMetadataNumeric", 3, id, def->id, mvalue); > > /* backup non-embedded data for embedded services */ >- if (do_backup && !def->embedded && tracker_is_service_embedded (service)) { >+ if (do_backup && >+ !def->embedded && >+ tracker_service_manager_is_service_embedded (service)) { > backup_non_embedded_metadata (db_con, id, def->id, mvalue); > } > >@@ -4058,7 +4051,8 @@ tracker_db_delete_metadata_value (DBConnection *db_con, const char *service, con > } > > >- if (!def->embedded && tracker_is_service_embedded (service)) { >+ if (!def->embedded && >+ tracker_service_manager_is_service_embedded (service)) { > backup_delete_non_embedded_metadata_value (db_con, id, def->id, value); > } > >@@ -4197,7 +4191,8 @@ tracker_db_delete_metadata (DBConnection *db_con, const char *service, const cha > return; > } > >- if (!def->embedded && tracker_is_service_embedded (service)) { >+ if (!def->embedded && >+ tracker_service_manager_is_service_embedded (service)) { > backup_delete_non_embedded_metadata (db_con, id, def->id); > } > >@@ -4337,7 +4332,7 @@ tracker_db_create_service (DBConnection *db_con, const char *service, FileInfo * > str_mtime = tracker_gint32_to_str (info->mtime); > str_offset = tracker_gint32_to_str (info->offset); > >- service_type_id = tracker_get_id_for_service (service); >+ service_type_id = tracker_service_manager_get_id_for_service (service); > > if (info->mime) { > tracker_debug ("service id for %s is %d and sid is %s with mime %s", service, service_type_id, sid, info->mime); >@@ -4350,6 +4345,8 @@ tracker_db_create_service (DBConnection *db_con, const char *service, FileInfo * > str_aux = tracker_int_to_str (info->aux_id); > > if (service_type_id != -1) { >+ gchar *parent; >+ > // gchar *apath = tracker_escape_string (path); > // gchar *aname = tracker_escape_string (name); > >@@ -4383,7 +4380,7 @@ tracker_db_create_service (DBConnection *db_con, const char *service, FileInfo * > > tracker_exec_proc (db_con->common, "IncStat", 1, service); > >- char *parent = tracker_get_parent_service (service); >+ parent = tracker_service_manager_get_parent_service (service); > > if (parent) { > tracker_exec_proc (db_con->common, "IncStat", 1, parent); >@@ -4501,12 +4498,16 @@ delete_cache_words (guint32 file_id) > static void > dec_stat (DBConnection *db_con, int id) > { >- char *service = tracker_get_service_by_id (id); >+ gchar *service; >+ >+ service = tracker_service_manager_get_service_by_id (id); > > if (service) { >+ gchar *parent; >+ > tracker_exec_proc (db_con->common, "DecStat", 1, service); > >- char *parent = tracker_get_parent_service (service); >+ parent = tracker_service_manager_get_parent_service (service); > > if (parent) { > tracker_exec_proc (db_con->common, "DecStat", 1, parent); >@@ -4526,10 +4527,10 @@ dec_stat (DBConnection *db_con, int id) > char * > tracker_db_get_id (DBConnection *db_con, const char *service, const char *uri) > { >- int service_id; >+ gint service_id; > guint32 id; > >- service_id = tracker_get_id_for_service (service); >+ service_id = tracker_service_manager_get_id_for_service (service); > > if (service_id == -1) { > return NULL; >@@ -4933,19 +4934,19 @@ tracker_db_search_text_mime (DBConnection *db_con, const char *text, char **mime > GSList *hit_list, *result_list; > const GSList *tmp; > int count; >+ gint service_array[8]; > > result = NULL; > result_list = NULL; > >- int service_array[8]; >- service_array[0] = tracker_get_id_for_service ("Files"); >- service_array[1] = tracker_get_id_for_service ("Folders"); >- service_array[2] = tracker_get_id_for_service ("Documents"); >- service_array[3] = tracker_get_id_for_service ("Images"); >- service_array[4] = tracker_get_id_for_service ("Music"); >- service_array[5] = tracker_get_id_for_service ("Videos"); >- service_array[6] = tracker_get_id_for_service ("Text"); >- service_array[7] = tracker_get_id_for_service ("Other"); >+ service_array[0] = tracker_service_manager_get_id_for_service ("Files"); >+ service_array[1] = tracker_service_manager_get_id_for_service ("Folders"); >+ service_array[2] = tracker_service_manager_get_id_for_service ("Documents"); >+ service_array[3] = tracker_service_manager_get_id_for_service ("Images"); >+ service_array[4] = tracker_service_manager_get_id_for_service ("Music"); >+ service_array[5] = tracker_service_manager_get_id_for_service ("Videos"); >+ service_array[6] = tracker_service_manager_get_id_for_service ("Text"); >+ service_array[7] = tracker_service_manager_get_id_for_service ("Other"); > > SearchQuery *query = tracker_create_query (db_con->word_index, service_array, 8, 0, 999999); > >@@ -5050,19 +5051,19 @@ tracker_db_search_text_location (DBConnection *db_con, const char *text, const c > GSList *hit_list, *result_list; > const GSList *tmp; > int count; >+ gint service_array[8]; > > location_prefix = g_strconcat (location, G_DIR_SEPARATOR_S, NULL); > > >- int service_array[8]; >- service_array[0] = tracker_get_id_for_service ("Files"); >- service_array[1] = tracker_get_id_for_service ("Folders"); >- service_array[2] = tracker_get_id_for_service ("Documents"); >- service_array[3] = tracker_get_id_for_service ("Images"); >- service_array[4] = tracker_get_id_for_service ("Music"); >- service_array[5] = tracker_get_id_for_service ("Videos"); >- service_array[6] = tracker_get_id_for_service ("Text"); >- service_array[7] = tracker_get_id_for_service ("Other"); >+ service_array[0] = tracker_service_manager_get_id_for_service ("Files"); >+ service_array[1] = tracker_service_manager_get_id_for_service ("Folders"); >+ service_array[2] = tracker_service_manager_get_id_for_service ("Documents"); >+ service_array[3] = tracker_service_manager_get_id_for_service ("Images"); >+ service_array[4] = tracker_service_manager_get_id_for_service ("Music"); >+ service_array[5] = tracker_service_manager_get_id_for_service ("Videos"); >+ service_array[6] = tracker_service_manager_get_id_for_service ("Text"); >+ service_array[7] = tracker_service_manager_get_id_for_service ("Other"); > > SearchQuery *query = tracker_create_query (db_con->word_index, service_array, 8, 0, 999999); > >@@ -5165,19 +5166,19 @@ tracker_db_search_text_mime_location (DBConnection *db_con, const char *text, ch > GSList *hit_list, *result_list; > const GSList *tmp; > int count; >+ gint service_array[8]; > > location_prefix = g_strconcat (location, G_DIR_SEPARATOR_S, NULL); > > >- int service_array[8]; >- service_array[0] = tracker_get_id_for_service ("Files"); >- service_array[1] = tracker_get_id_for_service ("Folders"); >- service_array[2] = tracker_get_id_for_service ("Documents"); >- service_array[3] = tracker_get_id_for_service ("Images"); >- service_array[4] = tracker_get_id_for_service ("Music"); >- service_array[5] = tracker_get_id_for_service ("Videos"); >- service_array[6] = tracker_get_id_for_service ("Text"); >- service_array[7] = tracker_get_id_for_service ("Other"); >+ service_array[0] = tracker_service_manager_get_id_for_service ("Files"); >+ service_array[1] = tracker_service_manager_get_id_for_service ("Folders"); >+ service_array[2] = tracker_service_manager_get_id_for_service ("Documents"); >+ service_array[3] = tracker_service_manager_get_id_for_service ("Images"); >+ service_array[4] = tracker_service_manager_get_id_for_service ("Music"); >+ service_array[5] = tracker_service_manager_get_id_for_service ("Videos"); >+ service_array[6] = tracker_service_manager_get_id_for_service ("Text"); >+ service_array[7] = tracker_service_manager_get_id_for_service ("Other"); > > SearchQuery *query = tracker_create_query (db_con->word_index, service_array, 8, 0, 999999); > >@@ -5687,28 +5688,152 @@ tracker_db_get_keyword_list (DBConnection *db_con, const char *service) > return res; > } > >+GSList * >+tracker_db_mime_query (DBConnection *db_con, >+ const gchar *stored_proc, >+ gint service_id) >+{ >+ >+ GSList *result = NULL; >+ gchar *service_id_str; >+ gchar ***result_set; >+ >+ service_id_str = g_strdup_printf ("%d", service_id); >+ result_set = tracker_exec_proc (db_con, stored_proc, 1, service_id_str); >+ g_free (service_id_str); >+ >+ if (result_set) { >+ gchar **row; >+ gint k; >+ >+ for (k = 0; (row = tracker_db_get_row (result_set, k)); k++) { >+ result = g_slist_prepend (result, g_strdup(row[0])); >+ } >+ >+ tracker_db_free_result (result_set); >+ >+ } >+ >+ return result; >+} >+ >+GSList * >+tracker_db_get_mimes_for_service_id (DBConnection *db_con, >+ gint service_id) >+{ >+ return tracker_db_mime_query (db_con, "GetMimeForServiceId", service_id); >+} >+ >+GSList * >+tracker_db_get_mime_prefixes_for_service_id (DBConnection *db_con, >+ gint service_id) >+{ >+ return tracker_db_mime_query (db_con, "GetMimePrefixForServiceId", service_id); >+} >+ >+static TrackerService * >+db_row_to_service (gchar **row) >+{ >+ TrackerService *service; >+ GSList *new_list; >+ gint id; >+ const gchar *name; >+ gint i; >+ >+ if (!row[0] || !row[1] || >+ !row[2] || !row[3] || >+ !row[4] || !row[5] || >+ !row[6] || !row[7] || >+ !row[8]) { >+ return NULL; >+ } >+ >+ service = tracker_service_new (); >+ >+ new_list = NULL; >+ id = atoi (row[0]); >+ name = row[1]; >+ >+ tracker_service_set_id (service, id); >+ tracker_service_set_name (service, name); >+ tracker_service_set_parent (service, row[2]); >+ tracker_service_set_enabled (service, row[3][0] == '1'); >+ tracker_service_set_embedded (service, row[4][0] == '1'); >+ tracker_service_set_has_metadata (service, row[5][0] == '1'); >+ tracker_service_set_has_full_text (service, row[6][0] == '1'); >+ tracker_service_set_has_thumbs (service, row[7][0] == '1'); >+ >+ if (row[8][1]) { >+ tracker_service_set_content_metadata (service, row[8]); >+ } >+ >+ if (g_str_has_prefix (name, "Email") || >+ g_str_has_suffix (name, "Emails")) { >+ tracker_service_set_db_type (service, TRACKER_DB_TYPE_EMAIL); >+ >+ if (tracker->email_service_min == 0 || >+ id < tracker->email_service_min) { >+ tracker->email_service_min = id; >+ } >+ >+ if (tracker->email_service_max == 0 || >+ id > tracker->email_service_max) { >+ tracker->email_service_max = id; >+ } >+ } else { >+ tracker_service_set_db_type (service, TRACKER_DB_TYPE_DATA); >+ } >+ >+ tracker_service_set_show_service_files (service, row[10][0] == '1'); >+ tracker_service_set_show_service_directories (service, row[11][0] == '1'); >+ >+ for (i = 12; i < 23; i++) { >+ if (row[i] && row[i][1]) { >+ /* We do not duplicate the data here because >+ * the TrackerService will do this for us. >+ */ >+ new_list = g_slist_prepend (new_list, row[i]); >+ } >+ } >+ >+ /* Hack to prevent db change late in the cycle, check the >+ * service name matches "Applications", then add some voodoo. >+ */ >+ if (strcmp (name, "Applications") == 0) { >+ /* These strings should be definitions at the top of >+ * this file somewhere really. >+ */ >+ new_list = g_slist_prepend (new_list, "App:DisplayName"); >+ new_list = g_slist_prepend (new_list, "App:Exec"); >+ new_list = g_slist_prepend (new_list, "App:Icon"); >+ } >+ >+ new_list = g_slist_reverse (new_list); >+ >+ tracker_service_set_key_metadata (service, new_list); >+ g_slist_free (new_list); >+ >+ return service; >+} > > /* get static data like metadata field definitions and services definitions and load them into hashtables */ > void > tracker_db_get_static_data (DBConnection *db_con) > { >- int i = 0, j; >- char ***res; >+ gchar ***res; >+ gint i = 0; >+ gint j; > >- >- /* get static metadata info */ >+ /* Get static metadata info */ > res = tracker_exec_proc (db_con, "GetMetadataTypes", 0); > >- > if (res) { >- char **row; >+ gchar **row; > > while ((row = tracker_db_get_row (res, i))) { >- > i++; > > if (row[0] && row[1] && row[2] && row[3] && row[4] && row[5] && row[6] && row[7] && row[8] && row[9]) { >- > FieldDef *def = NULL; > > def = g_new (FieldDef, 1); >@@ -5733,7 +5858,6 @@ tracker_db_get_static_data (DBConnection *db_con) > char **row2; > > while ((row2 = tracker_db_get_row (res2, j))) { >- > j++; > > if (row2[1]) { >@@ -5744,97 +5868,59 @@ tracker_db_get_static_data (DBConnection *db_con) > } > > g_hash_table_insert (tracker->metadata_table, g_utf8_strdown (row[1], -1), def); >- tracker_debug ("loading metadata def %s with weight %d", def->field_name, def->weight); >- >+ tracker_debug ("loading metadata def %s with weight %d", >+ def->field_name, def->weight); > } >- > } >+ > tracker_db_free_result (res); > } > >- >- /* get static service info */ >- >+ /* Get static service info */ > res = tracker_exec_proc_ignore_nulls (db_con, "GetAllServices", 0); > > if (res) { >- char **row; >+ gchar **row; >+ > i = 0; > > tracker->email_service_min = 0; > tracker->email_service_max = 0; > >- while ((row = tracker_db_get_row (res, i))) { >+ while ((row = tracker_db_get_row (res, i++))) { >+ TrackerService *service; >+ gint id; >+ const gchar *name; >+ GSList *mimes; >+ GSList *mime_prefixes; > >- i++; >+ service = db_row_to_service (row); > >- if (row[0] && row[1] && row[2] && row[3] && row[4] && row[5] && row[6] && row[7] && row[8]) { >- ServiceDef *def = g_new0 (ServiceDef, 1); >- >- def->id = atoi (row[0]); >- def->name = g_strdup (row[1]); >- def->parent = g_strdup (row[2]); >- def->enabled = (row[3][0] == '1'); >- def->embedded = (row[4][0] == '1'); >- def->has_metadata = (row[5][0] == '1'); >- def->has_fulltext = (row[6][0] == '1'); >- def->has_thumbs = (row[7][0] == '1'); >- >- def->content_metadata = NULL; >- if (row[8][1]) { >- def->content_metadata = g_strdup (row[8]); >+ if (!service) { >+ continue; > } > >- if (g_str_has_prefix (def->name, "Email") || g_str_has_suffix (def->name, "Emails")) { >- def->database = DB_EMAIL; >+ id = tracker_service_get_id (service); >+ name = tracker_service_get_name (service); > >- if (tracker->email_service_min == 0 || def->id < tracker->email_service_min) { >- tracker->email_service_min = def->id; >- } >- >- if (tracker->email_service_max == 0 || def->id > tracker->email_service_max) { >- tracker->email_service_max = def->id; >- } >- >- >- >- } else { >- def->database = DB_DATA; >- } >- >- def->show_service_files = (row[10][0] == '1'); >- def->show_service_directories = (row[11][0] == '1'); >- >- def->key_metadata = NULL; >+ mimes = tracker_db_get_mimes_for_service_id (db_con, id); >+ mime_prefixes = tracker_db_get_mime_prefixes_for_service_id (db_con, id); > >- int j; >+ tracker_debug ("Adding service definition for %s with id %d", name, id); >+ tracker_service_manager_add_service (service, >+ mimes, >+ mime_prefixes); > >- for (j=12; j<23; j++) { >- if (row[j] && row[j][1]) { >- def->key_metadata = g_slist_prepend (def->key_metadata, g_strdup (row[j])); >- } >- } >+ g_slist_free (mimes); >+ g_slist_free (mime_prefixes); > >- /* hack to prevent db change late in the cycle */ >- if (strcmp (def->name, "Applications") == 0) { >- def->key_metadata = g_slist_prepend (def->key_metadata, g_strdup ("App:DisplayName")); >- def->key_metadata = g_slist_prepend (def->key_metadata, g_strdup ("App:Exec")); >- def->key_metadata = g_slist_prepend (def->key_metadata, g_strdup ("App:Icon")); >+ g_object_unref (service); > } > >- >- def->key_metadata = g_slist_reverse (def->key_metadata); >- >- tracker_debug ("adding service definition for %s with id %s", def->name, row[0]); >- g_hash_table_insert (tracker->service_table, g_utf8_strdown (def->name, -1), def); >- g_hash_table_insert (tracker->service_id_table, g_strdup (row[0]), def); >- } >- >- } > tracker_db_free_result (res); > > /* check for web history */ >- if (!g_hash_table_lookup (tracker->service_table, "Webhistory")) { >+ if (!tracker_service_manager_get_service ("Webhistory")) { > tracker_log ("Adding missing Webhistory service"); > tracker_exec_proc (db_con, "InsertServiceType", 1, "Webhistory"); > } >@@ -5846,11 +5932,11 @@ tracker_db_get_static_data (DBConnection *db_con) > DBConnection * > tracker_db_get_service_connection (DBConnection *db_con, const char *service) > { >- DBTypes type; >+ TrackerDBType type; > >- type = tracker_get_db_for_service (service); >+ type = tracker_service_manager_get_db_for_service (service); > >- if (type == DB_EMAIL) { >+ if (type == TRACKER_DB_TYPE_EMAIL) { > return db_con->emails; > } > >@@ -5966,23 +6052,18 @@ tracker_db_load_service_file (DBConnection *db_con, const char *filename, gboole > } else { > id = atoi (def->id); > } >- > } else if (is_service) { >+ TrackerService *service; > >- char *name = g_utf8_strdown (*array, -1); >+ tracker_log ("Trying to obtain service %s in cache", *array); >+ service = tracker_service_manager_get_service (*array); > >- ServiceDef *def = g_hash_table_lookup (tracker->service_table, *array); >- >- g_free (name); >- >- if (!def) { >+ if (!service) { > tracker_exec_proc (db_con, "InsertServiceType", 1, *array); > id = sqlite3_last_insert_rowid (db_con->db); > } else { >- id = def->id; >+ id = tracker_service_get_id (service); > } >- >- > } else { > /* TODO add support for extractors here */; > } >diff --git a/trunk/src/trackerd/tracker-db-sqlite.h b/trunk/src/trackerd/tracker-db-sqlite.h >index 1d30765..5bee29b 100644 >--- a/trunk/src/trackerd/tracker-db-sqlite.h >+++ b/trunk/src/trackerd/tracker-db-sqlite.h >@@ -26,7 +26,7 @@ > #include <glib.h> > > #include "tracker-utils.h" >- >+#include "tracker-service-manager.h" > > > typedef enum { >@@ -42,7 +42,7 @@ typedef enum { > > typedef struct { > sqlite3 *db; >- DBTypes db_type; >+ TrackerDBType db_type; > DBCategory db_category; > char *err; > char *name; >diff --git a/trunk/src/trackerd/tracker-db.c b/trunk/src/trackerd/tracker-db.c >index f29b6c9..1a464ea 100644 >--- a/trunk/src/trackerd/tracker-db.c >+++ b/trunk/src/trackerd/tracker-db.c >@@ -32,6 +32,7 @@ > #include "tracker-email.h" > #include "tracker-metadata.h" > #include "tracker-os-dependant.h" >+#include "tracker-service-manager.h" > > extern Tracker *tracker; > >@@ -796,13 +797,6 @@ tracker_db_insert_pending_file (DBConnection *db_con, guint32 file_id, const cha > } > > >-gboolean >-tracker_is_valid_service (DBConnection *db_con, const char *service) >-{ >- return tracker_get_id_for_service (service) != -1; >-} >- >- > static void > restore_backup_data (gpointer mtype, > gpointer value, >@@ -850,7 +844,7 @@ tracker_db_index_service (DBConnection *db_con, FileInfo *info, const char *serv > uri = attachment_uri; > } > >- info->service_type_id = tracker_get_id_for_service (service); >+ info->service_type_id = tracker_service_manager_get_id_for_service (service); > > if (info->service_type_id == -1) { > tracker_log ("Service %s not supported yet", service); >@@ -952,7 +946,7 @@ tracker_db_index_service (DBConnection *db_con, FileInfo *info, const char *serv > } > > if (attachment_service) { >- info->service_type_id = tracker_get_id_for_service (attachment_service); >+ info->service_type_id = tracker_service_manager_get_id_for_service (attachment_service); > } > > /* save stuff to Db */ >@@ -1094,9 +1088,6 @@ tracker_db_index_master_files (DBConnection *db_con, const gchar *dirname, const > void > tracker_db_index_file (DBConnection *db_con, FileInfo *info, const char *attachment_uri, const char *attachment_service) > { >- char *services_with_metadata[] = {"Documents", "Music", "Videos", "Images","WebHistory", NULL}; >- char *services_with_text[] = {"Documents", "Development", "Text", "WebHistory",NULL}; >- char *services_with_thumbs[] = {"Documents", "Images", "Videos", "WebHistory",NULL}; > > GHashTable *meta_table; > const char *ext; >@@ -1129,7 +1120,7 @@ tracker_db_index_file (DBConnection *db_con, FileInfo *info, const char *attachm > > tracker_info ("mime is %s for %s", info->mime, info->uri); > >- service_name = tracker_get_service_type_for_mime (info->mime); >+ service_name = tracker_service_manager_get_service_type_for_mime (info->mime); > > } > >@@ -1216,14 +1207,25 @@ tracker_db_index_file (DBConnection *db_con, FileInfo *info, const char *attachm > > > is_external_service = g_str_has_prefix (info->mime, "service/"); >- is_file_indexable = (!info->is_directory && (strcmp (info->mime, "unknown") != 0) && (strcmp (info->mime, "symlink") != 0) && tracker_file_is_indexable (info->uri)); >- >- service_has_metadata = (is_external_service || >- (is_file_indexable && (tracker_str_in_array (service_name, services_with_metadata) != -1))) && !is_sidecar; >- service_has_fulltext = (is_external_service || >- (is_file_indexable && (tracker_str_in_array (service_name, services_with_text) != -1))) && !is_sidecar; >- service_has_thumbs = (is_external_service || >- (is_file_indexable && (tracker_str_in_array (service_name, services_with_thumbs) != -1))); >+ is_file_indexable = (!info->is_directory && >+ (strcmp (info->mime, "unknown") != 0) && >+ (strcmp (info->mime, "symlink") != 0) && >+ tracker_file_is_indexable (info->uri)); >+ >+ service_has_metadata = >+ (is_external_service || >+ (is_file_indexable && >+ tracker_service_manager_has_metadata (service_name))) && >+ !is_sidecar; >+ service_has_fulltext = >+ (is_external_service || >+ (is_file_indexable && >+ tracker_service_manager_has_text (service_name))) && >+ !is_sidecar; >+ service_has_thumbs = >+ (is_external_service || >+ (is_file_indexable && >+ tracker_service_manager_has_thumbnails (service_name))); > > #ifdef HAVE_EXEMPI > if (!info->is_directory) { >diff --git a/trunk/src/trackerd/tracker-dbus-files.c b/trunk/src/trackerd/tracker-dbus-files.c >index 0d94af4..9a0437c 100644 >--- a/trunk/src/trackerd/tracker-dbus-files.c >+++ b/trunk/src/trackerd/tracker-dbus-files.c >@@ -24,6 +24,7 @@ > #include "tracker-dbus-methods.h" > #include "tracker-metadata.h" > #include "tracker-dbus-files.h" >+#include "tracker-service-manager.h" > > void > tracker_dbus_method_files_exists (DBusRec *rec) >@@ -85,7 +86,7 @@ tracker_dbus_method_files_exists (DBusRec *rec) > service = g_strdup ("Files"); > } else { > info->mime = tracker_get_mime_type (uri); >- service = tracker_get_service_type_for_mime (info->mime); >+ service = tracker_service_manager_get_service_type_for_mime (info->mime); > info = tracker_get_file_info (info); > } > >@@ -161,7 +162,7 @@ tracker_dbus_method_files_create (DBusRec *rec) > info = tracker_create_file_info (uri, 1, 0, 0); > > info->mime = g_strdup (mime); >- service = tracker_get_service_type_for_mime (mime); >+ service = tracker_service_manager_get_service_type_for_mime (mime); > info->is_directory = is_dir; > info->file_size = size; > info->mtime = mtime; >@@ -334,7 +335,7 @@ tracker_dbus_method_files_get_service_type (DBusRec *rec) > > mime = tracker_get_metadata (db_con, "Files", str_id, "File:Mime"); > >- result = tracker_get_service_type_for_mime (mime); >+ result = tracker_service_manager_get_service_type_for_mime (mime); > > tracker_log ("Info for file %s is : id=%u, mime=%s, service=%s", uri, file_id, mime, result); > >@@ -635,7 +636,7 @@ tracker_dbus_method_files_get_by_service_type (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >diff --git a/trunk/src/trackerd/tracker-dbus-keywords.c b/trunk/src/trackerd/tracker-dbus-keywords.c >index 764cf08..c0e1a66 100644 >--- a/trunk/src/trackerd/tracker-dbus-keywords.c >+++ b/trunk/src/trackerd/tracker-dbus-keywords.c >@@ -89,7 +89,9 @@ tracker_dbus_signal_keywords_added (const char *service, const char *uri, const > DBusMessage *msg; > dbus_uint32_t serial = 0; > >- msg = dbus_message_new_signal (TRACKER_OBJECT, TRACKER_INTERFACE_KEYWORDS, TRACKER_SIGNAL_KEYWORD_ADDED); >+ msg = dbus_message_new_signal (TRACKER_OBJECT, >+ TRACKER_INTERFACE_KEYWORDS, >+ TRACKER_SIGNAL_KEYWORD_ADDED); > > if (!msg || !tracker->dbus_con) { > return; >@@ -131,7 +133,9 @@ tracker_dbus_signal_keywords_removed (const char *service, const char *uri, cons > DBusMessage *msg; > dbus_uint32_t serial = 0; > >- msg = dbus_message_new_signal (TRACKER_OBJECT, TRACKER_INTERFACE_KEYWORDS, TRACKER_SIGNAL_KEYWORD_REMOVED); >+ msg = dbus_message_new_signal (TRACKER_OBJECT, >+ TRACKER_INTERFACE_KEYWORDS, >+ TRACKER_SIGNAL_KEYWORD_REMOVED); > > if (!msg || !tracker->dbus_con) { > return; >@@ -200,7 +204,7 @@ tracker_dbus_method_keywords_get_list (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -249,7 +253,7 @@ tracker_dbus_method_keywords_get (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -330,7 +334,7 @@ tracker_dbus_method_keywords_add (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -408,7 +412,7 @@ tracker_dbus_method_keywords_remove (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -483,7 +487,7 @@ tracker_dbus_method_keywords_remove_all (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -556,7 +560,7 @@ tracker_dbus_method_keywords_search (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -598,10 +602,10 @@ tracker_dbus_method_keywords_search (DBusRec *rec) > > g_string_free (str_words, TRUE); > >- int smin, smax; >+ gint smin, smax; > char *str_min, *str_max; > >- smin = tracker_get_id_for_service (service); >+ smin = tracker_service_manager_get_id_for_service (service); > > if (smin == 0) { > smax = 8; >diff --git a/trunk/src/trackerd/tracker-dbus-metadata.c b/trunk/src/trackerd/tracker-dbus-metadata.c >index 816d67d..6d478b8 100644 >--- a/trunk/src/trackerd/tracker-dbus-metadata.c >+++ b/trunk/src/trackerd/tracker-dbus-metadata.c >@@ -61,7 +61,7 @@ tracker_dbus_method_metadata_set (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -159,7 +159,7 @@ tracker_dbus_method_metadata_get (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >diff --git a/trunk/src/trackerd/tracker-dbus-methods.c b/trunk/src/trackerd/tracker-dbus-methods.c >index ac98096..f2deb8b 100644 >--- a/trunk/src/trackerd/tracker-dbus-methods.c >+++ b/trunk/src/trackerd/tracker-dbus-methods.c >@@ -140,7 +140,7 @@ tracker_get_file_id (DBConnection *db_con, const char *uri, gboolean create_reco > service = g_strdup ("Files"); > } else { > info->mime = tracker_get_mime_type (uri_in_locale); >- service = tracker_get_service_type_for_mime (info->mime); >+ service = tracker_service_manager_get_service_type_for_mime (info->mime); > info = tracker_get_file_info (info); > } > >diff --git a/trunk/src/trackerd/tracker-dbus-search.c b/trunk/src/trackerd/tracker-dbus-search.c >index 3dff7d4..6caa8f1 100644 >--- a/trunk/src/trackerd/tracker-dbus-search.c >+++ b/trunk/src/trackerd/tracker-dbus-search.c >@@ -25,10 +25,10 @@ > #include "tracker-dbus-methods.h" > #include "tracker-rdf-query.h" > #include "tracker-indexer.h" >+#include "tracker-service-manager.h" > > extern Tracker *tracker; > >- > void > tracker_dbus_method_search_get_hit_count (DBusRec *rec) > { >@@ -68,7 +68,7 @@ tracker_dbus_method_search_get_hit_count (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -86,27 +86,27 @@ tracker_dbus_method_search_get_hit_count (DBusRec *rec) > DBusMessage *reply; > int service_count = 1; > >- service_array[0] = tracker_get_id_for_service (service); >+ service_array[0] = tracker_service_manager_get_id_for_service (service); > > if (strcmp (service, "Files") == 0) { >- service_array[1] = tracker_get_id_for_service ("Folders"); >- service_array[2] = tracker_get_id_for_service ("Documents"); >- service_array[3] = tracker_get_id_for_service ("Images"); >- service_array[4] = tracker_get_id_for_service ("Videos"); >- service_array[5] = tracker_get_id_for_service ("Music"); >- service_array[6] = tracker_get_id_for_service ("Text"); >- service_array[7] = tracker_get_id_for_service ("Development"); >- service_array[8] = tracker_get_id_for_service ("Other"); >+ service_array[1] = tracker_service_manager_get_id_for_service ("Folders"); >+ service_array[2] = tracker_service_manager_get_id_for_service ("Documents"); >+ service_array[3] = tracker_service_manager_get_id_for_service ("Images"); >+ service_array[4] = tracker_service_manager_get_id_for_service ("Videos"); >+ service_array[5] = tracker_service_manager_get_id_for_service ("Music"); >+ service_array[6] = tracker_service_manager_get_id_for_service ("Text"); >+ service_array[7] = tracker_service_manager_get_id_for_service ("Development"); >+ service_array[8] = tracker_service_manager_get_id_for_service ("Other"); > service_count = 9; > > } else if (strcmp (service, "Emails") == 0) { >- service_array[1] = tracker_get_id_for_service ("EvolutionEmails"); >- service_array[2] = tracker_get_id_for_service ("KMailEmails"); >- service_array[3] = tracker_get_id_for_service ("ThunderbirdEmails"); >+ service_array[1] = tracker_service_manager_get_id_for_service ("EvolutionEmails"); >+ service_array[2] = tracker_service_manager_get_id_for_service ("KMailEmails"); >+ service_array[3] = tracker_service_manager_get_id_for_service ("ThunderbirdEmails"); > service_count = 4; > > } else if (strcmp (service, "Conversations") == 0) { >- service_array[1] = tracker_get_id_for_service ("GaimConversations"); >+ service_array[1] = tracker_service_manager_get_id_for_service ("GaimConversations"); > service_count = 2; > } > >@@ -251,7 +251,7 @@ tracker_dbus_method_search_text (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -368,7 +368,7 @@ tracker_dbus_method_search_text_detailed (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -439,7 +439,7 @@ tracker_dbus_method_search_get_snippet (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -624,7 +624,7 @@ tracker_dbus_method_search_metadata (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -691,7 +691,7 @@ tracker_dbus_method_search_matching_fields (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >@@ -790,7 +790,7 @@ tracker_dbus_method_search_query (DBusRec *rec) > return; > } > >- if (!tracker_is_valid_service (db_con, service)) { >+ if (!tracker_service_manager_is_valid_service (service)) { > tracker_set_error (rec, "Invalid service %s or service has not been implemented yet", service); > return; > } >diff --git a/trunk/src/trackerd/tracker-dbus.c b/trunk/src/trackerd/tracker-dbus.c >index 63fc542..da2173c 100644 >--- a/trunk/src/trackerd/tracker-dbus.c >+++ b/trunk/src/trackerd/tracker-dbus.c >@@ -69,7 +69,10 @@ tracker_dbus_init (void) > > dbus_error_init (&error); > >- ret = dbus_bus_request_name (connection, TRACKER_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error); >+ ret = dbus_bus_request_name (connection, >+ TRACKER_DBUS_SERVICE, >+ DBUS_NAME_FLAG_DO_NOT_QUEUE, >+ &error); > > if (dbus_error_is_set (&error)) { > tracker_error ("ERROR: could not acquire service name due to '%s'", error.message); >@@ -81,7 +84,10 @@ tracker_dbus_init (void) > exit (EXIT_FAILURE); > } > >- if (!dbus_connection_register_object_path (connection, TRACKER_OBJECT, &tracker_vtable, NULL)) { >+ if (!dbus_connection_register_object_path (connection, >+ TRACKER_OBJECT, >+ &tracker_vtable, >+ NULL)) { > tracker_error ("ERROR: could not register D-BUS handlers"); > connection = NULL; > } >@@ -116,7 +122,9 @@ tracker_dbus_send_index_status_change_signal () > gboolean battery_pause; > gboolean enable_indexing; > >- msg = dbus_message_new_signal (TRACKER_OBJECT, TRACKER_INTERFACE, TRACKER_SIGNAL_INDEX_STATUS_CHANGE); >+ msg = dbus_message_new_signal (TRACKER_OBJECT, >+ TRACKER_INTERFACE, >+ TRACKER_SIGNAL_INDEX_STATUS_CHANGE); > > if (!msg || !tracker->dbus_con) { > return; >@@ -172,7 +180,9 @@ tracker_dbus_send_index_progress_signal (const char *service, const char *uri) > dbus_uint32_t serial = 0; > int count, processed; > >- msg = dbus_message_new_signal (TRACKER_OBJECT, TRACKER_INTERFACE, TRACKER_SIGNAL_INDEX_PROGRESS); >+ msg = dbus_message_new_signal (TRACKER_OBJECT, >+ TRACKER_INTERFACE, >+ TRACKER_SIGNAL_INDEX_PROGRESS); > > if (!msg || !tracker->dbus_con) { > return; >@@ -240,7 +250,9 @@ tracker_dbus_send_index_finished_signal () > dbus_uint32_t serial = 0; > int i = time (NULL) - tracker->index_time_start; > >- msg = dbus_message_new_signal (TRACKER_OBJECT, TRACKER_INTERFACE, TRACKER_SIGNAL_INDEX_FINISHED); >+ msg = dbus_message_new_signal (TRACKER_OBJECT, >+ TRACKER_INTERFACE, >+ TRACKER_SIGNAL_INDEX_FINISHED); > > if (!msg || !tracker->dbus_con) { > return; >@@ -297,7 +309,9 @@ message_func (DBusConnection *conn, > } > > /* process shutdown calls in this thread */ >- if (dbus_message_is_method_call (message, TRACKER_INTERFACE, TRACKER_METHOD_SHUTDOWN)) { >+ if (dbus_message_is_method_call (message, >+ TRACKER_INTERFACE, >+ TRACKER_METHOD_SHUTDOWN)) { > > DBusMessage *reply; > DBusError dbus_error; >diff --git a/trunk/src/trackerd/tracker-dbus.h b/trunk/src/trackerd/tracker-dbus.h >index e183c1b..8d148d7 100644 >--- a/trunk/src/trackerd/tracker-dbus.h >+++ b/trunk/src/trackerd/tracker-dbus.h >@@ -30,7 +30,7 @@ > #include <dbus/dbus-glib.h> > > >-#define TRACKER_SERVICE "org.freedesktop.Tracker" >+#define TRACKER_DBUS_SERVICE "org.freedesktop.Tracker" > #define TRACKER_OBJECT "/org/freedesktop/tracker" > #define TRACKER_INTERFACE "org.freedesktop.Tracker" > #define TRACKER_INTERFACE_METADATA "org.freedesktop.Tracker.Metadata" >diff --git a/trunk/src/trackerd/tracker-indexer.c b/trunk/src/trackerd/tracker-indexer.c >index 37c94a9..42abd1e 100644 >--- a/trunk/src/trackerd/tracker-indexer.c >+++ b/trunk/src/trackerd/tracker-indexer.c >@@ -52,6 +52,7 @@ > #include "tracker-indexer.h" > #include "tracker-cache.h" > #include "tracker-dbus.h" >+#include "tracker-service-manager.h" > > extern Tracker *tracker; > >@@ -1632,19 +1633,30 @@ tracker_get_hit_counts (SearchQuery *query) > GSList *tmp; > > for (tmp = query->hits; tmp; tmp=tmp->next) { >- SearchHit *hit = tmp->data; >- guint32 count = GPOINTER_TO_UINT (g_hash_table_lookup (table, GUINT_TO_POINTER (hit->service_type_id))) + 1; >+ SearchHit *hit; >+ gpointer data; >+ guint32 count; >+ gint parent_id; > >- g_hash_table_insert (table, GUINT_TO_POINTER (hit->service_type_id), GUINT_TO_POINTER (count)); >+ hit = tmp->data; >+ data = g_hash_table_lookup (table, GUINT_TO_POINTER (hit->service_type_id)); >+ count = GPOINTER_TO_UINT (data) + 1; > >+ g_hash_table_insert (table, >+ GUINT_TO_POINTER (hit->service_type_id), >+ GUINT_TO_POINTER (count)); > >- /* update service's parent count too (if it has a parent) */ >- gint parent_id = tracker_get_parent_id_for_service_id (hit->service_type_id); >+ >+ /* Update service's parent count too (if it has a parent) */ >+ parent_id = tracker_service_manager_get_parent_id_for_service_id (hit->service_type_id); > > if (parent_id != -1) { >- count = GPOINTER_TO_UINT (g_hash_table_lookup (table, GUINT_TO_POINTER (parent_id))) + 1; >+ data = g_hash_table_lookup (table, GUINT_TO_POINTER (parent_id)); >+ count = GPOINTER_TO_UINT (data) + 1; > >- g_hash_table_insert (table, GUINT_TO_POINTER (parent_id), GUINT_TO_POINTER (count)); >+ g_hash_table_insert (table, >+ GUINT_TO_POINTER (parent_id), >+ GUINT_TO_POINTER (count)); > } > } > tracker_index_free_hit_list (query->hits); >@@ -1660,18 +1672,29 @@ tracker_get_hit_counts (SearchQuery *query) > GSList *tmp; > > for (tmp = query->hits; tmp; tmp=tmp->next) { >- SearchHit *hit = tmp->data; >- guint32 count = GPOINTER_TO_UINT (g_hash_table_lookup (table, GUINT_TO_POINTER (hit->service_type_id))) + 1; >+ SearchHit *hit; >+ gpointer data; >+ guint32 count; >+ gint parent_id; > >- g_hash_table_insert (table, GUINT_TO_POINTER (hit->service_type_id), GUINT_TO_POINTER (count)); >+ hit = tmp->data; >+ data = g_hash_table_lookup (table, GUINT_TO_POINTER (hit->service_type_id)); >+ count = GPOINTER_TO_UINT (data) + 1; >+ >+ g_hash_table_insert (table, >+ GUINT_TO_POINTER (hit->service_type_id), >+ GUINT_TO_POINTER (count)); > > /* update service's parent count too (if it has a parent) */ >- gint parent_id = tracker_get_parent_id_for_service_id (hit->service_type_id); >+ parent_id = tracker_service_manager_get_parent_id_for_service_id (hit->service_type_id); > > if (parent_id != -1) { >- count = GPOINTER_TO_UINT (g_hash_table_lookup (table, GUINT_TO_POINTER (parent_id))) + 1; >+ data = g_hash_table_lookup (table, GUINT_TO_POINTER (parent_id)); >+ count = GPOINTER_TO_UINT (data) + 1; > >- g_hash_table_insert (table, GUINT_TO_POINTER (parent_id), GUINT_TO_POINTER (count)); >+ g_hash_table_insert (table, >+ GUINT_TO_POINTER (parent_id), >+ GUINT_TO_POINTER (count)); > } > } > >@@ -1697,6 +1720,10 @@ tracker_get_hit_counts (SearchQuery *query) > i = 0; > > for (lst = list; i < len && lst; lst = lst->next) { >+ gpointer data; >+ guint32 service; >+ guint32 count; >+ gchar **row; > > if (!lst || !lst->data) { > tracker_error ("ERROR: in get hit counts"); >@@ -1704,11 +1731,13 @@ tracker_get_hit_counts (SearchQuery *query) > continue; > } > >- guint32 service = GPOINTER_TO_UINT (lst->data); >- guint32 count = GPOINTER_TO_UINT (g_hash_table_lookup (table, GUINT_TO_POINTER (service))); >+ service = GPOINTER_TO_UINT (lst->data); >+ data = g_hash_table_lookup (table, GUINT_TO_POINTER (service)); >+ count = GPOINTER_TO_UINT (data); >+ >+ row = g_new0 (gchar *, 3); > >- gchar **row = g_new0 (gchar *, 3); >- row[0] = tracker_get_service_by_id ((int) service); >+ row[0] = tracker_service_manager_get_service_by_id ((gint) service); > row[1] = tracker_uint_to_str (count); > row[2] = NULL; > >diff --git a/trunk/src/trackerd/tracker-metadata.c b/trunk/src/trackerd/tracker-metadata.c >index e8b268b..c1df988 100644 >--- a/trunk/src/trackerd/tracker-metadata.c >+++ b/trunk/src/trackerd/tracker-metadata.c >@@ -35,235 +35,23 @@ > > #include "tracker-metadata.h" > #include "tracker-utils.h" >+#include "tracker-service-manager.h" > > extern Tracker *tracker; > > >-typedef enum { >- IGNORE_METADATA, >- NO_METADATA, >- DOC_METADATA, >- IMAGE_METADATA, >- VIDEO_METADATA, >- AUDIO_METADATA, >- DEVEL_METADATA, >- TEXT_METADATA >-} MetadataFileType; >- >- >-/* document mime type specific metadata groups - NB mime types below may be prefixes */ >-char *doc_mime_types[] = { >- "application/rtf", >- "text/richtext", >- "application/msword", >- "application/pdf", >- "application/postscript", >- "application/x-dvi", >- "application/vnd.ms-excel", >- "vnd.ms-powerpoint", >- "application/vnd.oasis.opendocument", >- "application/vnd.sun.xml", >- "application/vnd.stardivision", >- "application/x-abiword", >- "text/html", >- "text/sgml", >- "text/x-tex", >- "application/x-mswrite", >- "application/x-applix-word", >- "application/docbook+xml", >- "application/x-kword", >- "application/x-kword-crypt", >- "application/x-lyx", >- "application/vnd.lotus-1-2-3", >- "application/x-applix-spreadsheet", >- "application/x-gnumeric", >- "application/x-kspread", >- "application/x-kspread-crypt", >- "application/x-quattropro", >- "application/x-sc", >- "application/x-siag", >- "application/x-magicpoint", >- "application/x-kpresenter", >- "application/illustrator", >- "application/vnd.corel-draw", >- "application/vnd.stardivision.draw", >- "application/vnd.oasis.opendocument.graphics", >- "application/x-dia-diagram", >- "application/x-karbon", >- "application/x-killustrator", >- "application/x-kivio", >- "application/x-kontour", >- "application/x-wpg", >- "application/rdf+xml" >-}; >- >- >-char *text_mime_types[] = { >- "text/plain", >- "text/x-authors", >- "text/x-changelog", >- "text/x-copying", >- "text/x-credits", >- "text/x-install", >- "text/x-readme" >-}; >- >- >-char *development_mime_types[] = { >- "application/x-perl", >- "application/x-shellscript", >- "application/x-php", >- "application/x-java", >- "application/x-javascript", >- "application/x-glade", >- "application/x-csh", >- "application/x-class-file", >- "application/x-awk", >- "application/x-asp", >- "application/x-ruby", >- "application/x-m4", >- "text/x-m4", >- "text/x-c++", >- "text/x-adasrc", >- "text/x-c", >- "text/x-c++hdr", >- "text/x-chdr", >- "text/x-csharp", >- "text/x-c++src", >- "text/x-csrc", >- "text/x-dcl", >- "text/x-dsrc", >- "text/x-emacs-lisp", >- "text/x-fortran", >- "text/x-haskell", >- "text/x-literate-haskell", >- "text/x-java", >- "text/x-java-source" , >- "text/x-makefile", >- "text/x-objcsrc", >- "text/x-pascal", >- "text/x-patch", >- "text/x-python", >- "text/x-scheme", >- "text/x-sql", >- "text/x-tcl" >-}; >- >- >- >- >-static MetadataFileType >-tracker_get_metadata_type (const char *mime) >-{ >- int i; >- int num_elements; >- >- if (strcmp (mime, "text/plain") == 0) { >- return TEXT_METADATA; >- } >- >- if (g_str_has_prefix (mime, "image") || (strcmp (mime, "application/vnd.oasis.opendocument.image") == 0) || (strcmp (mime, "application/x-krita") == 0)) { >- return IMAGE_METADATA; >- >- } else if (g_str_has_prefix (mime, "video")) { >- return VIDEO_METADATA; >- >- } else if (g_str_has_prefix (mime, "audio") || (strcmp (mime, "application/ogg") == 0)) { >- return AUDIO_METADATA; >- >- } else { >- num_elements = sizeof (doc_mime_types) / sizeof (char *); >- for (i = 0; i < num_elements; i++ ) { >- if (g_str_has_prefix (mime, doc_mime_types [i] )) { >- return DOC_METADATA; >- } >- } >- } >- >- num_elements = sizeof (development_mime_types) / sizeof (char *); >- >- for (i = 0; i < num_elements; i++ ) { >- if (strcmp (mime, development_mime_types[i]) == 0 ) { >- return DEVEL_METADATA; >- } >- } >- >- num_elements = sizeof (text_mime_types) / sizeof (char *); >- >- for (i = 0; i < num_elements; i++ ) { >- if (strcmp (mime, text_mime_types[i]) == 0 ) { >- return TEXT_METADATA; >- } >- } >- >- return NO_METADATA; >-} >- >- >-char * >-tracker_get_service_type_for_mime (const char *mime) >-{ >- MetadataFileType stype; >- >- stype = tracker_get_metadata_type (mime); >- >- switch (stype) { >- >- case IGNORE_METADATA: >- if (g_str_has_prefix (mime, "video")) { >- return g_strdup ("Videos"); >- } else { >- return g_strdup ("Other"); >- } >- break; >- >- case NO_METADATA: >- return g_strdup ("Other"); >- break; >- >- case TEXT_METADATA: >- return g_strdup ("Text"); >- break; >- >- case DOC_METADATA: >- return g_strdup ("Documents"); >- break; >- >- case IMAGE_METADATA: >- return g_strdup ("Images"); >- break; >- >- case VIDEO_METADATA: >- return g_strdup ("Videos"); >- break; >- >- case AUDIO_METADATA: >- return g_strdup ("Music"); >- break; >- >- case DEVEL_METADATA: >- return g_strdup ("Development"); >- break; >- } >- >- return g_strdup ("Other Files"); >-} >- >- > char * > tracker_metadata_get_text_file (const char *uri, const char *mime) > { >- MetadataFileType ftype; > char *text_filter_file; >- >+ char *service_type; > text_filter_file = NULL; > >- ftype = tracker_get_metadata_type (mime); >- > /* no need to filter text based files - index em directly */ >+ service_type = tracker_service_manager_get_service_type_for_mime (mime); >+ if ( !strcmp ("Text", service_type) || !strcmp ("Development", service_type)) { > >- if (ftype == TEXT_METADATA || ftype == DEVEL_METADATA) { >- >+ g_free (service_type); > return g_filename_from_utf8 (uri, -1, NULL, NULL, NULL); > > } else { >@@ -376,21 +164,26 @@ tracker_metadata_get_thumbnail (const char *path, const char *mime, const char * > void > tracker_metadata_get_embedded (const char *uri, const char *mime, GHashTable *table) > { >- MetadataFileType meta_type; > gboolean success; > char *argv[4]; > char *output; > char **values; >+ char *service_type; > gint i; > > if (!uri || !mime || !table) { > return; > } > >- meta_type = tracker_get_metadata_type (mime); >+ service_type = tracker_service_manager_get_service_type_for_mime (mime); >+ if (!service_type ) { >+ return; >+ } > >- if (! (meta_type == DOC_METADATA || meta_type == IMAGE_METADATA || meta_type == AUDIO_METADATA || meta_type == VIDEO_METADATA)) >+ if (!tracker_service_manager_has_metadata (service_type)) { >+ g_free (service_type); > return; >+ } > > /* we extract metadata out of process using pipes */ > argv[0] = g_strdup ("tracker-extract"); >diff --git a/trunk/src/trackerd/tracker-process-files.c b/trunk/src/trackerd/tracker-process-files.c >index 92033ad..f39f9d6 100644 >--- a/trunk/src/trackerd/tracker-process-files.c >+++ b/trunk/src/trackerd/tracker-process-files.c >@@ -44,6 +44,7 @@ > #include "tracker-os-dependant.h" > #include "tracker-utils.h" > #include "tracker-watch.h" >+#include "tracker-service.h" > > static void > process_my_yield (void) >@@ -325,9 +326,8 @@ static void > process_index_entity (Tracker *tracker, > FileInfo *info) > { >- ServiceDef *def; >+ TrackerService *def; > gchar *service_info; >- gchar *str; > > g_return_if_fail (info); > g_return_if_fail (tracker_check_uri (info->uri)); >@@ -348,9 +348,7 @@ process_index_entity (Tracker *tracker, > return; > } > >- str = g_utf8_strdown (service_info, -1); >- def = g_hash_table_lookup (tracker->service_table, str); >- g_free (str); >+ def = tracker_service_manager_get_service (service_info); > > if (!def) { > if (service_info) { >@@ -363,12 +361,12 @@ process_index_entity (Tracker *tracker, > } > > if (info->is_directory) { >- info->is_hidden = !def->show_service_directories; >+ info->is_hidden = !tracker_service_get_show_service_directories (def); > tracker_db_index_file (tracker->index_db, info, NULL, NULL); > g_free (service_info); > return; > } else { >- info->is_hidden = !def->show_service_files; >+ info->is_hidden = !tracker_service_get_show_service_files (def); > } > > if (g_str_has_suffix (service_info, "Emails")) { >diff --git a/trunk/src/trackerd/tracker-rdf-query.c b/trunk/src/trackerd/tracker-rdf-query.c >index ebc9ff1..0f85793 100644 >--- a/trunk/src/trackerd/tracker-rdf-query.c >+++ b/trunk/src/trackerd/tracker-rdf-query.c >@@ -23,7 +23,6 @@ > > #include "tracker-rdf-query.h" > >- > /* RDF Query Condition > <rdfq:Condition> > <rdfq:and> >@@ -1024,7 +1023,7 @@ get_select_header (const char *service) > int type; > > result = g_string_new (""); >- type = tracker_get_id_for_service (service); >+ type = tracker_service_manager_get_id_for_service (service); > > switch (type) { > >diff --git a/trunk/src/trackerd/tracker-service-manager.c b/trunk/src/trackerd/tracker-service-manager.c >new file mode 100644 >index 0000000..923da43 >--- /dev/null >+++ b/trunk/src/trackerd/tracker-service-manager.c >@@ -0,0 +1,433 @@ >+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ >+/* >+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) >+ * Copyright (C) 2008, Nokia (urho.konttori@nokia.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 <string.h> >+#include <stdlib.h> >+ >+#include <glib.h> >+ >+#include "tracker-service-manager.h" >+ >+typedef struct { >+ gchar *prefix; >+ gint service; >+} ServiceMimePrefixes; >+ >+/* Hash (gint service_type_id, TrackerService *service) */ >+static GHashTable *service_id_table; >+ >+/* Hash (gchar *service_name, TrackerService *service) */ >+static GHashTable *service_table; >+ >+/* Hash (gchar *mime, gint service_type_id) */ >+static GHashTable *mime_service; >+ >+/* List of ServiceMimePrefixes */ >+static GSList *mime_prefix_service; >+ >+static void >+service_manager_mime_prefix_foreach (gpointer data, >+ gpointer user_data) >+{ >+ ServiceMimePrefixes *mime_prefix; >+ >+ mime_prefix = (ServiceMimePrefixes*) data; >+ >+ g_free (mime_prefix->prefix); >+ g_free (mime_prefix); >+} >+ >+gpointer >+service_manager_hash_lookup_by_str (GHashTable *hash_table, >+ const gchar *str) >+{ >+ gpointer *data; >+ gchar *str_lower; >+ >+ str_lower = g_utf8_strdown (str, -1); >+ data = g_hash_table_lookup (hash_table, str_lower); >+ g_free (str_lower); >+ >+ return data; >+} >+ >+gpointer >+service_manager_hash_lookup_by_id (GHashTable *hash_table, >+ gint id) >+{ >+ gpointer *data; >+ gchar *str; >+ >+ str = g_strdup_printf ("%d", id); >+ data = g_hash_table_lookup (hash_table, str); >+ g_free (str); >+ >+ return data; >+} >+ >+void >+tracker_service_manager_init (void) >+{ >+ >+ g_return_if_fail (service_id_table == NULL >+ && service_table == NULL >+ && mime_service == NULL); >+ >+ service_id_table = g_hash_table_new_full (g_str_hash, >+ g_str_equal, >+ g_free, >+ g_object_unref); >+ >+ service_table = g_hash_table_new_full (g_str_hash, >+ g_str_equal, >+ g_free, >+ g_object_unref); >+ >+ mime_service = g_hash_table_new_full (g_str_hash, >+ g_str_equal, >+ NULL, >+ NULL); >+} >+ >+void >+tracker_service_manager_term (void) >+{ >+ g_hash_table_remove_all (service_id_table); >+ g_hash_table_remove_all (service_table); >+ g_hash_table_remove_all (mime_service); >+ >+ if (mime_prefix_service) { >+ g_slist_foreach (mime_prefix_service, >+ service_manager_mime_prefix_foreach, >+ NULL); >+ g_slist_free (mime_prefix_service); >+ } >+} >+ >+void >+tracker_service_manager_add_service (TrackerService *service, >+ GSList *mimes, >+ GSList *mime_prefixes) >+{ >+ >+ GSList *mime, *prefix; >+ ServiceMimePrefixes *service_mime_prefix; >+ gint id; >+ const gchar *name; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ id = tracker_service_get_id (service); >+ name = tracker_service_get_name (service); >+ >+ g_hash_table_insert (service_table, >+ g_utf8_strdown (name, -1), >+ g_object_ref (service)); >+ g_hash_table_insert (service_id_table, >+ g_strdup_printf ("%d", id), >+ g_object_ref (service)); >+ >+ for (mime = mimes; mime != NULL; mime = mime->next) { >+ g_hash_table_insert (mime_service, >+ mime->data, >+ GINT_TO_POINTER (id)); >+ } >+ >+ for (prefix = mime_prefixes; prefix != NULL; prefix = prefix->next) { >+ service_mime_prefix = g_new0 (ServiceMimePrefixes, 1); >+ service_mime_prefix->prefix = prefix->data; >+ service_mime_prefix->service = id; >+ mime_prefix_service = g_slist_prepend (mime_prefix_service, >+ service_mime_prefix); >+ } >+} >+ >+TrackerService * >+tracker_service_manager_get_service (const gchar *service_str) >+{ >+ return service_manager_hash_lookup_by_str (service_table, service_str); >+} >+ >+gchar * >+tracker_service_manager_get_service_by_id (gint id) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_id (service_id_table, id); >+ >+ if (!service) { >+ return NULL; >+ } >+ >+ return g_strdup (tracker_service_get_name (service)); >+} >+ >+gchar * >+tracker_service_manager_get_service_type_for_mime (const gchar *mime) >+{ >+ gpointer *id; >+ ServiceMimePrefixes *item; >+ GSList *prefix_service; >+ >+ /* Try a complete mime */ >+ id = g_hash_table_lookup (mime_service, mime); >+ if (id) { >+ return tracker_service_manager_get_service_by_id (GPOINTER_TO_INT (id)); >+ } >+ >+ /* Try in prefixes */ >+ for (prefix_service = mime_prefix_service; >+ prefix_service != NULL; >+ prefix_service = prefix_service->next) { >+ item = prefix_service->data; >+ if (g_str_has_prefix (mime, item->prefix)) { >+ return tracker_service_manager_get_service_by_id (item->service); >+ } >+ } >+ >+ /* Default option */ >+ return g_strdup ("Other"); >+} >+ >+gint >+tracker_service_manager_get_id_for_service (const char *service_str) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (!service) { >+ return -1; >+ } >+ >+ return tracker_service_get_id (service); >+} >+ >+gchar * >+tracker_service_manager_get_parent_service_by_id (gint id) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_id (service_id_table, id); >+ >+ if (!service) { >+ return NULL; >+ } >+ >+ return g_strdup (tracker_service_get_parent (service)); >+} >+ >+gint >+tracker_service_manager_get_parent_id_for_service_id (gint id) >+{ >+ TrackerService *service; >+ const gchar *parent = NULL; >+ >+ service = service_manager_hash_lookup_by_id (service_id_table, id); >+ >+ if (service) { >+ parent = tracker_service_get_parent (service); >+ } >+ >+ if (!parent) { >+ return -1; >+ } >+ >+ service = service_manager_hash_lookup_by_str (service_table, parent); >+ >+ if (!service) { >+ return -1; >+ } >+ >+ return tracker_service_get_id (service); >+} >+ >+gint >+tracker_service_manager_get_id_for_parent_service (const gchar *service_str) >+{ >+ TrackerService *service; >+ const gchar *parent = NULL; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (service) { >+ parent = tracker_service_get_parent (service); >+ } >+ >+ if (!parent) { >+ return -1; >+ } >+ >+ return tracker_service_manager_get_id_for_service (parent); >+} >+ >+gchar * >+tracker_service_manager_get_parent_service (const gchar *service_str) >+{ >+ TrackerService *service; >+ const gchar *parent = NULL; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (service) { >+ parent = tracker_service_get_parent (service); >+ } >+ >+ return g_strdup (parent); >+} >+ >+TrackerDBType >+tracker_service_manager_get_db_for_service (const gchar *service_str) >+{ >+ TrackerDBType type; >+ gchar *str; >+ >+ type = TRACKER_DB_TYPE_DATA; >+ str = g_utf8_strdown (service_str, -1); >+ >+ if (g_str_has_prefix (str, "emails") || >+ g_str_has_prefix (str, "attachments")) { >+ type = TRACKER_DB_TYPE_EMAIL; >+ } >+ >+ g_free (str); >+ >+ return type; >+} >+ >+gboolean >+tracker_service_manager_is_service_embedded (const gchar *service_str) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (!service) { >+ return FALSE; >+ } >+ >+ return tracker_service_get_embedded (service); >+} >+ >+gboolean >+tracker_service_manager_is_valid_service (const gchar *service_str) >+{ >+ return tracker_service_manager_get_id_for_service (service_str) != -1; >+} >+ >+gint >+tracker_service_manager_metadata_in_service (const gchar *service_str, >+ const gchar *meta_name) >+{ >+ TrackerService *service; >+ gint i; >+ const GSList *l; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (!service) { >+ return 0; >+ } >+ >+ for (l = tracker_service_get_key_metadata (service), i = 0; >+ l; >+ l = l->next, i++) { >+ if (!l->data) { >+ continue; >+ } >+ >+ if (strcasecmp (l->data, meta_name) == 0) { >+ return i; >+ } >+ } >+ >+ return 0; >+} >+ >+gboolean >+tracker_service_manager_has_metadata (const gchar *service_str) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (!service) { >+ return FALSE; >+ } >+ >+ return tracker_service_get_has_metadata (service); >+} >+ >+gboolean >+tracker_service_manager_has_thumbnails (const gchar *service_str) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (!service) { >+ return FALSE; >+ } >+ >+ return tracker_service_get_has_thumbs (service); >+} >+ >+gboolean >+tracker_service_manager_has_text (const char *service_str) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (!service) { >+ return FALSE; >+ } >+ >+ return tracker_service_get_has_full_text (service); >+} >+ >+gboolean >+tracker_service_manager_show_service_files (const gchar *service_str) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (!service) { >+ return FALSE; >+ } >+ >+ return tracker_service_get_show_service_files (service); >+} >+ >+gboolean >+tracker_service_manager_show_service_directories (const gchar *service_str) >+{ >+ TrackerService *service; >+ >+ service = service_manager_hash_lookup_by_str (service_table, service_str); >+ >+ if (!service) { >+ return FALSE; >+ } >+ >+ return tracker_service_get_show_service_directories (service); >+} >diff --git a/trunk/src/trackerd/tracker-service-manager.h b/trunk/src/trackerd/tracker-service-manager.h >new file mode 100644 >index 0000000..3b3a3c6 >--- /dev/null >+++ b/trunk/src/trackerd/tracker-service-manager.h >@@ -0,0 +1,58 @@ >+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ >+/* >+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) >+ * Copyright (C) 2008, Nokia (urho.konttori@nokia.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_SERVICE_MANAGER_H__ >+#define __TRACKER_SERVICE_MANAGER_H__ >+ >+#include <glib-object.h> >+ >+#include "tracker-service.h" >+ >+G_BEGIN_DECLS >+ >+void tracker_service_manager_init (void); >+void tracker_service_manager_term (void); >+void tracker_service_manager_add_service (TrackerService *service, >+ GSList *mimes, >+ GSList *mime_prefixes); >+TrackerService *tracker_service_manager_get_service (const gchar *service_str); >+gchar * tracker_service_manager_get_service_by_id (gint id); >+gchar * tracker_service_manager_get_service_type_for_mime (const gchar *mime); >+gint tracker_service_manager_get_id_for_service (const gchar *service_str); >+gint tracker_service_manager_get_id_for_parent_service (const gchar *service_str); >+gchar * tracker_service_manager_get_parent_service (const gchar *service_str); >+gchar * tracker_service_manager_get_parent_service_by_id (gint id); >+gint tracker_service_manager_get_parent_id_for_service_id (gint id); >+TrackerDBType tracker_service_manager_get_db_for_service (const gchar *service_str); >+gboolean tracker_service_manager_is_service_embedded (const gchar *service_str); >+gboolean tracker_service_manager_is_valid_service (const gchar *service_str); >+gboolean tracker_service_manager_has_metadata (const gchar *service_str); >+gboolean tracker_service_manager_has_thumbnails (const gchar *service_str); >+gboolean tracker_service_manager_has_text (const gchar *service_str); >+gint tracker_service_manager_metadata_in_service (const gchar *service_str, >+ const gchar *meta_name); >+gboolean tracker_service_manager_show_service_directories (const gchar *service_str); >+gboolean tracker_service_manager_show_service_files (const gchar *service_str); >+ >+G_END_DECLS >+ >+#endif /* __TRACKER_SERVICE_MANAGER_H__ */ >+ >diff --git a/trunk/src/trackerd/tracker-service.c b/trunk/src/trackerd/tracker-service.c >new file mode 100644 >index 0000000..b2fa780 >--- /dev/null >+++ b/trunk/src/trackerd/tracker-service.c >@@ -0,0 +1,787 @@ >+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ >+/* >+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) >+ * Copyright (C) 2008, Nokia (urho.konttori@nokia.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 <string.h> >+#include <stdlib.h> >+ >+#include <glib.h> >+ >+#include "tracker-service.h" >+ >+#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_SERVICE, TrackerServicePriv)) >+ >+typedef struct _TrackerServicePriv TrackerServicePriv; >+ >+struct _TrackerServicePriv { >+ gint id; >+ >+ gchar *name; >+ gchar *parent; >+ >+ gchar *content_metadata; >+ GSList *key_metadata; >+ >+ TrackerDBType db_type; >+ >+ gboolean enabled; >+ gboolean embedded; >+ >+ gboolean has_metadata; >+ gboolean has_full_text; >+ gboolean has_thumbs; >+ >+ gboolean show_service_files; >+ gboolean show_service_directories; >+}; >+ >+static void service_finalize (GObject *object); >+static void service_get_property (GObject *object, >+ guint param_id, >+ GValue *value, >+ GParamSpec *pspec); >+static void service_set_property (GObject *object, >+ guint param_id, >+ const GValue *value, >+ GParamSpec *pspec); >+ >+enum { >+ PROP_0, >+ PROP_ID, >+ PROP_NAME, >+ PROP_PARENT, >+ PROP_CONTENT_METADATA, >+ PROP_KEY_METADATA, >+ PROP_DB_TYPE, >+ PROP_ENABLED, >+ PROP_EMBEDDED, >+ PROP_HAS_METADATA, >+ PROP_HAS_FULL_TEXT, >+ PROP_HAS_THUMBS, >+ PROP_SHOW_SERVICE_FILES, >+ PROP_SHOW_SERVICE_DIRECTORIES >+}; >+ >+GType >+tracker_db_type_get_type (void) >+{ >+ static GType etype = 0; >+ >+ if (etype == 0) { >+ static const GEnumValue values[] = { >+ { TRACKER_DB_TYPE_DATA, >+ "TRACKER_DB_TYPE_DATA", >+ "data" }, >+ { TRACKER_DB_TYPE_INDEX, >+ "TRACKER_DB_TYPE_INDEX", >+ "index" }, >+ { TRACKER_DB_TYPE_COMMON, >+ "TRACKER_DB_TYPE_COMMON", >+ "common" }, >+ { TRACKER_DB_TYPE_CONTENT, >+ "TRACKER_DB_TYPE_CONTENT", >+ "content" }, >+ { TRACKER_DB_TYPE_EMAIL, >+ "TRACKER_DB_TYPE_EMAIL", >+ "email" }, >+ { TRACKER_DB_TYPE_CACHE, >+ "TRACKER_DB_TYPE_CACHE", >+ "cache" }, >+ { TRACKER_DB_TYPE_USER, >+ "TRACKER_DB_TYPE_USER", >+ "user" }, >+ { 0, NULL, NULL } >+ }; >+ >+ etype = g_enum_register_static ("TrackerDBType", values); >+ } >+ >+ return etype; >+} >+ >+G_DEFINE_TYPE (TrackerService, tracker_service, G_TYPE_OBJECT); >+ >+static void >+tracker_service_class_init (TrackerServiceClass *klass) >+{ >+ GObjectClass *object_class = G_OBJECT_CLASS (klass); >+ >+ object_class->finalize = service_finalize; >+ object_class->get_property = service_get_property; >+ object_class->set_property = service_set_property; >+ >+ g_object_class_install_property (object_class, >+ PROP_ID, >+ g_param_spec_int ("id", >+ "id", >+ "Unique identifier for this service", >+ 0, >+ G_MAXINT, >+ 0, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_NAME, >+ g_param_spec_string ("name", >+ "name", >+ "Service name", >+ NULL, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_PARENT, >+ g_param_spec_string ("parent", >+ "parent", >+ "Service name of parent", >+ NULL, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_CONTENT_METADATA, >+ g_param_spec_string ("content-metadata", >+ "content-metadata", >+ "Content metadata", >+ NULL, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_KEY_METADATA, >+ g_param_spec_pointer ("key-metadata", >+ "key-metadata", >+ "Key metadata", >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_DB_TYPE, >+ g_param_spec_enum ("db-type", >+ "db-type", >+ "Database type", >+ tracker_db_type_get_type (), >+ TRACKER_DB_TYPE_DATA, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_ENABLED, >+ g_param_spec_boolean ("enabled", >+ "enabled", >+ "Enabled", >+ TRUE, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_EMBEDDED, >+ g_param_spec_boolean ("embedded", >+ "embedded", >+ "Embedded", >+ FALSE, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_HAS_METADATA, >+ g_param_spec_boolean ("has-metadata", >+ "has-metadata", >+ "Has metadata", >+ FALSE, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_HAS_FULL_TEXT, >+ g_param_spec_boolean ("has-full-text", >+ "has-full-text", >+ "Has full text", >+ FALSE, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_HAS_THUMBS, >+ g_param_spec_boolean ("has-thumbs", >+ "has-thumbs", >+ "Has thumbnails", >+ FALSE, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_SHOW_SERVICE_FILES, >+ g_param_spec_boolean ("show-service-files", >+ "show-service-files", >+ "Show service files", >+ FALSE, >+ G_PARAM_READWRITE)); >+ g_object_class_install_property (object_class, >+ PROP_SHOW_SERVICE_DIRECTORIES, >+ g_param_spec_boolean ("show-service-directories", >+ "show-service-directories", >+ "Show service directories", >+ FALSE, >+ G_PARAM_READWRITE)); >+ >+ g_type_class_add_private (object_class, sizeof (TrackerServicePriv)); >+} >+ >+static void >+tracker_service_init (TrackerService *service) >+{ >+} >+ >+static void >+service_finalize (GObject *object) >+{ >+ TrackerServicePriv *priv; >+ >+ priv = GET_PRIV (object); >+ >+ g_free (priv->name); >+ g_free (priv->parent); >+ g_free (priv->content_metadata); >+ >+ g_slist_foreach (priv->key_metadata, (GFunc) g_free, NULL); >+ g_slist_free (priv->key_metadata); >+ >+ (G_OBJECT_CLASS (tracker_service_parent_class)->finalize) (object); >+} >+ >+static void >+service_get_property (GObject *object, >+ guint param_id, >+ GValue *value, >+ GParamSpec *pspec) >+{ >+ TrackerServicePriv *priv; >+ >+ priv = GET_PRIV (object); >+ >+ switch (param_id) { >+ case PROP_ID: >+ g_value_set_int (value, priv->id); >+ break; >+ case PROP_NAME: >+ g_value_set_string (value, priv->name); >+ break; >+ case PROP_PARENT: >+ g_value_set_string (value, priv->parent); >+ break; >+ case PROP_CONTENT_METADATA: >+ g_value_set_string (value, priv->content_metadata); >+ break; >+ case PROP_KEY_METADATA: >+ g_value_set_pointer (value, priv->key_metadata); >+ break; >+ case PROP_DB_TYPE: >+ g_value_set_enum (value, priv->db_type); >+ break; >+ case PROP_ENABLED: >+ g_value_set_boolean (value, priv->enabled); >+ break; >+ case PROP_EMBEDDED: >+ g_value_set_boolean (value, priv->embedded); >+ break; >+ case PROP_HAS_METADATA: >+ g_value_set_boolean (value, priv->has_metadata); >+ break; >+ case PROP_HAS_FULL_TEXT: >+ g_value_set_boolean (value, priv->has_full_text); >+ break; >+ case PROP_HAS_THUMBS: >+ g_value_set_boolean (value, priv->has_thumbs); >+ break; >+ case PROP_SHOW_SERVICE_FILES: >+ g_value_set_boolean (value, priv->show_service_files); >+ break; >+ case PROP_SHOW_SERVICE_DIRECTORIES: >+ g_value_set_boolean (value, priv->show_service_directories); >+ break; >+ default: >+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); >+ break; >+ }; >+} >+ >+static void >+service_set_property (GObject *object, >+ guint param_id, >+ const GValue *value, >+ GParamSpec *pspec) >+{ >+ TrackerServicePriv *priv; >+ >+ priv = GET_PRIV (object); >+ >+ switch (param_id) { >+ case PROP_ID: >+ tracker_service_set_id (TRACKER_SERVICE (object), >+ g_value_get_int (value)); >+ break; >+ case PROP_NAME: >+ tracker_service_set_name (TRACKER_SERVICE (object), >+ g_value_get_string (value)); >+ break; >+ case PROP_PARENT: >+ tracker_service_set_parent (TRACKER_SERVICE (object), >+ g_value_get_string (value)); >+ break; >+ case PROP_CONTENT_METADATA: >+ tracker_service_set_content_metadata (TRACKER_SERVICE (object), >+ g_value_get_string (value)); >+ break; >+ case PROP_KEY_METADATA: >+ tracker_service_set_key_metadata (TRACKER_SERVICE (object), >+ g_value_get_pointer (value)); >+ break; >+ case PROP_DB_TYPE: >+ tracker_service_set_db_type (TRACKER_SERVICE (object), >+ g_value_get_enum (value)); >+ break; >+ case PROP_ENABLED: >+ tracker_service_set_enabled (TRACKER_SERVICE (object), >+ g_value_get_boolean (value)); >+ break; >+ case PROP_EMBEDDED: >+ tracker_service_set_embedded (TRACKER_SERVICE (object), >+ g_value_get_boolean (value)); >+ break; >+ case PROP_HAS_METADATA: >+ tracker_service_set_has_metadata (TRACKER_SERVICE (object), >+ g_value_get_boolean (value)); >+ break; >+ case PROP_HAS_FULL_TEXT: >+ tracker_service_set_has_full_text (TRACKER_SERVICE (object), >+ g_value_get_boolean (value)); >+ break; >+ case PROP_HAS_THUMBS: >+ tracker_service_set_has_thumbs (TRACKER_SERVICE (object), >+ g_value_get_boolean (value)); >+ break; >+ case PROP_SHOW_SERVICE_FILES: >+ tracker_service_set_show_service_files (TRACKER_SERVICE (object), >+ g_value_get_boolean (value)); >+ break; >+ case PROP_SHOW_SERVICE_DIRECTORIES: >+ tracker_service_set_show_service_directories (TRACKER_SERVICE (object), >+ g_value_get_boolean (value)); >+ break; >+ default: >+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); >+ break; >+ }; >+} >+ >+static gboolean >+service_int_validate (TrackerService *service, >+ const gchar *property, >+ gint value) >+{ >+#ifdef G_DISABLE_CHECKS >+ GParamSpec *spec; >+ GValue value = { 0 }; >+ gboolean valid; >+ >+ spec = g_object_class_find_property (G_OBJECT_CLASS (service), property); >+ g_return_val_if_fail (spec != NULL, FALSE); >+ >+ g_value_init (&value, spec->value_type); >+ g_value_set_int (&value, verbosity); >+ valid = g_param_value_validate (spec, &value); >+ g_value_unset (&value); >+ >+ g_return_val_if_fail (valid != TRUE, FALSE); >+#endif >+ >+ return TRUE; >+} >+ >+TrackerService * >+tracker_service_new (void) >+{ >+ TrackerService *service; >+ >+ service = g_object_new (TRACKER_TYPE_SERVICE, NULL); >+ >+ return service; >+} >+ >+gint >+tracker_service_get_id (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), -1); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->id; >+} >+ >+const gchar * >+tracker_service_get_name (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), NULL); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->name; >+} >+ >+const gchar * >+tracker_service_get_parent (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), NULL); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->parent; >+} >+ >+const gchar * >+tracker_service_get_content_metadata (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), NULL); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->content_metadata; >+} >+ >+const GSList * >+tracker_service_get_key_metadata (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), NULL); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->key_metadata; >+} >+ >+TrackerDBType >+tracker_service_get_db_type (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), TRACKER_DB_TYPE_DATA); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->db_type; >+} >+ >+gboolean >+tracker_service_get_enabled (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), FALSE); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->enabled; >+} >+ >+gboolean >+tracker_service_get_embedded (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), FALSE); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->embedded; >+} >+ >+gboolean >+tracker_service_get_has_metadata (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), FALSE); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->has_metadata; >+} >+ >+gboolean >+tracker_service_get_has_full_text (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), FALSE); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->has_full_text; >+} >+ >+gboolean >+tracker_service_get_has_thumbs (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), FALSE); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->has_thumbs; >+} >+ >+gboolean >+tracker_service_get_show_service_files (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), FALSE); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->show_service_files; >+} >+ >+gboolean >+tracker_service_get_show_service_directories (TrackerService *service) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_val_if_fail (TRACKER_IS_SERVICE (service), FALSE); >+ >+ priv = GET_PRIV (service); >+ >+ return priv->show_service_directories; >+} >+ >+void >+tracker_service_set_id (TrackerService *service, >+ gint value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ if (!service_int_validate (service, "id", value)) { >+ return; >+ } >+ >+ priv = GET_PRIV (service); >+ >+ priv->id = value; >+ g_object_notify (G_OBJECT (service), "id"); >+} >+ >+void >+tracker_service_set_name (TrackerService *service, >+ const gchar *value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ g_free (priv->name); >+ >+ if (value) { >+ priv->name = g_strdup (value); >+ } else { >+ priv->name = NULL; >+ } >+ >+ g_object_notify (G_OBJECT (service), "name"); >+} >+ >+void >+tracker_service_set_parent (TrackerService *service, >+ const gchar *value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ g_free (priv->parent); >+ >+ if (value) { >+ priv->parent = g_strdup (value); >+ } else { >+ priv->parent = NULL; >+ } >+ >+ g_object_notify (G_OBJECT (service), "parent"); >+} >+ >+void >+tracker_service_set_content_metadata (TrackerService *service, >+ const gchar *value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ g_free (priv->content_metadata); >+ >+ if (value) { >+ priv->content_metadata = g_strdup (value); >+ } else { >+ priv->content_metadata = NULL; >+ } >+ >+ g_object_notify (G_OBJECT (service), "content-metadata"); >+} >+ >+void >+tracker_service_set_key_metadata (TrackerService *service, >+ const GSList *value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ g_slist_foreach (priv->key_metadata, (GFunc) g_free, NULL); >+ g_slist_free (priv->key_metadata); >+ >+ if (value) { >+ GSList *new_list; >+ const GSList *l; >+ >+ new_list = NULL; >+ >+ for (l = value; l; l = l->next) { >+ new_list = g_slist_prepend (new_list, g_strdup (l->data)); >+ } >+ >+ new_list = g_slist_reverse (new_list); >+ priv->key_metadata = new_list; >+ } else { >+ priv->key_metadata = NULL; >+ } >+ >+ g_object_notify (G_OBJECT (service), "key-metadata"); >+} >+ >+void >+tracker_service_set_db_type (TrackerService *service, >+ TrackerDBType value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ priv->db_type = value; >+ g_object_notify (G_OBJECT (service), "db-type"); >+} >+ >+void >+tracker_service_set_enabled (TrackerService *service, >+ gboolean value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ priv->enabled = value; >+ g_object_notify (G_OBJECT (service), "enabled"); >+} >+ >+void >+tracker_service_set_embedded (TrackerService *service, >+ gboolean value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ priv->embedded = value; >+ g_object_notify (G_OBJECT (service), "embedded"); >+} >+ >+void >+tracker_service_set_has_metadata (TrackerService *service, >+ gboolean value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ priv->has_metadata = value; >+ g_object_notify (G_OBJECT (service), "has-metadata"); >+} >+ >+void >+tracker_service_set_has_full_text (TrackerService *service, >+ gboolean value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ priv->has_full_text = value; >+ g_object_notify (G_OBJECT (service), "has-full-text"); >+} >+ >+void >+tracker_service_set_has_thumbs (TrackerService *service, >+ gboolean value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ priv->has_thumbs = value; >+ g_object_notify (G_OBJECT (service), "has-thumbs"); >+} >+ >+void >+tracker_service_set_show_service_files (TrackerService *service, >+ gboolean value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ priv->show_service_files = value; >+ g_object_notify (G_OBJECT (service), "show-service-files"); >+} >+ >+void >+tracker_service_set_show_service_directories (TrackerService *service, >+ gboolean value) >+{ >+ TrackerServicePriv *priv; >+ >+ g_return_if_fail (TRACKER_IS_SERVICE (service)); >+ >+ priv = GET_PRIV (service); >+ >+ priv->show_service_directories = value; >+ g_object_notify (G_OBJECT (service), "show-service-directories"); >+} >diff --git a/trunk/src/trackerd/tracker-service.h b/trunk/src/trackerd/tracker-service.h >new file mode 100644 >index 0000000..0923303 >--- /dev/null >+++ b/trunk/src/trackerd/tracker-service.h >@@ -0,0 +1,111 @@ >+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ >+/* >+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) >+ * Copyright (C) 2008, Nokia (urho.konttori@nokia.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_SERVICES_H__ >+#define __TRACKER_SERVICES_H__ >+ >+#include <glib-object.h> >+ >+G_BEGIN_DECLS >+ >+#define TRACKER_TYPE_DB_TYPE (tracker_db_type_get_type ()) >+ >+typedef enum { >+ TRACKER_DB_TYPE_DATA, >+ TRACKER_DB_TYPE_INDEX, >+ TRACKER_DB_TYPE_COMMON, >+ TRACKER_DB_TYPE_CONTENT, >+ TRACKER_DB_TYPE_EMAIL, >+ TRACKER_DB_TYPE_CACHE, >+ TRACKER_DB_TYPE_USER >+} TrackerDBType; >+ >+GType tracker_db_type_get_type (void) G_GNUC_CONST; >+ >+ >+ >+#define TRACKER_TYPE_SERVICE (tracker_service_get_type ()) >+#define TRACKER_SERVICE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_SERVICE, TrackerService)) >+#define TRACKER_SERVICE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TRACKER_TYPE_SERVICE, TrackerServiceClass)) >+#define TRACKER_IS_SERVICE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_SERVICE)) >+#define TRACKER_IS_SERVICE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TRACKER_TYPE_SERVICE)) >+#define TRACKER_SERVICE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_SERVICE, TrackerServiceClass)) >+ >+typedef struct _TrackerService TrackerService; >+typedef struct _TrackerServiceClass TrackerServiceClass; >+ >+struct _TrackerService { >+ GObject parent; >+}; >+ >+struct _TrackerServiceClass { >+ GObjectClass parent_class; >+}; >+ >+GType tracker_service_get_type (void) G_GNUC_CONST; >+ >+TrackerService *tracker_service_new (void); >+ >+gint tracker_service_get_id (TrackerService *service); >+const gchar * tracker_service_get_name (TrackerService *service); >+const gchar * tracker_service_get_parent (TrackerService *service); >+const gchar * tracker_service_get_content_metadata (TrackerService *service); >+const GSList * tracker_service_get_key_metadata (TrackerService *service); >+TrackerDBType tracker_service_get_db_type (TrackerService *service); >+gboolean tracker_service_get_enabled (TrackerService *service); >+gboolean tracker_service_get_embedded (TrackerService *service); >+gboolean tracker_service_get_has_metadata (TrackerService *service); >+gboolean tracker_service_get_has_full_text (TrackerService *service); >+gboolean tracker_service_get_has_thumbs (TrackerService *service); >+gboolean tracker_service_get_show_service_files (TrackerService *service); >+gboolean tracker_service_get_show_service_directories (TrackerService *service); >+ >+void tracker_service_set_id (TrackerService *service, >+ gint value); >+void tracker_service_set_name (TrackerService *service, >+ const gchar *value); >+void tracker_service_set_parent (TrackerService *service, >+ const gchar *value); >+void tracker_service_set_content_metadata (TrackerService *service, >+ const gchar *value); >+void tracker_service_set_key_metadata (TrackerService *service, >+ const GSList *value); >+void tracker_service_set_db_type (TrackerService *service, >+ TrackerDBType value); >+void tracker_service_set_enabled (TrackerService *service, >+ gboolean value); >+void tracker_service_set_embedded (TrackerService *service, >+ gboolean value); >+void tracker_service_set_has_metadata (TrackerService *service, >+ gboolean value); >+void tracker_service_set_has_full_text (TrackerService *service, >+ gboolean value); >+void tracker_service_set_has_thumbs (TrackerService *service, >+ gboolean value); >+void tracker_service_set_show_service_files (TrackerService *service, >+ gboolean value); >+void tracker_service_set_show_service_directories (TrackerService *service, >+ gboolean value); >+ >+G_END_DECLS >+ >+#endif /* __TRACKER_SERVICE_H__ */ >+ >diff --git a/trunk/src/trackerd/tracker-utils.c b/trunk/src/trackerd/tracker-utils.c >index 12c27d3..27f98a3 100644 >--- a/trunk/src/trackerd/tracker-utils.c >+++ b/trunk/src/trackerd/tracker-utils.c >@@ -94,174 +94,6 @@ static const char imonths[] = { > }; > > >-char * >-tracker_get_service_by_id (int service_type_id) >-{ >- char *str_id; >- ServiceDef *def; >- >- str_id = tracker_int_to_str (service_type_id); >- def = g_hash_table_lookup (tracker->service_id_table, str_id); >- g_free (str_id); >- >- if (!def) { >- tracker_log ("WARNING: no service found for id %d", service_type_id); >- return NULL; >- } >- >- return g_strdup (def->name); >-} >- >- >-char * >-tracker_get_parent_service_by_id (int service_type_id) >-{ >- char *str_id = tracker_int_to_str (service_type_id); >- ServiceDef *def = g_hash_table_lookup (tracker->service_id_table, str_id); >- >- g_free (str_id); >- >- if (!def) { >- return NULL; >- } >- >- return g_strdup (def->parent); >-} >- >- >-int >-tracker_get_parent_id_for_service_id (int service_type_id) >-{ >- char *str_id = tracker_int_to_str (service_type_id); >- ServiceDef *def = g_hash_table_lookup (tracker->service_id_table, str_id); >- >- g_free (str_id); >- >- if (!def) { >- return -1; >- } >- >- char *name = g_utf8_strdown (def->parent, -1); >- >- ServiceDef *def2 = g_hash_table_lookup (tracker->service_table, name); >- >- g_free (name); >- >- if (!def2) { >- return -1; >- } >- >- return def2->id; >-} >- >- >-int >-tracker_get_id_for_service (const char *service) >-{ >- char *name = g_utf8_strdown (service, -1); >- >- ServiceDef *def = g_hash_table_lookup (tracker->service_table, name); >- >- g_free (name); >- >- if (!def) { >- return -1; >- } >- >- return def->id; >-} >- >- >-int >-tracker_get_id_for_parent_service (const char *service) >-{ >- char *name = g_utf8_strdown (service, -1); >- >- ServiceDef *def = g_hash_table_lookup (tracker->service_table, name); >- >- g_free (name); >- >- if (!def) { >- return -1; >- } >- >- return tracker_get_id_for_service (def->parent); >-} >- >- >-char * >-tracker_get_parent_service (const char *service) >-{ >- char *name = g_utf8_strdown (service, -1); >- >- ServiceDef *def = g_hash_table_lookup (tracker->service_table, name); >- >- g_free (name); >- >- if (!def) { >- return NULL; >- } >- >- if (def->parent) { >- return g_strdup (def->parent); >- } >- >- return NULL; >-} >- >- >-ServiceDef * >-tracker_get_service (const char *service) >-{ >- char *name = g_utf8_strdown (service, -1); >- >- ServiceDef *def = g_hash_table_lookup (tracker->service_table, name); >- >- g_free (name); >- >- return def; >-} >- >- >-DBTypes >-tracker_get_db_for_service (const char *service) >-{ >- char *name = g_utf8_strdown (service, -1); >- >- if (g_str_has_prefix (name, "emails") || g_str_has_prefix (name, "attachments")) { >- g_free (name); >- return DB_EMAIL; >- } >- >- int id = tracker_get_id_for_parent_service (name); >- char *str_id = tracker_int_to_str (id); >- >- g_free (str_id); >- >- g_free (name); >- >- return DB_DATA; >- >-} >- >- >-gboolean >-tracker_is_service_embedded (const char *service) >-{ >- char *name = g_utf8_strdown (service, -1); >- >- ServiceDef *def = g_hash_table_lookup (tracker->service_table, name); >- >- g_free (name); >- >- if (!def) { >- return FALSE; >- } >- >- return def->embedded; >-} >- >- > char ** > tracker_make_array_null_terminated (char **array, int length) > { >diff --git a/trunk/src/trackerd/tracker-utils.h b/trunk/src/trackerd/tracker-utils.h >index bfa7ef1..b140598 100644 >--- a/trunk/src/trackerd/tracker-utils.h >+++ b/trunk/src/trackerd/tracker-utils.h >@@ -91,17 +91,6 @@ typedef enum { > > > typedef enum { >- DB_DATA, >- DB_INDEX, >- DB_COMMON, >- DB_CONTENT, >- DB_EMAIL, >- DB_CACHE, >- DB_USER >-} DBTypes; >- >- >-typedef enum { > DB_CATEGORY_FILES, > DB_CATEGORY_EMAILS, > DB_CATEGORY_USER >@@ -165,26 +154,6 @@ typedef struct { > > > typedef struct { >- >- int id; >- char *name; >- char *parent; >- char *content_metadata; >- GSList *key_metadata; >- DBTypes database; >- >- guint enabled : 1; >- guint embedded : 1; >- guint has_metadata : 1; >- guint has_fulltext : 1; >- guint has_thumbs : 1; >- guint show_service_files : 1; >- guint show_service_directories : 1; >- >-} ServiceDef; >- >- >-typedef struct { > char *name; > char *type; > } ServiceInfo; >@@ -297,8 +266,6 @@ typedef struct { > GSList *service_directory_list; > > /* lookup tables for service and metadata IDs */ >- GHashTable *service_table; >- GHashTable *service_id_table; > GHashTable *metadata_table; > > /* email config options */ >@@ -486,17 +453,6 @@ typedef struct { > > } FileInfo; > >-ServiceDef * tracker_get_service (const char *service); >-int tracker_get_id_for_service (const char *service); >-int tracker_get_id_for_parent_service (const char *service); >-char * tracker_get_service_by_id (int service_type_id); >-char * tracker_get_parent_service (const char *service); >-char * tracker_get_parent_service_by_id (int service_type_id); >-int tracker_get_parent_id_for_service_id (int service_type_id); >-DBTypes tracker_get_db_for_service (const char *service); >-gboolean tracker_is_service_embedded (const char *service); >- >- > GSList * tracker_filename_array_to_list (gchar **array); > GSList * tracker_string_list_to_gslist (const gchar **array); > gchar ** tracker_gslist_to_string_list (GSList *list); >diff --git a/trunk/src/trackerd/trackerd.c b/trunk/src/trackerd/trackerd.c >index dbd5b4c..13b5d9b 100644 >--- a/trunk/src/trackerd/trackerd.c >+++ b/trunk/src/trackerd/trackerd.c >@@ -60,6 +60,8 @@ > #include "tracker-process-requests.h" > #include "tracker-watch.h" > >+#include "tracker-service-manager.h" >+ > #ifdef OS_WIN32 > #include <windows.h> > #include <pthread.h> >@@ -713,13 +715,16 @@ sanity_check_option_values (void) > > tracker_log ("Throttle level is %d\n", tracker_config_get_throttle (tracker->config)); > >- tracker->metadata_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); >- tracker->service_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); >- tracker->service_id_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); >- tracker->service_directory_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); >+ tracker->metadata_table = g_hash_table_new_full (g_str_hash, >+ g_str_equal, >+ NULL, >+ NULL); >+ tracker->service_directory_table = g_hash_table_new_full (g_str_hash, >+ g_str_equal, >+ NULL, >+ NULL); > } > >- > static void > create_index (gboolean need_data) > { >@@ -1062,6 +1067,9 @@ main (gint argc, gchar *argv[]) > > sanity_check_option_values (); > >+ /* Initialize the service manager */ >+ tracker_service_manager_init (); >+ > /* set thread safe DB connection */ > tracker_db_thread_init (); >
Created attachment 108787 [details] [review] Previous patch, fixed small error. The same patch with a one line error fixed. Now tracker_db_mime_query uses the stored_proc param instead a Hardcoded stored proc.
patch looks ok at first glance can you commit so we can get others to test it thanks jamie
Committed