From 98bfba6c534daee4ee6614a644f75e871ef86cfe Mon Sep 17 00:00:00 2001 From: "Zeeshan Ali (Khattak)" Date: Sun, 18 Jan 2009 19:27:44 +0000 Subject: [PATCH] More extensive use of (async) GIO. svn path=/trunk/; revision=449 --- src/rygel/rygel-http-server.vala | 8 +-- src/rygel/rygel-interactive-response.vala | 83 ++++++++++++++++++++----------- 2 files changed, 60 insertions(+), 31 deletions(-) diff --git a/src/rygel/rygel-http-server.vala b/src/rygel/rygel-http-server.vala index d8922f6..ec270b2 100644 --- a/src/rygel/rygel-http-server.vala +++ b/src/rygel/rygel-http-server.vala @@ -83,11 +83,13 @@ public class Rygel.HTTPServer : GLib.Object { private void serve_uri (string uri, Soup.Message msg, - Seek? seek) throws Error { + Seek? seek, + size_t size) throws Error { var response = new InteractiveResponse (this.context.server, msg, uri, - seek); + seek, + size); response.ended += on_response_ended; this.responses.append (response); @@ -243,7 +245,7 @@ public class Rygel.HTTPServer : GLib.Object { } try { - this.serve_uri (uri, msg, seek); + this.serve_uri (uri, msg, seek, item.res.size); } catch (Error error) { warning ("Error in attempting to serve %s: %s", uri, diff --git a/src/rygel/rygel-interactive-response.vala b/src/rygel/rygel-interactive-response.vala index 671dffe..c79f3f0 100644 --- a/src/rygel/rygel-interactive-response.vala +++ b/src/rygel/rygel-interactive-response.vala @@ -29,61 +29,88 @@ using GUPnP; public class Rygel.InteractiveResponse : Rygel.HTTPResponse { private Seek seek; + private File file; + + private char[] buffer; + private size_t length; public InteractiveResponse (Soup.Server server, Soup.Message msg, string uri, - Seek? seek) throws Error { + Seek? seek, + size_t file_length) throws Error { base (server, msg, false); this.seek = seek; + this.length = file_length; if (seek != null) { msg.set_status (Soup.KnownStatusCode.PARTIAL_CONTENT); + this.length = (size_t) seek.length; } else { + this.length = file_length; msg.set_status (Soup.KnownStatusCode.OK); } - File file = File.new_for_uri (uri); + this.buffer = new char[this.length]; + this.file = File.new_for_uri (uri); - file.load_contents_async (null, this.on_contents_loaded); + this.file.read_async (Priority.DEFAULT, null, this.on_file_read); } - private void on_contents_loaded (GLib.Object source_object, - GLib.AsyncResult result) { - File file = (File) source_object; - string contents; - size_t file_length; + private void on_file_read (GLib.Object source_object, + GLib.AsyncResult result) { + FileInputStream input_stream = null; try { - file.load_contents_finish (result, - out contents, - out file_length, - null); - } catch (Error error) { - warning ("Failed to load contents from URI: %s: %s\n", + input_stream = this.file.read_finish (result); + } catch (Error err) { + warning ("Failed to read from URI: %s: %s\n", file.get_uri (), - error.message); - msg.set_status (Soup.KnownStatusCode.NOT_FOUND); + err.message); + this.msg.set_status (Soup.KnownStatusCode.NOT_FOUND); return; } - size_t offset; - size_t length; if (seek != null) { - offset = (size_t) seek.start; - length = (size_t) seek.length; - - assert (offset < file_length); - assert (length <= file_length); - } else { - offset = 0; - length = file_length; + try { + input_stream.seek (seek.start, SeekType.SET, null); + } catch (Error err) { + warning ("Failed to seek to %s-%s on URI %s: %s\n", + seek.start.to_string (), + seek.stop.to_string (), + file.get_uri (), + err.message); + this.msg.set_status ( + Soup.KnownStatusCode.REQUESTED_RANGE_NOT_SATISFIABLE); + return; + } } - char *data = (char *) contents + offset; + input_stream.read_async (this.buffer, + this.length, + Priority.DEFAULT, + null, + on_contents_read); + + + } + + private void on_contents_read (GLib.Object source_object, + GLib.AsyncResult result) { + FileInputStream input_stream = (FileInputStream) source_object; + + try { + input_stream.read_finish (result); + } catch (Error err) { + warning ("Failed to read contents from URI: %s: %s\n", + this.file.get_uri (), + err.message); + this.msg.set_status (Soup.KnownStatusCode.NOT_FOUND); + return; + } - this.push_data (data, length); + this.push_data (this.buffer, this.length); this.end (false); } } -- 2.7.4