2 * captive vfs 'vfs' interface to reactos of sandbox parent
3 * Copyright (C) 2002-2003 Jan Kratochvil <project-captive@jankratochvil.net>
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
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.
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
22 #include "vfs-parent.h" /* self */
23 #include <glib/gmessages.h>
24 #include "captive/macros.h"
25 #include "../sandbox/parent-Vfs.h"
26 #include "directory-parent.h"
27 #include "file-parent.h"
28 #include "marshallers.h"
31 static gpointer captive_vfs_parent_object_parent_class=NULL;
34 static GnomeVFSResult captive_vfs_parent_init(CaptiveVfsObject *captive_vfs_object);
35 static void captive_vfs_parent_object_handler_detach(CaptiveVfsParentObject *captive_vfs_parent_object);
36 static void captive_vfs_parent_object_handler_cease(CaptiveVfsParentObject *captive_vfs_parent_object);
37 static void captive_vfs_parent_object_handler_abort(CaptiveVfsParentObject *captive_vfs_parent_object);
38 static GnomeVFSResult captive_vfs_parent_close(CaptiveVfsObject *captive_vfs_object);
39 static GnomeVFSResult captive_vfs_parent_commit(CaptiveVfsObject *captive_vfs_object);
40 static GnomeVFSResult captive_vfs_parent_volume_info_get
41 (CaptiveVfsObject *captive_vfs_object,CaptiveVfsVolumeInfo *volume_info);
44 static void captive_vfs_parent_object_finalize(CaptiveVfsParentObject *captive_vfs_parent_object)
46 g_return_if_fail(captive_vfs_parent_object!=NULL);
48 captive_vfs_parent_close(CAPTIVE_VFS_OBJECT(captive_vfs_parent_object)); /* errors ignored */
50 G_OBJECT_CLASS(captive_vfs_parent_object_parent_class)->finalize((GObject *)captive_vfs_parent_object);
54 static void captive_vfs_parent_object_class_init(CaptiveVfsParentObjectClass *class)
56 GObjectClass *gobject_class=G_OBJECT_CLASS(class);
57 CaptiveVfsObjectClass *captive_vfs_object_class=CAPTIVE_VFS_OBJECT_CLASS(class);
59 captive_vfs_parent_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class)));
60 gobject_class->finalize=(void (*)(GObject *object))captive_vfs_parent_object_finalize;
62 captive_vfs_object_class->init=captive_vfs_parent_init;
63 captive_vfs_object_class->commit=captive_vfs_parent_commit;
64 captive_vfs_object_class->volume_info_get=captive_vfs_parent_volume_info_get;
66 captive_vfs_object_class->directory_new_open=captive_directory_parent_new_open;
67 captive_vfs_object_class->directory_new_make=captive_directory_parent_new_make;
69 captive_vfs_object_class->file_new_open=captive_file_parent_new_open;
70 captive_vfs_object_class->file_new_create=captive_file_parent_new_create;
72 class->detach=captive_vfs_parent_object_handler_detach;
74 "detach", /* signal_name */
75 G_TYPE_FROM_CLASS(class), /* itype */
76 G_SIGNAL_RUN_LAST, /* signal_flags */
77 G_STRUCT_OFFSET(CaptiveVfsParentObjectClass,detach), /* class_offset */
78 NULL,NULL, /* accumulator,accu_data */
79 captive_client_VOID__VOID, /* c_marshaller */
80 G_TYPE_NONE,0); /* return_type,n_params */
81 class->cease=captive_vfs_parent_object_handler_cease;
83 "cease", /* signal_name */
84 G_TYPE_FROM_CLASS(class), /* itype */
85 G_SIGNAL_RUN_LAST, /* signal_flags */
86 G_STRUCT_OFFSET(CaptiveVfsParentObjectClass,cease), /* class_offset */
87 NULL,NULL, /* accumulator,accu_data */
88 captive_client_VOID__VOID, /* c_marshaller */
89 G_TYPE_NONE,0); /* return_type,n_params */
90 class->abort=captive_vfs_parent_object_handler_abort;
92 "abort", /* signal_name */
93 G_TYPE_FROM_CLASS(class), /* itype */
94 G_SIGNAL_RUN_LAST, /* signal_flags */
95 G_STRUCT_OFFSET(CaptiveVfsParentObjectClass,abort), /* class_offset */
96 NULL,NULL, /* accumulator,accu_data */
97 captive_client_VOID__VOID, /* c_marshaller */
98 G_TYPE_NONE,0); /* return_type,n_params */
102 static void captive_vfs_parent_object_init(CaptiveVfsParentObject *captive_vfs_parent_object)
104 captive_vfs_parent_object->corba_parent_giochanel_blind=NULL;
108 static void captive_vfs_parent_object_handler_detach(CaptiveVfsParentObject *captive_vfs_parent_object)
110 g_return_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_parent_object));
113 static void captive_vfs_parent_object_handler_cease(CaptiveVfsParentObject *captive_vfs_parent_object)
115 g_return_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_parent_object));
118 static void captive_vfs_parent_object_handler_abort(CaptiveVfsParentObject *captive_vfs_parent_object)
120 g_return_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_parent_object));
124 GType captive_vfs_parent_object_get_type(void)
126 static GType captive_vfs_parent_object_type=0;
128 if (!captive_vfs_parent_object_type) {
129 static const GTypeInfo captive_vfs_parent_object_info={
130 sizeof(CaptiveVfsParentObjectClass),
131 NULL, /* base_init */
132 NULL, /* base_finalize */
133 (GClassInitFunc)captive_vfs_parent_object_class_init,
134 NULL, /* class_finalize */
135 NULL, /* class_data */
136 sizeof(CaptiveVfsParentObject),
138 (GInstanceInitFunc)captive_vfs_parent_object_init,
141 captive_vfs_parent_object_type=g_type_register_static(CAPTIVE_VFS_TYPE_OBJECT,
142 "CaptiveVfsParentObject",&captive_vfs_parent_object_info,0);
145 return captive_vfs_parent_object_type;
149 static GnomeVFSResult captive_vfs_parent_init(CaptiveVfsObject *captive_vfs_object)
151 CaptiveVfsParentObject *captive_vfs_parent_object;
153 g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
155 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(captive_vfs_object);
157 return captive_sandbox_parent_vfs_new(captive_vfs_parent_object);
161 static GnomeVFSResult captive_vfs_parent_close(CaptiveVfsObject *captive_vfs_object)
163 CaptiveVfsParentObject *captive_vfs_parent_object;
166 g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
168 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(captive_vfs_object);
170 if (captive_vfs_parent_object->corba_Vfs_object!=CORBA_OBJECT_NIL) {
171 r=captive_sandbox_parent_vfs_close(captive_vfs_parent_object);
172 g_assert(captive_vfs_parent_object->corba_Vfs_object==CORBA_OBJECT_NIL);
181 static GnomeVFSResult captive_vfs_parent_commit(CaptiveVfsObject *captive_vfs_object)
183 CaptiveVfsParentObject *captive_vfs_parent_object;
187 g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
189 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(captive_vfs_object);
192 if (captive_vfs_parent_object->corba_Vfs_object==CORBA_OBJECT_NIL
193 && GNOME_VFS_OK!=(r=captive_vfs_parent_object_connect(captive_vfs_parent_object)))
195 if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
196 !=(r=captive_sandbox_parent_vfs_commit(captive_vfs_parent_object)))
198 } while (!retried++);
203 static GnomeVFSResult captive_vfs_parent_volume_info_get
204 (CaptiveVfsObject *captive_vfs_object,CaptiveVfsVolumeInfo *volume_info)
206 CaptiveVfsParentObject *captive_vfs_parent_object;
210 g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
211 g_return_val_if_fail(volume_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
213 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(captive_vfs_object);
216 if (captive_vfs_parent_object->corba_Vfs_object==CORBA_OBJECT_NIL
217 && GNOME_VFS_OK!=(r=captive_vfs_parent_object_connect(captive_vfs_parent_object)))
219 if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
220 !=(r=captive_sandbox_parent_vfs_volume_info_get(captive_vfs_parent_object,volume_info)))
222 } while (!retried++);
227 GnomeVFSResult captive_vfs_parent_object_connect(CaptiveVfsParentObject *captive_vfs_parent_object)
229 g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
231 g_return_val_if_fail(captive_vfs_parent_object->corba_Vfs_object==CORBA_OBJECT_NIL,GNOME_VFS_ERROR_BAD_PARAMETERS);
233 return captive_sandbox_parent_vfs_new(captive_vfs_parent_object);
237 GnomeVFSResult captive_vfs_parent_object_disconnect(CaptiveVfsParentObject *captive_vfs_parent_object)
241 g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
243 g_return_val_if_fail(captive_vfs_parent_object->corba_Vfs_object!=CORBA_OBJECT_NIL,GNOME_VFS_ERROR_BAD_PARAMETERS);
245 /* Detach all connectors: */
246 g_signal_emit_by_name(captive_vfs_parent_object,"detach");
248 /* Some connector detaching broke the connection? */
249 if (captive_vfs_parent_object->corba_Vfs_object==CORBA_OBJECT_NIL) {
250 /* "abort" should have been emitted by captive_vfs_parent_object_aborted() */
251 return GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE;
254 if (GNOME_VFS_OK!=(r=captive_sandbox_parent_vfs_close(captive_vfs_parent_object))) {
255 /* Some non-ORBit shutdown error may have occured: */
256 g_signal_emit_by_name(captive_vfs_parent_object,"abort");
261 g_signal_emit_by_name(captive_vfs_parent_object,"cease");
267 GnomeVFSResult captive_vfs_parent_object_aborted(CaptiveVfsParentObject *captive_vfs_parent_object)
269 static gint inside=0;
272 g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
274 g_return_val_if_fail(captive_vfs_parent_object->corba_Vfs_object!=CORBA_OBJECT_NIL,GNOME_VFS_ERROR_BAD_PARAMETERS);
276 /* Prevent looping by COMM_FAILURE of 'unmount' operation
277 * by captive_sandbox_parent_vfs_close().
284 g_signal_emit_by_name(captive_vfs_parent_object,"abort");
286 r=captive_sandbox_parent_vfs_close(captive_vfs_parent_object);