After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 523200 - Refactoring Service type "cache"
Refactoring Service type "cache"
Status: RESOLVED FIXED
Product: tracker
Classification: Core
Component: General
unspecified
Other All
: Normal enhancement
: ---
Assigned To: Jamie McCracken
Jamie McCracken
Depends on:
Blocks:
 
 
Reported: 2008-03-18 17:01 UTC by Ivan Frade
Modified: 2008-04-08 10:10 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
Refactor isolating ServiceType related code in an independient module (110.81 KB, patch)
2008-03-18 17:07 UTC, Ivan Frade
none Details | Review
Isolating Service Type management (updated patch) (110.69 KB, patch)
2008-03-26 14:22 UTC, Ivan Frade
none Details | Review
Previous patch, fixed small error. (110.69 KB, patch)
2008-04-07 15:43 UTC, Ivan Frade
committed Details | Review

Description Ivan Frade 2008-03-18 17:01:20 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.
Comment 1 Ivan Frade 2008-03-18 17:07:40 UTC
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.
Comment 2 Ivan Frade 2008-03-26 14:22:45 UTC
Created attachment 108061 [details] [review]
Isolating Service Type management (updated patch)

The same patch updated to current HEAD.
Comment 3 Ivan Frade 2008-04-07 15:38:15 UTC
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 ();
>
Comment 4 Ivan Frade 2008-04-07 15:43:35 UTC
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.
Comment 5 Jamie McCracken 2008-04-07 16:44:06 UTC
patch looks ok at first glance

can you commit so we can get others to test it

thanks

jamie
Comment 6 Ivan Frade 2008-04-08 10:10:39 UTC
Committed