[gvfs] afp: Use UTF-8 for volume names
- From: Ross Lagerwall <rossl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] afp: Use UTF-8 for volume names
- Date: Sat, 27 Sep 2014 08:39:35 +0000 (UTC)
commit c6200ea2184b63016fe573155b0480ba88069456
Author: Ross Lagerwall <rosslagerwall gmail com>
Date: Wed Jul 30 17:34:48 2014 +0100
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
daemon/gvfsafpconnection.c | 28 +++++++++++++++++++++++-----
daemon/gvfsafpconnection.h | 2 +-
daemon/gvfsafpserver.c | 12 ++++++------
daemon/gvfsafputils.h | 4 ++--
4 files changed, 32 insertions(+), 14 deletions(-)
---
diff --git a/daemon/gvfsafpconnection.c b/daemon/gvfsafpconnection.c
index 97d1f53..2f2958d 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 5d90cf6..1435e0d 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 2d3d33d..69e04b5 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 d520327..0672440 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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]