Finished and deployed CORBA sandbox separation
[captive.git] / src / libcaptive / sandbox / parent-File.c
1 /* $Id$
2  * CORBA/ORBit server 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 "captive/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
30
31 GnomeVFSResult captive_sandbox_parent_file_new_open(CaptiveFileObject *captive_file_object,
32                 const gchar *pathname,GnomeVFSOpenMode mode)
33 {
34         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
35         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
36
37         captive_file_object->corba_File_object=Captive_Vfs_file_new_open(
38                         captive_file_object->vfs->corba_Vfs_object,pathname,mode,&captive_corba_ev);
39
40         return captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
41 }
42
43
44 GnomeVFSResult captive_sandbox_parent_file_new_create(CaptiveFileObject *captive_file_object,
45                 const gchar *pathname,GnomeVFSOpenMode mode,gboolean exclusive,guint perm)
46 {
47         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
48         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
49
50         captive_file_object->corba_File_object=Captive_Vfs_file_new_create(
51                         captive_file_object->vfs->corba_Vfs_object,pathname,mode,exclusive,perm,&captive_corba_ev);
52
53         return captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
54 }
55
56
57 GnomeVFSResult captive_sandbox_parent_file_close(CaptiveFileObject *captive_file_object)
58 {
59         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
60         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
61
62         CORBA_Object_release((CORBA_Object)captive_file_object->corba_File_object,&captive_corba_ev);
63         captive_file_object->corba_File_object=CORBA_OBJECT_NIL;
64
65         return captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
66 }
67
68
69 GnomeVFSResult captive_sandbox_parent_file_read(CaptiveFileObject *captive_file_object,
70                 gpointer buffer_captive,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return)
71 {
72 GnomeVFSResult r;
73 Captive_Bytes *buffer_corba;
74
75         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
76         g_return_val_if_fail(buffer_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
77         g_return_val_if_fail(bytes_read_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
78         g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
79         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
80
81         *bytes_read_return=0;
82
83         Captive_File_read(captive_file_object->corba_File_object,&buffer_corba,num_bytes,&captive_corba_ev);
84         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
85                 return r;
86
87         g_return_val_if_fail(buffer_corba->_length<=num_bytes,GNOME_VFS_ERROR_GENERIC);
88         memcpy(buffer_captive,buffer_corba->_buffer,buffer_corba->_length);
89         *bytes_read_return=buffer_corba->_length;
90
91         Captive_Bytes__freekids(buffer_corba,NULL/* 'd'; meaning? */);
92         CORBA_free(buffer_corba);
93
94         return GNOME_VFS_OK;
95 }
96
97
98 GnomeVFSResult captive_sandbox_parent_file_write(CaptiveFileObject *captive_file_object,
99                 gconstpointer buffer_captive,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_written_return)
100 {
101 GnomeVFSResult r;
102 Captive_Bytes buffer_corba_local;
103 Captive_GnomeVFSFileSize bytes_written_corba;
104
105         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
106         g_return_val_if_fail(buffer_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
107         g_return_val_if_fail(bytes_written_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
108         g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
109         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
110
111         *bytes_written_return=0;
112
113         buffer_corba_local._maximum=num_bytes;
114         buffer_corba_local._length=num_bytes;
115         buffer_corba_local._buffer=(/* de-const */gpointer)buffer_captive;
116         buffer_corba_local._release=FALSE;
117
118         Captive_File_write(captive_file_object->corba_File_object,&buffer_corba_local,&bytes_written_corba,&captive_corba_ev);
119         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
120                 return r;
121
122         *bytes_written_return=bytes_written_corba;
123
124         return GNOME_VFS_OK;
125 }
126
127
128 GnomeVFSResult captive_sandbox_parent_file_seek
129                 (CaptiveFileObject *captive_file_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset)
130 {
131 GnomeVFSResult r;
132
133         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
134         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
135
136         Captive_File_seek(captive_file_object->corba_File_object,whence,offset,&captive_corba_ev);
137         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
138                 return r;
139
140         return GNOME_VFS_OK;
141 }
142
143
144 GnomeVFSResult captive_sandbox_parent_file_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return)
145 {
146 Captive_GnomeVFSFileOffset offset_corba;
147 GnomeVFSResult r;
148
149         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
150         g_return_val_if_fail(offset_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
151         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
152
153         Captive_File_tell(captive_file_object->corba_File_object,&offset_corba,&captive_corba_ev);
154         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
155                 return r;
156
157         *offset_return=offset_corba;
158
159         return GNOME_VFS_OK;
160 }
161
162
163 GnomeVFSResult captive_sandbox_parent_file_remove(CaptiveFileObject *captive_file_object)
164 {
165 GnomeVFSResult r;
166
167         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
168         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
169
170         Captive_File_remove(captive_file_object->corba_File_object,&captive_corba_ev);
171         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
172                 return r;
173
174         return GNOME_VFS_OK;
175 }
176
177
178 GnomeVFSResult captive_sandbox_parent_file_file_info_get(CaptiveFileObject *captive_file_object,
179                 GnomeVFSFileInfo *file_info_captive)
180 {
181 Captive_GnomeVFSFileInfo *file_info_corba;
182 GnomeVFSResult r;
183
184         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
185         g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
186         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
187
188         Captive_File_file_info_get(captive_file_object->corba_File_object,&file_info_corba,&captive_corba_ev);
189         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
190                 return r;
191
192         r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
193         Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
194         CORBA_free(file_info_corba);
195         if (r!=GNOME_VFS_OK)
196                 return r;
197
198         return GNOME_VFS_OK;
199 }
200
201
202 GnomeVFSResult captive_sandbox_parent_file_file_info_set(CaptiveFileObject *captive_file_object,
203     const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask)
204 {
205 Captive_GnomeVFSFileInfo file_info_corba;
206 GnomeVFSResult r;
207
208         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
209         g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
210         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
211
212         if (GNOME_VFS_OK!=(r=captive_sandbox_file_info_captive_to_corba(&file_info_corba,file_info_captive)))
213                 return r;
214
215         Captive_File_file_info_set(captive_file_object->corba_File_object,&file_info_corba,mask,&captive_corba_ev);
216         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
217                 return r;
218
219         Captive_GnomeVFSFileInfo__freekids(&file_info_corba,NULL/* 'd'; meaning? */);
220
221         return GNOME_VFS_OK;
222 }
223
224
225 GnomeVFSResult captive_sandbox_parent_file_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size)
226 {
227 GnomeVFSResult r;
228
229         g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
230         g_return_val_if_fail(captive_file_object->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
231
232         Captive_File_truncate(captive_file_object->corba_File_object,file_size,&captive_corba_ev);
233         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
234                 return r;
235
236         return GNOME_VFS_OK;
237 }
238
239
240 GnomeVFSResult captive_sandbox_parent_file_move
241                 (CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace)
242 {
243 GnomeVFSResult r;
244
245         g_return_val_if_fail(captive_file_object_old!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
246         g_return_val_if_fail(pathname_new!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
247         g_return_val_if_fail(captive_file_object_old->file_Handle==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
248
249         Captive_File_move(captive_file_object_old->corba_File_object,pathname_new,force_replace,&captive_corba_ev);
250         if (GNOME_VFS_OK!=(r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev)))
251                 return r;
252
253         return GNOME_VFS_OK;
254 }