Compatibility with ORBit2>=2.7.x; new configure option '--with-orbit-line'.
[captive.git] / src / libcaptive / sandbox / parent-File.c
1 /* $Id$
2  * CORBA/ORBit client side of File object of sandbox_parent()
3  * Copyright (C) 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 "parent-File.h"        /* self */
23 #include <glib/gmessages.h>
24 #include "split.h"
25 #include "sandbox.h"
26 #include "../client/file.h"
27 #include "../client/vfs.h"
28 #include "FileInfo.h"
29 #include "captive/macros.h"
30 #include "reactos/ntos/types.h" /* for ULONG */
31
32
33 GnomeVFSResult captive_sandbox_parent_file_new_open(CaptiveFileParentObject *captive_file_parent_object)
34 {
35 xmlNode *xml_action=NULL;
36 CaptiveVfsParentObject *captive_vfs_parent_object;
37 GnomeVFSResult r;
38 Captive_File corba_File_object;
39
40         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
41         g_return_val_if_fail(captive_file_parent_object->pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
42
43         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
44
45         if (captive_vfs_parent_object->corba_bug_action) {
46                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_new_open",NULL);
47                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
48                 xmlNewProp(xml_action,"pathname",captive_file_parent_object->pathname);
49                 xmlNewProp(xml_action,"mode",captive_printf_alloca("%u",(unsigned)captive_file_parent_object->mode));
50                 }
51
52         corba_File_object=Captive_Vfs_file_new_open(captive_vfs_parent_object->corba_Vfs_object,
53                         captive_file_parent_object->pathname,captive_file_parent_object->mode,&captive_corba_ev);
54         if (xml_action)
55                 xmlNewProp(xml_action,"result",(captive_corba_ev._major==CORBA_NO_EXCEPTION ? "1" : "0"));
56         /* If 'r' means failure 'corba_File_object' may not be 'CORBA_OBJECT_NIL'
57          * although it is not valid 'CORBA_Object' to be passed to CORBA_Object_release().
58          */
59         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object)))
60                 return r;
61
62         captive_file_parent_object->corba_File_object=corba_File_object;
63         return GNOME_VFS_OK;
64 }
65
66
67 GnomeVFSResult captive_sandbox_parent_file_new_create(CaptiveFileParentObject *captive_file_parent_object,
68                 gboolean exclusive,guint perm)
69 {
70 xmlNode *xml_action=NULL;
71 CaptiveVfsParentObject *captive_vfs_parent_object;
72 GnomeVFSResult r;
73 Captive_File corba_File_object;
74
75         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
76         g_return_val_if_fail(captive_file_parent_object->pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
77
78         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
79
80         if (captive_vfs_parent_object->corba_bug_action) {
81                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_new_create",NULL);
82                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
83                 xmlNewProp(xml_action,"pathname",captive_file_parent_object->pathname);
84                 xmlNewProp(xml_action,"mode",captive_printf_alloca("%u",(unsigned)captive_file_parent_object->mode));
85                 xmlNewProp(xml_action,"exclusive",captive_printf_alloca("%u",(unsigned)exclusive));
86                 xmlNewProp(xml_action,"perm",captive_printf_alloca("%u",(unsigned)perm));
87                 }
88
89         corba_File_object=Captive_Vfs_file_new_create(captive_vfs_parent_object->corba_Vfs_object,
90                         captive_file_parent_object->pathname,captive_file_parent_object->mode,exclusive,perm,&captive_corba_ev);
91         if (xml_action)
92                 xmlNewProp(xml_action,"result",(captive_corba_ev._major==CORBA_NO_EXCEPTION ? "1" : "0"));
93         /* If 'r' means failure 'corba_File_object' may not be 'CORBA_OBJECT_NIL'
94          * although it is not valid 'CORBA_Object' to be passed to CORBA_Object_release().
95          */
96         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object)))
97                 return r;
98
99         captive_file_parent_object->corba_File_object=corba_File_object;
100         return GNOME_VFS_OK;
101 }
102
103
104 GnomeVFSResult captive_sandbox_parent_file_close(CaptiveFileParentObject *captive_file_parent_object)
105 {
106 GnomeVFSResult r;
107 xmlNode *xml_action=NULL;
108 CaptiveVfsParentObject *captive_vfs_parent_object;
109
110         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
111
112         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
113
114         if (captive_vfs_parent_object->corba_bug_action) {
115                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_close",NULL);
116                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
117                 }
118
119         Captive_File_shutdown(captive_file_parent_object->corba_File_object,&captive_corba_ev);
120         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
121         if (xml_action)
122                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
123
124         /* Always clear 'corba_File_object' even if 'r' means failure. */
125         CORBA_Object_release((CORBA_Object)captive_file_parent_object->corba_File_object,&captive_corba_ev);
126         captive_file_parent_object->corba_File_object=CORBA_OBJECT_NIL;
127
128         return r;
129 }
130
131
132 static GnomeVFSResult captive_sandbox_parent_file_seek_slave
133                 (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset);
134
135 GnomeVFSResult captive_sandbox_parent_file_read(CaptiveFileParentObject *captive_file_parent_object,
136                 gpointer buffer_captive,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return)
137 {
138 GnomeVFSResult r;
139 Captive_Bytes *buffer_corba;
140 xmlNode *xml_action=NULL;
141 CaptiveVfsParentObject *captive_vfs_parent_object;
142
143         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
144         g_return_val_if_fail(buffer_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
145         g_return_val_if_fail(bytes_read_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
146         g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
147
148         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
149
150         *bytes_read_return=0;
151
152         if (captive_vfs_parent_object->corba_bug_action) {
153                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_read",NULL);
154                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
155                 xmlNewProp(xml_action,"num_bytes",captive_printf_alloca("%lu",(unsigned long)num_bytes));
156                 }
157
158         r=captive_sandbox_parent_file_seek_slave(captive_file_parent_object,
159                         GNOME_VFS_SEEK_START,captive_file_parent_object->offset);
160         if (r==GNOME_VFS_OK) {
161                 Captive_File_read(captive_file_parent_object->corba_File_object,&buffer_corba,num_bytes,&captive_corba_ev);
162                 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
163                 }
164         if (xml_action)
165                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
166         if (r!=GNOME_VFS_OK)
167                 return r;
168
169         g_return_val_if_fail(buffer_corba->_length<=num_bytes,GNOME_VFS_ERROR_GENERIC);
170         memcpy(buffer_captive,buffer_corba->_buffer,buffer_corba->_length);
171         *bytes_read_return=buffer_corba->_length;
172         captive_file_parent_object->offset+=buffer_corba->_length;
173
174         Captive_Bytes__freekids(buffer_corba,NULL/* 'd'; meaning? */);
175         CORBA_free(buffer_corba);
176
177         if (xml_action)
178                 xmlNewProp(xml_action,"bytes_read_return",captive_printf_alloca("%lu",(unsigned long)*bytes_read_return));
179
180         return GNOME_VFS_OK;
181 }
182
183
184 GnomeVFSResult captive_sandbox_parent_file_write(CaptiveFileParentObject *captive_file_parent_object,
185                 gconstpointer buffer_captive,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_written_return)
186 {
187 GnomeVFSResult r;
188 Captive_Bytes buffer_corba_local;
189 Captive_GnomeVFSFileSize bytes_written_corba;
190 xmlNode *xml_action=NULL;
191 CaptiveVfsParentObject *captive_vfs_parent_object;
192
193         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
194         g_return_val_if_fail(buffer_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
195         g_return_val_if_fail(bytes_written_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
196         g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
197
198         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
199
200         *bytes_written_return=0;
201
202         r=captive_sandbox_parent_file_seek_slave(captive_file_parent_object,
203                         GNOME_VFS_SEEK_START,captive_file_parent_object->offset);
204         if (r==GNOME_VFS_OK) {
205
206                 if (captive_vfs_parent_object->corba_bug_action) {
207                         xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_write",NULL);
208                         xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
209                         xmlNewProp(xml_action,"num_bytes",captive_printf_alloca("%lu",(unsigned long)num_bytes));
210                         }
211
212                 buffer_corba_local._maximum=num_bytes;
213                 buffer_corba_local._length=num_bytes;
214                 buffer_corba_local._buffer=(/* de-const */gpointer)buffer_captive;
215                 buffer_corba_local._release=FALSE;
216
217                 Captive_File_write(captive_file_parent_object->corba_File_object,
218                                 &buffer_corba_local,&bytes_written_corba,&captive_corba_ev);
219                 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
220                 if (xml_action)
221                         xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
222                 }
223         if (r!=GNOME_VFS_OK)
224                 return r;
225
226         *bytes_written_return=bytes_written_corba;
227         captive_file_parent_object->offset+=bytes_written_corba;
228
229         if (xml_action)
230                 xmlNewProp(xml_action,"bytes_written_return",captive_printf_alloca("%lu",(unsigned long)*bytes_written_return));
231
232         return GNOME_VFS_OK;
233 }
234
235
236 static GnomeVFSResult captive_sandbox_parent_file_seek_slave
237                 (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset)
238 {
239 GnomeVFSResult r;
240 xmlNode *xml_action=NULL;
241 CaptiveVfsParentObject *captive_vfs_parent_object;
242
243         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
244
245         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
246
247         if (captive_vfs_parent_object->corba_bug_action) {
248                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_seek",NULL);
249                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
250                 xmlNewProp(xml_action,"whence",
251                                 (whence==GNOME_VFS_SEEK_START ? "start" :
252                                         (whence==GNOME_VFS_SEEK_CURRENT ? "current" :
253                                                 (whence==GNOME_VFS_SEEK_END ? "end" : captive_printf_alloca("%lu",(unsigned long)whence)))));
254                 xmlNewProp(xml_action,"offset",captive_printf_alloca("%" G_GINT64_FORMAT,(gint64)offset));
255                 }
256
257         Captive_File_seek(captive_file_parent_object->corba_File_object,whence,offset,&captive_corba_ev);
258         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
259         if (xml_action)
260                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
261         if (r!=GNOME_VFS_OK)
262                 return r;
263
264         return GNOME_VFS_OK;
265 }
266
267
268 GnomeVFSResult captive_sandbox_parent_file_seek
269                 (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset)
270 {
271 GnomeVFSResult r;
272 xmlNode *xml_action=NULL;
273 CaptiveVfsParentObject *captive_vfs_parent_object;
274
275         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
276
277         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
278
279         if (captive_vfs_parent_object->corba_bug_action) {
280                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_seek",NULL);
281                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
282                 xmlNewProp(xml_action,"whence",
283                                 (whence==GNOME_VFS_SEEK_START ? "start" :
284                                         (whence==GNOME_VFS_SEEK_CURRENT ? "current" :
285                                                 (whence==GNOME_VFS_SEEK_END ? "end" : captive_printf_alloca("%lu",(unsigned long)whence)))));
286                 xmlNewProp(xml_action,"offset",captive_printf_alloca("%" G_GINT64_FORMAT,(gint64)offset));
287                 }
288
289         switch (whence) {
290                 case GNOME_VFS_SEEK_START:
291                         captive_file_parent_object->offset=offset;
292                         r=GNOME_VFS_OK;
293                         break;
294                 case GNOME_VFS_SEEK_CURRENT:
295                         if (0
296                                         || (offset>0 && (captive_file_parent_object->offset+offset)<captive_file_parent_object->offset)
297                                         || (offset<0 && (captive_file_parent_object->offset+offset)>captive_file_parent_object->offset))
298                                 r=GNOME_VFS_ERROR_BAD_PARAMETERS;
299                         else {
300                                 captive_file_parent_object->offset+=offset;
301                                 r=GNOME_VFS_OK;
302                                 }
303                         break;
304                 case GNOME_VFS_SEEK_END:
305                         g_assert_not_reached(); /* NOT IMPLEMENTED YET */
306                         r=GNOME_VFS_ERROR_GENERIC;
307                         break;
308                 default:
309                         r=GNOME_VFS_ERROR_BAD_PARAMETERS;
310                 }
311
312         if (xml_action)
313                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
314         if (r!=GNOME_VFS_OK)
315                 return r;
316
317         return GNOME_VFS_OK;
318 }
319
320
321 #if 0 /* unused */
322 static GnomeVFSResult captive_sandbox_parent_file_tell_slave
323                 (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileOffset *offset_return)
324 {
325 Captive_GnomeVFSFileOffset offset_corba;
326 GnomeVFSResult r;
327 xmlNode *xml_action=NULL;
328 CaptiveVfsParentObject *captive_vfs_parent_object;
329
330         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
331         g_return_val_if_fail(offset_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
332
333         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
334
335         if (captive_vfs_parent_object->corba_bug_action) {
336                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_tell",NULL);
337                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
338                 }
339
340         Captive_File_tell(captive_file_parent_object->corba_File_object,&offset_corba,&captive_corba_ev);
341         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
342         if (xml_action)
343                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
344         if (r!=GNOME_VFS_OK)
345                 return r;
346
347         *offset_return=offset_corba;
348
349         if (xml_action)
350                 xmlNewProp(xml_action,"offset_return",captive_printf_alloca("%" G_GINT64_FORMAT,(gint64)*offset_return));
351
352         return GNOME_VFS_OK;
353 }
354 #endif
355
356
357 GnomeVFSResult captive_sandbox_parent_file_tell(CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileOffset *offset_return)
358 {
359 GnomeVFSResult r;
360 xmlNode *xml_action=NULL;
361 CaptiveVfsParentObject *captive_vfs_parent_object;
362
363         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
364         g_return_val_if_fail(offset_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
365
366         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
367
368         if (captive_vfs_parent_object->corba_bug_action) {
369                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_tell",NULL);
370                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
371                 }
372
373         *offset_return=captive_file_parent_object->offset;
374         r=GNOME_VFS_OK;
375         if (xml_action)
376                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
377         if (r!=GNOME_VFS_OK)
378                 return r;
379
380         if (xml_action)
381                 xmlNewProp(xml_action,"offset_return",captive_printf_alloca("%" G_GINT64_FORMAT,(gint64)*offset_return));
382
383         return GNOME_VFS_OK;
384 }
385
386
387 GnomeVFSResult captive_sandbox_parent_file_remove(CaptiveFileParentObject *captive_file_parent_object)
388 {
389 GnomeVFSResult r;
390 xmlNode *xml_action=NULL;
391 CaptiveVfsParentObject *captive_vfs_parent_object;
392
393         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
394
395         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
396
397         if (captive_vfs_parent_object->corba_bug_action) {
398                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_remove",NULL);
399                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
400                 }
401
402         Captive_File_remove(captive_file_parent_object->corba_File_object,&captive_corba_ev);
403         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
404         if (xml_action)
405                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
406         if (r!=GNOME_VFS_OK)
407                 return r;
408
409         return GNOME_VFS_OK;
410 }
411
412
413 GnomeVFSResult captive_sandbox_parent_file_file_info_get(CaptiveFileParentObject *captive_file_parent_object,
414                 GnomeVFSFileInfo *file_info_captive)
415 {
416 Captive_GnomeVFSFileInfo *file_info_corba;
417 GnomeVFSResult r;
418 xmlNode *xml_action=NULL;
419 CaptiveVfsParentObject *captive_vfs_parent_object;
420
421         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
422         g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
423
424         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
425
426         if (captive_vfs_parent_object->corba_bug_action) {
427                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_file_info_get",NULL);
428                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
429                 }
430
431         Captive_File_file_info_get(captive_file_parent_object->corba_File_object,&file_info_corba,&captive_corba_ev);
432         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
433         if (xml_action)
434                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
435         if (r!=GNOME_VFS_OK)
436                 return r;
437
438         r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
439         Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
440         CORBA_free(file_info_corba);
441         if (xml_action)
442                 xmlSetProp(xml_action,"result",gnome_vfs_result_to_string(r));
443         if (r!=GNOME_VFS_OK)
444                 return r;
445
446         return GNOME_VFS_OK;
447 }
448
449
450 GnomeVFSResult captive_sandbox_parent_file_file_info_set(CaptiveFileParentObject *captive_file_parent_object,
451     const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask)
452 {
453 Captive_GnomeVFSFileInfo file_info_corba;
454 GnomeVFSResult r;
455 xmlNode *xml_action=NULL;
456 CaptiveVfsParentObject *captive_vfs_parent_object;
457
458         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
459         g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
460
461         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
462
463         if (captive_vfs_parent_object->corba_bug_action) {
464                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_file_info_set",NULL);
465                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
466                 xmlNewProp(xml_action,"mask",captive_printf_alloca("%u",(unsigned)mask));
467                 }
468
469         if (GNOME_VFS_OK!=(r=captive_sandbox_file_info_set_mask_captive_to_corba(&file_info_corba,file_info_captive,mask)))
470                 return r;
471
472         Captive_File_file_info_set(captive_file_parent_object->corba_File_object,&file_info_corba,mask,&captive_corba_ev);
473         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
474         if (xml_action)
475                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
476         if (r!=GNOME_VFS_OK)
477                 return r;
478
479         Captive_GnomeVFSFileInfo__freekids(&file_info_corba,NULL/* 'd'; meaning? */);
480
481         return GNOME_VFS_OK;
482 }
483
484
485 GnomeVFSResult captive_sandbox_parent_file_truncate(CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileSize file_size)
486 {
487 GnomeVFSResult r;
488 xmlNode *xml_action=NULL;
489 CaptiveVfsParentObject *captive_vfs_parent_object;
490
491         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
492
493         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
494
495         if (captive_vfs_parent_object->corba_bug_action) {
496                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_truncate",NULL);
497                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
498                 xmlNewProp(xml_action,"file_size",captive_printf_alloca("%" G_GUINT64_FORMAT,(guint64)file_size));
499                 }
500
501         Captive_File_truncate(captive_file_parent_object->corba_File_object,file_size,&captive_corba_ev);
502         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
503         if (xml_action)
504                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
505         if (r!=GNOME_VFS_OK)
506                 return r;
507
508         return GNOME_VFS_OK;
509 }
510
511
512 GnomeVFSResult captive_sandbox_parent_file_move
513                 (CaptiveFileParentObject *captive_file_parent_object_old,const gchar *pathname_new,gboolean force_replace)
514 {
515 GnomeVFSResult r;
516 xmlNode *xml_action=NULL;
517 CaptiveVfsParentObject *captive_vfs_parent_object;
518
519         g_return_val_if_fail(captive_file_parent_object_old!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
520         g_return_val_if_fail(pathname_new!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
521
522         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object_old)->vfs);
523
524         if (captive_vfs_parent_object->corba_bug_action) {
525                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_truncate",NULL);
526                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object_old));
527                 xmlNewProp(xml_action,"pathname_new",pathname_new);
528                 xmlNewProp(xml_action,"force_replace",captive_printf_alloca("%u",(unsigned)force_replace));
529                 }
530
531         Captive_File_move(captive_file_parent_object_old->corba_File_object,pathname_new,force_replace,&captive_corba_ev);
532         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
533         if (xml_action)
534                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
535         if (r!=GNOME_VFS_OK)
536                 return r;
537
538         return GNOME_VFS_OK;
539 }