Implemented CaptiveParentConnector sandbox restarts handling GInterface.
[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         if (captive_vfs_parent_object->corba_bug_action) {
203                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_write",NULL);
204                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
205                 xmlNewProp(xml_action,"num_bytes",captive_printf_alloca("%lu",(unsigned long)num_bytes));
206                 }
207
208         r=captive_sandbox_parent_file_seek_slave(captive_file_parent_object,
209                         GNOME_VFS_SEEK_START,captive_file_parent_object->offset);
210         if (r==GNOME_VFS_OK) {
211                 buffer_corba_local._maximum=num_bytes;
212                 buffer_corba_local._length=num_bytes;
213                 buffer_corba_local._buffer=(/* de-const */gpointer)buffer_captive;
214                 buffer_corba_local._release=FALSE;
215
216                 Captive_File_write(captive_file_parent_object->corba_File_object,
217                                 &buffer_corba_local,&bytes_written_corba,&captive_corba_ev);
218                 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
219                 }
220         if (xml_action)
221                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
222         if (r!=GNOME_VFS_OK)
223                 return r;
224
225         *bytes_written_return=bytes_written_corba;
226         captive_file_parent_object->offset+=bytes_written_corba;
227
228         if (xml_action)
229                 xmlNewProp(xml_action,"bytes_written_return",captive_printf_alloca("%lu",(unsigned long)*bytes_written_return));
230
231         return GNOME_VFS_OK;
232 }
233
234
235 static GnomeVFSResult captive_sandbox_parent_file_seek_slave
236                 (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset)
237 {
238 GnomeVFSResult r;
239 xmlNode *xml_action=NULL;
240 CaptiveVfsParentObject *captive_vfs_parent_object;
241
242         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
243
244         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
245
246         if (captive_vfs_parent_object->corba_bug_action) {
247                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_seek",NULL);
248                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
249                 xmlNewProp(xml_action,"whence",
250                                 (whence==GNOME_VFS_SEEK_START ? "start" :
251                                         (whence==GNOME_VFS_SEEK_CURRENT ? "current" :
252                                                 (whence==GNOME_VFS_SEEK_END ? "end" : captive_printf_alloca("%lu",(unsigned long)whence)))));
253                 xmlNewProp(xml_action,"offset",captive_printf_alloca("%" G_GINT64_FORMAT,(gint64)offset));
254                 }
255
256         Captive_File_seek(captive_file_parent_object->corba_File_object,whence,offset,&captive_corba_ev);
257         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
258         if (xml_action)
259                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
260         if (r!=GNOME_VFS_OK)
261                 return r;
262
263         return GNOME_VFS_OK;
264 }
265
266
267 GnomeVFSResult captive_sandbox_parent_file_seek
268                 (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset)
269 {
270 GnomeVFSResult r;
271 xmlNode *xml_action=NULL;
272 CaptiveVfsParentObject *captive_vfs_parent_object;
273
274         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
275
276         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
277
278         if (captive_vfs_parent_object->corba_bug_action) {
279                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_seek",NULL);
280                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
281                 xmlNewProp(xml_action,"whence",
282                                 (whence==GNOME_VFS_SEEK_START ? "start" :
283                                         (whence==GNOME_VFS_SEEK_CURRENT ? "current" :
284                                                 (whence==GNOME_VFS_SEEK_END ? "end" : captive_printf_alloca("%lu",(unsigned long)whence)))));
285                 xmlNewProp(xml_action,"offset",captive_printf_alloca("%" G_GINT64_FORMAT,(gint64)offset));
286                 }
287
288         switch (whence) {
289                 case GNOME_VFS_SEEK_START:
290                         captive_file_parent_object->offset=offset;
291                         break;
292                 case GNOME_VFS_SEEK_CURRENT:
293                         if (0
294                                         || (offset>0 && (captive_file_parent_object->offset+offset)<captive_file_parent_object->offset)
295                                         || (offset<0 && (captive_file_parent_object->offset+offset)>captive_file_parent_object->offset))
296                                 r=GNOME_VFS_ERROR_BAD_PARAMETERS;
297                         else
298                                 captive_file_parent_object->offset+=offset;
299                         break;
300                 case GNOME_VFS_SEEK_END:
301                         g_assert_not_reached(); /* NOT IMPLEMENTED YET */
302                         r=GNOME_VFS_ERROR_GENERIC;
303                         break;
304                 default:
305                         r=GNOME_VFS_ERROR_BAD_PARAMETERS;
306                 }
307
308         if (xml_action)
309                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
310         if (r!=GNOME_VFS_OK)
311                 return r;
312
313         return GNOME_VFS_OK;
314 }
315
316
317 #if 0 /* unused */
318 static GnomeVFSResult captive_sandbox_parent_file_tell_slave
319                 (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileOffset *offset_return)
320 {
321 Captive_GnomeVFSFileOffset offset_corba;
322 GnomeVFSResult r;
323 xmlNode *xml_action=NULL;
324 CaptiveVfsParentObject *captive_vfs_parent_object;
325
326         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
327         g_return_val_if_fail(offset_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
328
329         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
330
331         if (captive_vfs_parent_object->corba_bug_action) {
332                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_tell",NULL);
333                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
334                 }
335
336         Captive_File_tell(captive_file_parent_object->corba_File_object,&offset_corba,&captive_corba_ev);
337         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
338         if (xml_action)
339                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
340         if (r!=GNOME_VFS_OK)
341                 return r;
342
343         *offset_return=offset_corba;
344
345         if (xml_action)
346                 xmlNewProp(xml_action,"offset_return",captive_printf_alloca("%" G_GINT64_FORMAT,(gint64)*offset_return));
347
348         return GNOME_VFS_OK;
349 }
350 #endif
351
352
353 GnomeVFSResult captive_sandbox_parent_file_tell(CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileOffset *offset_return)
354 {
355 GnomeVFSResult r;
356 xmlNode *xml_action=NULL;
357 CaptiveVfsParentObject *captive_vfs_parent_object;
358
359         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
360         g_return_val_if_fail(offset_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
361
362         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
363
364         if (captive_vfs_parent_object->corba_bug_action) {
365                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_tell",NULL);
366                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
367                 }
368
369         *offset_return=captive_file_parent_object->offset;
370         r=GNOME_VFS_OK;
371         if (xml_action)
372                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
373         if (r!=GNOME_VFS_OK)
374                 return r;
375
376         if (xml_action)
377                 xmlNewProp(xml_action,"offset_return",captive_printf_alloca("%" G_GINT64_FORMAT,(gint64)*offset_return));
378
379         return GNOME_VFS_OK;
380 }
381
382
383 GnomeVFSResult captive_sandbox_parent_file_remove(CaptiveFileParentObject *captive_file_parent_object)
384 {
385 GnomeVFSResult r;
386 xmlNode *xml_action=NULL;
387 CaptiveVfsParentObject *captive_vfs_parent_object;
388
389         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
390
391         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
392
393         if (captive_vfs_parent_object->corba_bug_action) {
394                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_remove",NULL);
395                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
396                 }
397
398         Captive_File_remove(captive_file_parent_object->corba_File_object,&captive_corba_ev);
399         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
400         if (xml_action)
401                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
402         if (r!=GNOME_VFS_OK)
403                 return r;
404
405         return GNOME_VFS_OK;
406 }
407
408
409 GnomeVFSResult captive_sandbox_parent_file_file_info_get(CaptiveFileParentObject *captive_file_parent_object,
410                 GnomeVFSFileInfo *file_info_captive)
411 {
412 Captive_GnomeVFSFileInfo *file_info_corba;
413 GnomeVFSResult r;
414 xmlNode *xml_action=NULL;
415 CaptiveVfsParentObject *captive_vfs_parent_object;
416
417         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
418         g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
419
420         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
421
422         if (captive_vfs_parent_object->corba_bug_action) {
423                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_file_info_get",NULL);
424                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
425                 }
426
427         Captive_File_file_info_get(captive_file_parent_object->corba_File_object,&file_info_corba,&captive_corba_ev);
428         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
429         if (xml_action)
430                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
431         if (r!=GNOME_VFS_OK)
432                 return r;
433
434         r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
435         Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
436         CORBA_free(file_info_corba);
437         if (xml_action)
438                 xmlSetProp(xml_action,"result",gnome_vfs_result_to_string(r));
439         if (r!=GNOME_VFS_OK)
440                 return r;
441
442         return GNOME_VFS_OK;
443 }
444
445
446 GnomeVFSResult captive_sandbox_parent_file_file_info_set(CaptiveFileParentObject *captive_file_parent_object,
447     const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask)
448 {
449 Captive_GnomeVFSFileInfo file_info_corba;
450 GnomeVFSResult r;
451 xmlNode *xml_action=NULL;
452 CaptiveVfsParentObject *captive_vfs_parent_object;
453
454         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
455         g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
456
457         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
458
459         if (captive_vfs_parent_object->corba_bug_action) {
460                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_file_info_set",NULL);
461                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
462                 xmlNewProp(xml_action,"mask",captive_printf_alloca("%u",(unsigned)mask));
463                 }
464
465         if (GNOME_VFS_OK!=(r=captive_sandbox_file_info_captive_to_corba(&file_info_corba,file_info_captive)))
466                 return r;
467
468         Captive_File_file_info_set(captive_file_parent_object->corba_File_object,&file_info_corba,mask,&captive_corba_ev);
469         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
470         if (xml_action)
471                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
472         if (r!=GNOME_VFS_OK)
473                 return r;
474
475         Captive_GnomeVFSFileInfo__freekids(&file_info_corba,NULL/* 'd'; meaning? */);
476
477         return GNOME_VFS_OK;
478 }
479
480
481 GnomeVFSResult captive_sandbox_parent_file_truncate(CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileSize file_size)
482 {
483 GnomeVFSResult r;
484 xmlNode *xml_action=NULL;
485 CaptiveVfsParentObject *captive_vfs_parent_object;
486
487         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
488
489         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
490
491         if (captive_vfs_parent_object->corba_bug_action) {
492                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_truncate",NULL);
493                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object));
494                 xmlNewProp(xml_action,"file_size",captive_printf_alloca("%" G_GUINT64_FORMAT,(guint64)file_size));
495                 }
496
497         Captive_File_truncate(captive_file_parent_object->corba_File_object,file_size,&captive_corba_ev);
498         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
499         if (xml_action)
500                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
501         if (r!=GNOME_VFS_OK)
502                 return r;
503
504         return GNOME_VFS_OK;
505 }
506
507
508 GnomeVFSResult captive_sandbox_parent_file_move
509                 (CaptiveFileParentObject *captive_file_parent_object_old,const gchar *pathname_new,gboolean force_replace)
510 {
511 GnomeVFSResult r;
512 xmlNode *xml_action=NULL;
513 CaptiveVfsParentObject *captive_vfs_parent_object;
514
515         g_return_val_if_fail(captive_file_parent_object_old!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
516         g_return_val_if_fail(pathname_new!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
517
518         captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object_old)->vfs);
519
520         if (captive_vfs_parent_object->corba_bug_action) {
521                 xml_action=xmlNewTextChild(captive_vfs_parent_object->corba_bug_action,NULL,"file_truncate",NULL);
522                 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_file_parent_object_old));
523                 xmlNewProp(xml_action,"pathname_new",pathname_new);
524                 xmlNewProp(xml_action,"force_replace",captive_printf_alloca("%u",(unsigned)force_replace));
525                 }
526
527         Captive_File_move(captive_file_parent_object_old->corba_File_object,pathname_new,force_replace,&captive_corba_ev);
528         r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev,captive_vfs_parent_object);
529         if (xml_action)
530                 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r));
531         if (r!=GNOME_VFS_OK)
532                 return r;
533
534         return GNOME_VFS_OK;
535 }