aboutsummaryrefslogtreecommitdiff
path: root/xmpp-vala/src/core/stanza_writer.vala
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp-vala/src/core/stanza_writer.vala')
-rw-r--r--xmpp-vala/src/core/stanza_writer.vala42
1 files changed, 32 insertions, 10 deletions
diff --git a/xmpp-vala/src/core/stanza_writer.vala b/xmpp-vala/src/core/stanza_writer.vala
index e67920db..270d898d 100644
--- a/xmpp-vala/src/core/stanza_writer.vala
+++ b/xmpp-vala/src/core/stanza_writer.vala
@@ -2,26 +2,48 @@ namespace Xmpp.Core {
public class StanzaWriter {
private OutputStream output;
+ private Queue<SourceFuncWrapper> queue = new Queue<SourceFuncWrapper>();
+ private bool running = false;
+
public StanzaWriter.for_stream(OutputStream output) {
this.output = output;
}
- public void write_node(StanzaNode node) throws XmlError {
- try {
- lock(output) {
- output.write_all(node.to_xml().data, null);
- }
- } catch (GLib.IOError e) {
- throw new XmlError.IO_ERROR(@"IOError in GLib: $(e.message)");
- }
+ public async void write_node(StanzaNode node) throws XmlError {
+ yield write_data(node.to_xml().data);
}
public async void write(string s) throws XmlError {
+ yield write_data(s.data);
+ }
+
+ private async void write_data(uint8[] data) throws XmlError {
+ if (running) {
+ queue.push_tail(new SourceFuncWrapper(write_data.callback));
+ yield;
+ }
+ running = true;
try {
- output.write_all(s.data, null);
- } catch (GLib.IOError e) {
+ yield output.write_all_async(data, 0, null, null);
+ SourceFuncWrapper? sfw = queue.pop_head();
+ if (sfw != null) {
+ sfw.sfun();
+ }
+ } catch (GLib.Error e) {
throw new XmlError.IO_ERROR(@"IOError in GLib: $(e.message)");
+ } finally {
+ running = false;
}
}
}
+
+public class SourceFuncWrapper : Object {
+
+ public SourceFunc sfun;
+
+ public SourceFuncWrapper(owned SourceFunc sfun) {
+ this.sfun = (owned)sfun;
+ }
+}
+
}