[gvfs] afp: implement enumerate for AfpVersion < 3.1
- From: Christian Kellner <gicmo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] afp: implement enumerate for AfpVersion < 3.1
- Date: Thu, 25 Aug 2011 19:28:46 +0000 (UTC)
commit 1a04d440574a505c357e0fde07ee4a94dce896f4
Author: Carl-Anton Ingmarsson <ca ingmarsson gmail com>
Date: Sun Aug 7 10:38:10 2011 +0200
afp: implement enumerate for AfpVersion < 3.1
daemon/gvfsbackendafp.c | 81 ++++++++++++++++++++++++++--------------------
1 files changed, 46 insertions(+), 35 deletions(-)
---
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c
index 3518d00..f26138e 100644
--- a/daemon/gvfsbackendafp.c
+++ b/daemon/gvfsbackendafp.c
@@ -61,8 +61,9 @@
#define G_FILE_ATTRIBUTE_AFP_CHILDREN_COUNT "afp::children-count"
#define G_FILE_ATTRIBUTE_AFP_UA_PERMISSIONS "afp::ua-permisssions"
-static const gint16 ENUMERATE_REQ_COUNT = G_MAXINT16;
-static const gint32 ENUMERATE_MAX_REPLY_SIZE = G_MAXINT32;
+static const gint16 ENUMERATE_REQ_COUNT = G_MAXINT16;
+static const gint16 ENUMERATE_EXT_MAX_REPLY_SIZE = G_MAXINT16;
+static const gint32 ENUMERATE_EXT2_MAX_REPLY_SIZE = G_MAXINT32;
struct _GVfsBackendAfpClass
{
@@ -470,7 +471,7 @@ open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
g_object_unref (reply);
- g_simple_async_result_set_op_res_gpointer (simple, GINT_TO_POINTER (fork_refnum),
+ g_simple_async_result_set_op_res_gpointer (simple, GINT_TO_POINTER ((gint)fork_refnum),
NULL);
g_simple_async_result_complete (simple);
}
@@ -2725,11 +2726,12 @@ create_dir_bitmap (GVfsBackendAfp *afp_backend, GFileAttributeMatcher *matcher)
}
static void
-enumerate_ext2 (GVfsJobEnumerate *job,
- gint32 start_index);
+enumerate (GVfsBackendAfp *afp_backend,
+ GVfsJobEnumerate *job,
+ gint32 start_index);
static void
-enumerate_ext2_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+enumerate_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
{
GVfsAfpConnection *afp_conn = G_VFS_AFP_CONNECTION (source_object);
GVfsJobEnumerate *job = G_VFS_JOB_ENUMERATE (user_data);
@@ -2743,7 +2745,7 @@ enumerate_ext2_cb (GObject *source_object, GAsyncResult *res, gpointer user_data
guint16 dir_bitmap;
gint16 count, i;
- gint start_index;
+ gint64 start_index, max;
reply = g_vfs_afp_connection_send_command_finish (afp_conn, res, &err);
if (!reply)
@@ -2816,21 +2818,27 @@ enumerate_ext2_cb (GObject *source_object, GAsyncResult *res, gpointer user_data
g_vfs_afp_reply_seek (reply, start_pos + struct_length, G_SEEK_SET);
}
g_object_unref (reply);
-
+
start_index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (job),
"start-index"));
start_index += count;
- g_object_set_data (G_OBJECT (job), "start-index",
- GINT_TO_POINTER (start_index));
- enumerate_ext2 (job, start_index);
+ max = (afp_backend->server->version >= AFP_VERSION_3_1) ? G_MAXINT32 : G_MAXINT16;
+ /* Can't enumerate any more files */
+ if (start_index > max)
+ {
+ g_vfs_job_succeeded (G_VFS_JOB (job));
+ g_vfs_job_enumerate_done (job);
+ }
+
+ enumerate (afp_backend, job, start_index);
}
static void
-enumerate_ext2 (GVfsJobEnumerate *job,
- gint32 start_index)
+enumerate (GVfsBackendAfp *afp_backend,
+ GVfsJobEnumerate *job,
+ gint32 start_index)
{
- GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (job->backend);
GVfsAfpConnection *conn = afp_backend->server->conn;
const char *filename = job->filename;
GFileAttributeMatcher *matcher = job->attribute_matcher;
@@ -2838,7 +2846,11 @@ enumerate_ext2 (GVfsJobEnumerate *job,
GVfsAfpCommand *comm;
guint16 file_bitmap, dir_bitmap;
- comm = g_vfs_afp_command_new (AFP_COMMAND_ENUMERATE_EXT2);
+ if (afp_backend->server->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);
+
/* pad byte */
g_vfs_afp_command_put_byte (comm, 0);
@@ -2857,18 +2869,28 @@ enumerate_ext2 (GVfsJobEnumerate *job,
/* Req Count */
g_vfs_afp_command_put_int16 (comm, ENUMERATE_REQ_COUNT);
+
- /* StartIndex */
- g_vfs_afp_command_put_int32 (comm, start_index);
+ /* StartIndex and MaxReplySize */
+ if (afp_backend->server->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);
+ }
+ else
+ {
+ g_vfs_afp_command_put_int16 (comm, start_index);
+ g_vfs_afp_command_put_int16 (comm, ENUMERATE_EXT_MAX_REPLY_SIZE);
+ }
- /* MaxReplySize */
- g_vfs_afp_command_put_int32 (comm, ENUMERATE_MAX_REPLY_SIZE);
-
/* Pathname */
put_pathname (comm, filename);
- g_vfs_afp_connection_send_command (conn, comm, enumerate_ext2_cb,
- G_VFS_JOB (job)->cancellable, job);
+ g_object_set_data (G_OBJECT (job), "start-index",
+ GINT_TO_POINTER (start_index));
+
+ g_vfs_afp_connection_send_command (conn, comm, enumerate_cb,
+ G_VFS_JOB (job)->cancellable, job);
g_object_unref (comm);
}
@@ -2881,19 +2903,8 @@ try_enumerate (GVfsBackend *backend,
{
GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend);
- if (afp_backend->server->version >= AFP_VERSION_3_1)
- {
- g_object_set_data (G_OBJECT (job), "start-index",
- GINT_TO_POINTER (1));
- enumerate_ext2 (job, 1);
- }
-
- else
- {
- g_vfs_job_failed_literal (G_VFS_JOB (job), G_IO_ERROR, G_IO_ERROR_FAILED,
- "Enumeration not supported for AFP_VERSION_3_0 yet");
- }
-
+ enumerate (afp_backend, job, 1);
+
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]