c1d09b2cc9f47a30ad78cfed9166879b4cad2aae
[captive.git] / src / libcaptive / client / file-parent.c
1 /* $Id$
2  * captive vfs 'file' interface to reactos of sandbox parent
3  * Copyright (C) 2002-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 "file-parent.h"        /* self */
23 #include <glib/gmessages.h>
24 #include "../sandbox/parent-File.h"
25 #include "vfs-parent.h"
26 #include "reactos/ntos/types.h" /* for ULONG */
27
28
29 static gpointer captive_file_parent_object_parent_class=NULL;
30
31
32 static GnomeVFSResult captive_file_parent_close(CaptiveFileObject *captive_file_object);
33 static GnomeVFSResult captive_file_parent_read(CaptiveFileObject *captive_file_object,
34                 gpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return);
35 static GnomeVFSResult captive_file_parent_write(CaptiveFileObject *captive_file_object,
36                 gconstpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_written_return);
37 static GnomeVFSResult captive_file_parent_seek
38                 (CaptiveFileObject *captive_file_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset);
39 static GnomeVFSResult captive_file_parent_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return);
40 static GnomeVFSResult captive_file_parent_remove(CaptiveFileObject *captive_file_object);
41 static GnomeVFSResult captive_file_parent_file_info_get
42                 (CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info);
43 static GnomeVFSResult captive_file_parent_file_info_set
44                 (CaptiveFileObject *captive_file_object,const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask);
45 static GnomeVFSResult captive_file_parent_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size);
46 static GnomeVFSResult captive_file_parent_move
47                 (CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace);
48
49
50 static void captive_file_parent_object_finalize(CaptiveFileParentObject *captive_file_parent_object)
51 {
52         g_return_if_fail(captive_file_parent_object!=NULL);
53
54         captive_file_parent_close(CAPTIVE_FILE_OBJECT(captive_file_parent_object));     /* errors ignored */
55
56         G_OBJECT_CLASS(captive_file_parent_object_parent_class)->finalize((GObject *)captive_file_parent_object);
57 }
58
59
60 static void captive_file_parent_object_class_init(CaptiveFileParentObjectClass *class)
61 {
62 GObjectClass *gobject_class=G_OBJECT_CLASS(class);
63 CaptiveFileObjectClass *captive_file_object_class=CAPTIVE_FILE_OBJECT_CLASS(class);
64
65         captive_file_parent_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class)));
66         gobject_class->finalize=(void (*)(GObject *object))captive_file_parent_object_finalize;
67
68         captive_file_object_class->read=captive_file_parent_read;
69         captive_file_object_class->write=captive_file_parent_write;
70         captive_file_object_class->seek=captive_file_parent_seek;
71         captive_file_object_class->tell=captive_file_parent_tell;
72         captive_file_object_class->remove=captive_file_parent_remove;
73         captive_file_object_class->file_info_get=captive_file_parent_file_info_get;
74         captive_file_object_class->file_info_set=captive_file_parent_file_info_set;
75         captive_file_object_class->truncate=captive_file_parent_truncate;
76         captive_file_object_class->move=captive_file_parent_move;
77 }
78
79
80 static void captive_file_parent_object_init(CaptiveFileParentObject *captive_file_parent_object)
81 {
82 }
83
84
85 GType captive_file_parent_object_get_type(void)
86 {
87 static GType captive_file_parent_object_type=0;
88
89         if (!captive_file_parent_object_type) {
90 static const GTypeInfo captive_file_parent_object_info={
91                                 sizeof(CaptiveFileParentObjectClass),
92                                 NULL,   /* base_init */
93                                 NULL,   /* base_finalize */
94                                 (GClassInitFunc)captive_file_parent_object_class_init,
95                                 NULL,   /* class_finalize */
96                                 NULL,   /* class_data */
97                                 sizeof(CaptiveFileParentObject),
98                                 5,      /* n_preallocs */
99                                 (GInstanceInitFunc)captive_file_parent_object_init,
100                                 };
101
102                 captive_file_parent_object_type=g_type_register_static(CAPTIVE_FILE_TYPE_OBJECT,
103                                 "CaptiveFileParentObject",&captive_file_parent_object_info,0);
104                 }
105
106         return captive_file_parent_object_type;
107 }
108
109
110 GnomeVFSResult captive_file_parent_new_open(CaptiveFileObject **captive_file_object_return,
111                 CaptiveVfsObject *captive_vfs_object,const gchar *pathname,GnomeVFSOpenMode mode)
112 {
113 CaptiveFileParentObject *captive_file_parent_object;
114
115         g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
116         g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
117         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
118
119         captive_file_parent_object=g_object_new(
120                         CAPTIVE_FILE_PARENT_TYPE_OBJECT,        /* object_type */
121                         NULL);  /* first_property_name; FIXME: support properties */
122
123         captive_file_init(CAPTIVE_FILE_OBJECT(captive_file_parent_object),captive_vfs_object);
124
125         *captive_file_object_return=CAPTIVE_FILE_OBJECT(captive_file_parent_object);
126
127         return captive_sandbox_parent_file_new_open(captive_file_parent_object,pathname,mode);
128 }
129
130
131 GnomeVFSResult captive_file_parent_new_create(CaptiveFileObject **captive_file_object_return,
132                 CaptiveVfsObject *captive_vfs_object,const gchar *pathname,GnomeVFSOpenMode mode,gboolean exclusive,guint perm)
133 {
134 CaptiveFileParentObject *captive_file_parent_object;
135
136         g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
137         g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
138         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
139
140         captive_file_parent_object=g_object_new(
141                         CAPTIVE_FILE_PARENT_TYPE_OBJECT,        /* object_type */
142                         NULL);  /* first_property_name; FIXME: support properties */
143
144         captive_file_init(CAPTIVE_FILE_OBJECT(captive_file_parent_object),captive_vfs_object);
145
146         *captive_file_object_return=CAPTIVE_FILE_OBJECT(captive_file_parent_object);
147
148         return captive_sandbox_parent_file_new_create(captive_file_parent_object,pathname,mode,exclusive,perm);
149 }
150
151
152 static GnomeVFSResult captive_file_parent_close(CaptiveFileObject *captive_file_object)
153 {
154         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
155
156         return captive_sandbox_parent_file_close(CAPTIVE_FILE_PARENT_OBJECT(captive_file_object));
157 }
158
159
160 static GnomeVFSResult captive_file_parent_read(CaptiveFileObject *captive_file_object,
161                 gpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return)
162 {
163 CaptiveFileParentObject *captive_file_parent_object;
164
165         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
166         g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
167         g_return_val_if_fail(bytes_read_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
168         g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
169
170         captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
171
172         return captive_sandbox_parent_file_read(captive_file_parent_object,buffer,num_bytes,bytes_read_return);
173 }
174
175
176 static GnomeVFSResult captive_file_parent_write(CaptiveFileObject *captive_file_object,
177                 gconstpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_written_return)
178 {
179 CaptiveFileParentObject *captive_file_parent_object;
180
181         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
182         g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
183         g_return_val_if_fail(bytes_written_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
184         g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
185
186         captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
187
188         return captive_sandbox_parent_file_write(captive_file_parent_object,buffer,num_bytes,bytes_written_return);
189 }
190
191
192 static GnomeVFSResult captive_file_parent_seek
193                 (CaptiveFileObject *captive_file_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset)
194 {
195 CaptiveFileParentObject *captive_file_parent_object;
196
197         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
198
199         captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
200
201         return captive_sandbox_parent_file_seek(captive_file_parent_object,whence,offset);
202 }
203
204
205 static GnomeVFSResult captive_file_parent_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return)
206 {
207 CaptiveFileParentObject *captive_file_parent_object;
208
209         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
210         g_return_val_if_fail(offset_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
211
212         captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
213
214         return captive_sandbox_parent_file_tell(captive_file_parent_object,offset_return);
215 }
216
217
218 static GnomeVFSResult captive_file_parent_remove(CaptiveFileObject *captive_file_object)
219 {
220 CaptiveFileParentObject *captive_file_parent_object;
221
222         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
223
224         captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
225
226         return captive_sandbox_parent_file_remove(captive_file_parent_object);
227 }
228
229
230 static GnomeVFSResult captive_file_parent_file_info_get
231                 (CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info)
232 {
233 CaptiveFileParentObject *captive_file_parent_object;
234
235         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
236         g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
237
238         captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
239
240         return captive_sandbox_parent_file_file_info_get(captive_file_parent_object,file_info);
241 }
242
243
244 static GnomeVFSResult captive_file_parent_file_info_set
245                 (CaptiveFileObject *captive_file_object,const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask)
246 {
247 CaptiveFileParentObject *captive_file_parent_object;
248
249         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
250         g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
251
252         captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
253
254         return captive_sandbox_parent_file_file_info_set(captive_file_parent_object,info,mask);
255 }
256
257
258 static GnomeVFSResult captive_file_parent_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size)
259 {
260 CaptiveFileParentObject *captive_file_parent_object;
261
262         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
263
264         captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
265
266         return captive_sandbox_parent_file_truncate(captive_file_parent_object,file_size);
267 }
268
269
270 static GnomeVFSResult captive_file_parent_move
271                 (CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace)
272 {
273 CaptiveFileParentObject *captive_file_parent_object_old;
274
275         g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object_old),GNOME_VFS_ERROR_BAD_PARAMETERS);
276         g_return_val_if_fail(pathname_new!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
277
278         captive_file_parent_object_old=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object_old);
279
280         return captive_sandbox_parent_file_move(captive_file_parent_object_old,pathname_new,force_replace);
281 }