Initial original import from: fuse-2.4.2-2.fc4
[captive.git] / src / libcaptive / client / file.c
1 /* $Id$
2  * captive vfs 'file' interface to reactos
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 "captive/client-file.h"        /* self */
23 #include "file.h"       /* self-priv */
24 #include <glib/gmessages.h>
25 #include "vfs.h"
26 #include "reactos/ntos/types.h" /* for ULONG */
27
28
29 static gpointer captive_file_object_parent_class=NULL;
30
31
32 static GnomeVFSResult captive_file_close(CaptiveFileObject *captive_file_object);
33
34 static void captive_file_object_finalize(CaptiveFileObject *captive_file_object)
35 {
36         g_return_if_fail(captive_file_object!=NULL);
37
38         captive_file_close(captive_file_object);        /* errors ignored */
39
40         G_OBJECT_CLASS(captive_file_object_parent_class)->finalize((GObject *)captive_file_object);
41 }
42
43
44 static void captive_file_object_class_init(CaptiveFileObjectClass *class)
45 {
46 GObjectClass *gobject_class=G_OBJECT_CLASS(class);
47
48         captive_file_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class)));
49         gobject_class->finalize=(void (*)(GObject *object))captive_file_object_finalize;
50 }
51
52
53 static void captive_file_object_init(CaptiveFileObject *captive_file_object)
54 {
55 }
56
57
58 GType captive_file_object_get_type(void)
59 {
60 static GType captive_file_object_type=0;
61
62         if (!captive_file_object_type) {
63 static const GTypeInfo captive_file_object_info={
64                                 sizeof(CaptiveFileObjectClass),
65                                 NULL,   /* base_init */
66                                 NULL,   /* base_finalize */
67                                 (GClassInitFunc)captive_file_object_class_init,
68                                 NULL,   /* class_finalize */
69                                 NULL,   /* class_data */
70                                 sizeof(CaptiveFileObject),
71                                 5,      /* n_preallocs */
72                                 (GInstanceInitFunc)captive_file_object_init,
73                                 };
74
75                 captive_file_object_type=g_type_register_static(G_TYPE_OBJECT,
76                                 "CaptiveFileObject",&captive_file_object_info,G_TYPE_FLAG_ABSTRACT);
77                 }
78
79         return captive_file_object_type;
80 }
81
82
83 GnomeVFSResult captive_file_new_open(CaptiveFileObject **captive_file_object_return,
84                 CaptiveVfsObject *captive_vfs_object,const gchar *pathname,GnomeVFSOpenMode mode)
85 {
86         g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
87         g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
88         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
89
90         return (*CAPTIVE_VFS_OBJECT_GET_CLASS(captive_vfs_object)->file_new_open)
91                         (captive_file_object_return,captive_vfs_object,pathname,mode);
92 }
93
94
95 GnomeVFSResult captive_file_new_create(CaptiveFileObject **captive_file_object_return,
96                 CaptiveVfsObject *captive_vfs_object,const gchar *pathname,GnomeVFSOpenMode mode,gboolean exclusive,guint perm)
97 {
98         g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
99         g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
100         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
101
102         return (*CAPTIVE_VFS_OBJECT_GET_CLASS(captive_vfs_object)->file_new_create)
103                         (captive_file_object_return,captive_vfs_object,pathname,mode,exclusive,perm);
104 }
105
106
107 GnomeVFSResult captive_file_init(CaptiveFileObject *captive_file_object,CaptiveVfsObject *captive_vfs_object)
108 {
109         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
110         g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
111
112         g_return_val_if_fail(captive_file_object->vfs==NULL,GNOME_VFS_ERROR_GENERIC);
113
114         captive_file_object->vfs=g_object_ref(captive_vfs_object);
115
116         return GNOME_VFS_OK;
117 }
118
119
120 static GnomeVFSResult captive_file_close(CaptiveFileObject *captive_file_object)
121 {
122         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
123
124         if (captive_file_object->vfs!=NULL) {
125                 g_assert(CAPTIVE_VFS_IS_OBJECT(captive_file_object->vfs));
126                 g_object_unref(captive_file_object->vfs);
127                 captive_file_object->vfs=NULL;
128                 }
129
130         return GNOME_VFS_OK;
131 }
132
133
134 CaptiveVfsObject *captive_file_ref_vfs(CaptiveFileObject *captive_file_object)
135 {
136         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),NULL);
137
138         g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_file_object->vfs),NULL);
139
140         return g_object_ref(captive_file_object->vfs);
141 }
142
143
144 GnomeVFSResult captive_file_read(CaptiveFileObject *captive_file_object,
145                 gpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return)
146 {
147         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
148         g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
149         g_return_val_if_fail(bytes_read_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
150         g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
151
152         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->read)
153                         (captive_file_object,buffer,num_bytes,bytes_read_return);
154 }
155
156
157 GnomeVFSResult captive_file_write(CaptiveFileObject *captive_file_object,
158                 gconstpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_written_return)
159 {
160         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
161         g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
162         g_return_val_if_fail(bytes_written_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
163         g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS);
164
165         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->write)
166                         (captive_file_object,buffer,num_bytes,bytes_written_return);
167 }
168
169
170 GnomeVFSResult captive_file_seek
171                 (CaptiveFileObject *captive_file_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset)
172 {
173         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
174
175         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->seek)
176                         (captive_file_object,whence,offset);
177 }
178
179
180 GnomeVFSResult captive_file_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return)
181 {
182         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
183
184         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->tell)
185                         (captive_file_object,offset_return);
186 }
187
188
189 GnomeVFSResult captive_file_remove(CaptiveFileObject *captive_file_object)
190 {
191         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
192
193         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->remove)
194                         (captive_file_object);
195 }
196
197
198 GnomeVFSResult captive_file_file_info_get(CaptiveFileObject *captive_file_object,
199                 GnomeVFSFileInfo *file_info)
200 {
201         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
202         g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
203
204         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->file_info_get)
205                         (captive_file_object,file_info);
206 }
207
208
209 GnomeVFSResult captive_file_file_info_set(CaptiveFileObject *captive_file_object,
210     const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask)
211 {
212         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
213         g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
214
215         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->file_info_set)
216                         (captive_file_object,info,mask);
217 }
218
219
220 GnomeVFSResult captive_file_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size)
221 {
222         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
223
224         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->truncate)
225                         (captive_file_object,file_size);
226 }
227
228
229 GnomeVFSResult captive_file_move(CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace)
230 {
231         g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object_old),GNOME_VFS_ERROR_BAD_PARAMETERS);
232         g_return_val_if_fail(pathname_new!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
233
234         return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object_old)->move)
235                         (captive_file_object_old,pathname_new,force_replace);
236 }