2 * bonobo-moniker-extender-file.c:
5 * Dietmar Maurer (dietmar@helixcode.com)
7 * Copyright 2000, Helix Code, Inc.
11 #include <bonobo/bonobo-storage.h>
12 #include <bonobo/bonobo-exception.h>
13 #include <bonobo/bonobo-moniker.h>
14 #include <bonobo/bonobo-moniker-extender.h>
15 #include <bonobo/bonobo-moniker-util.h>
16 #include <libgnomevfs/gnome-vfs-mime.h>
18 #include "gnome-moniker-std.h"
21 bonobo_file_extender_resolve (BonoboMonikerExtender *extender,
22 const Bonobo_Moniker m,
23 const Bonobo_ResolveOptions *options,
24 const CORBA_char *display_name,
25 const CORBA_char *requested_interface,
26 CORBA_Environment *ev)
28 const char *mime_type;
29 char *oaf_requirements;
30 Bonobo_Unknown object;
31 Bonobo_Persist persist;
33 Bonobo_ServerInfoList *result;
36 if (strchr (display_name, ':'))
37 fname = strchr (display_name, ':') + 1;
41 g_warning ("Filename : '%s'", fname);
43 mime_type = gnome_vfs_mime_type_from_name (fname);
45 oaf_requirements = g_strdup_printf (
46 "bonobo:supported_mime_types.has ('%s') AND repo_ids.has ('%s') AND "
47 "repo_ids.has ('IDL:Bonobo/PersistFile:1.0')",
48 mime_type, requested_interface);
50 result = bonobo_activation_query (oaf_requirements, NULL, ev);
51 if (BONOBO_EX (ev) || result == NULL || result->_buffer == NULL ||
52 !result->_buffer[0].iid)
53 return CORBA_OBJECT_NIL;
55 g_free (oaf_requirements);
57 oafiid = g_strdup (result->_buffer[0].iid);
61 object = bonobo_url_lookup (oafiid, (gchar *) display_name, ev);
62 if (!BONOBO_EX (ev) && object != CORBA_OBJECT_NIL) {
64 Bonobo_Unknown_ref (object, ev);
66 return bonobo_moniker_util_qi_return (object,
67 requested_interface, ev);
70 CORBA_exception_init (ev);
72 object = bonobo_activation_activate_from_id (oafiid, 0, NULL, ev);
76 if (BONOBO_EX (ev) || object == CORBA_OBJECT_NIL)
77 return CORBA_OBJECT_NIL;
79 persist = Bonobo_Unknown_queryInterface (
80 object, "IDL:Bonobo/PersistFile:1.0", ev);
82 if (BONOBO_EX (ev) || persist == CORBA_OBJECT_NIL) {
83 bonobo_object_release_unref (object, ev);
84 return CORBA_OBJECT_NIL;
87 if (persist != CORBA_OBJECT_NIL) {
88 Bonobo_PersistFile_load (persist, fname, ev);
90 bonobo_object_release_unref (persist, ev);
92 return bonobo_moniker_util_qi_return (
93 object, requested_interface, ev);
96 return CORBA_OBJECT_NIL;