static void write_dsi_header_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GOutputStream *output = G_OUTPUT_STREAM (object); GVfsAfpConnection *afp_conn = G_VFS_AFP_CONNECTION (user_data); GVfsAfpConnectionPrivate *priv = afp_conn->priv; RequestData *req_data; char *data; gsize size; req_data = g_queue_peek_head (priv->request_queue); HANDLE_RES (); if (req_data->type == REQUEST_TYPE_TICKLE) { remove_first (priv->request_queue); send_request (afp_conn); return; } data = g_vfs_afp_command_get_data (req_data->command); size = g_vfs_afp_command_get_size (req_data->command); write_all_async (output, data, size, 0, NULL, write_command_cb, afp_conn); }
static void write_dsi_header_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GOutputStream *output = G_OUTPUT_STREAM (object); RequestData *req_data = user_data; GVfsAfpConnection *afp_conn = req_data->conn; GVfsAfpConnectionPrivate *priv = afp_conn->priv; char *data; gsize size; HANDLE_RES (); if (req_data->type == REQUEST_TYPE_TICKLE) { g_mutex_lock (&priv->mutex); send_request_unlocked (afp_conn); g_mutex_unlock (&priv->mutex); return; } data = g_vfs_afp_command_get_data (req_data->command); size = g_vfs_afp_command_get_size (req_data->command); write_all_async (output, data, size, 0, NULL, write_command_cb, req_data); }
static void write_command_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GOutputStream *output = G_OUTPUT_STREAM (object); GVfsAfpConnection *afp_conn = G_VFS_AFP_CONNECTION (user_data); GVfsAfpConnectionPrivate *priv = afp_conn->priv; RequestData *req_data; req_data = g_queue_peek_head (priv->request_queue); HANDLE_RES (); if (priv->write_dsi_header.command == DSI_WRITE && req_data->command->buf) { write_all_async (output, req_data->command->buf, req_data->command->buf_size, 0, NULL, write_buf_cb, afp_conn); return; } g_hash_table_insert (priv->request_hash, GUINT_TO_POINTER ((guint)GUINT16_FROM_BE (priv->write_dsi_header.requestID)), req_data); g_queue_pop_head (priv->request_queue); send_request (afp_conn); }
static void write_command_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GOutputStream *output = G_OUTPUT_STREAM (object); RequestData *req_data = user_data; GVfsAfpConnection *afp_conn = req_data->conn; GVfsAfpConnectionPrivate *priv = afp_conn->priv; HANDLE_RES (); if (priv->write_dsi_header.command == DSI_WRITE && req_data->command->buf) { write_all_async (output, req_data->command->buf, req_data->command->buf_size, 0, NULL, write_buf_cb, req_data); return; } g_hash_table_insert (priv->request_hash, GUINT_TO_POINTER ((guint)GUINT16_FROM_BE (priv->write_dsi_header.requestID)), req_data); g_mutex_lock (&priv->mutex); send_request_unlocked (afp_conn); g_mutex_unlock (&priv->mutex); }
static void send_request (GVfsAfpConnection *afp_connection) { GVfsAfpConnectionPrivate *priv = afp_connection->priv; RequestData *req_data; guint32 writeOffset; guint8 dsi_command; while ((req_data = g_queue_peek_head (priv->request_queue))) { if (req_data->cancellable && g_cancellable_is_cancelled (req_data->cancellable)) { if (req_data->simple) { GError *err = NULL; g_cancellable_set_error_if_cancelled (req_data->cancellable, &err); g_simple_async_result_take_error (req_data->simple, err); g_simple_async_result_complete (req_data->simple); } remove_first (priv->request_queue); } else break; } if (!req_data) { priv->send_loop_running = FALSE; return; } switch (req_data->type) { case REQUEST_TYPE_TICKLE: priv->write_dsi_header.flags = 0x00; priv->write_dsi_header.command = DSI_TICKLE; priv->write_dsi_header.requestID = GUINT16_TO_BE (get_request_id (afp_connection)); priv->write_dsi_header.writeOffset = 0; priv->write_dsi_header.totalDataLength = 0; priv->write_dsi_header.reserved = 0; break; case REQUEST_TYPE_COMMAND: { gsize size; switch (req_data->command->type) { case AFP_COMMAND_WRITE: writeOffset = 8; dsi_command = DSI_WRITE; break; case AFP_COMMAND_WRITE_EXT: writeOffset = 20; dsi_command = DSI_WRITE; break; default: writeOffset = 0; dsi_command = DSI_COMMAND; break; } priv->write_dsi_header.flags = 0x00; priv->write_dsi_header.command = dsi_command; priv->write_dsi_header.requestID = GUINT16_TO_BE (get_request_id (afp_connection)); priv->write_dsi_header.writeOffset = GUINT32_TO_BE (writeOffset); /* totalDataLength */ size = g_vfs_afp_command_get_size (req_data->command); if (dsi_command == DSI_WRITE && req_data->command->buf) size += req_data->command->buf_size; priv->write_dsi_header.totalDataLength = GUINT32_TO_BE (size); priv->write_dsi_header.reserved = 0; break; } default: g_assert_not_reached (); } write_all_async (g_io_stream_get_output_stream (priv->conn), &priv->write_dsi_header, sizeof (DSIHeader), 0, NULL, write_dsi_header_cb, afp_connection); }