ftp://ftp.redhat.com/pub/redhat/linux/rawhide/SRPMS/SRPMS/gnome-vfs2-2.3.8-1.src.rpm
[gnome-vfs-httpcaptive.git] / monikers / bonobo-moniker-extender-file.c
1 /*
2  * bonobo-moniker-extender-file.c: 
3  *
4  * Author:
5  *      Dietmar Maurer (dietmar@helixcode.com)
6  *
7  * Copyright 2000, Helix Code, Inc.
8  */
9 #include "config.h"
10 #include <string.h>
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>
17
18 #include "gnome-moniker-std.h"
19
20 Bonobo_Unknown
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)
27 {
28         const char            *mime_type;
29         char                  *oaf_requirements;
30         Bonobo_Unknown         object;
31         Bonobo_Persist         persist;
32         const char            *fname;
33         Bonobo_ServerInfoList *result;
34         char                  *oafiid;
35
36         if (strchr (display_name, ':'))
37                 fname = strchr (display_name, ':') + 1;
38         else
39                 fname = display_name;
40
41         g_warning ("Filename : '%s'", fname);
42
43         mime_type = gnome_vfs_mime_type_from_name (fname);
44
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);
49                 
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;
54
55         g_free (oaf_requirements);
56
57         oafiid = g_strdup (result->_buffer[0].iid);
58
59         CORBA_free (result);
60
61         object = bonobo_url_lookup (oafiid, (gchar *) display_name, ev);
62         if (!BONOBO_EX (ev) && object != CORBA_OBJECT_NIL) {
63                 g_free (oafiid);
64                 Bonobo_Unknown_ref (object, ev);
65                 if (!BONOBO_EX (ev))
66                         return bonobo_moniker_util_qi_return (object, 
67                                 requested_interface, ev);
68         }
69         
70         CORBA_exception_init (ev);
71
72         object = bonobo_activation_activate_from_id (oafiid, 0, NULL, ev);
73
74         g_free (oafiid);        
75
76         if (BONOBO_EX (ev) || object == CORBA_OBJECT_NIL)
77                 return CORBA_OBJECT_NIL;
78
79         persist = Bonobo_Unknown_queryInterface (
80                 object, "IDL:Bonobo/PersistFile:1.0", ev);
81
82         if (BONOBO_EX (ev) || persist == CORBA_OBJECT_NIL) {
83                 bonobo_object_release_unref (object, ev);
84                 return CORBA_OBJECT_NIL;
85         }
86
87         if (persist != CORBA_OBJECT_NIL) {
88                 Bonobo_PersistFile_load (persist, fname, ev);
89
90                 bonobo_object_release_unref (persist, ev);
91
92                 return bonobo_moniker_util_qi_return (
93                         object, requested_interface, ev);
94         }
95         
96         return CORBA_OBJECT_NIL;
97 }