diff options
author | Ross Lagerwall <rosslagerwall@gmail.com> | 2014-07-30 17:34:48 +0100 |
---|---|---|
committer | Ross Lagerwall <rosslagerwall@gmail.com> | 2014-09-27 09:37:24 +0100 |
commit | c6200ea2184b63016fe573155b0480ba88069456 (patch) | |
tree | 51a482187bacb3e1f3318ed9390190901dad7066 | |
parent | fab432937b4bfcd56c07c8be3e14335612bd42f3 (diff) | |
download | gvfs-c6200ea2184b63016fe573155b0480ba88069456.tar.gz |
afp: Use UTF-8 for volume names
Use UTF-8 for volume names since volume names are encoded as UTF-8 for
protocol versions 3.0 and higher. This prevents seeing volume names
like: "John’s Public Folder"
Since the volume name comes as a pascal string with UTF-8 encoding,
extend the function to read pascal strings with the ability to read
pascal strings encoded as UTF-8.
https://bugzilla.gnome.org/show_bug.cgi?id=733996
-rw-r--r-- | daemon/gvfsafpconnection.c | 28 | ||||
-rw-r--r-- | daemon/gvfsafpconnection.h | 2 | ||||
-rw-r--r-- | daemon/gvfsafpserver.c | 12 | ||||
-rw-r--r-- | daemon/gvfsafputils.h | 4 |
4 files changed, 32 insertions, 14 deletions
diff --git a/daemon/gvfsafpconnection.c b/daemon/gvfsafpconnection.c index 97d1f538..2f2958d7 100644 --- a/daemon/gvfsafpconnection.c +++ b/daemon/gvfsafpconnection.c @@ -275,7 +275,7 @@ g_vfs_afp_reply_dup_data (GVfsAfpReply *reply, gsize size, guint8 **data) } gboolean -g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, char **str) +g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, gboolean is_utf8, char **str) { guint8 strsize; @@ -290,12 +290,30 @@ g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, char **str) if (str) { - *str = g_convert (reply->data + reply->pos, strsize, - "UTF-8", "MACINTOSH", NULL, NULL, NULL); + if (is_utf8) + { + char *tmp; + + if (!g_vfs_afp_reply_get_data (reply, strsize, (guint8 **)&tmp)) + { + reply->pos--; + return FALSE; + } + + *str = g_utf8_normalize (tmp, strsize, G_NORMALIZE_DEFAULT_COMPOSE); + } + else + { + *str = g_convert (reply->data + reply->pos, strsize, + "UTF-8", "MACINTOSH", NULL, NULL, NULL); + reply->pos += strsize; + } + } + else + { + reply->pos += strsize; } - reply->pos += strsize; - return TRUE; } diff --git a/daemon/gvfsafpconnection.h b/daemon/gvfsafpconnection.h index 5d90cf64..1435e0df 100644 --- a/daemon/gvfsafpconnection.h +++ b/daemon/gvfsafpconnection.h @@ -254,7 +254,7 @@ gboolean g_vfs_afp_reply_read_uint16 (GVfsAfpReply *reply, guint16 gboolean g_vfs_afp_reply_get_data (GVfsAfpReply *reply, gsize size, guint8 **data); gboolean g_vfs_afp_reply_dup_data (GVfsAfpReply *reply, gsize size, guint8 **data); -gboolean g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, char **str); +gboolean g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, gboolean is_utf8, char **str); gboolean g_vfs_afp_reply_read_afp_name (GVfsAfpReply *reply, gboolean read_text_encoding, GVfsAfpName **afp_name); gboolean g_vfs_afp_reply_seek (GVfsAfpReply *reply, goffset offset, GSeekType type); diff --git a/daemon/gvfsafpserver.c b/daemon/gvfsafpserver.c index 2d3d33db..69e04b5a 100644 --- a/daemon/gvfsafpserver.c +++ b/daemon/gvfsafpserver.c @@ -760,7 +760,7 @@ get_server_info (GVfsAfpServer *server, REPLY_READ_UINT16 (reply, &priv->info.flags); - REPLY_READ_PASCAL (reply, &priv->info.server_name); + REPLY_READ_PASCAL (reply, FALSE, &priv->info.server_name); /* Parse UTF-8 ServerName */ if (priv->info.flags & (0x1 << 8)) { @@ -779,7 +779,7 @@ get_server_info (GVfsAfpServer *server, /* Parse MachineType */ REPLY_SEEK (reply, MachineType_offset, G_SEEK_SET); - REPLY_READ_PASCAL (reply, &priv->info.machine_type); + REPLY_READ_PASCAL (reply, FALSE, &priv->info.machine_type); /* Parse Versions */ REPLY_SEEK (reply, AFPVersionCount_offset, G_SEEK_SET); @@ -789,7 +789,7 @@ get_server_info (GVfsAfpServer *server, char *version; AfpVersion afp_version; - REPLY_READ_PASCAL (reply, &version); + REPLY_READ_PASCAL (reply, FALSE, &version); afp_version = string_to_afp_version (version); g_free (version); if (afp_version > priv->info.version) @@ -813,7 +813,7 @@ get_server_info (GVfsAfpServer *server, { char *uam; - REPLY_READ_PASCAL (reply, &uam); + REPLY_READ_PASCAL (reply, FALSE, &uam); priv->info.uams = g_slist_prepend (priv->info.uams, uam); } @@ -1342,7 +1342,7 @@ get_volumes_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) GVfsAfpVolumeData *volume_data; REPLY_READ_BYTE (reply, &flags); - REPLY_READ_PASCAL (reply, &vol_name); + REPLY_READ_PASCAL (reply, TRUE, &vol_name); if (!vol_name) continue; @@ -1743,7 +1743,7 @@ map_id_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) if (map_data->function == GVFS_AFP_MAP_ID_FUNCTION_USER_ID_TO_NAME || map_data->function == GVFS_AFP_MAP_ID_FUNCTION_GROUP_ID_TO_NAME) { - REPLY_READ_PASCAL (reply, &map_data->name); + REPLY_READ_PASCAL (reply, FALSE, &map_data->name); } else { diff --git a/daemon/gvfsafputils.h b/daemon/gvfsafputils.h index d520327e..06724403 100644 --- a/daemon/gvfsafputils.h +++ b/daemon/gvfsafputils.h @@ -127,9 +127,9 @@ G_STMT_START { \ goto invalid_reply; \ } G_STMT_END -#define REPLY_READ_PASCAL(reply, val) \ +#define REPLY_READ_PASCAL(reply, is_utf8, val) \ G_STMT_START { \ - if (!g_vfs_afp_reply_read_pascal (reply, val)) \ + if (!g_vfs_afp_reply_read_pascal (reply, is_utf8, val)) \ goto invalid_reply; \ } G_STMT_END |