Initial original import from: fuse-2.4.2-2.fc4
[captive.git] / src / libcaptive / client / directory-parent.c
1 /* $Id$
2  * captive vfs 'directory' interface to reactos of sandbox parent
3  * Copyright (C) 2002-2003 Jan Kratochvil <project-captive@jankratochvil.net>
4  * 
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; exactly version 2 of June 1991 is required
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19
20 #include "config.h"
21
22 #include "directory-parent.h"   /* self */
23 #include <glib/gmessages.h>
24 #include "../sandbox/parent-Directory.h"
25 #include "vfs-parent.h"
26 #include "parent-connector.h"
27
28
29 static gpointer captive_directory_parent_object_parent_class=NULL;
30
31
32 static GnomeVFSResult captive_directory_parent_close(CaptiveDirectoryObject *captive_directory_object);
33 static GnomeVFSResult captive_directory_parent_read
34                 (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info);
35 static GnomeVFSResult captive_directory_parent_remove(CaptiveDirectoryObject *captive_directory_object);
36
37
38 static void captive_directory_parent_object_dispose(CaptiveDirectoryParentObject *captive_directory_parent_object)
39 {
40         g_return_if_fail(captive_directory_parent_object!=NULL);
41
42         captive_directory_parent_close(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object));      /* errors ignored */
43
44         if (captive_parent_connector_dispose(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object)))
45                 return;
46
47         G_OBJECT_CLASS(captive_directory_parent_object_parent_class)->dispose((GObject *)captive_directory_parent_object);
48 }
49
50 static void captive_directory_parent_object_finalize(CaptiveDirectoryParentObject *captive_directory_parent_object)
51 {
52         g_return_if_fail(captive_directory_parent_object!=NULL);
53
54         captive_parent_connector_finalize(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
55
56         g_free(captive_directory_parent_object->pathname);
57         captive_directory_parent_object->pathname=NULL;
58
59         G_OBJECT_CLASS(captive_directory_parent_object_parent_class)->finalize((GObject *)captive_directory_parent_object);
60 }
61
62 static void captive_directory_parent_object_class_init(CaptiveDirectoryParentObjectClass *class)
63 {
64 GObjectClass *gobject_class=G_OBJECT_CLASS(class);
65 CaptiveDirectoryObjectClass *captive_directory_object_class=CAPTIVE_DIRECTORY_OBJECT_CLASS(class);
66
67         captive_directory_parent_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class)));
68         gobject_class->dispose=(void (*)(GObject *object))captive_directory_parent_object_dispose;
69         gobject_class->finalize=(void (*)(GObject *object))captive_directory_parent_object_finalize;
70
71         captive_directory_object_class->read=captive_directory_parent_read;
72         captive_directory_object_class->remove=captive_directory_parent_remove;
73 }
74
75
76 static GnomeVFSResult (*captive_directory_parent_object_captive_parent_connector_open_orig)
77                 (CaptiveParentConnector *captive_parent_connector);
78 static GnomeVFSResult captive_directory_parent_object_captive_parent_connector_open
79                 (CaptiveParentConnector *captive_parent_connector);
80
81 static GnomeVFSResult captive_directory_parent_object_captive_parent_connector_close
82                 (CaptiveParentConnector *captive_parent_connector);
83 static GnomeVFSResult (*captive_directory_parent_object_captive_parent_connector_close_orig)
84                 (CaptiveParentConnector *captive_parent_connector);
85
86 static G_CONST_RETURN gchar *captive_directory_parent_object_captive_parent_connector_get_pathname
87                 (CaptiveParentConnector *captive_parent_connector);
88
89 static void captive_directory_parent_object_captive_parent_connector_init(CaptiveParentConnectorIface *captive_parent_connector_iface)
90 {
91         g_return_if_fail(CAPTIVE_IS_PARENT_CONNECTOR_CLASS(captive_parent_connector_iface));
92
93         captive_directory_parent_object_captive_parent_connector_open_orig=captive_parent_connector_iface->open;
94         captive_parent_connector_iface->open=captive_directory_parent_object_captive_parent_connector_open;
95
96         captive_directory_parent_object_captive_parent_connector_close_orig=captive_parent_connector_iface->close;
97         captive_parent_connector_iface->close=captive_directory_parent_object_captive_parent_connector_close;
98
99         captive_parent_connector_iface->get_pathname=captive_directory_parent_object_captive_parent_connector_get_pathname;
100 }
101
102
103 static void captive_directory_parent_object_init(CaptiveDirectoryParentObject *captive_directory_parent_object)
104 {
105         g_return_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object));
106 }
107
108
109 GType captive_directory_parent_object_get_type(void)
110 {
111 static GType captive_directory_parent_object_type=0;
112
113         if (!captive_directory_parent_object_type) {
114 static const GTypeInfo captive_directory_parent_object_info={
115                                 sizeof(CaptiveDirectoryParentObjectClass),
116                                 NULL,   /* base_init */
117                                 NULL,   /* base_finalize */
118                                 (GClassInitFunc)captive_directory_parent_object_class_init,
119                                 NULL,   /* class_finalize */
120                                 NULL,   /* class_data */
121                                 sizeof(CaptiveDirectoryParentObject),
122                                 5,      /* n_preallocs */
123                                 (GInstanceInitFunc)captive_directory_parent_object_init,
124                                 };
125 static const GInterfaceInfo captive_parent_connector_info={
126                                 (GInterfaceInitFunc)captive_directory_parent_object_captive_parent_connector_init,      /* interface_init */
127                                 NULL,   /* interface_finalize */
128                                 NULL,   /* interface_data */
129                                 };
130
131                 captive_directory_parent_object_type=g_type_register_static(CAPTIVE_DIRECTORY_TYPE_OBJECT,
132                                 "CaptiveDirectoryParentObject",&captive_directory_parent_object_info,0);
133                 g_type_add_interface_static(captive_directory_parent_object_type,
134                                 CAPTIVE_TYPE_PARENT_CONNECTOR,&captive_parent_connector_info);
135                 }
136
137         return captive_directory_parent_object_type;
138 }
139
140
141 static void captive_directory_parent_init
142                 (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveVfsObject *captive_vfs_object)
143 {
144         g_return_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object));
145         g_return_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object));
146
147         /* Order of captive_directory_init() and captive_parent_connector_init()
148          * should not matter as 'vfs' is passed by value to captive_parent_connector_init().
149          */
150         captive_directory_init(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object),captive_vfs_object);
151
152         captive_parent_connector_init(
153                         CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object),      /* captive_parent_connector */
154                         &captive_directory_parent_object->corba_Directory_object,       /* corba_objectp */
155                         CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs));     /* captive_vfs_parent_object */
156 }
157
158 GnomeVFSResult captive_directory_parent_new_open(CaptiveDirectoryObject **captive_directory_object_return,
159                 CaptiveVfsObject *captive_vfs_object,const gchar *pathname)
160 {
161 CaptiveDirectoryParentObject *captive_directory_parent_object;
162 GnomeVFSResult r;
163
164         g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
165         g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
166         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
167
168         captive_directory_parent_object=g_object_new(
169                         CAPTIVE_DIRECTORY_PARENT_TYPE_OBJECT,   /* object_type */
170                         NULL);  /* first_property_name; FIXME: support properties */
171         captive_directory_parent_object->pathname=g_strdup(pathname);
172
173         captive_directory_parent_init(captive_directory_parent_object,captive_vfs_object);
174
175         if (GNOME_VFS_OK!=(r=captive_parent_connector_connect(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
176                 return r;
177
178         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_new_open(captive_directory_parent_object))) {
179                 g_object_unref(captive_directory_parent_object);
180                 *captive_directory_object_return=NULL;
181                 return r;
182                 }
183
184         *captive_directory_object_return=CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object);
185         return (*captive_directory_parent_object_captive_parent_connector_open_orig)
186                         (CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
187 }
188
189
190 GnomeVFSResult captive_directory_parent_new_make(CaptiveDirectoryObject **captive_directory_object_return,
191                 CaptiveVfsObject *captive_vfs_object,const gchar *pathname,guint perm)
192 {
193 CaptiveDirectoryParentObject *captive_directory_parent_object;
194 GnomeVFSResult r;
195
196         g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
197         g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
198         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
199
200         captive_directory_parent_object=g_object_new(
201                         CAPTIVE_DIRECTORY_PARENT_TYPE_OBJECT,   /* object_type */
202                         NULL);  /* first_property_name; FIXME: support properties */
203         captive_directory_parent_object->pathname=g_strdup(pathname);
204
205         captive_directory_parent_init(captive_directory_parent_object,captive_vfs_object);
206
207         if (GNOME_VFS_OK!=(r=captive_parent_connector_connect(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
208                 return r;
209
210         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_new_make(captive_directory_parent_object,perm))) {
211                 g_object_unref(captive_directory_parent_object);
212                 *captive_directory_object_return=NULL;
213                 return r;
214                 }
215         captive_parent_connector_set_dirty(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
216
217         *captive_directory_object_return=CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object);
218         return (*captive_directory_parent_object_captive_parent_connector_open_orig)
219                         (CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
220 }
221
222
223 static GnomeVFSResult captive_directory_parent_close(CaptiveDirectoryObject *captive_directory_object)
224 {
225 CaptiveDirectoryParentObject *captive_directory_parent_object;
226 GnomeVFSResult r;
227 gint retried=0;
228
229         g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
230
231         captive_directory_parent_object=CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_directory_object);
232
233         do {
234                 if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
235                         break;
236                 if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
237                                 !=(r=captive_parent_connector_close(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
238                         break;
239                 } while (!retried++);
240         return r;
241 }
242
243
244 static GnomeVFSResult captive_directory_parent_object_captive_parent_connector_open
245                 (CaptiveParentConnector *captive_parent_connector)
246 {
247 GnomeVFSResult r;
248
249         g_return_val_if_fail(CAPTIVE_IS_PARENT_CONNECTOR(captive_parent_connector),GNOME_VFS_ERROR_BAD_PARAMETERS);
250         g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_parent_connector),GNOME_VFS_ERROR_BAD_PARAMETERS);
251
252         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_new_open(CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_parent_connector))))
253                 return r;
254
255         return (*captive_directory_parent_object_captive_parent_connector_open_orig)(captive_parent_connector);
256 }
257
258
259 static GnomeVFSResult captive_directory_parent_object_captive_parent_connector_close
260                 (CaptiveParentConnector *captive_parent_connector)
261 {
262 GnomeVFSResult r;
263
264         g_return_val_if_fail(CAPTIVE_IS_PARENT_CONNECTOR(captive_parent_connector),GNOME_VFS_ERROR_BAD_PARAMETERS);
265         g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_parent_connector),GNOME_VFS_ERROR_BAD_PARAMETERS);
266
267         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_close(CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_parent_connector))))
268                 return r;
269
270         return (*captive_directory_parent_object_captive_parent_connector_close_orig)(captive_parent_connector);
271 }
272
273
274 static G_CONST_RETURN gchar *captive_directory_parent_object_captive_parent_connector_get_pathname
275                 (CaptiveParentConnector *captive_parent_connector)
276 {
277 CaptiveDirectoryParentObject *captive_directory_parent_object;
278
279         g_return_val_if_fail(CAPTIVE_IS_PARENT_CONNECTOR(captive_parent_connector),NULL);
280         g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_parent_connector),NULL);
281
282         captive_directory_parent_object=CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_parent_connector);
283
284         g_return_val_if_fail(captive_directory_parent_object->pathname!=NULL,NULL);
285
286         return captive_directory_parent_object->pathname;
287 }
288
289
290 static GnomeVFSResult captive_directory_parent_read
291                 (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info)
292 {
293 CaptiveDirectoryParentObject *captive_directory_parent_object;
294 GnomeVFSResult r;
295 gint retried=0;
296
297         g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
298         g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
299
300         captive_directory_parent_object=CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_directory_object);
301
302         do {
303                 if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
304                         return r;
305                 if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
306                                 !=(r=captive_sandbox_parent_directory_read(captive_directory_parent_object,file_info)))
307                         return r;
308                 } while (!retried++);
309         return r;
310 }
311
312
313 static GnomeVFSResult captive_directory_parent_remove(CaptiveDirectoryObject *captive_directory_object)
314 {
315 CaptiveDirectoryParentObject *captive_directory_parent_object;
316 GnomeVFSResult r;
317 gint retried=0;
318
319         g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
320
321         captive_directory_parent_object=CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_directory_object);
322
323         do {
324                 if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
325                         return r;
326                 if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE!=(r=captive_sandbox_parent_directory_remove(captive_directory_parent_object))) {
327                         if (GNOME_VFS_OK==r)
328                                 captive_parent_connector_set_dirty(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
329                         return r;
330                         }
331                 } while (!retried++);
332         return r;
333 }