diff options
author | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2011-09-01 01:00:11 +0200 |
---|---|---|
committer | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2012-01-22 09:47:27 +0100 |
commit | 612ef0a3facb8473b5812f2f4e79942ed32b8473 (patch) | |
tree | daf6614002a7da18bd3e4a04069dbe526f841aca /daemon | |
parent | f0a4fe7e7cde9da102caa3a36eb417165499f768 (diff) | |
download | gvfs-612ef0a3facb8473b5812f2f4e79942ed32b8473.tar.gz |
afp: move get_vol_parms to GVfsAfpServer
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/gvfsafpserver.c | 170 | ||||
-rw-r--r-- | daemon/gvfsafpserver.h | 36 | ||||
-rw-r--r-- | daemon/gvfsbackendafp.c | 154 |
3 files changed, 198 insertions, 162 deletions
diff --git a/daemon/gvfsafpserver.c b/daemon/gvfsafpserver.c index baa499f8..21db245a 100644 --- a/daemon/gvfsafpserver.c +++ b/daemon/gvfsafpserver.c @@ -1038,3 +1038,173 @@ g_vfs_afp_server_time_to_local_time (GVfsAfpServer *server, { return server_time + server->time_diff; } + +static void +get_vol_parms_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) +{ + GVfsAfpConnection *connection = G_VFS_AFP_CONNECTION (source_object); + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data); + GVfsAfpServer *server = G_VFS_AFP_SERVER (g_async_result_get_source_object (G_ASYNC_RESULT (simple))); + + GVfsAfpReply *reply; + GError *err = NULL; + AfpResultCode res_code; + + guint16 vol_bitmap; + GFileInfo *info; + + reply = g_vfs_afp_connection_send_command_finish (connection, res, &err); + if (!reply) + { + 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; + } + + g_vfs_afp_reply_read_uint16 (reply, &vol_bitmap); + + info = g_file_info_new (); + + if (vol_bitmap & AFP_VOLUME_BITMAP_ATTRIBUTE_BIT) + { + guint16 vol_attrs_bitmap; + + g_vfs_afp_reply_read_uint16 (reply, &vol_attrs_bitmap); + + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, + vol_attrs_bitmap & AFP_VOLUME_ATTRIBUTES_BITMAP_READ_ONLY); + } + + if (vol_bitmap & AFP_VOLUME_BITMAP_CREATE_DATE_BIT) + { + gint32 create_date; + gint64 create_date_local; + + g_vfs_afp_reply_read_int32 (reply, &create_date); + + create_date_local = g_vfs_afp_server_time_to_local_time (server, create_date); + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_CREATED, + create_date_local); + } + + if (vol_bitmap & AFP_VOLUME_BITMAP_MOD_DATE_BIT) + { + gint32 mod_date; + gint64 mod_date_local; + + g_vfs_afp_reply_read_int32 (reply, &mod_date); + + mod_date_local = g_vfs_afp_server_time_to_local_time (server, mod_date); + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED, + mod_date_local); + } + + if (vol_bitmap & AFP_VOLUME_BITMAP_EXT_BYTES_FREE_BIT) + { + guint64 bytes_free; + + g_vfs_afp_reply_read_uint64 (reply, &bytes_free); + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, + bytes_free); + } + + if (vol_bitmap & AFP_VOLUME_BITMAP_EXT_BYTES_TOTAL_BIT) + { + guint64 bytes_total; + + g_vfs_afp_reply_read_uint64 (reply, &bytes_total); + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, + bytes_total); + } + + g_object_unref (reply); + + g_simple_async_result_set_op_res_gpointer (simple, info, g_object_unref); + +done: + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +/* + * g_vfs_afp_server_get_vol_parms: + * + * @server: a #GVfsAfpServer + * @volume_id: id of the volume whose parameters should be received. + * @vol_bitmap: bitmap describing the parameters that should be received. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * @callback: callback to call when the request is satisfied. + * @user_data: the data to pass to callback function. + * + * Asynchronously retrives the parameters specified by @vol_bitmap of the volume + * with id $volume_id. + */ +void +g_vfs_afp_server_get_vol_parms (GVfsAfpServer *server, + guint16 volume_id, + guint16 vol_bitmap, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GVfsAfpCommand *comm; + GSimpleAsyncResult *simple; + + comm = g_vfs_afp_command_new (AFP_COMMAND_GET_VOL_PARMS); + /* pad byte */ + g_vfs_afp_command_put_byte (comm, 0); + /* Volume ID */ + g_vfs_afp_command_put_uint16 (comm, volume_id); + /* Volume Bitmap */ + g_vfs_afp_command_put_uint16 (comm, vol_bitmap); + + simple = g_simple_async_result_new (G_OBJECT (server), callback, user_data, + g_vfs_afp_server_get_vol_parms); + + + g_vfs_afp_connection_send_command (server->conn, comm, NULL, get_vol_parms_cb, + cancellable, simple); + g_object_unref (comm); +} + +/* + * g_vfs_afp_server_get_vol_parms_finish: + * + * @server: a #GVfsAfpServer. + * @result: a #GAsyncResult. + * @error: a #GError, %NULL to ignore. + * + * Finalizes the asynchronous operation started by + * g_vfs_afp_server_get_vol_parms. + * + * Returns: (transfer full): A #GFileInfo with the requested parameters or %NULL + * on error. + */ +GFileInfo * +g_vfs_afp_server_get_vol_parms_finish (GVfsAfpServer *server, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, + G_OBJECT (server), + g_vfs_afp_server_get_vol_parms), + NULL); + + simple = (GSimpleAsyncResult *)result; + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple)); +} diff --git a/daemon/gvfsafpserver.h b/daemon/gvfsafpserver.h index 5d1626fc..fc642bea 100644 --- a/daemon/gvfsafpserver.h +++ b/daemon/gvfsafpserver.h @@ -71,19 +71,29 @@ struct _GVfsAfpServer gint32 time_diff; }; -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, - const char *initial_user, - GMountSource *mount_source, - char **logged_in_user, - GCancellable *cancellable, - GError **error); - -gint64 g_vfs_afp_server_time_to_local_time (GVfsAfpServer *afp_serv, - gint32 server_time); +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, + const char *initial_user, + GMountSource *mount_source, + char **logged_in_user, + GCancellable *cancellable, + GError **error); + +gint64 g_vfs_afp_server_time_to_local_time (GVfsAfpServer *afp_serv, + gint32 server_time); + +void g_vfs_afp_server_get_vol_parms (GVfsAfpServer *server, + guint16 volume_id, + guint16 vol_bitmap, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileInfo * g_vfs_afp_server_get_vol_parms_finish (GVfsAfpServer *server, + GAsyncResult *result, + GError **error); G_END_DECLS diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c index f1dd86b7..5b840f27 100644 --- a/daemon/gvfsbackendafp.c +++ b/daemon/gvfsbackendafp.c @@ -873,151 +873,6 @@ get_filedir_parms_finish (GVfsBackendAfp *afp_backend, return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple)); } -static void -get_vol_parms_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); - GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (g_async_result_get_source_object (G_ASYNC_RESULT (simple))); - - GVfsAfpReply *reply; - GError *err = NULL; - AfpResultCode res_code; - - guint16 vol_bitmap; - GFileInfo *info; - - reply = g_vfs_afp_connection_send_command_finish (afp_conn, res, &err); - if (!reply) - { - 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; - } - - g_vfs_afp_reply_read_uint16 (reply, &vol_bitmap); - - info = g_file_info_new (); - - if (vol_bitmap & AFP_VOLUME_BITMAP_ATTRIBUTE_BIT) - { - guint16 vol_attrs_bitmap; - - g_vfs_afp_reply_read_uint16 (reply, &vol_attrs_bitmap); - - g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, - vol_attrs_bitmap & AFP_VOLUME_ATTRIBUTES_BITMAP_READ_ONLY); - } - - if (vol_bitmap & AFP_VOLUME_BITMAP_CREATE_DATE_BIT) - { - gint32 create_date; - gint64 create_date_local; - - g_vfs_afp_reply_read_int32 (reply, &create_date); - - create_date_local = g_vfs_afp_server_time_to_local_time (afp_backend->server, - create_date); - g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_CREATED, - create_date_local); - } - - if (vol_bitmap & AFP_VOLUME_BITMAP_MOD_DATE_BIT) - { - gint32 mod_date; - gint64 mod_date_local; - - g_vfs_afp_reply_read_int32 (reply, &mod_date); - - mod_date_local = g_vfs_afp_server_time_to_local_time (afp_backend->server, - mod_date); - g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED, - mod_date_local); - } - - if (vol_bitmap & AFP_VOLUME_BITMAP_EXT_BYTES_FREE_BIT) - { - guint64 bytes_free; - - g_vfs_afp_reply_read_uint64 (reply, &bytes_free); - g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, - bytes_free); - } - - if (vol_bitmap & AFP_VOLUME_BITMAP_EXT_BYTES_TOTAL_BIT) - { - guint64 bytes_total; - - g_vfs_afp_reply_read_uint64 (reply, &bytes_total); - g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, - bytes_total); - } - - g_object_unref (reply); - - g_simple_async_result_set_op_res_gpointer (simple, info, g_object_unref); - -done: - g_simple_async_result_complete (simple); - g_object_unref (simple); -} - -static void -get_vol_parms (GVfsBackendAfp *afp_backend, - guint16 vol_bitmap, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GVfsAfpCommand *comm; - GSimpleAsyncResult *simple; - - comm = g_vfs_afp_command_new (AFP_COMMAND_GET_VOL_PARMS); - /* pad byte */ - g_vfs_afp_command_put_byte (comm, 0); - /* Volume ID */ - g_vfs_afp_command_put_uint16 (comm, afp_backend->volume_id); - /* Volume Bitmap */ - g_vfs_afp_command_put_uint16 (comm, vol_bitmap); - - simple = g_simple_async_result_new (G_OBJECT (afp_backend), callback, user_data, - get_vol_parms); - - - g_vfs_afp_connection_send_command (afp_backend->server->conn, comm, NULL, - get_vol_parms_cb, cancellable, - simple); - g_object_unref (comm); -} - -static GFileInfo * -get_vol_parms_finish (GVfsBackendAfp *afp_backend, - GAsyncResult *result, - GError **error) -{ - GSimpleAsyncResult *simple; - - g_return_val_if_fail (g_simple_async_result_is_valid (result, - G_OBJECT (afp_backend), - get_vol_parms), - NULL); - - simple = (GSimpleAsyncResult *)result; - - if (g_simple_async_result_propagate_error (simple, error)) - return NULL; - - return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple)); -} - typedef struct { char *filename; @@ -3817,13 +3672,13 @@ try_set_attribute (GVfsBackend *backend, static void query_fs_info_get_vol_parms_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object); + GVfsAfpServer *server = G_VFS_AFP_SERVER (source_object); GVfsJobQueryFsInfo *job = G_VFS_JOB_QUERY_FS_INFO (user_data); GError *err = NULL; GFileInfo *info; - info = get_vol_parms_finish (afp_backend, res, &err); + info = g_vfs_afp_server_get_vol_parms_finish (server, res, &err); if (!info) { g_vfs_job_failed_from_error (G_VFS_JOB (job), err); @@ -3863,8 +3718,9 @@ try_query_fs_info (GVfsBackend *backend, if (vol_bitmap != 0) { - get_vol_parms (afp_backend, vol_bitmap, G_VFS_JOB (job)->cancellable, - query_fs_info_get_vol_parms_cb, job); + g_vfs_afp_server_get_vol_parms (afp_backend->server, afp_backend->volume_id, + vol_bitmap, G_VFS_JOB (job)->cancellable, + query_fs_info_get_vol_parms_cb, job); } else g_vfs_job_succeeded (G_VFS_JOB (job)); |