1/* GIO - GLib Input, Output and Streaming Library 2 * 3 * Copyright (C) 2006-2007 Red Hat, Inc. 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General 16 * Public License along with this library; if not, write to the 17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 18 * Boston, MA 02111-1307, USA. 19 * 20 * Author: Alexander Larsson <alexl@redhat.com> 21 */ 22 23#include "config.h" 24#include <string.h> 25#include "gvfs.h" 26#include "glocalvfs.h" 27#include "giomodule-priv.h" 28#include "glibintl.h" 29 30#include "gioalias.h" 31 32/** 33 * SECTION:gvfs 34 * @short_description: Virtual File System 35 * @include: gio/gio.h 36 * 37 * Entry point for using GIO functionality. 38 * 39 **/ 40 41G_DEFINE_TYPE (GVfs, g_vfs, G_TYPE_OBJECT); 42 43static void 44g_vfs_class_init (GVfsClass *klass) 45{ 46} 47 48static void 49g_vfs_init (GVfs *vfs) 50{ 51} 52 53/** 54 * g_vfs_is_active: 55 * @vfs: a #GVfs. 56 * 57 * Checks if the VFS is active. 58 * 59 * Returns: %TRUE if construction of the @vfs was successful and it is now active. 60 **/ 61gboolean 62g_vfs_is_active (GVfs *vfs) 63{ 64 GVfsClass *class; 65 66 g_return_val_if_fail (G_IS_VFS (vfs), FALSE); 67 68 class = G_VFS_GET_CLASS (vfs); 69 70 return (* class->is_active) (vfs); 71} 72 73 74/** 75 * g_vfs_get_file_for_path: 76 * @vfs: a #GVfs. 77 * @path: a string containing a VFS path. 78 * 79 * Gets a #GFile for @path. 80 * 81 * Returns: a #GFile. 82 * Free the returned object with g_object_unref(). 83 **/ 84GFile * 85g_vfs_get_file_for_path (GVfs *vfs, 86 const char *path) 87{ 88 GVfsClass *class; 89 90 g_return_val_if_fail (G_IS_VFS (vfs), NULL); 91 g_return_val_if_fail (path != NULL, NULL); 92 93 class = G_VFS_GET_CLASS (vfs); 94 95 return (* class->get_file_for_path) (vfs, path); 96} 97 98/** 99 * g_vfs_get_file_for_uri: 100 * @vfs: a#GVfs. 101 * @uri: a string containing a URI 102 * 103 * Gets a #GFile for @uri. 104 * 105 * This operation never fails, but the returned object 106 * might not support any I/O operation if the URI 107 * is malformed or if the URI scheme is not supported. 108 * 109 * Returns: a #GFile. 110 * Free the returned object with g_object_unref(). 111 **/ 112GFile * 113g_vfs_get_file_for_uri (GVfs *vfs, 114 const char *uri) 115{ 116 GVfsClass *class; 117 118 g_return_val_if_fail (G_IS_VFS (vfs), NULL); 119 g_return_val_if_fail (uri != NULL, NULL); 120 121 class = G_VFS_GET_CLASS (vfs); 122 123 return (* class->get_file_for_uri) (vfs, uri); 124} 125 126/** 127 * g_vfs_get_supported_uri_schemes: 128 * @vfs: a #GVfs. 129 * 130 * Gets a list of URI schemes supported by @vfs. 131 * 132 * Returns: a %NULL-terminated array of strings. 133 * The returned array belongs to GIO and must 134 * not be freed or modified. 135 **/ 136const gchar * const * 137g_vfs_get_supported_uri_schemes (GVfs *vfs) 138{ 139 GVfsClass *class; 140 141 g_return_val_if_fail (G_IS_VFS (vfs), NULL); 142 143 class = G_VFS_GET_CLASS (vfs); 144 145 return (* class->get_supported_uri_schemes) (vfs); 146} 147 148/** 149 * g_vfs_parse_name: 150 * @vfs: a #GVfs. 151 * @parse_name: a string to be parsed by the VFS module. 152 * 153 * This operation never fails, but the returned object might 154 * not support any I/O operations if the @parse_name cannot 155 * be parsed by the #GVfs module. 156 * 157 * Returns: a #GFile for the given @parse_name. 158 * Free the returned object with g_object_unref(). 159 **/ 160GFile * 161g_vfs_parse_name (GVfs *vfs, 162 const char *parse_name) 163{ 164 GVfsClass *class; 165 166 g_return_val_if_fail (G_IS_VFS (vfs), NULL); 167 g_return_val_if_fail (parse_name != NULL, NULL); 168 169 class = G_VFS_GET_CLASS (vfs); 170 171 return (* class->parse_name) (vfs, parse_name); 172} 173 174static gpointer 175get_default_vfs (gpointer arg) 176{ 177 const char *use_this; 178 GVfs *vfs; 179 GList *l; 180 GIOExtensionPoint *ep; 181 GIOExtension *extension; 182 183 184 use_this = g_getenv ("GIO_USE_VFS"); 185 186 /* Ensure vfs in modules loaded */ 187 _g_io_modules_ensure_loaded (); 188 189 ep = g_io_extension_point_lookup (G_VFS_EXTENSION_POINT_NAME); 190 191 if (use_this) 192 { 193 extension = g_io_extension_point_get_extension_by_name (ep, use_this); 194 if (extension) 195 { 196 vfs = g_object_new (g_io_extension_get_type (extension), NULL); 197 198 if (g_vfs_is_active (vfs)) 199 return vfs; 200 201 g_object_unref (vfs); 202 } 203 } 204 205 for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next) 206 { 207 extension = l->data; 208 209 vfs = g_object_new (g_io_extension_get_type (extension), NULL); 210 211 if (g_vfs_is_active (vfs)) 212 return vfs; 213 214 g_object_unref (vfs); 215 } 216 217 218 return NULL; 219} 220 221/** 222 * g_vfs_get_default: 223 * 224 * Gets the default #GVfs for the system. 225 * 226 * Returns: a #GVfs. 227 **/ 228GVfs * 229g_vfs_get_default (void) 230{ 231 static GOnce once_init = G_ONCE_INIT; 232 233 return g_once (&once_init, get_default_vfs, NULL); 234} 235 236/** 237 * g_vfs_get_local: 238 * 239 * Gets the local #GVfs for the system. 240 * 241 * Returns: a #GVfs. 242 **/ 243GVfs * 244g_vfs_get_local (void) 245{ 246 static gsize vfs = 0; 247 248 if (g_once_init_enter (&vfs)) 249 g_once_init_leave (&vfs, (gsize)_g_local_vfs_new ()); 250 251 return G_VFS (vfs); 252} 253 254#define __G_VFS_C__ 255#include "gioaliasdef.c" 256