summaryrefslogtreecommitdiff
path: root/daemon/gvfsbackendtest.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@src.gnome.org>2007-09-13 09:50:55 +0000
committerAlexander Larsson <alexl@src.gnome.org>2007-09-13 09:50:55 +0000
commitd6f1e3a1a699a8cc16062c2e5c2302c5024af4c1 (patch)
tree3824638b3c1d409e583e8507fd6bb7a8cee75433 /daemon/gvfsbackendtest.c
parentfd8347bc624177853d1a3e85be93a09d6dc788da (diff)
downloadgvfs-d6f1e3a1a699a8cc16062c2e5c2302c5024af4c1.tar.gz
Implement seek
Original git commit by Alexander Larsson <alex@localhost.localdomain> at 1163674878 +0100 svn path=/trunk/; revision=156
Diffstat (limited to 'daemon/gvfsbackendtest.c')
-rw-r--r--daemon/gvfsbackendtest.c66
1 files changed, 63 insertions, 3 deletions
diff --git a/daemon/gvfsbackendtest.c b/daemon/gvfsbackendtest.c
index bba791ff..89e15fd7 100644
--- a/daemon/gvfsbackendtest.c
+++ b/daemon/gvfsbackendtest.c
@@ -12,17 +12,23 @@
#include "gvfsbackendtest.h"
#include "gvfsjobopenforread.h"
#include "gvfsjobread.h"
+#include "gvfsjobseekread.h"
G_DEFINE_TYPE (GVfsBackendTest, g_vfs_backend_test, G_TYPE_VFS_BACKEND);
-static gboolean do_open_for_read (GVfsBackend *backend,
+static gboolean do_open_for_read (GVfsBackend *backend,
GVfsJobOpenForRead *job,
char *filename);
-static gboolean do_read (GVfsBackend *backend,
+static gboolean do_read (GVfsBackend *backend,
GVfsJobRead *job,
GVfsHandle *handle,
char *buffer,
gsize bytes_requested);
+static gboolean do_seek_on_read (GVfsBackend *backend,
+ GVfsJobSeekRead *job,
+ GVfsHandle *handle,
+ goffset offset,
+ GSeekType type);
static void
g_vfs_backend_test_finalize (GObject *object)
@@ -45,6 +51,7 @@ g_vfs_backend_test_class_init (GVfsBackendTestClass *klass)
backend_class->open_for_read = do_open_for_read;
backend_class->read = do_read;
+ backend_class->seek_on_read = do_seek_on_read;
}
static void
@@ -66,7 +73,7 @@ open_idle_cb (gpointer data)
{
GVfsJobOpenForRead *job = data;
int fd;
-
+
fd = g_open (job->filename, O_RDONLY);
if (fd == -1)
{
@@ -77,6 +84,7 @@ open_idle_cb (gpointer data)
}
else
{
+ g_vfs_job_open_for_read_set_can_seek (job, TRUE);
g_vfs_job_open_for_read_set_handle (job, GINT_TO_POINTER (fd));
g_vfs_job_succeeded (G_VFS_JOB (job));
}
@@ -90,6 +98,8 @@ do_open_for_read (GVfsBackend *backend,
{
GError *error;
+ g_print ("open_for_read (%s)\n", filename);
+
if (strcmp (filename, "/fail") == 0)
{
error = g_error_new (G_FILE_ERROR, G_FILE_ERROR_IO, "Test error");
@@ -113,6 +123,8 @@ do_read (GVfsBackend *backend,
int fd;
ssize_t res;
+ g_print ("read (%d)\n", bytes_requested);
+
fd = GPOINTER_TO_INT (handle);
res = read (fd, buffer, bytes_requested);
@@ -132,3 +144,51 @@ do_read (GVfsBackend *backend,
return TRUE;
}
+
+static gboolean
+do_seek_on_read (GVfsBackend *backend,
+ GVfsJobSeekRead *job,
+ GVfsHandle *handle,
+ goffset offset,
+ GSeekType type)
+{
+ int whence;
+ int fd;
+ off_t final_offset;
+
+ g_print ("seek_on_read (%d, %d)\n", (int)offset, type);
+
+ switch (type)
+ {
+ default:
+ case G_SEEK_SET:
+ whence = SEEK_SET;
+ break;
+ case G_SEEK_CUR:
+ whence = SEEK_CUR;
+ break;
+ case G_SEEK_END:
+ whence = SEEK_END;
+ break;
+ }
+
+
+ fd = GPOINTER_TO_INT (handle);
+
+ final_offset = lseek (fd, offset, whence);
+
+ if (final_offset == (off_t)-1)
+ {
+ g_vfs_job_failed (G_VFS_JOB (job), G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ "Error seeking in file: %s",
+ g_strerror (errno));
+ }
+ else
+ {
+ g_vfs_job_seek_read_set_offset (job, offset);
+ g_vfs_job_succeeded (G_VFS_JOB (job));
+ }
+
+ return TRUE;
+}