diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/http-files/src/file_provider.vala | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/plugins/http-files/src/file_provider.vala b/plugins/http-files/src/file_provider.vala index 7928dc81..1433a74f 100644 --- a/plugins/http-files/src/file_provider.vala +++ b/plugins/http-files/src/file_provider.vala @@ -46,7 +46,7 @@ public class FileProvider : Dino.FileProvider, Object { } } - private class LimitInputStream : InputStream { + private class LimitInputStream : InputStream, PollableInputStream { InputStream inner; int64 remaining_size; @@ -55,6 +55,20 @@ public class FileProvider : Dino.FileProvider, Object { this.remaining_size = max_size; } + public bool can_poll() { + return inner is PollableInputStream && ((PollableInputStream)inner).can_poll(); + } + + public PollableSource create_source(Cancellable? cancellable = null) { + if (!can_poll()) throw new IOError.NOT_SUPPORTED("Stream is not pollable"); + return ((PollableInputStream)inner).create_source(cancellable); + } + + public bool is_readable() { + if (!can_poll()) throw new IOError.NOT_SUPPORTED("Stream is not pollable"); + return ((PollableInputStream)inner).is_readable(); + } + private ssize_t check_limit(ssize_t read) throws IOError { this.remaining_size -= read; if (remaining_size < 0) throw new IOError.FAILED("Stream length exceeded limit"); @@ -69,6 +83,11 @@ public class FileProvider : Dino.FileProvider, Object { return check_limit(yield inner.read_async(buffer, io_priority, cancellable)); } + public ssize_t read_nonblocking_fn(uint8[] buffer) throws Error { + if (!is_readable()) throw new IOError.WOULD_BLOCK("Stream is not readable"); + return read(buffer); + } + public override bool close(Cancellable? cancellable = null) throws IOError { return inner.close(cancellable); } |