[gvfs] afp: make fields private in GVfsAfpServer



commit b355a34ca375c686f83279dfacd068607b35452a
Author: Carl-Anton Ingmarsson <ca ingmarsson gmail com>
Date:   Mon Mar 12 21:34:36 2012 +0100

    afp: make fields private in GVfsAfpServer

 daemon/gvfsafpconnection.h    |    4 +-
 daemon/gvfsafpserver.c        |  230 ++++++++++++++++++++++++++--------------
 daemon/gvfsafpserver.h        |   33 +++---
 daemon/gvfsafpvolume.c        |   55 ++++++-----
 daemon/gvfsafpvolume.h        |    2 +-
 daemon/gvfsbackendafp.c       |   11 ++-
 daemon/gvfsbackendafpbrowse.c |    9 +-
 7 files changed, 213 insertions(+), 131 deletions(-)
---
diff --git a/daemon/gvfsafpconnection.h b/daemon/gvfsafpconnection.h
index caea152..5637ed9 100644
--- a/daemon/gvfsafpconnection.h
+++ b/daemon/gvfsafpconnection.h
@@ -324,8 +324,8 @@ GType           g_vfs_afp_command_get_type (void) G_GNUC_CONST;
 #define G_VFS_TYPE_AFP_CONNECTION             (g_vfs_afp_connection_get_type ())
 #define G_VFS_AFP_CONNECTION(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_VFS_TYPE_AFP_CONNECTION, GVfsAfpConnection))
 #define G_VFS_AFP_CONNECTION_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), G_VFS_TYPE_AFP_CONNECTION, GVfsAfpConnectionClass))
-#define G_IS_VFS_AFP_CONNECTION(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_VFS_TYPE_AFP_CONNECTION))
-#define G_IS_VFS_AFP_CONNECTION_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), G_VFS_TYPE_AFP_CONNECTION))
+#define G_VFS_IS_AFP_CONNECTION(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_VFS_TYPE_AFP_CONNECTION))
+#define G_VFS_IS_AFP_CONNECTION_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), G_VFS_TYPE_AFP_CONNECTION))
 #define G_VFS_AFP_CONNECTION_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), G_VFS_TYPE_AFP_CONNECTION, GVfsAfpConnectionClass))
 
 typedef struct _GVfsAfpConnectionClass GVfsAfpConnectionClass;
diff --git a/daemon/gvfsafpserver.c b/daemon/gvfsafpserver.c
index 9631f9a..6c80eb5 100644
--- a/daemon/gvfsafpserver.c
+++ b/daemon/gvfsafpserver.c
@@ -36,6 +36,18 @@
 
 G_DEFINE_TYPE (GVfsAfpServer, g_vfs_afp_server, G_TYPE_OBJECT);
 
+struct _GvfsAfpServerPrivate
+{
+  GNetworkAddress     *addr;
+  GVfsAfpConnection   *conn;
+
+  GVfsAfpServerInfo   info;
+  gint32              time_diff;
+
+  guint32             user_id;
+  guint32             group_id;
+};
+
 #define AFP_UAM_NO_USER   "No User Authent"
 #define AFP_UAM_DHX       "DHCAST128"
 #define AFP_UAM_DHX2      "DHX2"
@@ -43,38 +55,44 @@ G_DEFINE_TYPE (GVfsAfpServer, g_vfs_afp_server, G_TYPE_OBJECT);
 GVfsAfpServer *
 g_vfs_afp_server_new (GNetworkAddress *addr)
 {
-  GVfsAfpServer *afp_serv;
+  GVfsAfpServer *server;
 
-  afp_serv = g_object_new (G_VFS_TYPE_AFP_SERVER, NULL);
+  server = g_object_new (G_VFS_TYPE_AFP_SERVER, NULL);
 
-  afp_serv->addr = addr;
+  server->priv->addr = addr;
   
-  return afp_serv;
+  return server;
 }
 
 static void
-g_vfs_afp_server_init (GVfsAfpServer *afp_serv)
+g_vfs_afp_server_init (GVfsAfpServer *server)
 {
-  afp_serv->machine_type = NULL;
-  afp_serv->server_name = NULL;
-  afp_serv->utf8_server_name = NULL;
-  afp_serv->uams = NULL;
-  afp_serv->version = AFP_VERSION_INVALID;
+  GVfsAfpServerPrivate *priv;
+  
+  server->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (server, G_VFS_TYPE_AFP_SERVER,
+                                                     GVfsAfpServerPrivate);
+  
+  priv->info.machine_type = NULL;
+  priv->info.server_name = NULL;
+  priv->info.utf8_server_name = NULL;
+  priv->info.uams = NULL;
+  priv->info.version = AFP_VERSION_INVALID;
 }
 
 static void
 g_vfs_afp_server_finalize (GObject *object)
 {
-  GVfsAfpServer *afp_serv = G_VFS_AFP_SERVER (object);
+  GVfsAfpServer *server = G_VFS_AFP_SERVER (object);
+  GVfsAfpServerPrivate *priv = server->priv;
 
-  g_clear_object (&afp_serv->addr);
-  g_clear_object (&afp_serv->conn);
+  g_clear_object (&priv->addr);
+  g_clear_object (&priv->conn);
   
-  g_free (afp_serv->machine_type);
-  g_free (afp_serv->server_name);
-  g_free (afp_serv->utf8_server_name);
+  g_free (priv->info.machine_type);
+  g_free (priv->info.server_name);
+  g_free (priv->info.utf8_server_name);
   
-  g_slist_free_full (afp_serv->uams, g_free);
+  g_slist_free_full (priv->info.uams, g_free);
 
   G_OBJECT_CLASS (g_vfs_afp_server_parent_class)->finalize (object);
 }
@@ -85,6 +103,8 @@ g_vfs_afp_server_class_init (GVfsAfpServerClass *klass)
   GObjectClass* object_class = G_OBJECT_CLASS (klass);
 
   object_class->finalize = g_vfs_afp_server_finalize;
+
+  g_type_class_add_private (klass, sizeof (GVfsAfpServerPrivate));
 }
 
 static const char *
@@ -113,12 +133,14 @@ string_to_afp_version (const char *str)
 
 #ifdef HAVE_GCRYPT
 static gboolean
-dhx2_login (GVfsAfpServer *afp_serv,
+dhx2_login (GVfsAfpServer *server,
             const char *username,
             const char *password,
             GCancellable *cancellable,
             GError **error)
 {
+  GVfsAfpServerPrivate *priv = server->priv;
+  
   gboolean res;
   gcry_error_t gcry_err;
   GVfsAfpCommand *comm;
@@ -177,12 +199,12 @@ dhx2_login (GVfsAfpServer *afp_serv,
 
   /* Request 1 */
   comm = g_vfs_afp_command_new (AFP_COMMAND_LOGIN);
-  g_vfs_afp_command_put_pascal (comm, afp_version_to_string (afp_serv->version));
+  g_vfs_afp_command_put_pascal (comm, afp_version_to_string (priv->info.version));
   g_vfs_afp_command_put_pascal (comm, AFP_UAM_DHX2);
   g_vfs_afp_command_put_pascal (comm, username);
   g_vfs_afp_command_pad_to_even (comm);
 
-  reply = g_vfs_afp_connection_send_command_sync (afp_serv->conn, comm,
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm,
                                                   cancellable, error);
   g_object_unref (comm);
   if (!reply)
@@ -286,7 +308,7 @@ dhx2_login (GVfsAfpServer *afp_serv,
   /* clientNonce */
   g_output_stream_write_all (G_OUTPUT_STREAM (comm), clientNonce_buf, 16, NULL, NULL, NULL);
 
-  reply = g_vfs_afp_connection_send_command_sync (afp_serv->conn, comm,
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm,
                                                 cancellable, error);
   g_object_unref (comm);
   if (!reply)
@@ -351,7 +373,7 @@ dhx2_login (GVfsAfpServer *afp_serv,
                              G_N_ELEMENTS (answer_buf), NULL, NULL, NULL);
 
 
-  reply = g_vfs_afp_connection_send_command_sync (afp_serv->conn, comm,
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm,
                                                   cancellable, error);
   g_object_unref (comm);
   if (!reply)
@@ -365,7 +387,7 @@ dhx2_login (GVfsAfpServer *afp_serv,
     {
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
                    _("AFP server %s declined the submitted password"),
-                   afp_serv->server_name);
+                   priv->info.server_name);
       goto error;
     }
     else
@@ -399,12 +421,14 @@ generic_error:
 }
 
 static gboolean
-dhx_login (GVfsAfpServer *afp_serv,
+dhx_login (GVfsAfpServer *server,
            const char *username,
            const char *password,
            GCancellable *cancellable,
            GError **error)
 {
+  GVfsAfpServerPrivate *priv = server->priv;
+  
   gcry_error_t gcry_err;
   gcry_mpi_t prime, base;
   gcry_mpi_t ra;
@@ -474,14 +498,14 @@ dhx_login (GVfsAfpServer *afp_serv,
 
   /* Create login command */
   comm = g_vfs_afp_command_new (AFP_COMMAND_LOGIN);
-  g_vfs_afp_command_put_pascal (comm, afp_version_to_string (afp_serv->version));
+  g_vfs_afp_command_put_pascal (comm, afp_version_to_string (priv->info.version));
   g_vfs_afp_command_put_pascal (comm, AFP_UAM_DHX);
   g_vfs_afp_command_put_pascal (comm, username);
   g_vfs_afp_command_pad_to_even (comm);
   g_output_stream_write_all (G_OUTPUT_STREAM(comm), ma_buf, G_N_ELEMENTS (ma_buf),
                              NULL, NULL, NULL);
 
-  reply = g_vfs_afp_connection_send_command_sync (afp_serv->conn, comm,
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm,
                                                   cancellable, error);
   g_object_unref (comm);
   if (!reply)
@@ -571,7 +595,7 @@ dhx_login (GVfsAfpServer *afp_serv,
                              G_N_ELEMENTS (answer_buf), NULL, NULL, NULL);
 
 
-  reply = g_vfs_afp_connection_send_command_sync (afp_serv->conn, comm,
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm,
                                                   cancellable, error);
   g_object_unref (comm);
   if (!reply)
@@ -585,7 +609,7 @@ dhx_login (GVfsAfpServer *afp_serv,
     {
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
                    _("AFP server %s declined the submitted password"),
-                   afp_serv->server_name);
+                   priv->info.server_name);
       goto error;
     }
     else
@@ -612,13 +636,15 @@ generic_error:
 #endif
 
 static gboolean
-do_login (GVfsAfpServer *afp_serv,
+do_login (GVfsAfpServer *server,
           const char *username,
           const char *password,
           gboolean anonymous,
           GCancellable *cancellable,
           GError **error)
 {
+  GVfsAfpServerPrivate *priv = server->priv;
+  
   /* anonymous login */
   if (anonymous)
   {
@@ -626,19 +652,19 @@ do_login (GVfsAfpServer *afp_serv,
     GVfsAfpReply *reply;
     AfpResultCode res_code;
     
-    if (!g_slist_find_custom (afp_serv->uams, AFP_UAM_NO_USER, (GCompareFunc)g_strcmp0))
+    if (!g_slist_find_custom (priv->info.uams, AFP_UAM_NO_USER, (GCompareFunc)g_strcmp0))
     {
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
                            _("AFP server %s doesn't support anonymous login"),
-                   afp_serv->server_name);
+                   priv->info.server_name);
       return FALSE;
     }
 
     comm = g_vfs_afp_command_new (AFP_COMMAND_LOGIN);
 
-    g_vfs_afp_command_put_pascal (comm, afp_version_to_string (afp_serv->version));
+    g_vfs_afp_command_put_pascal (comm, afp_version_to_string (priv->info.version));
     g_vfs_afp_command_put_pascal (comm, AFP_UAM_NO_USER);
-    reply = g_vfs_afp_connection_send_command_sync (afp_serv->conn, comm,
+    reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm,
                                                     cancellable, error);
     g_object_unref (comm);
     if (!reply)
@@ -655,7 +681,7 @@ do_login (GVfsAfpServer *afp_serv,
         case AFP_RESULT_BAD_UAM:
           g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
                        _("AFP server %s doesn't support anonymous login"),
-                       afp_serv->server_name);
+                       priv->info.server_name);
           break;
           
         default:
@@ -673,26 +699,28 @@ do_login (GVfsAfpServer *afp_serv,
 
 #ifdef HAVE_GCRYPT
     /* Diffie-Hellman 2 */
-    if (g_slist_find_custom (afp_serv->uams, AFP_UAM_DHX2, (GCompareFunc)g_strcmp0))
-      return dhx2_login (afp_serv, username, password, cancellable, error);
+    if (g_slist_find_custom (priv->info.uams, AFP_UAM_DHX2, (GCompareFunc)g_strcmp0))
+      return dhx2_login (server, username, password, cancellable, error);
     
     /* Diffie-Hellman */
-    if (g_slist_find_custom (afp_serv->uams, AFP_UAM_DHX, (GCompareFunc)g_strcmp0))
-      return dhx_login (afp_serv, username, password, cancellable, error); 
+    if (g_slist_find_custom (priv->info.uams, AFP_UAM_DHX, (GCompareFunc)g_strcmp0))
+      return dhx_login (server, username, password, cancellable, error); 
 #endif
 
     g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                  _("Login to AFP server %s failed (no suitable authentication mechanism found)"),
-                 afp_serv->server_name);
+                 priv->info.server_name);
     return FALSE;
   }
 }
 
 static gboolean
-get_server_info (GVfsAfpServer *afp_serv,
+get_server_info (GVfsAfpServer *server,
                  GCancellable *cancellable,
                  GError **error)
 {
+  GVfsAfpServerPrivate *priv = server->priv;
+  
   GVfsAfpReply *reply;
 
   guint16 MachineType_offset, AFPVersionCount_offset, UAMCount_offset;
@@ -700,7 +728,7 @@ get_server_info (GVfsAfpServer *afp_serv,
   guint8 count;
   guint i;
 
-  reply = g_vfs_afp_query_server_info (G_SOCKET_CONNECTABLE (afp_serv->addr),
+  reply = g_vfs_afp_query_server_info (G_SOCKET_CONNECTABLE (priv->addr),
                                        cancellable, error);
   if (!reply)
     return FALSE;
@@ -711,12 +739,12 @@ get_server_info (GVfsAfpServer *afp_serv,
   /* VolumeIconAndMask_offset */
   g_vfs_afp_reply_read_uint16 (reply, NULL);
 
-  g_vfs_afp_reply_read_uint16 (reply, &afp_serv->flags);
+  g_vfs_afp_reply_read_uint16 (reply, &priv->info.flags);
 
-  g_vfs_afp_reply_read_pascal (reply, &afp_serv->server_name);
+  g_vfs_afp_reply_read_pascal (reply, &priv->info.server_name);
 
   /* Parse UTF-8 ServerName */
-  if (afp_serv->flags & (0x1 << 8)) {
+  if (priv->info.flags & (0x1 << 8)) {
     guint16 UTF8ServerName_offset;
     GVfsAfpName *utf8_server_name;
 
@@ -726,13 +754,13 @@ get_server_info (GVfsAfpServer *afp_serv,
 
     g_vfs_afp_reply_seek (reply, UTF8ServerName_offset, G_SEEK_SET);
     g_vfs_afp_reply_read_afp_name (reply, FALSE, &utf8_server_name);
-    afp_serv->utf8_server_name = g_vfs_afp_name_get_string (utf8_server_name);
+    priv->info.utf8_server_name = g_vfs_afp_name_get_string (utf8_server_name);
     g_vfs_afp_name_unref (utf8_server_name);
   }
     
   /* Parse MachineType */
   g_vfs_afp_reply_seek (reply, MachineType_offset, G_SEEK_SET);
-  g_vfs_afp_reply_read_pascal (reply, &afp_serv->machine_type);
+  g_vfs_afp_reply_read_pascal (reply, &priv->info.machine_type);
   
   /* Parse Versions */
   g_vfs_afp_reply_seek (reply, AFPVersionCount_offset, G_SEEK_SET);
@@ -744,11 +772,11 @@ get_server_info (GVfsAfpServer *afp_serv,
 
     g_vfs_afp_reply_read_pascal (reply, &version);
     afp_version = string_to_afp_version (version);
-    if (afp_version > afp_serv->version)
-      afp_serv->version = afp_version;
+    if (afp_version > priv->info.version)
+      priv->info.version = afp_version;
   }
 
-  if (afp_serv->version == AFP_VERSION_INVALID)
+  if (priv->info.version == AFP_VERSION_INVALID)
   {
     g_object_unref (reply);
     g_set_error (error,
@@ -765,7 +793,7 @@ get_server_info (GVfsAfpServer *afp_serv,
     char *uam;
 
     g_vfs_afp_reply_read_pascal (reply, &uam);
-    afp_serv->uams = g_slist_prepend (afp_serv->uams, uam);
+    priv->info.uams = g_slist_prepend (priv->info.uams, uam);
   }
 
   g_object_unref (reply);
@@ -778,6 +806,8 @@ get_server_parms (GVfsAfpServer *server,
                   GCancellable  *cancellable,
                   GError       **error)
 {
+  GVfsAfpServerPrivate *priv = server->priv;
+  
   GVfsAfpCommand *comm;
   GVfsAfpReply   *reply;
   AfpResultCode   res_code;
@@ -788,7 +818,7 @@ get_server_parms (GVfsAfpServer *server,
   /* pad byte */
   g_vfs_afp_command_put_byte (comm, 0);
 
-  reply = g_vfs_afp_connection_send_command_sync (server->conn, comm, cancellable,
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm, cancellable,
                                                   error);
   g_object_unref (comm);
   if (!reply)
@@ -805,7 +835,7 @@ get_server_parms (GVfsAfpServer *server,
 
   /* server time */
   g_vfs_afp_reply_read_int32 (reply, &server_time);
-  server->time_diff = (g_get_real_time () / G_USEC_PER_SEC) - server_time;
+  priv->time_diff = (g_get_real_time () / G_USEC_PER_SEC) - server_time;
 
   g_object_unref (reply);
 
@@ -817,6 +847,8 @@ get_userinfo (GVfsAfpServer *server,
               GCancellable  *cancellable,
               GError       **error)
 {
+  GVfsAfpServerPrivate *priv = server->priv;
+  
   GVfsAfpCommand *comm;
   guint16 bitmap;
 
@@ -832,8 +864,8 @@ get_userinfo (GVfsAfpServer *server,
   bitmap = AFP_GET_USER_INFO_BITMAP_GET_UID_BIT | AFP_GET_USER_INFO_BITMAP_GET_GID_BIT;
   g_vfs_afp_command_put_uint16 (comm, bitmap);
 
-  reply = g_vfs_afp_connection_send_command_sync (server->conn,
-                                                comm, cancellable, error);
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm, cancellable,
+                                                  error);
   g_object_unref (comm);
   if (!reply)
     return FALSE;
@@ -873,9 +905,9 @@ get_userinfo (GVfsAfpServer *server,
   /* Bitmap */
   g_vfs_afp_reply_read_uint16 (reply, NULL);
   /* UID */
-  g_vfs_afp_reply_read_uint32 (reply, &server->user_id);
+  g_vfs_afp_reply_read_uint32 (reply, &priv->user_id);
   /* GID */
-  g_vfs_afp_reply_read_uint32 (reply, &server->group_id);
+  g_vfs_afp_reply_read_uint32 (reply, &priv->group_id);
 
   g_object_unref (reply);
   
@@ -890,6 +922,8 @@ g_vfs_afp_server_login (GVfsAfpServer *server,
                         GCancellable   *cancellable,
                         GError         **error)
 {
+  GVfsAfpServerPrivate *priv = server->priv;
+  
   gboolean res;
   char *user, *olduser;
   char *password;
@@ -908,7 +942,7 @@ g_vfs_afp_server_login (GVfsAfpServer *server,
   if (initial_user)
   {
     if (g_str_equal (initial_user, "anonymous") &&
-        g_slist_find_custom (server->uams, AFP_UAM_NO_USER, (GCompareFunc)g_strcmp0))
+        g_slist_find_custom (priv->info.uams, AFP_UAM_NO_USER, (GCompareFunc)g_strcmp0))
     {
       user = NULL;
       password = NULL;
@@ -917,12 +951,12 @@ g_vfs_afp_server_login (GVfsAfpServer *server,
     }
 
     else if (g_vfs_keyring_lookup_password (initial_user,
-                                            g_network_address_get_hostname (server->addr),
+                                            g_network_address_get_hostname (priv->addr),
                                             NULL,
                                             "afp",
                                             NULL,
                                             NULL,
-                                            g_network_address_get_port (server->addr),
+                                            g_network_address_get_port (priv->addr),
                                             &user,
                                             NULL,
                                             &password) &&
@@ -935,7 +969,7 @@ g_vfs_afp_server_login (GVfsAfpServer *server,
   }
 
   /* Use utf8_server_name if it exists */
-  server_name = server->utf8_server_name ? server->utf8_server_name : server->server_name;
+  server_name = priv->info.utf8_server_name ? priv->info.utf8_server_name : priv->info.server_name;
   
   while (TRUE)
   {
@@ -969,7 +1003,7 @@ g_vfs_afp_server_login (GVfsAfpServer *server,
     {
       flags |= G_ASK_PASSWORD_NEED_USERNAME;
       
-      if (g_slist_find_custom (server->uams, AFP_UAM_NO_USER, (GCompareFunc)g_strcmp0))
+      if (g_slist_find_custom (priv->info.uams, AFP_UAM_NO_USER, (GCompareFunc)g_strcmp0))
         flags |= G_ASK_PASSWORD_ANONYMOUS_SUPPORTED;
     }
 
@@ -1002,8 +1036,8 @@ g_vfs_afp_server_login (GVfsAfpServer *server,
 try_login:
 
     /* Open connection */
-    server->conn = g_vfs_afp_connection_new (G_SOCKET_CONNECTABLE (server->addr));
-    res = g_vfs_afp_connection_open_sync (server->conn, cancellable, &err);
+    priv->conn = g_vfs_afp_connection_new (G_SOCKET_CONNECTABLE (priv->addr));
+    res = g_vfs_afp_connection_open_sync (priv->conn, cancellable, &err);
     if (!res)
       break;
 
@@ -1011,8 +1045,8 @@ try_login:
                     cancellable, &err);
     if (!res)
     {
-      g_vfs_afp_connection_close_sync (server->conn, cancellable, NULL);
-      g_clear_object (&server->conn);
+      g_vfs_afp_connection_close_sync (priv->conn, cancellable, NULL);
+      g_clear_object (&priv->conn);
 
       if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED))
         break;
@@ -1043,12 +1077,12 @@ try_login:
   {
     /* a prompt was created, so we have to save the password */
     g_vfs_keyring_save_password (user,
-                                 g_network_address_get_hostname (server->addr),
+                                 g_network_address_get_hostname (priv->addr),
                                  NULL,
                                  "afp",
                                  NULL,
                                  NULL,
-                                 g_network_address_get_port (server->addr),
+                                 g_network_address_get_port (priv->addr),
                                  password,
                                  password_save);
     g_free (prompt);
@@ -1085,33 +1119,65 @@ g_vfs_afp_server_logout_sync (GVfsAfpServer *server,
                               GCancellable  *cancellable,
                               GError       **error)
 {
+  GVfsAfpServerPrivate *priv;
   GVfsAfpCommand *comm;
   GVfsAfpReply *reply;
   gint32 res_code;
+  gboolean res = FALSE;
 
+  g_return_val_if_fail (G_VFS_IS_AFP_SERVER (server), FALSE);
+
+  priv = server->priv;
+  
   comm = g_vfs_afp_command_new (AFP_COMMAND_LOGOUT);
   /* pad byte */
   g_vfs_afp_command_put_byte (comm, 0);
 
-  reply = g_vfs_afp_connection_send_command_sync (server->conn, comm, cancellable, error);
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm, cancellable, error);
   if (!reply) {
-    g_vfs_afp_connection_close_sync (server->conn, cancellable, NULL);
-    return FALSE;
+    g_vfs_afp_connection_close_sync (priv->conn, cancellable, NULL);
+    goto done;
   }
 
   res_code = g_vfs_afp_reply_get_result_code (reply);
   g_object_unref (reply);
   if (res_code != AFP_RESULT_NO_ERROR) {
     g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Failed to logout from server"));
-    g_vfs_afp_connection_close_sync (server->conn, cancellable, NULL);
-    return FALSE;
+    g_vfs_afp_connection_close_sync (priv->conn, cancellable, NULL);
+    goto done;
   }
 
-  return g_vfs_afp_connection_close_sync (server->conn, cancellable, error);
+  res = g_vfs_afp_connection_close_sync (priv->conn, cancellable, error);
+
+done:
+  g_clear_object (&priv->conn);
+  return res; 
 }
-          
+
+/*
+ * g_vfs_afp_server_get_info:
+ * 
+ * @server: a #GVfsAfpServer
+ * 
+ * Returns: a #GVfsAfpServerInfo or %NULL if the server is not logged in.
+ */
+const GVfsAfpServerInfo *
+g_vfs_afp_server_get_info (GVfsAfpServer *server)
+{
+  GVfsAfpServerPrivate *priv;
+  
+  g_return_val_if_fail (G_VFS_IS_AFP_SERVER (server), FALSE);
+
+  priv = server->priv;
+
+  if (!priv->conn)
+    return NULL;
+
+  return &priv->info;
+}
+
 /*
- * g_vfs_server_time_to_local_time:
+ * g_vfs_afp_server_time_to_local_time:
  * 
  * @server: a #GVfsAfpServer
  * @server_time: a time value in server time
@@ -1121,8 +1187,10 @@ g_vfs_afp_server_logout_sync (GVfsAfpServer *server,
 gint64
 g_vfs_afp_server_time_to_local_time (GVfsAfpServer *server,
                                      gint32         server_time)
-{
-  return server_time + server->time_diff;
+{  
+  g_return_val_if_fail (G_VFS_IS_AFP_SERVER (server), 0);
+
+  return server_time + server->priv->time_diff;
 }
 
 
@@ -1225,7 +1293,7 @@ g_vfs_afp_server_get_volumes (GVfsAfpServer       *server,
   simple = g_simple_async_result_new (G_OBJECT (server), callback, user_data,
                                       g_vfs_afp_server_get_volumes);
   
-  g_vfs_afp_connection_send_command (server->conn, comm, NULL, get_volumes_cb,
+  g_vfs_afp_connection_send_command (server->priv->conn, comm, NULL, get_volumes_cb,
                                      cancellable, simple);
 }
 
@@ -1271,7 +1339,7 @@ g_vfs_afp_server_mount_volume_sync (GVfsAfpServer *server,
 {
   GVfsAfpVolume *volume;
 
-  volume = g_vfs_afp_volume_new (server);
+  volume = g_vfs_afp_volume_new (server, server->priv->conn);
   if (!g_vfs_afp_volume_mount_sync (volume, volume_name, cancellable, error))
   {
     g_object_unref (volume);
@@ -1483,9 +1551,9 @@ g_vfs_afp_server_fill_info (GVfsAfpServer *server,
     g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_AFP_UA_PERMISSIONS,
                                       ua_permissions);
     
-    if (uid == server->user_id)
+    if (uid == server->priv->user_id)
       set_access_attributes_trusted (info, (permissions >> 6) & 0x7);
-    else if (gid == server->group_id)
+    else if (gid == server->priv->group_id)
       set_access_attributes (info, (permissions >> 3) & 0x7);
     else
       set_access_attributes (info, (permissions >> 0) & 0x7);
diff --git a/daemon/gvfsafpserver.h b/daemon/gvfsafpserver.h
index d528850..f2c2235 100644
--- a/daemon/gvfsafpserver.h
+++ b/daemon/gvfsafpserver.h
@@ -40,6 +40,16 @@ typedef enum
   AFP_VERSION_3_3
 } AfpVersion;
 
+typedef struct
+{
+  guint16             flags;
+  char                *machine_type;
+  char                *server_name;
+  char                *utf8_server_name;
+  GSList              *uams;
+  AfpVersion          version;
+} GVfsAfpServerInfo;
+
 #define G_VFS_TYPE_AFP_SERVER             (g_vfs_afp_server_get_type ())
 #define G_VFS_AFP_SERVER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_VFS_TYPE_AFP_SERVER, GVfsAfpServer))
 #define G_VFS_AFP_SERVER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), G_VFS_TYPE_AFP_SERVER, GVfsAfpServerClass))
@@ -48,6 +58,7 @@ typedef enum
 #define G_VFS_AFP_SERVER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), G_VFS_TYPE_AFP_SERVER, GVfsAfpServerClass))
 
 typedef struct _GVfsAfpServerClass GVfsAfpServerClass;
+typedef struct _GvfsAfpServerPrivate GVfsAfpServerPrivate;
 
 struct _GVfsAfpServerClass
 {
@@ -58,27 +69,14 @@ struct _GVfsAfpServer
 {
   GObject parent_instance;
 
-  GNetworkAddress     *addr;
-  GVfsAfpConnection   *conn;
-
-  guint16             flags;
-  char                *machine_type;
-  char                *server_name;
-  char                *utf8_server_name;
-  GSList              *uams;
-  AfpVersion          version;
-
-  gint32              time_diff;
-
-  guint32             user_id;
-  guint32             group_id;
+  GVfsAfpServerPrivate *priv;
 };
 
 GType              g_vfs_afp_server_get_type             (void) G_GNUC_CONST;
 
 GVfsAfpServer*     g_vfs_afp_server_new                  (GNetworkAddress *addr);
 
-gboolean           g_vfs_afp_server_login                (GVfsAfpServer *afp_serv,
+gboolean           g_vfs_afp_server_login                (GVfsAfpServer *server,
                                                           const char     *initial_user,
                                                           GMountSource   *mount_source,
                                                           char           **logged_in_user,
@@ -89,9 +87,12 @@ gboolean           g_vfs_afp_server_logout_sync          (GVfsAfpServer *server,
                                                           GCancellable  *cancellable,
                                                           GError       **error);
 
-gint64             g_vfs_afp_server_time_to_local_time   (GVfsAfpServer *afp_serv,
+gint64             g_vfs_afp_server_time_to_local_time   (GVfsAfpServer *server,
                                                           gint32         server_time);
 
+const
+GVfsAfpServerInfo* g_vfs_afp_server_get_info             (GVfsAfpServer *server);
+
 typedef struct _GVfsAfpVolumeData GVfsAfpVolumeData;
 struct _GVfsAfpVolumeData
 {
diff --git a/daemon/gvfsafpvolume.c b/daemon/gvfsafpvolume.c
index 4329aaf..2e5e7c1 100644
--- a/daemon/gvfsafpvolume.c
+++ b/daemon/gvfsafpvolume.c
@@ -33,6 +33,7 @@ G_DEFINE_TYPE (GVfsAfpVolume, g_vfs_afp_volume, G_TYPE_OBJECT);
 struct _GVfsAfpVolumePrivate
 {
   GVfsAfpServer *server;
+  GVfsAfpConnection *conn;
   gboolean mounted;
 
   guint16 attributes;
@@ -68,17 +69,19 @@ g_vfs_afp_volume_class_init (GVfsAfpVolumeClass *klass)
 }
 
 GVfsAfpVolume *
-g_vfs_afp_volume_new (GVfsAfpServer *server)
+g_vfs_afp_volume_new (GVfsAfpServer *server, GVfsAfpConnection *conn)
 {
   GVfsAfpVolume *volume;
   GVfsAfpVolumePrivate *priv;
 
   g_return_val_if_fail (G_VFS_IS_AFP_SERVER (server), NULL);
+  g_return_val_if_fail (G_VFS_IS_AFP_CONNECTION (conn), NULL);
   
   volume = g_object_new (G_VFS_TYPE_AFP_VOLUME, NULL);
   priv = volume->priv;
 
   priv->server = server;
+  priv->conn = conn;
 
   return volume;
 }
@@ -111,7 +114,7 @@ g_vfs_afp_volume_mount_sync (GVfsAfpVolume *volume,
 
   /* TODO: password? */
 
-  reply = g_vfs_afp_connection_send_command_sync (priv->server->conn, comm, cancellable,
+  reply = g_vfs_afp_connection_send_command_sync (priv->conn, comm, cancellable,
                                                   error);
   g_object_unref (comm);
   if (!reply)
@@ -140,7 +143,7 @@ generic_error:
   /* Translators: first %s is volumename and second servername */ 
   g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                _("Couldn't mount AFP volume %s on %s"), volume_name,
-               priv->server->server_name);
+               g_vfs_afp_server_get_info(priv->server)->server_name);
   return FALSE;
 }
 
@@ -297,7 +300,7 @@ g_vfs_afp_volume_get_parms (GVfsAfpVolume       *volume,
                                       g_vfs_afp_volume_get_parms);
                                       
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL, get_vol_parms_cb,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL, get_vol_parms_cb,
                                      cancellable, simple);
   g_object_unref (comm);
 }
@@ -481,7 +484,7 @@ g_vfs_afp_volume_open_fork (GVfsAfpVolume      *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback,
                                       user_data, g_vfs_afp_volume_open_fork);
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      open_fork_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -593,7 +596,7 @@ g_vfs_afp_volume_close_fork (GVfsAfpVolume       *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback, user_data,
                                       g_vfs_afp_volume_close_fork);
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      close_fork_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -729,7 +732,7 @@ g_vfs_afp_volume_delete (GVfsAfpVolume       *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback,
                                       user_data, g_vfs_afp_volume_delete);
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      delete_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -883,7 +886,7 @@ create_file_get_filedir_parms_cb (GObject *source_object, GAsyncResult *res, gpo
   g_vfs_afp_command_put_pathname (comm, basename);
   g_free (basename);
 
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      create_file_cb, cfd->cancellable, simple);
   g_object_unref (comm);
 }
@@ -1071,7 +1074,7 @@ create_directory_get_filedir_parms_cb (GObject *source_object, GAsyncResult *res
   /* Pathname */
   g_vfs_afp_command_put_pathname (comm, cdd->basename);
   
-  g_vfs_afp_connection_send_command (volume->priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (volume->priv->conn, comm, NULL,
                                      make_directory_cb, cdd->cancellable, simple);
   g_object_unref (comm);
   return;
@@ -1281,7 +1284,7 @@ rename_get_filedir_parms_cb (GObject      *source_object,
   /* NewName */
   g_vfs_afp_command_put_pathname (comm, rd->new_name);
 
-  g_vfs_afp_connection_send_command (volume->priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (volume->priv->conn, comm, NULL,
                                      rename_cb, rd->cancellable, simple);
   g_object_unref (comm);
 }
@@ -1480,7 +1483,7 @@ g_vfs_afp_volume_move_and_rename (GVfsAfpVolume      *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback,
                                       user_data, g_vfs_afp_volume_move_and_rename);
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      move_and_rename_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -1640,7 +1643,7 @@ g_vfs_afp_volume_copy_file (GVfsAfpVolume      *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback,
                                       user_data, g_vfs_afp_volume_copy_file);
 
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      copy_file_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -1805,7 +1808,7 @@ g_vfs_afp_volume_map_id (GVfsAfpVolume       *volume,
   g_simple_async_result_set_op_res_gpointer (simple, map_data,
                                              (GDestroyNotify)map_id_data_free);
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      map_id_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -1965,7 +1968,7 @@ g_vfs_afp_volume_get_filedir_parms (GVfsAfpVolume       *volume,
                                       g_vfs_afp_volume_get_filedir_parms);
                                       
 
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      get_filedir_parms_cb, cancellable,
                                      simple);
   g_object_unref (comm);
@@ -2090,7 +2093,7 @@ g_vfs_afp_volume_get_fork_parms (GVfsAfpVolume       *volume,
                                       g_vfs_afp_volume_get_fork_parms);
                                       
 
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      get_fork_parms_cb, cancellable,
                                      simple);
   g_object_unref (comm);
@@ -2218,7 +2221,7 @@ g_vfs_afp_volume_set_fork_size (GVfsAfpVolume       *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback, user_data,
                                       g_vfs_afp_volume_set_fork_size);
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      set_fork_parms_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -2364,7 +2367,7 @@ g_vfs_afp_volume_set_unix_privs (GVfsAfpVolume       *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback,
                                       user_data, g_vfs_afp_volume_set_unix_privs);
 
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      set_unix_privs_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -2523,6 +2526,8 @@ g_vfs_afp_volume_enumerate (GVfsAfpVolume       *volume,
                             gpointer             user_data)
 {
   GVfsAfpVolumePrivate *priv;
+
+  const GVfsAfpServerInfo *info;
   gint32 max;
   
   GVfsAfpCommand *comm;
@@ -2534,8 +2539,10 @@ g_vfs_afp_volume_enumerate (GVfsAfpVolume       *volume,
 
   simple = g_simple_async_result_new (G_OBJECT (volume), callback,
                                       user_data, g_vfs_afp_volume_enumerate);
+
+  info = g_vfs_afp_server_get_info (priv->server);
   
-  max = (priv->server->version >= AFP_VERSION_3_1) ? G_MAXINT32 : G_MAXINT16;
+  max = (info->version >= AFP_VERSION_3_1) ? G_MAXINT32 : G_MAXINT16;
   /* Can't enumerate any more files */
   if (start_index > max)
   {
@@ -2544,7 +2551,7 @@ g_vfs_afp_volume_enumerate (GVfsAfpVolume       *volume,
     return;
   }
   
-  if (priv->server->version >= AFP_VERSION_3_1)
+  if (info->version >= AFP_VERSION_3_1)
     comm = g_vfs_afp_command_new (AFP_COMMAND_ENUMERATE_EXT2);
   else
     comm = g_vfs_afp_command_new (AFP_COMMAND_ENUMERATE_EXT);
@@ -2568,7 +2575,7 @@ g_vfs_afp_volume_enumerate (GVfsAfpVolume       *volume,
 
   
   /* StartIndex and MaxReplySize */
-  if (priv->server->version >= AFP_VERSION_3_1)
+  if (info->version >= AFP_VERSION_3_1)
   {
     g_vfs_afp_command_put_int32 (comm, start_index);
     g_vfs_afp_command_put_int32 (comm, ENUMERATE_EXT2_MAX_REPLY_SIZE);
@@ -2582,7 +2589,7 @@ g_vfs_afp_volume_enumerate (GVfsAfpVolume       *volume,
   /* Pathname */
   g_vfs_afp_command_put_pathname (comm, directory);
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      enumerate_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -2722,7 +2729,7 @@ g_vfs_afp_volume_exchange_files (GVfsAfpVolume       *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback, user_data,
                                       g_vfs_afp_volume_exchange_files);
   
-  g_vfs_afp_connection_send_command (priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (priv->conn, comm, NULL,
                                      close_replace_exchange_files_cb,
                                      cancellable, simple);
   g_object_unref (comm); 
@@ -2859,7 +2866,7 @@ g_vfs_afp_volume_write_to_fork (GVfsAfpVolume       *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback, user_data,
                                       g_vfs_afp_volume_write_to_fork);
   
-  g_vfs_afp_connection_send_command (volume->priv->server->conn, comm, NULL,
+  g_vfs_afp_connection_send_command (volume->priv->conn, comm, NULL,
                                      write_ext_cb, cancellable, simple);
   g_object_unref (comm);
 }
@@ -2989,7 +2996,7 @@ g_vfs_afp_volume_read_from_fork (GVfsAfpVolume       *volume,
   simple = g_simple_async_result_new (G_OBJECT (volume), callback, user_data,
                                       g_vfs_afp_volume_read_from_fork);
   
-  g_vfs_afp_connection_send_command (volume->priv->server->conn, comm, buffer,
+  g_vfs_afp_connection_send_command (volume->priv->conn, comm, buffer,
                                      read_ext_cb, cancellable, simple);
   g_object_unref (comm);
 }
diff --git a/daemon/gvfsafpvolume.h b/daemon/gvfsafpvolume.h
index 209ad74..86eefa1 100644
--- a/daemon/gvfsafpvolume.h
+++ b/daemon/gvfsafpvolume.h
@@ -54,7 +54,7 @@ struct _GVfsAfpVolume
 
 GType g_vfs_afp_volume_get_type (void) G_GNUC_CONST;
 
-GVfsAfpVolume *g_vfs_afp_volume_new                 (GVfsAfpServer *server);
+GVfsAfpVolume *g_vfs_afp_volume_new                 (GVfsAfpServer *server, GVfsAfpConnection *conn);
 
 gboolean       g_vfs_afp_volume_mount_sync          (GVfsAfpVolume *volume,
                                                      const char    *volume_name,
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c
index 003a696..030a14c 100644
--- a/daemon/gvfsbackendafp.c
+++ b/daemon/gvfsbackendafp.c
@@ -2023,7 +2023,8 @@ do_mount (GVfsBackend *backend,
 
   gboolean res;
   GError *err = NULL;
-  
+
+  const GVfsAfpServerInfo *info;
   GMountSpec *afp_mount_spec;
   char       *server_name;
   char       *display_name;
@@ -2052,10 +2053,12 @@ do_mount (GVfsBackend *backend,
   g_vfs_backend_set_mount_spec (backend, afp_mount_spec);
   g_mount_spec_unref (afp_mount_spec);
 
-  if (afp_backend->server->utf8_server_name)
-    server_name = afp_backend->server->utf8_server_name;
+  info = g_vfs_afp_server_get_info (afp_backend->server);
+  
+  if (info->utf8_server_name)
+    server_name = info->utf8_server_name;
   else
-    server_name = afp_backend->server->server_name;
+    server_name = info->server_name;
   
   if (afp_backend->user)
     /* Translators: first %s is volumename, second username and third servername */ 
diff --git a/daemon/gvfsbackendafpbrowse.c b/daemon/gvfsbackendafpbrowse.c
index f597cc6..1f00787 100644
--- a/daemon/gvfsbackendafpbrowse.c
+++ b/daemon/gvfsbackendafpbrowse.c
@@ -417,6 +417,7 @@ do_mount (GVfsBackend *backend,
   gboolean res;
   GError *err = NULL;
 
+  const GVfsAfpServerInfo *info;
   GMountSpec *afp_mount_spec;
   char       *server_name;
   char       *display_name;
@@ -439,10 +440,12 @@ do_mount (GVfsBackend *backend,
   g_vfs_backend_set_mount_spec (backend, afp_mount_spec);
   g_mount_spec_unref (afp_mount_spec);
 
-  if (afp_backend->server->utf8_server_name)
-    server_name = afp_backend->server->utf8_server_name;
+  info = g_vfs_afp_server_get_info (afp_backend->server);
+  
+  if (info->utf8_server_name)
+    server_name = info->utf8_server_name;
   else
-    server_name = afp_backend->server->server_name;
+    server_name = info->server_name;
   
   if (afp_backend->user)
     /* Translators: first %s is username and second serververname */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]