Support for major_mime_type/*



Hi,

Before beginning to investigate what it would take to move the monikers to
gnome-vfs, I decided to make this very small hack to Bonobo Classic (:))
to enable components to support every mime type that has a given major
mime type (i.e. a component that supports text/*). Is it OK to check in?

My comments:

* Yes, get_major_mime_type () is ugly, it shouldn't be c&p'd over the two
extenders, in fact, it shouldn't be in there at all. I know all of that
and I will of course use gnome_vfs_get_supertype_from_mime_type in the
gnomevfs version.

* Maybe I should run a major/minor query first, and run major/* only if
the first one fails? (because a component explicitly supporting foo/xyzzy
might be more suitable than a component that supports every foo/* type and
has no means of utilizing the exciting features only xyzzy supports from
the foo family) Of course this might become superfluous once we have the
priority list thing.

* Don't ever create an .oaf file that lists application/* in its supported
mime types! :)


Bye,
	Cactus

-- 
   .--= ULLA! =----------------------.   `We are not here to give users what
   \    http://cactus.rulez.org       \   they want'  -- RMS, at GUADEC 2001
    `-----= cactus cactus rulez org =--'
You are in a twisty little maze of Debian packages, all different.
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/bonobo/ChangeLog,v
retrieving revision 1.1041
diff -u -u -r1.1041 ChangeLog
--- ChangeLog	2001/04/20 00:42:34	1.1041
+++ ChangeLog	2001/04/21 13:03:50
@@ -1,3 +1,11 @@
+2001-04-21  ERDI Gergo  <cactus cactus rulez org>
+
+	* monikers/bonobo-moniker-extender-file.c:
+	* monikers/bonobo-moniker-extender-stream.c: Query for components
+	that support every mime type that has the major mime type of the
+	current stream (e.g. query for text/* if the stream is of type
+	text/frobozz)
+
 Thu Apr 19 17:34:02 2001  George Lebl <jirka 5z com>
 
 	* bonobo/bonobo-control-frame.c
Index: monikers/bonobo-moniker-extender-file.c
===================================================================
RCS file: /cvs/gnome/bonobo/monikers/bonobo-moniker-extender-file.c,v
retrieving revision 1.9
diff -u -u -r1.9 bonobo-moniker-extender-file.c
--- monikers/bonobo-moniker-extender-file.c	2001/03/16 12:26:31	1.9
+++ monikers/bonobo-moniker-extender-file.c	2001/04/21 13:03:52
@@ -17,6 +17,23 @@
 
 #include "bonobo-moniker-std.h"
 
+/* The result needs to be g_free'd */
+static gchar* get_major_mime_type (const char* mime_type)
+{
+	char *major_end;
+	char *major;
+	int   major_length;
+
+	major_end = strchr (mime_type, '/');
+	major_length = major_end - mime_type;
+
+	major = g_new (gchar, major_length + 1); /* +1 for trailing \0 */
+	strncpy (major, mime_type, major_length);
+	major[major_length] = '\0'; /* Uglee */
+	
+	return major;
+}
+
 Bonobo_Unknown
 bonobo_file_extender_resolve (BonoboMonikerExtender *extender,
 			      const Bonobo_Moniker   m,
@@ -26,6 +43,7 @@
 			      CORBA_Environment     *ev)
 {
 	const char         *mime_type;
+	char               *mime_type_major;
 	char               *oaf_requirements;
 	Bonobo_Unknown      object;
 	Bonobo_Persist      persist;
@@ -42,19 +60,23 @@
 	g_warning ("Filename : '%s'", fname);
 
 	mime_type = gnome_mime_type (fname);
-
+	mime_type_major = get_major_mime_type (mime_type);
+	
 	oaf_requirements = g_strdup_printf (
-		"bonobo:supported_mime_types.has ('%s') AND repo_ids.has ('%s') AND "
+		"bonobo:supported_mime_types.has_one (['%s', '%s/*']) AND "
+		"repo_ids.has ('%s') AND "
 		"repo_ids.has ('IDL:Bonobo/PersistFile:1.0')",
-		mime_type, requested_interface);
-		
+		mime_type, mime_type_major,
+		requested_interface);
+	
 	result = oaf_query (oaf_requirements, NULL, ev);
 	if (BONOBO_EX (ev) || result == NULL || result->_buffer == NULL ||
 	    !result->_buffer[0].iid)
 		return CORBA_OBJECT_NIL;
 
 	g_free (oaf_requirements);
-
+	g_free (mime_type_major);
+	
 	oafiid = g_strdup (result->_buffer[0].iid);
 
 	CORBA_free (result);
Index: monikers/bonobo-moniker-extender-stream.c
===================================================================
RCS file: /cvs/gnome/bonobo/monikers/bonobo-moniker-extender-stream.c,v
retrieving revision 1.4
diff -u -u -r1.4 bonobo-moniker-extender-stream.c
--- monikers/bonobo-moniker-extender-stream.c	2001/02/05 20:53:52	1.4
+++ monikers/bonobo-moniker-extender-stream.c	2001/04/21 13:03:52
@@ -17,6 +17,23 @@
 
 #include "bonobo-moniker-std.h"
 
+/* The result needs to be g_free'd */
+static gchar* get_major_mime_type (const char* mime_type)
+{
+	char *major_end;
+	char *major;
+	int   major_length;
+
+	major_end = strchr (mime_type, '/');
+	major_length = major_end - mime_type;
+
+	major = g_new (gchar, major_length + 1); /* +1 for trailing \0 */
+	strncpy (major, mime_type, major_length);
+	major[major_length] = '\0'; /* Uglee */
+	
+	return major;
+}
+
 static gchar *
 get_stream_type (Bonobo_Stream stream, CORBA_Environment *ev)
 {
@@ -46,6 +63,7 @@
 				CORBA_Environment           *ev)
 {
 	const char    *mime_type;
+	char          *mime_type_major;
 	char          *oaf_requirements;
 	Bonobo_Unknown object;
 	Bonobo_Unknown stream;
@@ -66,15 +84,20 @@
 	if (!mime_type)
 		goto unref_stream_exception;
 
+	mime_type_major = get_major_mime_type (mime_type);
+	
 	oaf_requirements = g_strdup_printf (
-		"bonobo:supported_mime_types.has ('%s') AND repo_ids.has ('%s') AND "
+		"bonobo:supported_mime_types.has_one (['%s', '%s/*']) AND "
+		"repo_ids.has ('%s') AND "
 		"repo_ids.has ('IDL:Bonobo/PersistStream:1.0')",
-		mime_type, requested_interface);
+		mime_type, mime_type_major, requested_interface);
 		
 	object = oaf_activate (oaf_requirements, NULL, 0, &ret_id, ev);
 	g_warning ("Attempt activate object satisfying '%s': %p",
 		   oaf_requirements, object);
+
 	g_free (oaf_requirements);
+	g_free (mime_type_major);
 
 	if (ev->_major != CORBA_NO_EXCEPTION)
 		goto unref_stream_exception;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]