2 * CORBA/ORBit client side of Directory object of sandbox_parent()
3 * Copyright (C) 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 "parent-Directory.h" /* self */
23 #include <glib/gmessages.h>
26 #include "../client/directory.h"
27 #include "../client/vfs.h"
29 #include "captive/macros.h"
30 #include "../client/vfs-parent.h"
33 GnomeVFSResult captive_sandbox_parent_directory_new_open
34 (CaptiveDirectoryParentObject *captive_directory_parent_object,const gchar *pathname)
36 gboolean retried=FALSE;
38 CaptiveVfsParentObject *captive_vfs_parent_object;
40 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
41 g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
43 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
47 if (captive_vfs_parent_object->corba_bug_action) {
48 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"directory_new_open",NULL);
49 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_directory_parent_object));
50 xmlNewProp(xml_action,"pathname",pathname);
53 captive_directory_parent_object->corba_Directory_object=Captive_Vfs_directory_new_open(
54 captive_vfs_parent_object->corba_Vfs_object,pathname,&captive_corba_ev);
56 xmlNewProp(xml_action,"result",(captive_corba_ev._major==CORBA_NO_EXCEPTION ? "1" : "0"));
58 if (!retried && captive_sandbox_parent_query_vfs_retry(&captive_corba_ev,captive_vfs_parent_object)) {
63 return captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
67 GnomeVFSResult captive_sandbox_parent_directory_new_make
68 (CaptiveDirectoryParentObject *captive_directory_parent_object,const gchar *pathname,guint perm)
70 gboolean retried=FALSE;
72 CaptiveVfsParentObject *captive_vfs_parent_object;
74 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
75 g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
77 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
81 if (captive_vfs_parent_object->corba_bug_action) {
82 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"directory_new_make",NULL);
83 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_directory_parent_object));
84 xmlNewProp(xml_action,"pathname",pathname);
85 xmlNewProp(xml_action,"perm",captive_printf_alloca("%u",(unsigned)perm));
88 captive_directory_parent_object->corba_Directory_object=Captive_Vfs_directory_new_make(
89 captive_vfs_parent_object->corba_Vfs_object,pathname,perm,&captive_corba_ev);
91 xmlNewProp(xml_action,"result",(captive_corba_ev._major==CORBA_NO_EXCEPTION ? "1" : "0"));
93 if (!retried && captive_sandbox_parent_query_vfs_retry(&captive_corba_ev,captive_vfs_parent_object)) {
98 return captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
102 GnomeVFSResult captive_sandbox_parent_directory_close(CaptiveDirectoryParentObject *captive_directory_parent_object)
105 xmlNode *xml_action=NULL;
106 CaptiveVfsParentObject *captive_vfs_parent_object;
108 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
110 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
112 if (captive_vfs_parent_object->corba_bug_action) {
113 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"directory_close",NULL);
114 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_directory_parent_object));
117 Captive_Directory_shutdown(captive_directory_parent_object->corba_Directory_object,&captive_corba_ev);
118 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
120 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
124 CORBA_Object_release((CORBA_Object)captive_directory_parent_object->corba_Directory_object,&captive_corba_ev);
125 captive_directory_parent_object->corba_Directory_object=CORBA_OBJECT_NIL;
127 if (captive_directory_parent_object->corba_Directory_file_info_list) {
128 GList *file_info_last_l=g_list_last(captive_directory_parent_object->corba_Directory_file_info_list);
130 /* Prevent gnome_vfs_file_info_list_free() and its gnome_vfs_file_info_unref()
131 * on the last 'file_info_list' items as it is EOF with NULL '->data'.
133 g_assert(file_info_last_l->data==NULL); /* directory EOF */
134 captive_directory_parent_object->corba_Directory_file_info_list=g_list_delete_link(
135 captive_directory_parent_object->corba_Directory_file_info_list,file_info_last_l);
136 gnome_vfs_file_info_list_free(captive_directory_parent_object->corba_Directory_file_info_list);
137 captive_directory_parent_object->corba_Directory_file_info_list=NULL;
140 return captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
143 static GnomeVFSResult captive_sandbox_parent_directory_read_fill1
144 (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive)
146 xmlNode *xml_action=NULL;
147 Captive_GnomeVFSFileInfo *file_info_corba;
149 CaptiveVfsParentObject *captive_vfs_parent_object;
151 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
152 g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
154 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
156 if (captive_vfs_parent_object->corba_bug_action) {
157 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"directory_read",NULL);
158 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_directory_parent_object));
161 Captive_Directory_read(captive_directory_parent_object->corba_Directory_object,&file_info_corba,&captive_corba_ev);
162 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
164 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
168 r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
170 xmlSetProp(xml_action,"result",gnome_vfs_result_to_string(r));
172 return r; /* 'file_info_corba' leak */
174 Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
175 CORBA_free(file_info_corba);
180 static GnomeVFSResult captive_sandbox_parent_directory_read_filldir(CaptiveDirectoryParentObject *captive_directory_parent_object)
182 GnomeVFSFileInfo *file_info_captive;
185 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
186 g_return_val_if_fail(captive_directory_parent_object->corba_Directory_file_info_list==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
189 file_info_captive=gnome_vfs_file_info_new();
190 r=captive_sandbox_parent_directory_read_fill1(captive_directory_parent_object,file_info_captive);
191 if (r==GNOME_VFS_ERROR_EOF) {
192 gnome_vfs_file_info_unref(file_info_captive);
195 if (r!=GNOME_VFS_OK) {
196 gnome_vfs_file_info_unref(file_info_captive);
197 gnome_vfs_file_info_list_free(captive_directory_parent_object->corba_Directory_file_info_list);
198 captive_directory_parent_object->corba_Directory_file_info_list=NULL;
201 captive_directory_parent_object->corba_Directory_file_info_list=g_list_prepend(
202 captive_directory_parent_object->corba_Directory_file_info_list,file_info_captive);
205 captive_directory_parent_object->corba_Directory_file_info_list=g_list_prepend(
206 captive_directory_parent_object->corba_Directory_file_info_list,NULL); /* EOF */
207 captive_directory_parent_object->corba_Directory_file_info_list=g_list_reverse(
208 captive_directory_parent_object->corba_Directory_file_info_list);
213 /* We have to read the whole directory atomically
214 * as during valid child restart we would loose our reading position.
216 GnomeVFSResult captive_sandbox_parent_directory_read
217 (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive)
221 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
222 g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
224 if (!captive_directory_parent_object->corba_Directory_file_info_list)
225 if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_read_filldir(captive_directory_parent_object)))
228 if (!captive_directory_parent_object->corba_Directory_file_info_list->data) {
229 g_assert(captive_directory_parent_object->corba_Directory_file_info_list->next==NULL);
230 /* Do not clear the list to leave us stuck at EOF - GnomeVFS behaves that way. */
231 r=GNOME_VFS_ERROR_EOF;
234 /* Cut first list item. */
235 gnome_vfs_file_info_copy(
236 file_info_captive, /* dest */
237 captive_directory_parent_object->corba_Directory_file_info_list->data); /* src */
238 gnome_vfs_file_info_unref(captive_directory_parent_object->corba_Directory_file_info_list->data);
239 captive_directory_parent_object->corba_Directory_file_info_list=g_list_delete_link(
240 captive_directory_parent_object->corba_Directory_file_info_list,
241 captive_directory_parent_object->corba_Directory_file_info_list);
249 GnomeVFSResult captive_sandbox_parent_directory_remove(CaptiveDirectoryParentObject *captive_directory_parent_object)
252 xmlNode *xml_action=NULL;
253 CaptiveVfsParentObject *captive_vfs_parent_object;
255 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
257 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
259 if (captive_vfs_parent_object->corba_bug_action) {
260 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"directory_remove",NULL);
261 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_directory_parent_object));
264 Captive_Directory_remove(captive_directory_parent_object->corba_Directory_object,&captive_corba_ev);
265 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
267 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));