diff options
author | Christian Kellner <gicmo@src.gnome.org> | 2008-09-24 12:46:09 +0000 |
---|---|---|
committer | Christian Kellner <gicmo@src.gnome.org> | 2008-09-24 12:46:09 +0000 |
commit | d01d71d8f36809983b174f0b7d62d20bedf33a74 (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /client/smburi.c | |
parent | 953132a87aed73507042a6279b343523741a1800 (diff) | |
download | gvfs-GVFS_1_0_1_svn2027.tar.gz |
Wrong branchGVFS_1_0_1_svn2027
svn path=/tags/GVFS_1_0_1; revision=2026
Diffstat (limited to 'client/smburi.c')
-rw-r--r-- | client/smburi.c | 297 |
1 files changed, 0 insertions, 297 deletions
diff --git a/client/smburi.c b/client/smburi.c deleted file mode 100644 index d3804cf4..00000000 --- a/client/smburi.c +++ /dev/null @@ -1,297 +0,0 @@ -/* GIO - GLib Input, Output and Streaming Library - * - * Copyright (C) 2006-2007 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Alexander Larsson <alexl@redhat.com> - */ - -#include <config.h> -#include <string.h> - -#include <gio/gio.h> -#include <gvfsurimapper.h> -#include <gvfsuriutils.h> - -typedef struct _GVfsUriMapperSmb GVfsUriMapperSmb; -typedef struct _GVfsUriMapperSmbClass GVfsUriMapperSmbClass; - -struct _GVfsUriMapperSmb -{ - GVfsUriMapper parent; -}; - -struct _GVfsUriMapperSmbClass -{ - GVfsUriMapperClass parent_class; -}; - -GType g_vfs_uri_mapper_smb_get_type (void); -void g_vfs_uri_mapper_smb_register (GIOModule *module); - -G_DEFINE_DYNAMIC_TYPE (GVfsUriMapperSmb, g_vfs_uri_mapper_smb, G_VFS_TYPE_URI_MAPPER) - -static void -g_vfs_uri_mapper_smb_init (GVfsUriMapperSmb *vfs) -{ -} - -static char * -normalize_smb_name (const char *name, gssize len) -{ - gboolean valid_utf8; - - valid_utf8 = g_utf8_validate (name, len, NULL); - - if (valid_utf8) - return g_utf8_casefold (name, len); - else - return g_ascii_strdown (name, len); -} - -static const char * const * -smb_get_handled_schemes (GVfsUriMapper *mapper) -{ - static const char *schemes[] = { - "smb", - NULL - }; - return schemes; -} - -static GVfsUriMountInfo * -smb_from_uri (GVfsUriMapper *mapper, - const char *uri_str) -{ - char *tmp; - const char *p; - const char *share, *share_end; - GDecodedUri *uri; - GVfsUriMountInfo *info; - - uri = g_vfs_decode_uri (uri_str); - if (uri == NULL) - return NULL; - - if (uri->host == NULL || strlen (uri->host) == 0) - { - /* uri form: smb:/// or smb:///$path */ - info = g_vfs_uri_mount_info_new ("smb-network"); - if (uri->path == NULL || *uri->path == 0) - info->path = g_strdup ("/"); - else - info->path = g_strdup (uri->path); - } - else - { - /* host set */ - p = uri->path; - while (p && *p == '/') - p++; - - if (p == NULL || *p == 0) - { - /* uri form: smb://$host/ */ - info = g_vfs_uri_mount_info_new ("smb-server"); - tmp = normalize_smb_name (uri->host, -1); - g_vfs_uri_mount_info_set (info, "server", tmp); - g_free (tmp); - info->path = g_strdup ("/"); - } - else - { - share = p; - share_end = strchr (share, '/'); - if (share_end == NULL) - share_end = share + strlen (share); - - p = share_end; - - while (*p == '/') - p++; - - if (*p == 0) - { - /* uri form: smb://$host/$share/ - * Here we special case smb-server files by adding "._" to the names in the uri */ - if (share[0] == '.' && share[1] == '_') - { - info = g_vfs_uri_mount_info_new ("smb-server"); - tmp = normalize_smb_name (uri->host, -1); - g_vfs_uri_mount_info_set (info, "server", tmp); - g_free (tmp); - tmp = normalize_smb_name (share + 2, share_end - (share + 2)); - info->path = g_strconcat ("/", tmp, NULL); - g_free (tmp); - } - else - { - info = g_vfs_uri_mount_info_new ("smb-share"); - tmp = normalize_smb_name (uri->host, -1); - g_vfs_uri_mount_info_set (info, "server", tmp); - g_free (tmp); - tmp = normalize_smb_name (share, share_end - share); - g_vfs_uri_mount_info_set (info, "share", tmp); - g_free (tmp); - info->path = g_strdup ("/"); - } - } - else - { - info = g_vfs_uri_mount_info_new ("smb-share"); - - tmp = normalize_smb_name (uri->host, -1); - g_vfs_uri_mount_info_set (info, "server", tmp); - g_free (tmp); - - tmp = normalize_smb_name (share, share_end - share); - g_vfs_uri_mount_info_set (info, "share", tmp); - g_free (tmp); - - info->path = g_strconcat ("/", p, NULL); - } - } - } - - if (uri->userinfo) - { - const char *user = uri->userinfo; - p = strchr (uri->userinfo, ';'); - if (p) - { - if (p != user) - g_vfs_uri_mount_info_set_with_len (info, "domain", user, p - user); - user = p + 1; - } - if (*user != 0) - g_vfs_uri_mount_info_set (info, "user", user); - } - - g_vfs_decoded_uri_free (uri); - - return info; -} - -static const char * const * -smb_get_handled_mount_types (GVfsUriMapper *mapper) -{ - static const char *types[] = { - "smb-network", - "smb-server", - "smb-share", - NULL - }; - return types; -} - -static char * -smb_to_uri (GVfsUriMapper *mapper, - GVfsUriMountInfo *info, - gboolean allow_utf8) -{ - const char *type; - const char *server; - const char *share; - const char *user; - const char *domain; - char *s; - GDecodedUri *uri; - - uri = g_new0 (GDecodedUri, 1); - - type = g_vfs_uri_mount_info_get (info, "type"); - - uri->scheme = g_strdup ("smb"); - uri->port = -1; - - if (strcmp (type, "smb-network") == 0) - { - uri->path = g_strdup (info->path); - } - else if (strcmp (type, "smb-server") == 0) - { - server = g_vfs_uri_mount_info_get (info, "server"); - uri->host = g_strdup (server); - - /* Map the mountables in server to ._share because the actual share mount maps to smb://server/share */ - if (info->path && info->path[0] == '/' && info->path[1] != 0) - uri->path = g_strconcat ("/._", info->path + 1, NULL); - else - uri->path = g_strdup ("/"); - } - else if (strcmp (type, "smb-share") == 0) - { - server = g_vfs_uri_mount_info_get (info, "server"); - uri->host = g_strdup (server); - share = g_vfs_uri_mount_info_get (info, "share"); - if (info->path[0] == '/') - uri->path = g_strconcat ("/", share, info->path, NULL); - else - uri->path = g_strconcat ("/", share, "/", info->path, NULL); - - user = g_vfs_uri_mount_info_get (info, "user"); - domain = g_vfs_uri_mount_info_get (info, "domain"); - if (user) { - if (domain) - uri->userinfo = g_strconcat (domain, ";", user, NULL); - else - uri->userinfo = g_strdup (user); - } - } - - s = g_vfs_encode_uri (uri, allow_utf8); - g_vfs_decoded_uri_free (uri); - return s; -} - -static const char * -smb_to_uri_scheme (GVfsUriMapper *mapper, - GVfsUriMountInfo *info) -{ - const gchar *type = g_vfs_uri_mount_info_get (info, "type"); - - if (strcmp ("smb-network", type) == 0 || - strcmp ("smb-server", type) == 0 || - strcmp ("smb-share", type) == 0) - return "smb"; - else - return NULL; -} - -static void -g_vfs_uri_mapper_smb_class_finalize (GVfsUriMapperSmbClass *klass) -{ -} - -static void -g_vfs_uri_mapper_smb_class_init (GVfsUriMapperSmbClass *class) -{ - GVfsUriMapperClass *mapper_class; - - mapper_class = G_VFS_URI_MAPPER_CLASS (class); - mapper_class->get_handled_schemes = smb_get_handled_schemes; - mapper_class->from_uri = smb_from_uri; - mapper_class->get_handled_mount_types = smb_get_handled_mount_types; - mapper_class->to_uri = smb_to_uri; - mapper_class->to_uri_scheme = smb_to_uri_scheme; -} - -void -g_vfs_uri_mapper_smb_register (GIOModule *module) -{ - g_vfs_uri_mapper_smb_register_type (G_TYPE_MODULE (module)); -} |