[maemo-commits] [maemo-commits] r11108 - in projects/haf/trunk/libhildonmime: . debian libhildonmime tests

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Tue Apr 17 14:07:31 EEST 2007
Author: martyn
Date: 2007-04-17 14:07:29 +0300 (Tue, 17 Apr 2007)
New Revision: 11108

Modified:
   projects/haf/trunk/libhildonmime/ChangeLog
   projects/haf/trunk/libhildonmime/debian/changelog
   projects/haf/trunk/libhildonmime/libhildonmime/hildon-mime-open.c
   projects/haf/trunk/libhildonmime/libhildonmime/hildon-mime.h
   projects/haf/trunk/libhildonmime/tests/test-open.c
Log:
        * libhildonmime/hildon-mime-open.c: Actually use the return value
	from dbus_connection_send() to know if we succeeded locally.

        * libhildonmime/hildon-mime.h: Updated the documentation to be
	consistent with hildon-uri.h and also to describe how the _open*()
	API is asynchronous and requires an event loop in cases where
	applications have to be launched if not already running.

        * tests/test-open.c: Fixed the test case to use a main loop so
	that if the application associated with the mime type is not
	running and has to be started by D-Bus, we have time to	allow dbus
	to process the events and then send the "mime_open" dbus
	message. Fixes NB#54056.


Modified: projects/haf/trunk/libhildonmime/ChangeLog
===================================================================
--- projects/haf/trunk/libhildonmime/ChangeLog	2007-04-17 10:38:37 UTC (rev 11107)
+++ projects/haf/trunk/libhildonmime/ChangeLog	2007-04-17 11:07:29 UTC (rev 11108)
@@ -1,3 +1,19 @@
+2007-04-17  Martyn Russell  <martyn at imendio.com>
+
+        * libhildonmime/hildon-mime-open.c: Actually use the return value
+	from dbus_connection_send() to know if we succeeded locally.
+	
+        * libhildonmime/hildon-mime.h: Updated the documentation to be
+	consistent with hildon-uri.h and also to describe how the _open*()
+	API is asynchronous and requires an event loop in cases where
+	applications have to be launched if not already running.
+
+        * tests/test-open.c: Fixed the test case to use a main loop so
+	that if the application associated with the mime type is not
+	running and has to be started by D-Bus, we have time to	allow dbus
+	to process the events and then send the "mime_open" dbus
+	message. Fixes NB#54056.
+
 2007-04-04  Richard Hult  <richard at imendio.com>
 
 	* tests/test-mime-category.c: Improve output.

Modified: projects/haf/trunk/libhildonmime/debian/changelog
===================================================================
--- projects/haf/trunk/libhildonmime/debian/changelog	2007-04-17 10:38:37 UTC (rev 11107)
+++ projects/haf/trunk/libhildonmime/debian/changelog	2007-04-17 11:07:29 UTC (rev 11108)
@@ -1,3 +1,10 @@
+libhildonmime (1.9.4-1) unstable; urgency=low
+
+  * UNRELEASED!
+  * Fixes: NB#54056, The files are not getting opened when the application...
+
+ -- Martyn Russell <martyn at imendio.com>  Fri, 20 April 2007 17:33:01 +0000
+
 libhildonmime (1.9.3-2) unstable; urgency=low
 
   * Implemented: NR#153624, NR#153625, NR#153171

Modified: projects/haf/trunk/libhildonmime/libhildonmime/hildon-mime-open.c
===================================================================
--- projects/haf/trunk/libhildonmime/libhildonmime/hildon-mime-open.c	2007-04-17 10:38:37 UTC (rev 11107)
+++ projects/haf/trunk/libhildonmime/libhildonmime/hildon-mime-open.c	2007-04-17 11:07:29 UTC (rev 11108)
@@ -92,22 +92,20 @@
 #define APP_LAUNCH_BANNER_METHOD_PATH       "/com/nokia/tasknav/app_launch_banner"
 #define APP_LAUNCH_BANNER_METHOD            "app_launch_banner"
 
-
 typedef struct {
+	gchar  *service_name;
 	GSList *files;
 } AppEntry;
 
+static gboolean mime_launch         (DBusConnection  *con,
+				     AppEntry        *entry);
+static void     mime_launch_add_arg (const gchar     *uri,
+				     DBusMessageIter *iter);
 
-static void mime_launch         (const gchar     *key,
-				 AppEntry        *entry,
-				 DBusConnection  *con);
-static void mime_launch_add_arg (const gchar     *uri,
-				 DBusMessageIter *iter);
-
-
 static void
 app_entry_free (AppEntry *entry)
 {
+	g_free (entry->service_name);
 	g_slist_free (entry->files);
 	g_free (entry);
 }
@@ -139,8 +137,8 @@
 		g_free (group);
 	}
 
+	g_key_file_free (key_file);
 	g_free (filename);
-	g_key_file_free (key_file);
 
 	return service_name;
 }
@@ -156,8 +154,11 @@
 	gchar *service_name = NULL;
 
 	default_id = gnome_vfs_mime_get_default_desktop_entry (mime_type);
-	if (default_id != NULL && default_id[0] != '\0') {
-		service_name = desktop_file_get_service_name (default_id); 
+	if (default_id) {
+		if (default_id[0] != '\0') {
+			service_name = desktop_file_get_service_name (default_id); 
+		}
+
 		g_free (default_id);
 
 		return service_name;
@@ -199,6 +200,7 @@
 {
 	AppEntry *entry;
 	gchar    *service_name;
+	gboolean  success;
 
 	if (con == NULL) {
 		DLOG_OPEN("libossomime");
@@ -223,22 +225,33 @@
 	}
 
 	entry = g_new0 (AppEntry, 1);
+
+	entry->service_name = service_name;
 	entry->files = g_slist_append (NULL, (gpointer) file);
 
-	mime_launch (service_name, entry, con);
+	success = mime_launch (con, entry);
 
-	g_free (service_name);
 	app_entry_free (entry);
 
-	return 1;
+	return success ? 1 : 0;
 }
 
+static void 
+mime_open_file_list_foreach (const gchar  *key, 
+			     AppEntry     *entry, 
+			     GSList      **list)
+{
+	*list = g_slist_prepend (*list, entry);
+}
+
 gint
 hildon_mime_open_file_list (DBusConnection *con, GSList *files)
 {
 	GHashTable *apps = NULL;
+	GSList     *list = NULL;
 	GSList     *l;
 	gint        num_apps;
+	gboolean    success = TRUE;
 
 	if (con == NULL) {
 		DLOG_OPEN("libossomime");
@@ -254,8 +267,9 @@
 		return 0;
 	}
 
-	apps = g_hash_table_new_full (g_str_hash, g_str_equal,
-				      g_free, 
+	apps = g_hash_table_new_full (g_str_hash, 
+				      g_str_equal,
+				      NULL, 
 				      (GDestroyNotify) app_entry_free);
     
 	gnome_vfs_init (); /* make sure that gnome vfs is initialized */
@@ -275,26 +289,37 @@
 			entry = g_hash_table_lookup (apps, service_name);
 			if (!entry) {
 				entry = g_new0 (AppEntry, 1);
-				g_hash_table_insert (apps, service_name, entry);
+				
+				entry->service_name = service_name;
+				g_hash_table_insert (apps, entry->service_name, entry);
+			} else {
+				g_free (service_name);
 			}
-		
+					
 			entry->files = g_slist_append (entry->files, file);
 		} else {
 			dprint ("No service name for file '%s'", file);
 		}			
 	}	
 
+
 	num_apps = g_hash_table_size (apps);
+	g_hash_table_foreach (apps, (GHFunc) mime_open_file_list_foreach, &list);
 
-	g_hash_table_foreach (apps, (GHFunc) mime_launch, con);
-	g_hash_table_destroy (apps);
+	/* If we didn't find an application to launch, it's an error. */
+	success &= list != NULL;
 
-	/* If we didn't find an application to launch, it's an error. */
-	if (num_apps == 0) {
-		return 0;
-	} else {
-		return 1;
+	for (l = list; l; l = l->next) {
+		AppEntry *entry;
+
+		entry = l->data;
+		success &= mime_launch (con, entry);
 	}
+	
+	g_slist_free (list);
+	g_hash_table_destroy (apps);
+	
+	return success ? 1 : 0;
 }
 
 gint
@@ -304,6 +329,7 @@
 {
        AppEntry *entry;
        gchar    *service_name;
+       gboolean  success;
 
        if (con == NULL) {
                DLOG_OPEN("libossomime");
@@ -335,26 +361,79 @@
        }
 
        entry = g_new0 (AppEntry, 1);
+
+       entry->service_name = service_name;
        entry->files = g_slist_append (NULL, (gpointer) file);
 
-       mime_launch (service_name, entry, con);
-
-       g_free (service_name);
+       success = mime_launch (con, entry);
        app_entry_free (entry);
 
-       return 1;
+       return success ? 1 : 0;
 }
 
-static void mime_launch (const gchar    *key, 
-			 AppEntry       *entry, 
-			 DBusConnection *con)
+static gboolean
+mime_launch_notify_task_navigator (DBusConnection *con, 
+				   const gchar    *service)
 {
+	DBusMessage *msg;
+	gboolean     success = TRUE;
+
+	/* From osso-rpc.c */
+	/* Inform the task navigator that we are launching the service */
+	dprint ("Notifying the task navigator...");
+
+	dprint ("Creating message for service: '%s'", TASK_NAV_SERVICE);
+	msg = dbus_message_new_method_call (TASK_NAV_SERVICE,
+					    APP_LAUNCH_BANNER_METHOD_PATH,
+					    APP_LAUNCH_BANNER_METHOD_INTERFACE,
+					    APP_LAUNCH_BANNER_METHOD);
+	
+	if (msg) {
+		if (dbus_message_append_args (msg,
+					      DBUS_TYPE_STRING, &service,
+					      DBUS_TYPE_INVALID)) {
+			
+			if (dbus_connection_send (con, msg, NULL) == TRUE) {
+				dprint ("Sent message to service: '%s'", 
+					TASK_NAV_SERVICE);
+				dbus_connection_flush (con);
+			} else {
+				dprint ("Couldn't send message to service: '%s'", 
+					TASK_NAV_SERVICE);
+				success = FALSE;
+			}
+			
+		} else {
+			dprint ("Couldn't append msg with service: '%s'", 
+				TASK_NAV_SERVICE);
+			success = FALSE;
+		}
+		
+		dbus_message_unref (msg);
+	} else {
+		dprint ("Couldn't create msg with method: '%s' to service: '%s'", 
+			APP_LAUNCH_BANNER_METHOD, 
+			TASK_NAV_SERVICE);
+		success = FALSE;
+	}
+	
+	return success;
+}
+
+static gboolean 
+mime_launch (DBusConnection *con,
+	     AppEntry       *entry)
+{
 	DBusMessage     *msg;
 	DBusMessageIter  iter;
+	const gchar     *key;
 	gchar           *service;
 	gchar           *object_path;
 	gchar           *interface;
+	gboolean         success = TRUE;
 
+	key = entry->service_name;
+
 	/* If the service name has a '.', treat it as a full name, otherwise
 	 * prepend com.nokia. */
 	if (strchr (key, '.')) {
@@ -368,59 +447,54 @@
 		object_path = g_strdup_printf ("/com/nokia/%s", key);
 		interface = g_strdup (service);
 	}
-	
-	dprint ("Activating service: %s\n", service);
 
-	msg = dbus_message_new_method_call (service, object_path,
-					    interface, "mime_open");
+	dprint ("Activating: '%s'...", key);
+
+	dprint ("Creating message for service: '%s'", service);
+	msg = dbus_message_new_method_call (service, object_path, interface, "mime_open");
+
 	if (msg) {
 		dbus_message_set_no_reply (msg, TRUE);
-		
 		dbus_message_iter_init_append (msg, &iter);
 		
+		dprint ("Adding arguments:");
 		g_slist_foreach (entry->files, (GFunc) mime_launch_add_arg, &iter);
 		
-		dbus_connection_send (con, msg, NULL);
-		dbus_connection_flush (con);
+		if (dbus_connection_send (con, msg, NULL) == TRUE) {
+			dprint ("Sent message to service: '%s'", service);
+			dbus_connection_flush (con);
+
+			/* Update the task navigator */
+			success = mime_launch_notify_task_navigator (con, service);
+		} else {
+			dprint ("Couldn't send message to service: '%s'", service);
+			success = FALSE;
+		}
 		
 		dbus_message_unref (msg);
-		
-		/* From osso-rpc.c */
-		/* Inform the task navigator that we are launching the service */
-		msg = dbus_message_new_method_call (TASK_NAV_SERVICE,
-						    APP_LAUNCH_BANNER_METHOD_PATH,
-						    APP_LAUNCH_BANNER_METHOD_INTERFACE,
-						    APP_LAUNCH_BANNER_METHOD);
-		
-		if (msg) {
-			if (dbus_message_append_args (msg,
-						      DBUS_TYPE_STRING, &service,
-						      DBUS_TYPE_INVALID)) {
-				dbus_connection_send (con, msg, NULL);
-				dbus_connection_flush (con);
-			} else {
-				dprint ("Couldn't add service: %s\n", service);
-			}
-			dbus_message_unref (msg);
-		} else {
-			dprint ("Couldn't create msg to: %s\n", service);
-		}
+	} else {
+		dprint ("Couldn't create msg with method: 'mime-open' to service: '%s'", 
+			service);
+		success = FALSE;
 	}
 
 	g_free (service);
 	g_free (object_path);
 	g_free (interface);
+
+	return success;
 }
 
-static void mime_launch_add_arg (const gchar     *uri, 
-				 DBusMessageIter *iter)
+static void 
+mime_launch_add_arg (const gchar     *uri, 
+		     DBusMessageIter *iter)
 {
 	if (!g_utf8_validate (uri, -1, NULL)) {
 		g_warning ("Invalid UTF-8 passed to hildon_mime_open\n");
 		return;
 	}
 
-	dprint ("  %s\n", uri);
+	dprint ("URI: '%s'", uri);
 	
 	dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &uri);
 }

Modified: projects/haf/trunk/libhildonmime/libhildonmime/hildon-mime.h
===================================================================
--- projects/haf/trunk/libhildonmime/libhildonmime/hildon-mime.h	2007-04-17 10:38:37 UTC (rev 11107)
+++ projects/haf/trunk/libhildonmime/libhildonmime/hildon-mime.h	2007-04-17 11:07:29 UTC (rev 11108)
@@ -43,39 +43,45 @@
 /*@{*/
 
 /**
+ * hildon_mime_open_file:
+ * @con: The D-BUS connection to use.
+ * @file: A %const @gchar pointer URI to be opened (UTF-8). 
+ *
  * This function opens a file in the application that has
- * registered as the handler for the mime type of the file.
- * @param con The D-BUS connection that we want to use.
- * @param file A string representation of the GnomeVFS URI of the file to be
- * opened (UTF-8). See hildonmime_open for more details.
+ * registered as the handler for the mime type of the @file.
  *
+ * The @file parameter must be a full URI, that is to say that it must
+ * be in the form of 'file:///etc/hosts'.  
+ *
  * The mapping from mime type to D-BUS service is done by looking up the
  * application for the mime type and in the desktop file for that application
  * the X-Osso-Service field is used to get the D-BUS service.
  *
- * @return 1 in case of success, < 1 if an error occurred or if some parameter
- * is invalid.
+ * This function operates asynchronously, this means that if D-BUS has
+ * to open the application that handles this @file type and your
+ * application quits prematurely, the application may not open the
+ * @file. An event loop is expected to be used here to ensure D-BUS has
+ * a chance to send the message if the application isn't already started. 
+ *
+ * Return: 1 in case of success, < 1 if an error occurred or if some parameter
+ * is invalid. 
  */
 gint hildon_mime_open_file                  (DBusConnection *con,
 					     const gchar    *file);
 
 
 /**
- * This function opens a list of files in the application that has
- * registered as the handler for the mime type of the file.
- * @param con The D-BUS connection that we want to use.
- * @param files A list of string representations of the GnomeVFS URI of the file
- * to be opened (UTF-8). See hildonmime_open for more details.
- * 
- * These will be sent to the application that handles this MIME-type.
- * If more then one type of file is specified, many applications may be
- * launched. 
+ * hildon_mime_open_file_list:
+ * @con: The D-BUS connection to use.
+ * @files: A @GList of %const @gchar pointer URIs to be opened (UTF-8). 
  *
- * The mapping from mime type to D-BUS service is done by looking up the
- * application for the mime type and in the desktop file for that application
- * the X-Osso-Service field is used to get the D-BUS service.
+ * This function opens a list of @files. The @files will be sent to
+ * each application that handles their MIME-type. If more then one
+ * type of file is specified, many applications may be launched.  
  *
- * @return 1 in case of success, < 1 if an error occurred or if some parameter
+ * For more information on opening files, see hildon_mime_open_file().
+ *
+ * Return: 1 in case of success, < 1 if an error occurred or if some parameter
  * is invalid.
  */
 gint hildon_mime_open_file_list             (DBusConnection *con,
@@ -83,16 +89,20 @@
 
 
 /**
- * This function opens a file in the application that has
- * registered as the handler for the mime type of the file.
- * @param con The D-BUS connection that we want to use.
- * @param mime_type A string representation of the mime-type.
+ * hildon_mime_open_file_with_mime_type:
+ * @con: The D-BUS connection that we want to use.
+ * @file: A %const @gchar pointer URI to be opened (UTF-8). 
+ * @mime_type: A %const @gchar pointer MIME-type to be used (UTF-8). 
  *
- * This operates similarly to hildonmime_open_file() with the exception
- * that a file does not need to be given, and the @mime_type supplied
- * is used without the need for checking the mime-type of the file itself. 
+ * This function opens @file in the application that has
+ * registered as the handler for @mime_type.
  *
- * @return 1 in case of success, < 1 if an error occurred or if some parameter
+ * The @file is optional. If it is omitted, the @mime_type is used
+ * to know which application to launch.
+ * 
+ * For more information on opening files, see hildon_mime_open_file().
+ *
+ * Return: 1 in case of success, < 1 if an error occurred or if some parameter
  * is invalid.
  */
 gint hildon_mime_open_file_with_mime_type   (DBusConnection *con,
@@ -118,20 +128,25 @@
 } HildonMimeCategory;
 
 /**
- * Return the category the specified mime type is in. See
- * hildon_mime_get_mime_types_for_category() for more information.
+ * hildon_mime_get_category_for_mime_type:
+ * @mime_type: A %const @gchar pointer MIME-type to be used (UTF-8). 
  *
- * @param mime_type The mime type.
+ * This function returns the @HildonMimeCategory for the specified
+ * @mime_type. See hildon_mime_get_mime_types_for_category() for more
+ * information. 
  *
-* @return The category that the mime type is in.
-*/
+ * Return: The category that the @mime_type is in.
+ */
 HildonMimeCategory hildon_mime_get_category_for_mime_type     (const gchar       *mime_type);
 
 /**
- * Returns a list of mime types that are in the specified category. The returned
- * list should be freed by calling hildon_mime_types_list_free().
+ * hildon_mime_get_mime_types_for_category:
+ * @category: The @HildonMimeCategory.
  *
- * The mapping between category and mime type is handled through the shared mime
+ * This function returns a @GList of  %const @gchar pointer mime types
+ * that are in the specified category.  
+ *
+ * The mapping between @category and mime type is handled through the shared mime
  * info. Add the tag <osso:category name="name"/> to a mime type to specify that
  * the mime type is in the category "name". Valid category names are:
  *
@@ -139,40 +154,42 @@
  * 
  * An example:
  *
- *  <mime-type type="text/plain">
- *   <osso:category name="documents"/>
- * </mime-type>
- * 
- * @param category The category.
+ *   <mime-type type="text/plain">
+ *     <osso:category name="documents"/>
+ *   </mime-type>
  *
- * @return A list of mime types, represented as strings, or NULL if none were
- * found or not valid category.
+ * Return: A newly allocated @GList which should be freed with
+ * hildon_mime_types_list_free() OR %NULL if none were found.
  */
 GList *          hildon_mime_get_mime_types_for_category      (HildonMimeCategory   category);
 
 /**
- * Frees the list of mime types as returned by
+ * hildon_mime_types_list_free:
+ * @list: A @GList of mime types.
+ *
+ * Frees the list of mime types returned by
  * hildon_mime_get_mime_types_for_category().
- * 
- * @param list A list of mime types.
  */
 void             hildon_mime_types_list_free                  (GList             *list);
 
 /**
- * Returns the name of the specified category.
- * 
- * @param category The category.
+ * hildon_mime_get_category_name:
+ * @category: The @HildonMimeCategory.
  *
- * @return The name of the category, should not be freed or modified.
+ * This function returns the name of the specified category.
+ *
+ * Return: The %const @gchar pointer name of the category, this should not
+ * be freed or modified. 
  */
 const gchar *    hildon_mime_get_category_name                (HildonMimeCategory   category);
 
 /**
- * Returns the category corresponding to the given name.
- * 
- * @param category The category name.
+ * hildon_mime_get_category_from_name:
+ * @category: The %const @gchar pointer category name.
  *
- * @return The category.
+ * This function returns the @HildonMimeCategory corresponding to @category.
+ *
+ * Return: The @HildonMimeCategory.
  */
 HildonMimeCategory hildon_mime_get_category_from_name         (const gchar       *category);
 
@@ -184,25 +201,28 @@
 /*@{*/
 
 /**
+ * hildon_mime_application_get_mime_types:
+ * @application_id: The application id, as returned by GnomeVFS.
+ *
  * Returns a list of mime types supported by the application corresponding to
- * the specified appliction id. The returned list should be freed by calling
- * hildon_mime_application_mime_types_list_free().
+ * the specified @appliction_id. 
  *
  * The list of mime types is specifed in the desktop file for the application
  * with the MimeType field.
- * 
- * @param application_id The application id, as returned by GnomeVFS.
  *
- * @return A list of mime types, represented as strings, or NULL if none were
- * found.
+ * Return: A newly allocated @GList of %const @gchar pointer mime
+ * types which should be freed with
+ * hildon_mime_application_mime_types_list_free() OR %NULL if none were
+ * found.  
  */
 GList *          hildon_mime_application_get_mime_types       (const gchar       *application_id);
 
 /**
- * Frees the list of mime types as returned by
- * hildon_mime_application_get_mime_types().
+ * hildon_mime_application_mime_types_list_free:
+ * @mime_types: A @GList of %const @gchar pointer mime types.
  * 
- * @param mime_types A list of mime types.
+ * Frees the list of mime_types as returned by
+ * hildon_mime_application_get_mime_types(). 
  */
 void             hildon_mime_application_mime_types_list_free (GList             *mime_types);
 
@@ -214,24 +234,27 @@
 /*@{*/
 
 /**
- * Returns a NULL terminated array of icon names for the specified mime
- * type. The icon names are GtkIconTheme names. A number of names are returned,
- * ordered by how specific they are. For example, if the mime type "image/png"
- * is passed, the first icon name might correspond to a png file, the second to
- * an image file, and the third to a regular file.
+ * hildon_mime_get_icon_names:
+ * @mime_type: The %const @gchar pointer mime type
+ * @file_info: Optional GnomeVFSFileInfo struct, or %NULL
+ * 
+ * This function returns a %NULL terminated array of icon names for
+ * the specified @mime_type. The icon names are @GtkIconTheme names. A
+ * number of names are returned, ordered by how specific they are. For
+ * example, if the mime type "image/png" is passed, the first icon
+ * name might correspond to a png file, the second to an image file,
+ * and the third to a regular file. 
  *
- * In order to decide which icon to use, the existance of it in the icon theme
- * should be checked with gtk_icon_theme_has_icon(). If the first icon is not
- * available, try the next etc.
+ * In order to decide which icon to use, the existance of it in the
+ * icon theme should be checked with gtk_icon_theme_has_icon(). If the
+ * first icon is not available, try the next etc. 
  *
- * The optional GnomeVFSFileInfo struct is used to get additional information
- * about a file or directory that might help to get the right icon.
+ * The optional GnomeVFSFileInfo struct is used to get additional
+ * information about a file or directory that might help to get the
+ * right icon. 
  *
- * @param mime_type The mime type
- * @param file_info Optional GnomeVFSFileInfo struct, or NULL
- *
- * @return A newly allocated array of icon name strings. Should be freed with
- * g_strfreev().
+ * Return: A newly allocated array of icon name strings which should be freed with
+ * g_strfreev() OR %NULL if none were found.
  */
 gchar **         hildon_mime_get_icon_names                   (const gchar       *mime_type,
 							       GnomeVFSFileInfo  *file_info);

Modified: projects/haf/trunk/libhildonmime/tests/test-open.c
===================================================================
--- projects/haf/trunk/libhildonmime/tests/test-open.c	2007-04-17 10:38:37 UTC (rev 11107)
+++ projects/haf/trunk/libhildonmime/tests/test-open.c	2007-04-17 11:07:29 UTC (rev 11108)
@@ -2,7 +2,7 @@
 /*
  * This is file is part of libhildonmime
  *
- * Copyright (C) 2004-2006 Nokia Corporation.
+ * Copyright (C) 2004-2007 Nokia Corporation.
  *
  * Contact: Erik Karlsson <erik.b.karlsson at nokia.com>
  *
@@ -23,48 +23,127 @@
  */
 
 #include <config.h>
+#include <stdlib.h>
 #include <hildon-mime.h>
 
+static gboolean   use_system = FALSE;
+static gchar     *open_uri = NULL;
+static gchar    **open_uri_list = NULL;
+static gchar     *mime_type = NULL;
+
+static GOptionEntry entries[] = {
+	{ "open-uri", 'o', 
+	  0, G_OPTION_ARG_STRING, 
+	  &open_uri, 
+	  "Open a URI (for example, \"-l file://...\")",
+	  NULL },
+	{ "open-uri-list", 'l', 
+	  0, G_OPTION_ARG_STRING_ARRAY, 
+	  &open_uri_list, 
+	  "Open a list of URIs (for example, \"-l file://... -l file://...\", etc)",
+	  NULL },
+	{ "mime-type", 'm', 
+	  0, G_OPTION_ARG_STRING, 
+	  &mime_type, 
+	  "Opens the application associated with the mime-type (used WITH --open-uri)",
+	  NULL},
+	{ "system", 's', 
+	  0, G_OPTION_ARG_NONE,
+	  &use_system,
+	  "Use SYSTEM bus instead of SESSION bus for the D-Bus connection",
+	  NULL },
+	{ NULL }
+};
+
+static gboolean
+quit_cb (GMainLoop *main_loop)
+{
+	g_main_loop_quit (main_loop);
+	return FALSE;
+}
+
 int
 main (int argc, char** argv)
 {
-	DBusConnection *conn;
-	gint            ret;
+	DBusConnection *con;
+	GMainLoop      *main_loop;
+	GOptionContext *context;
+	gboolean        success;
 
-	if (argc < 2) {
-		g_printerr ("Usage: %s <URI> [<mime-type>]\n", argv[0]);
-		return 1;
-	}
-	
-	conn = dbus_bus_get (DBUS_BUS_SESSION, NULL);
-	g_assert (conn != NULL);
+	context = g_option_context_new ("- test the hildon-open API.");
+	g_option_context_add_main_entries (context, entries, NULL);
+	g_option_context_parse (context, &argc, &argv, NULL);
+	g_option_context_free (context);
 
-	g_print ("\nTesting hildon_mime_open_file() with URI:'%s'\n", argv[1]);
-	ret = hildon_mime_open_file (conn, argv[1]);
-	if (ret != 1) {
-		g_print ("Error\n");
-	} else {
-		g_print ("Success\n");
+	if (!open_uri && !mime_type && !open_uri_list) {
+ 		g_printerr ("Usage: %s --help\n", argv[0]); 
+		return EXIT_FAILURE;
 	}
 	
-	g_print ("\nTesting hildon_mime_open_file_list() with URI:'%s'\n", argv[1]);
-	ret = hildon_mime_open_file_list (conn, g_slist_append (NULL, argv[1]));
-	if (ret != 1) {
-		g_print ("Error\n");
+	if (!use_system) {
+		g_print ("---- Using SESSION bus\n");
+		con = dbus_bus_get (DBUS_BUS_SESSION, NULL);
 	} else {
-		g_print ("Success\n");
+		g_print ("---- Using SYSTEM bus\n");
+		con = dbus_bus_get (DBUS_BUS_SYSTEM, NULL);
 	}
 
-	if (argc > 2 && argv[2]) {
-		g_print ("\nTesting hildon_mime_open_file_with_mime() with URI:'%s' and MIME:'%s'\n", 
-                         argv[1], argv[2]);
-		ret = hildon_mime_open_file_with_mime_type (conn, argv[1], argv[2]);
-		if (ret != 1) {
-			g_print ("Error\n");
+	if (!con) {
+		g_printerr ("Could not get D-Bus connection\n");
+		return EXIT_FAILURE;
+	}
+
+	if (open_uri_list) {
+		GSList      *uris = NULL;
+		const gchar *uri;
+		gint         i = 0;
+
+		while ((uri = open_uri_list[i++]) != NULL) {
+			uris = g_slist_append (uris, g_strdup (uri));
+		}
+
+		g_print ("---> hildon_uri_open_file_list() with %d URIs\n", g_slist_length (uris));
+		success = hildon_mime_open_file_list (con, uris) == 1;
+		g_slist_foreach (uris, (GFunc) g_free, NULL);
+		g_slist_free (uris);
+
+		if (!success) {
+			g_print ("<--- Error\n");
+			return EXIT_FAILURE;
 		} else {
-			g_print ("Success\n");
+			g_print ("<--- Success\n");
 		}
 	}
+
+	if (open_uri && !mime_type) {
+		g_print ("---> Testing hildon_mime_open_file() with URI: '%s'\n", open_uri);
+		success = hildon_mime_open_file (con, open_uri) == 1;
+		if (!success) {
+			g_print ("<--- Error\n");
+			return EXIT_FAILURE;
+		} else {
+			g_print ("<--- Success\n");
+		}
+	}
 	
-	return 0;
+	if (open_uri && mime_type) {
+		g_print ("---> Testing hildon_mime_open_file_with_mime() with URI: '%s' and MIME: '%s'\n", 
+                         open_uri, mime_type);
+		
+		success = hildon_mime_open_file_with_mime_type (con, open_uri, mime_type) == 1;
+		if (!success) {
+			g_print ("<--- Error\n");
+			return EXIT_FAILURE;
+		} else {
+			g_print ("<--- Success\n");
+		}
+	}
+
+	/* Quit after 2 seconds, which should be long enough */
+	main_loop = g_main_loop_new (NULL, FALSE);
+	g_timeout_add (2000, (GSourceFunc) quit_cb, main_loop);
+	g_main_loop_run (main_loop);
+	g_main_loop_unref (main_loop);
+		
+	return EXIT_SUCCESS;
 }


More information about the maemo-commits mailing list