[gvfs] afp: Use UTF-8 for volume names



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]