diff options
author | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2011-09-26 21:01:09 +0200 |
---|---|---|
committer | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2012-01-22 09:47:27 +0100 |
commit | 88866fdc3c34e8b9ce2d4435098885e67212ac40 (patch) | |
tree | 7db0f285fbd30adb5901c7a1d4ea9480fe497a76 /daemon/gvfsbackendafpbrowse.c | |
parent | 5207f0102fb3bad1505f70fed37435537905c46a (diff) | |
download | gvfs-88866fdc3c34e8b9ce2d4435098885e67212ac40.tar.gz |
afp: move retrieval of volumes into GVfsAfpServer
GVfsAfpServer now has a g_vfs_afp_server_get_volumes to retrieve the available
volumes asynchronously.
Diffstat (limited to 'daemon/gvfsbackendafpbrowse.c')
-rw-r--r-- | daemon/gvfsbackendafpbrowse.c | 104 |
1 files changed, 25 insertions, 79 deletions
diff --git a/daemon/gvfsbackendafpbrowse.c b/daemon/gvfsbackendafpbrowse.c index 5226ce85..1b5f1fc4 100644 --- a/daemon/gvfsbackendafpbrowse.c +++ b/daemon/gvfsbackendafpbrowse.c @@ -58,26 +58,13 @@ struct _GVfsBackendAfpBrowse GVfsAfpServer *server; char *logged_in_user; - GSList *volumes; + GPtrArray *volumes; }; G_DEFINE_TYPE (GVfsBackendAfpBrowse, g_vfs_backend_afp_browse, G_VFS_TYPE_BACKEND); -typedef struct -{ - char *name; - guint16 flags; -} VolumeData; - -static void -volume_data_free (VolumeData *vol_data) -{ - g_free (vol_data->name); - g_slice_free (VolumeData, vol_data); -} - static gboolean is_root (const char *filename) { @@ -91,62 +78,27 @@ is_root (const char *filename) } static void -get_srvr_parms_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) +get_volumes_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - GVfsAfpConnection *afp_conn = G_VFS_AFP_CONNECTION (source_object); - GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data); + GVfsAfpServer *server = G_VFS_AFP_SERVER (source_object); + GSimpleAsyncResult *simple = user_data; GVfsBackendAfpBrowse *afp_backend; - GVfsAfpReply *reply; + GPtrArray *volumes; GError *err = NULL; - AfpResultCode res_code; - guint8 num_volumes, i; - afp_backend = G_VFS_BACKEND_AFP_BROWSE (g_async_result_get_source_object (G_ASYNC_RESULT (simple))); - reply = g_vfs_afp_connection_send_command_finish (afp_conn, res, &err); - if (!reply) + volumes = g_vfs_afp_server_get_volumes_finish (server, res, &err); + if (!volumes) { g_simple_async_result_take_error (simple, err); goto done; } - res_code = g_vfs_afp_reply_get_result_code (reply); - if (res_code != AFP_RESULT_NO_ERROR) - { - g_object_unref (reply); - - g_simple_async_result_take_error (simple, afp_result_code_to_gerror (res_code)); - goto done; - } - - /* server time */ - g_vfs_afp_reply_read_int32 (reply, NULL); - - g_slist_free_full (afp_backend->volumes, (GDestroyNotify) volume_data_free); - afp_backend->volumes = NULL; - - g_vfs_afp_reply_read_byte (reply, &num_volumes); - for (i = 0; i < num_volumes; i++) - { - guint8 flags; - char *vol_name; - - VolumeData *volume_data; - - g_vfs_afp_reply_read_byte (reply, &flags); - g_vfs_afp_reply_read_pascal (reply, &vol_name); - if (!vol_name) - continue; - - volume_data = g_slice_new (VolumeData); - volume_data->flags = flags; - volume_data->name = vol_name; - - afp_backend->volumes = g_slist_prepend (afp_backend->volumes, volume_data); - } - g_object_unref (reply); + if (afp_backend->volumes) + g_ptr_array_unref (afp_backend->volumes); + afp_backend->volumes = volumes; done: g_simple_async_result_complete (simple); @@ -159,20 +111,13 @@ update_cache (GVfsBackendAfpBrowse *afp_backend, GAsyncReadyCallback callback, gpointer user_data) { - GVfsAfpCommand *comm; GSimpleAsyncResult *simple; - comm = g_vfs_afp_command_new (AFP_COMMAND_GET_SRVR_PARMS); - /* pad byte */ - g_vfs_afp_command_put_byte (comm, 0); - simple = g_simple_async_result_new (G_OBJECT (afp_backend), callback, user_data, update_cache); - - g_vfs_afp_connection_send_command (afp_backend->server->conn, comm, NULL, - get_srvr_parms_cb, - cancellable, simple); - g_object_unref (comm); + + g_vfs_afp_server_get_volumes (afp_backend->server, cancellable, get_volumes_cb, + simple); } static gboolean @@ -194,13 +139,13 @@ update_cache_finish (GVfsBackendAfpBrowse *afp_backend, return TRUE; } -static VolumeData * +static GVfsAfpVolumeData * find_volume (GVfsBackendAfpBrowse *afp_backend, char *filename) { char *end; guint len; - GSList *l; + guint i; while (*filename == '/') filename++; @@ -219,9 +164,9 @@ find_volume (GVfsBackendAfpBrowse *afp_backend, else len = strlen (filename); - for (l = afp_backend->volumes; l; l = g_slist_next (l)) + for (i = 0; i < afp_backend->volumes->len; i++) { - VolumeData *vol_data = (VolumeData *)l->data; + GVfsAfpVolumeData *vol_data = g_ptr_array_index (afp_backend->volumes, i); if (strlen (vol_data->name) == len && strncmp (vol_data->name, filename, len) == 0) return vol_data; @@ -239,7 +184,7 @@ mount_mountable_cb (GObject *source_object, GVfsJobMountMountable *job = G_VFS_JOB_MOUNT_MOUNTABLE (user_data); GError *err; - VolumeData *vol_data; + GVfsAfpVolumeData *vol_data; GMountSpec *mount_spec; if (!update_cache_finish (afp_backend, res, &err)) @@ -292,7 +237,7 @@ try_mount_mountable (GVfsBackend *backend, } static void -fill_info (GFileInfo *info, VolumeData *vol_data, GVfsBackendAfpBrowse *afp_backend) +fill_info (GFileInfo *info, GVfsAfpVolumeData *vol_data, GVfsBackendAfpBrowse *afp_backend) { GIcon *icon; GMountSpec *mount_spec; @@ -346,7 +291,7 @@ enumerate_cache_updated_cb (GObject *source_object, GVfsJobEnumerate *job = G_VFS_JOB_ENUMERATE (user_data); GError *err = NULL; - GSList *l; + guint i; if (!update_cache_finish (afp_backend, res, &err)) { @@ -357,9 +302,9 @@ enumerate_cache_updated_cb (GObject *source_object, g_vfs_job_succeeded (G_VFS_JOB (job)); - for (l = afp_backend->volumes; l; l = l->next) + for (i = 0; i < afp_backend->volumes->len; i++) { - VolumeData *vol_data = l->data; + GVfsAfpVolumeData *vol_data = g_ptr_array_index (afp_backend->volumes, i); GFileInfo *info; @@ -405,7 +350,7 @@ query_info_cb (GObject *source_object, GVfsJobQueryInfo *job = G_VFS_JOB_QUERY_INFO (user_data); GError *err = NULL; - VolumeData *vol_data; + GVfsAfpVolumeData *vol_data; if (!update_cache_finish (afp_backend, res, &err)) { @@ -577,7 +522,8 @@ g_vfs_backend_afp_browse_finalize (GObject *object) g_free (afp_backend->user); g_free (afp_backend->logged_in_user); - g_slist_free_full (afp_backend->volumes, (GDestroyNotify)volume_data_free); + if (afp_backend->volumes) + g_ptr_array_unref (afp_backend->volumes); G_OBJECT_CLASS (g_vfs_backend_afp_browse_parent_class)->finalize (object); } |