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"
31 #include "captive/client-file-info.h"
34 GnomeVFSResult captive_sandbox_parent_directory_new_open
35 (CaptiveDirectoryParentObject *captive_directory_parent_object)
37 xmlNode *xml_action=NULL;
38 CaptiveVfsParentObject *captive_vfs_parent_object;
40 Captive_Directory corba_Directory_object;
42 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
43 g_return_val_if_fail(captive_directory_parent_object->pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
45 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,BAD_CAST "directory_new_open",NULL);
49 xmlNewProp(xml_action,BAD_CAST "object",BAD_CAST captive_printf_alloca("%p",captive_directory_parent_object));
50 xmlNewProp(xml_action,BAD_CAST "pathname",BAD_CAST captive_directory_parent_object->pathname);
53 corba_Directory_object=Captive_Vfs_directory_new_open(
54 captive_vfs_parent_object->corba_Vfs_object,captive_directory_parent_object->pathname,&captive_corba_ev);
56 xmlNewProp(xml_action,BAD_CAST "result",BAD_CAST (captive_corba_ev._major==CORBA_NO_EXCEPTION ? "1" : "0"));
57 /* If 'r' means failure 'corba_Directory_object' may not be 'CORBA_OBJECT_NIL'
58 * although it is not valid 'CORBA_Object' to be passed to CORBA_Object_release().
60 if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object)))
63 captive_directory_parent_object->corba_Directory_object=corba_Directory_object;
68 GnomeVFSResult captive_sandbox_parent_directory_new_make
69 (CaptiveDirectoryParentObject *captive_directory_parent_object,guint perm)
71 xmlNode *xml_action=NULL;
72 CaptiveVfsParentObject *captive_vfs_parent_object;
74 Captive_Directory corba_Directory_object;
76 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
77 g_return_val_if_fail(captive_directory_parent_object->pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
79 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,BAD_CAST "directory_new_make",NULL);
83 xmlNewProp(xml_action,BAD_CAST "object",BAD_CAST captive_printf_alloca("%p",captive_directory_parent_object));
84 xmlNewProp(xml_action,BAD_CAST "pathname",BAD_CAST captive_directory_parent_object->pathname);
85 xmlNewProp(xml_action,BAD_CAST "perm",BAD_CAST captive_printf_alloca("%u",(unsigned)perm));
88 corba_Directory_object=Captive_Vfs_directory_new_make(
89 captive_vfs_parent_object->corba_Vfs_object,captive_directory_parent_object->pathname,perm,&captive_corba_ev);
91 xmlNewProp(xml_action,BAD_CAST "result",BAD_CAST (captive_corba_ev._major==CORBA_NO_EXCEPTION ? "1" : "0"));
92 /* If 'r' means failure 'corba_Directory_object' may not be 'CORBA_OBJECT_NIL'
93 * although it is not valid 'CORBA_Object' to be passed to CORBA_Object_release().
95 if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object)))
98 captive_directory_parent_object->corba_Directory_object=corba_Directory_object;
103 GnomeVFSResult captive_sandbox_parent_directory_close(CaptiveDirectoryParentObject *captive_directory_parent_object)
106 xmlNode *xml_action=NULL;
107 CaptiveVfsParentObject *captive_vfs_parent_object;
109 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
111 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
113 if (captive_vfs_parent_object->corba_bug_action) {
114 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,BAD_CAST "directory_close",NULL);
115 xmlNewProp(xml_action,BAD_CAST "object",BAD_CAST captive_printf_alloca("%p",captive_directory_parent_object));
118 Captive_Directory_shutdown(captive_directory_parent_object->corba_Directory_object,&captive_corba_ev);
119 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
121 xmlNewProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
123 /* Always clear 'corba_Directory_object' even if 'r' means failure. */
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 /* Do not: g_assert(file_info_last_l->data==NULL); * directory EOF *
134 * as the crashed client may not produced the trailing NULL.
136 if (!file_info_last_l->data)
137 captive_directory_parent_object->corba_Directory_file_info_list=g_list_delete_link(
138 captive_directory_parent_object->corba_Directory_file_info_list,file_info_last_l);
139 gnome_vfs_file_info_list_free(captive_directory_parent_object->corba_Directory_file_info_list);
140 captive_directory_parent_object->corba_Directory_file_info_list=NULL;
146 static GnomeVFSResult captive_sandbox_parent_directory_read_get1
147 (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return)
149 xmlNode *xml_action=NULL;
150 Captive_CaptiveFileInfoObject *file_info_corba;
152 CaptiveVfsParentObject *captive_vfs_parent_object;
153 CaptiveFileInfoObject *file_info_captive;
155 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
156 g_return_val_if_fail(file_info_captive_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
158 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
160 if (captive_vfs_parent_object->corba_bug_action) {
161 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,BAD_CAST "directory_read",NULL);
162 xmlNewProp(xml_action,BAD_CAST "object",BAD_CAST captive_printf_alloca("%p",captive_directory_parent_object));
165 Captive_Directory_read(captive_directory_parent_object->corba_Directory_object,&file_info_corba,&captive_corba_ev);
166 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
168 xmlNewProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
172 r=captive_file_info_object_new(&file_info_captive);
174 xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
176 return r; /* 'file_info_corba' leak */
178 r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
180 xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
181 if (r!=GNOME_VFS_OK) {
182 g_object_unref(file_info_captive);
183 return r; /* 'file_info_corba' leak */
186 Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */);
187 CORBA_free(file_info_corba);
189 *file_info_captive_return=file_info_captive;
193 static GnomeVFSResult captive_sandbox_parent_directory_read_filldir(CaptiveDirectoryParentObject *captive_directory_parent_object)
195 CaptiveFileInfoObject *file_info_captive;
198 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
199 g_return_val_if_fail(captive_directory_parent_object->corba_Directory_file_info_list==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
202 r=captive_sandbox_parent_directory_read_get1(captive_directory_parent_object,&file_info_captive);
203 if (r==GNOME_VFS_ERROR_EOF)
205 if (r!=GNOME_VFS_OK) {
206 gnome_vfs_file_info_list_free(captive_directory_parent_object->corba_Directory_file_info_list);
207 captive_directory_parent_object->corba_Directory_file_info_list=NULL;
210 captive_directory_parent_object->corba_Directory_file_info_list=g_list_prepend(
211 captive_directory_parent_object->corba_Directory_file_info_list,file_info_captive);
214 captive_directory_parent_object->corba_Directory_file_info_list=g_list_prepend(
215 captive_directory_parent_object->corba_Directory_file_info_list,NULL); /* EOF */
216 captive_directory_parent_object->corba_Directory_file_info_list=g_list_reverse(
217 captive_directory_parent_object->corba_Directory_file_info_list);
222 /* We have to read the whole directory atomically
223 * as during valid child restart we would loose our reading position.
224 * Returned 'CaptiveFileInfoObject' has 1 reference for yourself, you must g_object_unref() it.
226 GnomeVFSResult captive_sandbox_parent_directory_read
227 (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return)
231 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
232 g_return_val_if_fail(file_info_captive_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
234 if (!captive_directory_parent_object->corba_Directory_file_info_list)
235 if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_read_filldir(captive_directory_parent_object)))
238 if (!captive_directory_parent_object->corba_Directory_file_info_list->data) {
239 g_assert(captive_directory_parent_object->corba_Directory_file_info_list->next==NULL);
240 /* Do not clear the list to leave us stuck at EOF - GnomeVFS behaves that way. */
241 r=GNOME_VFS_ERROR_EOF;
244 /* Cut first list item. */
245 *file_info_captive_return=captive_directory_parent_object->corba_Directory_file_info_list->data;
246 captive_directory_parent_object->corba_Directory_file_info_list=g_list_delete_link(
247 captive_directory_parent_object->corba_Directory_file_info_list,
248 captive_directory_parent_object->corba_Directory_file_info_list);
256 GnomeVFSResult captive_sandbox_parent_directory_remove(CaptiveDirectoryParentObject *captive_directory_parent_object)
259 xmlNode *xml_action=NULL;
260 CaptiveVfsParentObject *captive_vfs_parent_object;
262 g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
264 captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
266 if (captive_vfs_parent_object->corba_bug_action) {
267 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,BAD_CAST "directory_remove",NULL);
268 xmlNewProp(xml_action,BAD_CAST "object",BAD_CAST captive_printf_alloca("%p",captive_directory_parent_object));
271 Captive_Directory_remove(captive_directory_parent_object->corba_Directory_object,&captive_corba_ev);
272 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
274 xmlNewProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));