Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "vfs.h"
00021 #include "audstrings.h"
00022 #include <stdio.h>
00023 #include <unistd.h>
00024 #include <sys/stat.h>
00025 #include <sys/types.h>
00026 #include <string.h>
00027
00028
00033 GList *vfs_transports = NULL;
00034
00035
00041 void vfs_register_transport (VFSConstructor * vtable)
00042 {
00043 vfs_transports = g_list_append (vfs_transports, vtable);
00044 }
00045
00046 static VFSConstructor *
00047 vfs_get_constructor(const gchar *path)
00048 {
00049 VFSConstructor *vtable = NULL;
00050 GList *node;
00051
00052 if (path == NULL)
00053 return NULL;
00054
00055 for (node = vfs_transports; node != NULL; node = g_list_next(node))
00056 {
00057 VFSConstructor *vtptr = (VFSConstructor *) node->data;
00058
00059 if (!strncasecmp(path, vtptr->uri_id, strlen(vtptr->uri_id)))
00060 {
00061 vtable = vtptr;
00062 break;
00063 }
00064 }
00065
00066
00067 if (vtable == NULL)
00068 g_warning("Could not open '%s', no transport plugin available.", path);
00069
00070 return vtable;
00071 }
00072
00081 VFSFile *
00082 vfs_fopen(const gchar * path,
00083 const gchar * mode)
00084 {
00085 VFSFile *file;
00086 VFSConstructor *vtable = NULL;
00087
00088 if (path == NULL || mode == NULL || (vtable = vfs_get_constructor(path)) == NULL)
00089 return NULL;
00090
00091 file = vtable->vfs_fopen_impl(path, mode);
00092
00093 if (file == NULL)
00094 return NULL;
00095
00096 file->uri = g_strdup(path);
00097 file->base = vtable;
00098 file->ref = 1;
00099
00100 return file;
00101 }
00102
00109 gint
00110 vfs_fclose(VFSFile * file)
00111 {
00112 gint ret = 0;
00113
00114 if (file == NULL)
00115 return -1;
00116
00117 if (--file->ref > 0)
00118 return -1;
00119
00120 if (file->base->vfs_fclose_impl(file) != 0)
00121 ret = -1;
00122
00123 g_free(file->uri);
00124 g_free(file);
00125
00126 return ret;
00127 }
00128
00138 gint64 vfs_fread (void * ptr, gint64 size, gint64 nmemb, VFSFile * file)
00139 {
00140 if (file == NULL)
00141 return 0;
00142
00143 return file->base->vfs_fread_impl(ptr, size, nmemb, file);
00144 }
00145
00155 gint64 vfs_fwrite (const void * ptr, gint64 size, gint64 nmemb, VFSFile * file)
00156 {
00157 if (file == NULL)
00158 return 0;
00159
00160 return file->base->vfs_fwrite_impl(ptr, size, nmemb, file);
00161 }
00162
00169 gint
00170 vfs_getc(VFSFile *file)
00171 {
00172 if (file == NULL)
00173 return -1;
00174
00175 return file->base->vfs_getc_impl(file);
00176 }
00177
00185 gint
00186 vfs_ungetc(gint c, VFSFile *file)
00187 {
00188 if (file == NULL)
00189 return -1;
00190
00191 return file->base->vfs_ungetc_impl(c, file);
00192 }
00193
00207 gint
00208 vfs_fseek(VFSFile * file,
00209 gint64 offset,
00210 gint whence)
00211 {
00212 if (file == NULL)
00213 return 0;
00214
00215 return file->base->vfs_fseek_impl(file, offset, whence);
00216 }
00217
00223 void
00224 vfs_rewind(VFSFile * file)
00225 {
00226 if (file == NULL)
00227 return;
00228
00229 file->base->vfs_rewind_impl(file);
00230 }
00231
00238 glong
00239 vfs_ftell(VFSFile * file)
00240 {
00241 if (file == NULL)
00242 return -1;
00243
00244 return file->base->vfs_ftell_impl(file);
00245 }
00246
00253 gboolean
00254 vfs_feof(VFSFile * file)
00255 {
00256 if (file == NULL)
00257 return FALSE;
00258
00259 return (gboolean) file->base->vfs_feof_impl(file);
00260 }
00261
00269 gint vfs_ftruncate (VFSFile * file, gint64 length)
00270 {
00271 if (file == NULL)
00272 return -1;
00273
00274 return file->base->vfs_ftruncate_impl(file, length);
00275 }
00276
00283 gint64
00284 vfs_fsize(VFSFile * file)
00285 {
00286 if (file == NULL)
00287 return -1;
00288
00289 return file->base->vfs_fsize_impl(file);
00290 }
00291
00299 gchar *
00300 vfs_get_metadata(VFSFile * file, const gchar * field)
00301 {
00302 if (file == NULL)
00303 return NULL;
00304
00305 if (file->base->vfs_get_metadata_impl)
00306 return file->base->vfs_get_metadata_impl(file, field);
00307 return NULL;
00308 }
00309
00317 gboolean
00318 vfs_file_test(const gchar * path, GFileTest test)
00319 {
00320 if (strncmp (path, "file://", 7))
00321 return FALSE;
00322
00323 gchar * path2 = uri_to_filename (path);
00324
00325 if (path2 == NULL)
00326 path2 = g_strdup(path);
00327
00328 gboolean ret = g_file_test (path2, test);
00329
00330 g_free(path2);
00331
00332 return ret;
00333 }
00334
00341 gboolean
00342 vfs_is_writeable(const gchar * path)
00343 {
00344 struct stat info;
00345 gchar * realfn = uri_to_filename (path);
00346
00347 if (stat(realfn, &info) == -1)
00348 return FALSE;
00349
00350 g_free(realfn);
00351
00352 return (info.st_mode & S_IWUSR);
00353 }
00354
00364 VFSFile *
00365 vfs_dup(VFSFile *in)
00366 {
00367 g_return_val_if_fail(in != NULL, NULL);
00368
00369 in->ref++;
00370
00371 return in;
00372 }
00373
00380 gboolean
00381 vfs_is_remote(const gchar * path)
00382 {
00383 VFSConstructor *vtable = NULL;
00384
00385 if (path == NULL || (vtable = vfs_get_constructor(path)) == NULL)
00386 return FALSE;
00387
00388
00389 if (!strncasecmp("file://", vtable->uri_id, strlen(vtable->uri_id)))
00390 return FALSE;
00391 else
00392 return TRUE;
00393 }
00394
00401 gboolean
00402 vfs_is_streaming(VFSFile *file)
00403 {
00404 off_t size = 0;
00405
00406 if (file == NULL)
00407 return FALSE;
00408
00409 size = file->base->vfs_fsize_impl(file);
00410
00411 if (size == -1)
00412 return TRUE;
00413 else
00414 return FALSE;
00415 }