Implemented sub-second W32 filesystem interface by new: CaptiveFileInfoObject
[captive.git] / src / libcaptive / client / directory.c
1 /* $Id$
2  * captive vfs 'directory' 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-directory.h"   /* self */
23 #include "directory.h"  /* self-priv */
24 #include <glib/gmessages.h>
25 #include "vfs.h"
26
27
28 static gpointer captive_directory_object_parent_class=NULL;
29
30
31 static GnomeVFSResult captive_directory_close(CaptiveDirectoryObject *captive_directory_object);
32
33 static void captive_directory_object_finalize(CaptiveDirectoryObject *captive_directory_object)
34 {
35         g_return_if_fail(captive_directory_object!=NULL);
36
37         captive_directory_close(captive_directory_object);      /* errors ignored */
38
39         G_OBJECT_CLASS(captive_directory_object_parent_class)->finalize((GObject *)captive_directory_object);
40 }
41
42
43 static void captive_directory_object_class_init(CaptiveDirectoryObjectClass *class)
44 {
45 GObjectClass *gobject_class=G_OBJECT_CLASS(class);
46
47         captive_directory_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class)));
48         gobject_class->finalize=(void (*)(GObject *object))captive_directory_object_finalize;
49 }
50
51
52 static void captive_directory_object_init(CaptiveDirectoryObject *captive_directory_object)
53 {
54 }
55
56
57 GType captive_directory_object_get_type(void)
58 {
59 static GType captive_directory_object_type=0;
60
61         if (!captive_directory_object_type) {
62 static const GTypeInfo captive_directory_object_info={
63                                 sizeof(CaptiveDirectoryObjectClass),
64                                 NULL,   /* base_init */
65                                 NULL,   /* base_finalize */
66                                 (GClassInitFunc)captive_directory_object_class_init,
67                                 NULL,   /* class_finalize */
68                                 NULL,   /* class_data */
69                                 sizeof(CaptiveDirectoryObject),
70                                 5,      /* n_preallocs */
71                                 (GInstanceInitFunc)captive_directory_object_init,
72                                 };
73
74                 captive_directory_object_type=g_type_register_static(G_TYPE_OBJECT,
75                                 "CaptiveDirectoryObject",&captive_directory_object_info,G_TYPE_FLAG_ABSTRACT);
76                 }
77
78         return captive_directory_object_type;
79 }
80
81
82 GnomeVFSResult captive_directory_new_open(CaptiveDirectoryObject **captive_directory_object_return,
83                 CaptiveVfsObject *captive_vfs_object,const gchar *pathname)
84 {
85         g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
86         g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
87         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
88
89         return (*CAPTIVE_VFS_OBJECT_GET_CLASS(captive_vfs_object)->directory_new_open)
90                         (captive_directory_object_return,captive_vfs_object,pathname);
91 }
92
93
94 GnomeVFSResult captive_directory_new_make(CaptiveDirectoryObject **captive_directory_object_return,
95                 CaptiveVfsObject *captive_vfs_object,const gchar *pathname,guint perm)
96 {
97         g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
98         g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
99         g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
100
101         return (*CAPTIVE_VFS_OBJECT_GET_CLASS(captive_vfs_object)->directory_new_make)
102                         (captive_directory_object_return,captive_vfs_object,pathname,perm);
103 }
104
105
106 GnomeVFSResult captive_directory_init(CaptiveDirectoryObject *captive_directory_object,CaptiveVfsObject *captive_vfs_object)
107 {
108         g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
109         g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
110
111         g_return_val_if_fail(captive_directory_object->vfs==NULL,GNOME_VFS_ERROR_GENERIC);
112
113         captive_directory_object->vfs=g_object_ref(captive_vfs_object);
114
115         return GNOME_VFS_OK;
116 }
117
118
119 static GnomeVFSResult captive_directory_close(CaptiveDirectoryObject *captive_directory_object)
120 {
121         g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
122
123         if (captive_directory_object->vfs!=NULL) {
124                 g_assert(CAPTIVE_VFS_IS_OBJECT(captive_directory_object->vfs));
125                 g_object_unref(captive_directory_object->vfs);
126                 captive_directory_object->vfs=NULL;
127                 }
128
129         return GNOME_VFS_OK;
130 }
131
132
133 CaptiveVfsObject *captive_directory_ref_vfs(CaptiveDirectoryObject *captive_directory_object)
134 {
135         g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),NULL);
136
137         g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_directory_object->vfs),NULL);
138
139         return g_object_ref(captive_directory_object->vfs);
140 }
141
142
143 GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object,
144                 CaptiveFileInfoObject **captive_file_info_object_return)
145 {
146         g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
147         g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
148
149         return (*CAPTIVE_DIRECTORY_OBJECT_GET_CLASS(captive_directory_object)->read)
150                         (captive_directory_object,captive_file_info_object_return);
151 }
152
153
154 GnomeVFSResult captive_directory_remove(CaptiveDirectoryObject *captive_directory_object)
155 {
156         g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
157
158         return (*CAPTIVE_DIRECTORY_OBJECT_GET_CLASS(captive_directory_object)->remove)
159                         (captive_directory_object);
160 }