diff options
author | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 14:33:46 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 14:33:46 +0000 |
commit | 83b5d35fda9f011042fabbcf410ce67284475eb2 (patch) | |
tree | d51d0acd67bad88cc5798ef237e008538abb2a5a /client | |
parent | 31553c7a759a472b382afdba77e531536f64c6e9 (diff) | |
download | gvfs-83b5d35fda9f011042fabbcf410ce67284475eb2.tar.gz |
Implement etag sending on close in daemon stream
Original git commit by Alexander Larsson <alexl@redhat.com> at 1185358218 +0200
svn path=/trunk/; revision=709
Diffstat (limited to 'client')
-rw-r--r-- | client/gdaemonfile.c | 21 | ||||
-rw-r--r-- | client/gdaemonfileoutputstream.c | 35 |
2 files changed, 43 insertions, 13 deletions
diff --git a/client/gdaemonfile.c b/client/gdaemonfile.c index 477cef64..4eba1b5d 100644 --- a/client/gdaemonfile.c +++ b/client/gdaemonfile.c @@ -805,18 +805,19 @@ g_daemon_file_append_to (GFile *file, guint32 fd_id; dbus_bool_t can_seek; guint16 mode; - guint64 mtime, initial_offset; + guint64 initial_offset; dbus_bool_t make_backup; + char *etag; mode = 1; - mtime = 0; + etag = ""; make_backup = FALSE; reply = do_sync_path_call (file, G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE, &connection, cancellable, error, DBUS_TYPE_UINT16, &mode, - DBUS_TYPE_UINT64, &mtime, + DBUS_TYPE_STRING, &etag, DBUS_TYPE_BOOLEAN, &make_backup, 0); if (reply == NULL) @@ -858,18 +859,19 @@ g_daemon_file_create (GFile *file, guint32 fd_id; dbus_bool_t can_seek; guint16 mode; - guint64 mtime, initial_offset; + guint64 initial_offset; dbus_bool_t make_backup; + char *etag; mode = 0; - mtime = 0; + etag = ""; make_backup = FALSE; reply = do_sync_path_call (file, G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE, &connection, cancellable, error, DBUS_TYPE_UINT16, &mode, - DBUS_TYPE_UINT64, &mtime, + DBUS_TYPE_STRING, &etag, DBUS_TYPE_BOOLEAN, &make_backup, 0); if (reply == NULL) @@ -902,7 +904,7 @@ g_daemon_file_create (GFile *file, static GFileOutputStream * g_daemon_file_replace (GFile *file, - time_t mtime, + const char *etag, gboolean make_backup, GCancellable *cancellable, GError **error) @@ -913,18 +915,17 @@ g_daemon_file_replace (GFile *file, guint32 fd_id; dbus_bool_t can_seek; guint16 mode; - guint64 dbus_mtime, initial_offset; + guint64 initial_offset; dbus_bool_t dbus_make_backup; mode = 2; - dbus_mtime = mtime; dbus_make_backup = make_backup; reply = do_sync_path_call (file, G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE, &connection, cancellable, error, DBUS_TYPE_UINT16, &mode, - DBUS_TYPE_UINT64, &dbus_mtime, + DBUS_TYPE_STRING, &etag, DBUS_TYPE_BOOLEAN, &dbus_make_backup, 0); if (reply == NULL) diff --git a/client/gdaemonfileoutputstream.c b/client/gdaemonfileoutputstream.c index 51e21ac1..8ba48777 100644 --- a/client/gdaemonfileoutputstream.c +++ b/client/gdaemonfileoutputstream.c @@ -125,6 +125,9 @@ struct _GDaemonFileOutputStream { GString *input_buffer; GString *output_buffer; + + char *etag; + }; static gssize g_daemon_file_output_stream_write (GOutputStream *stream, @@ -139,6 +142,9 @@ static GFileInfo *g_daemon_file_output_stream_get_file_info (GFileOutputStream char *attributes, GCancellable *cancellable, GError **error); +static char *g_daemon_file_output_stream_get_etag (GFileOutputStream *stream, + GCancellable *cancellable, + GError **error); static goffset g_daemon_file_output_stream_tell (GFileOutputStream *stream); static gboolean g_daemon_file_output_stream_can_seek (GFileOutputStream *stream); static gboolean g_daemon_file_output_stream_seek (GFileOutputStream *stream, @@ -182,6 +188,8 @@ g_daemon_file_output_stream_finalize (GObject *object) g_string_free (file->input_buffer, TRUE); g_string_free (file->output_buffer, TRUE); + + g_free (file->etag); if (G_OBJECT_CLASS (g_daemon_file_output_stream_parent_class)->finalize) (*G_OBJECT_CLASS (g_daemon_file_output_stream_parent_class)->finalize) (object); @@ -208,7 +216,7 @@ g_daemon_file_output_stream_class_init (GDaemonFileOutputStreamClass *klass) file_stream_class->can_seek = g_daemon_file_output_stream_can_seek; file_stream_class->seek = g_daemon_file_output_stream_seek; file_stream_class->get_file_info = g_daemon_file_output_stream_get_file_info; - + file_stream_class->get_etag = g_daemon_file_output_stream_get_etag; } static void @@ -278,8 +286,10 @@ get_reply_header_missing_bytes (GString *buffer) type = g_ntohl (reply->type); arg2 = g_ntohl (reply->arg2); - - if (type == G_VFS_DAEMON_SOCKET_PROTOCOL_REPLY_ERROR) + + /* ERROR and CLOSED has extra data w/ len in arg2 */ + if (type == G_VFS_DAEMON_SOCKET_PROTOCOL_REPLY_ERROR || + type == G_VFS_DAEMON_SOCKET_PROTOCOL_REPLY_CLOSED) return G_VFS_DAEMON_SOCKET_PROTOCOL_REPLY_SIZE + arg2 - buffer->len; return 0; } @@ -679,6 +689,8 @@ iterate_close_state_machine (GDaemonFileOutputStream *file, IOOperationData *io_ else if (reply.type == G_VFS_DAEMON_SOCKET_PROTOCOL_REPLY_CLOSED) { op->ret_val = TRUE; + if (reply.arg2 > 0) + file->etag = g_strndup (data, reply.arg2); g_string_truncate (file->input_buffer, 0); return STATE_OP_DONE; } @@ -941,6 +953,23 @@ g_daemon_file_output_stream_seek (GFileOutputStream *stream, return op.ret_val; } +static char * +g_daemon_file_output_stream_get_etag (GFileOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GDaemonFileOutputStream *file; + + file = G_DAEMON_FILE_OUTPUT_STREAM (stream); + + if (file->etag) + return file->etag; + + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("etag not supported on stream")); + return NULL; +} + static GFileInfo * g_daemon_file_output_stream_get_file_info (GFileOutputStream *stream, char *attributes, |