[gvfs] sftp: Allow queuing and waiting for commands on different connections



commit 9cefe0419fa2d03326313a72700159bc9014116a
Author: Ross Lagerwall <rosslagerwall gmail com>
Date:   Mon May 25 12:00:06 2015 +0100

    sftp: Allow queuing and waiting for commands on different connections
    
    Update the infrastructure to allow submitting multiple commands to be
    sent on different connections and then waiting for the all to complete.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=747128

 daemon/gvfsbackendsftp.c |   59 ++++++++++++++++++++++++++-------------------
 1 files changed, 34 insertions(+), 25 deletions(-)
---
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c
index 2b1b98a..fe1d1a0 100644
--- a/daemon/gvfsbackendsftp.c
+++ b/daemon/gvfsbackendsftp.c
@@ -1639,9 +1639,14 @@ multi_request_cb (GVfsBackendSftp *backend,
     }
 }
 
+typedef struct
+{
+  Connection *connection;
+  GDataOutputStream *cmd;
+} Command;
+
 static void
-queue_command_streams_and_free (Connection *conn,
-                                GDataOutputStream **commands,
+queue_command_streams_and_free (Command *commands,
                                 int n_commands,
                                 MultiReplyCallback callback,
                                 GVfsJob *job,
@@ -1664,8 +1669,8 @@ queue_command_streams_and_free (Connection *conn,
     {
       reply = &data->replies[i];
       reply->request = data;
-      queue_command_stream_and_free (conn,
-                                     commands[i],
+      queue_command_stream_and_free (commands[i].connection,
+                                     commands[i].cmd,
                                      multi_request_cb,
                                      job,
                                      reply);
@@ -4442,20 +4447,22 @@ try_query_info (GVfsBackend *backend,
                 GFileAttributeMatcher *matcher)
 {
   GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend);
-  GDataOutputStream *commands[3];
+  Command commands[3];
   GDataOutputStream *command;
   int n_commands;
 
   n_commands = 0;
   
-  command = commands[n_commands++] =
+  commands[n_commands].connection = &op_backend->command_connection;
+  command = commands[n_commands++].cmd =
     new_command_stream (op_backend,
                         SSH_FXP_LSTAT);
   put_string (command, filename);
   
   if (! (job->flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS))
     {
-      command = commands[n_commands++] =
+      commands[n_commands].connection = &op_backend->command_connection;
+      command = commands[n_commands++].cmd =
         new_command_stream (op_backend,
                             SSH_FXP_STAT);
       put_string (command, filename);
@@ -4464,14 +4471,14 @@ try_query_info (GVfsBackend *backend,
   if (g_file_attribute_matcher_matches (job->attribute_matcher,
                                         G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET))
     {
-      command = commands[n_commands++] =
+      commands[n_commands].connection = &op_backend->command_connection;
+      command = commands[n_commands++].cmd =
         new_command_stream (op_backend,
                             SSH_FXP_READLINK);
       put_string (command, filename);
     }
 
-  queue_command_streams_and_free (&op_backend->command_connection,
-                                  commands, n_commands,
+  queue_command_streams_and_free (commands, n_commands,
                                   query_info_reply,
                                   G_VFS_JOB (job), NULL);
   
@@ -4819,20 +4826,21 @@ try_move (GVfsBackend *backend,
 {
   GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend);
   GDataOutputStream *command;
-  GDataOutputStream *commands[2];
+  Command commands[2];
 
-  command = commands[0] =
+  commands[0].connection = &op_backend->command_connection;
+  command = commands[0].cmd =
     new_command_stream (op_backend,
                         SSH_FXP_LSTAT);
   put_string (command, source);
 
-  command = commands[1] =
+  commands[1].connection = &op_backend->command_connection;
+  command = commands[1].cmd =
     new_command_stream (op_backend,
                         SSH_FXP_LSTAT);
   put_string (command, destination);
 
-  queue_command_streams_and_free (&op_backend->command_connection,
-                                  commands, 2,
+  queue_command_streams_and_free (commands, 2,
                                   move_lstat_reply,
                                   G_VFS_JOB (job), NULL);
   
@@ -6405,7 +6413,7 @@ try_pull (GVfsBackend *backend,
 {
   GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend);
   SftpPullHandle *handle;
-  GDataOutputStream *commands[2];
+  Command commands[2];
 
   handle = g_slice_new0 (SftpPullHandle);
   handle->backend = g_object_ref (op_backend);
@@ -6415,17 +6423,18 @@ try_pull (GVfsBackend *backend,
   handle->size = PULL_SIZE_INVALID;
   handle->max_req = 1;
 
-  commands[0] = new_command_stream (op_backend,
-                                    flags & G_FILE_COPY_NOFOLLOW_SYMLINKS ? SSH_FXP_LSTAT : SSH_FXP_STAT);
-  put_string (commands[0], source);
+  commands[0].connection = &op_backend->command_connection;
+  commands[0].cmd = new_command_stream (op_backend,
+                                        flags & G_FILE_COPY_NOFOLLOW_SYMLINKS ? SSH_FXP_LSTAT : 
SSH_FXP_STAT);
+  put_string (commands[0].cmd, source);
 
-  commands[1] = new_command_stream (op_backend, SSH_FXP_OPEN);
-  put_string (commands[1], source);
-  g_data_output_stream_put_uint32 (commands[1], SSH_FXF_READ, NULL, NULL);
-  g_data_output_stream_put_uint32 (commands[1], 0, NULL, NULL);
+  commands[1].connection = &op_backend->command_connection;
+  commands[1].cmd = new_command_stream (op_backend, SSH_FXP_OPEN);
+  put_string (commands[1].cmd, source);
+  g_data_output_stream_put_uint32 (commands[1].cmd, SSH_FXF_READ, NULL, NULL);
+  g_data_output_stream_put_uint32 (commands[1].cmd, 0, NULL, NULL);
 
-  queue_command_streams_and_free (&op_backend->command_connection,
-                                  commands, 2,
+  queue_command_streams_and_free (commands, 2,
                                   pull_open_reply,
                                   G_VFS_JOB(job),
                                   handle);


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