Fri, 29 Apr 2016 02:03:24 -0500
libpurple: Add PurpleQueuedOutputStream for fire and forget output
This patch adds a queued GOutputStream implementation to allow
queuing data to send even if a stream operation is in progress.
This could potentially be upstreamed to Gio with some
cleanup/reformatting.
|
37665
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
1 | /* |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
2 | * |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
3 | * purple |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
4 | * |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
5 | * Purple is the legal property of its developers, whose names are too numerous |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
6 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
7 | * source distribution. |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
8 | * |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
9 | * This program is free software; you can redistribute it and/or modify |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
10 | * it under the terms of the GNU General Public License as published by |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
11 | * the Free Software Foundation; either version 2 of the License, or |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
12 | * (at your option) any later version. |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
13 | * |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
14 | * This program is distributed in the hope that it will be useful, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
17 | * GNU General Public License for more details. |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
18 | * |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
19 | * You should have received a copy of the GNU General Public License |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
20 | * along with this program; if not, write to the Free Software |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
22 | */ |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
23 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
24 | #include "internal.h" |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
25 | #include "queuedoutputstream.h" |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
26 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
27 | struct _PurpleQueuedOutputStreamPrivate { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
28 | GAsyncQueue *queue; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
29 | }; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
30 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
31 | GObjectClass *parent_class = NULL; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
32 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
33 | #define PURPLE_QUEUED_OUTPUT_STREAM_GET_PRIVATE(obj) \ |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
34 | (G_TYPE_INSTANCE_GET_PRIVATE((obj), \ |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
35 | PURPLE_TYPE_QUEUED_OUTPUT_STREAM, \ |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
36 | PurpleQueuedOutputStreamPrivate)) |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
37 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
38 | G_DEFINE_TYPE_WITH_CODE(PurpleQueuedOutputStream, purple_queued_output_stream, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
39 | G_TYPE_FILTER_OUTPUT_STREAM, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
40 | G_ADD_PRIVATE(PurpleQueuedOutputStream)) |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
41 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
42 | static void purple_queued_output_stream_dispose(GObject *object); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
43 | static gboolean purple_queued_output_stream_flush(GOutputStream *stream, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
44 | GCancellable *cancellable, GError **error); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
45 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
46 | static void |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
47 | purple_queued_output_stream_class_init(PurpleQueuedOutputStreamClass *klass) |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
48 | { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
49 | GObjectClass *object_class; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
50 | GOutputStreamClass *ostream_class; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
51 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
52 | parent_class = g_type_class_peek_parent(klass); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
53 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
54 | object_class = G_OBJECT_CLASS(klass); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
55 | object_class->dispose = purple_queued_output_stream_dispose; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
56 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
57 | ostream_class = G_OUTPUT_STREAM_CLASS(klass); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
58 | ostream_class->flush = purple_queued_output_stream_flush; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
59 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
60 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
61 | PurpleQueuedOutputStream * |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
62 | purple_queued_output_stream_new(GOutputStream *base_stream) |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
63 | { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
64 | PurpleQueuedOutputStream *stream; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
65 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
66 | g_return_val_if_fail(G_IS_OUTPUT_STREAM(base_stream), NULL); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
67 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
68 | stream = g_object_new(PURPLE_TYPE_QUEUED_OUTPUT_STREAM, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
69 | "base-stream", base_stream, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
70 | NULL); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
71 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
72 | return stream; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
73 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
74 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
75 | void |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
76 | purple_queued_output_stream_push_bytes(PurpleQueuedOutputStream *stream, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
77 | GBytes *bytes) |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
78 | { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
79 | g_return_if_fail(PURPLE_QUEUED_OUTPUT_STREAM(stream)); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
80 | g_return_if_fail(bytes != NULL); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
81 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
82 | g_async_queue_push(stream->priv->queue, g_bytes_ref(bytes)); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
83 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
84 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
85 | static void |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
86 | purple_queued_output_stream_init(PurpleQueuedOutputStream *stream) |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
87 | { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
88 | stream->priv = PURPLE_QUEUED_OUTPUT_STREAM_GET_PRIVATE(stream); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
89 | stream->priv->queue = |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
90 | g_async_queue_new_full((GDestroyNotify)g_bytes_unref); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
91 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
92 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
93 | static void |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
94 | purple_queued_output_stream_dispose(GObject *object) |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
95 | { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
96 | PurpleQueuedOutputStream *stream = PURPLE_QUEUED_OUTPUT_STREAM(object); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
97 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
98 | /* Chain up first in case the stream is flushed */ |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
99 | G_OBJECT_CLASS(parent_class)->dispose(object); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
100 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
101 | g_clear_pointer(&stream->priv->queue, g_async_queue_unref); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
102 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
103 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
104 | static gboolean |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
105 | purple_queued_output_stream_flush(GOutputStream *stream, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
106 | GCancellable *cancellable, GError **error) |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
107 | { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
108 | GOutputStream *base_stream; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
109 | GAsyncQueue *queue; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
110 | GBytes *bytes; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
111 | const void *buffer; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
112 | gsize count; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
113 | gsize bytes_written = 0; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
114 | gboolean ret = TRUE; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
115 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
116 | base_stream = g_filter_output_stream_get_base_stream( |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
117 | G_FILTER_OUTPUT_STREAM(stream)); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
118 | queue = PURPLE_QUEUED_OUTPUT_STREAM(stream)->priv->queue; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
119 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
120 | do { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
121 | bytes = g_async_queue_try_pop(queue); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
122 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
123 | if (bytes == NULL) { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
124 | break; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
125 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
126 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
127 | buffer = g_bytes_get_data(bytes, &count); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
128 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
129 | ret = g_output_stream_write_all(base_stream, buffer, count, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
130 | &bytes_written, cancellable, error); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
131 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
132 | if (!ret) { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
133 | GBytes *queue_bytes; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
134 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
135 | if (bytes_written > 0) { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
136 | queue_bytes = g_bytes_new_from_bytes(bytes, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
137 | bytes_written, |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
138 | count - bytes_written); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
139 | } else { |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
140 | queue_bytes = g_bytes_ref(bytes); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
141 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
142 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
143 | g_async_queue_push_front(queue, queue_bytes); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
144 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
145 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
146 | g_bytes_unref(bytes); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
147 | } while (ret); |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
148 | |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
149 | return ret; |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
150 | } |
|
3eab84b9b88f
libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff
changeset
|
151 |