libpurple/queuedoutputstream.c

Mon, 12 Dec 2022 23:38:47 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 12 Dec 2022 23:38:47 -0600
changeset 41966
c7bcaf2f41ef
parent 41960
c8a4853205e3
permissions
-rw-r--r--

Create PurpleAvatar to represent avatars

Testing Done:
Ran the unit tests and manually verified the docs.

Reviewed at https://reviews.imfreedom.org/r/2092/

37665
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
1 /*
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
2 * Purple - Internet Messaging Library
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
37665
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 * 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
6 * 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
7 * 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
8 * (at your option) any later version.
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
9 *
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
10 * 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
11 * 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
12 * 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
13 * GNU General Public License for more details.
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
14 *
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
16 * along with this program; if not, see <https://www.gnu.org/licenses/>.
37665
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
17 */
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 #include "queuedoutputstream.h"
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
20
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
21 struct _PurpleQueuedOutputStream
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
22 {
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
23 GFilterOutputStream parent;
37665
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
24
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
25 GAsyncQueue *queue;
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
26 gboolean pending_queued;
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
27 } PurpleQueuedOutputStreamPrivate;
37665
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
28
41727
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
29 G_DEFINE_TYPE(PurpleQueuedOutputStream, purple_queued_output_stream,
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
30 G_TYPE_FILTER_OUTPUT_STREAM)
37665
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
31
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
32 /******************************************************************************
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
33 * Helpers
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
34 *****************************************************************************/
37665
3eab84b9b88f libpurple: Add PurpleQueuedOutputStream for fire and forget output
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
35
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
36 static void purple_queued_output_stream_start_push_bytes_async(GTask *task);
37978
266009ac8af6 purplequeuedoutputstream: Implement unthreaded asynchronous flush
Mike Ruprecht <cmaiku@gmail.com>
parents: 37975
diff changeset
37
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
38 static void
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
39 purple_queued_output_stream_push_bytes_async_cb(GObject *source,
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
40 GAsyncResult *res,
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
41 gpointer user_data)
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
42 {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
43 GTask *task = G_TASK(user_data);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
44 PurpleQueuedOutputStream *stream = g_task_get_source_object(task);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
45 gssize written;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
46 GBytes *bytes;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
47 gsize size;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
48 GError *error = NULL;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
49
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
50 written = g_output_stream_write_bytes_finish(G_OUTPUT_STREAM(source),
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
51 res, &error);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
52
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
53 bytes = g_task_get_task_data(task);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
54 size = g_bytes_get_size(bytes);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
55
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
56 if (written < 0) {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
57 /* Error occurred, return error */
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
58 g_task_return_error(task, error);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
59 g_clear_object(&task);
41960
c8a4853205e3 Bump C standard to C99 for libpurple files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41795
diff changeset
60 } else if (size > (gsize)written) {
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
61 /* Partial write, prepare to send remaining data */
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
62 bytes = g_bytes_new_from_bytes(bytes, written, size - written);
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
63 g_task_set_task_data(task, bytes, (GDestroyNotify)g_bytes_unref);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
64 } else {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
65 /* Full write, this task is finished */
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
66 g_task_return_boolean(task, TRUE);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
67 g_clear_object(&task);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
68 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
69
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
70 /* If g_task_return_* was called in this function, the callback
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
71 * may have cleared the stream. If so, there will be no remaining
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
72 * tasks to process here.
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
73 */
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
74
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
75 if (task == NULL) {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
76 /* Any queued data left? */
41727
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
77 task = g_async_queue_try_pop(stream->queue);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
78 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
79
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
80 if (task != NULL) {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
81 /* More to process */
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
82 purple_queued_output_stream_start_push_bytes_async(task);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
83 } else {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
84 /* All done */
41727
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
85 stream->pending_queued = FALSE;
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
86 g_output_stream_clear_pending(G_OUTPUT_STREAM(stream));
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
87 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
88 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
89
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
90 static void
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
91 purple_queued_output_stream_start_push_bytes_async(GTask *task) {
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
92 PurpleQueuedOutputStream *stream = g_task_get_source_object(task);
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
93 GOutputStream *base_stream = NULL;
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
94 GFilterOutputStream *filtered = NULL;
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
95
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
96 filtered = G_FILTER_OUTPUT_STREAM(stream);
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
97 base_stream = g_filter_output_stream_get_base_stream(filtered);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
98
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
99 g_output_stream_write_bytes_async(base_stream, g_task_get_task_data(task),
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
100 g_task_get_priority(task),
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
101 g_task_get_cancellable(task),
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
102 purple_queued_output_stream_push_bytes_async_cb,
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
103 task);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
104 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
105
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
106 /******************************************************************************
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
107 * GObject Implementation
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
108 *****************************************************************************/
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
109 static void
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
110 purple_queued_output_stream_dispose(GObject *object) {
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
111 PurpleQueuedOutputStream *stream = PURPLE_QUEUED_OUTPUT_STREAM(object);
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
112
41727
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
113 g_clear_pointer(&stream->queue, g_async_queue_unref);
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
114
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
115 G_OBJECT_CLASS(purple_queued_output_stream_parent_class)->dispose(object);
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
116 }
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
117
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
118 static void
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
119 purple_queued_output_stream_class_init(PurpleQueuedOutputStreamClass *klass) {
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
120 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
121
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
122 obj_class->dispose = purple_queued_output_stream_dispose;
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
123 }
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
124
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
125 static void
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
126 purple_queued_output_stream_init(PurpleQueuedOutputStream *stream) {
41727
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
127 stream->queue = g_async_queue_new_full((GDestroyNotify)g_bytes_unref);
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
128 stream->pending_queued = FALSE;
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
129 }
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
130
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
131 /******************************************************************************
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
132 * Public API
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
133 *****************************************************************************/
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
134 PurpleQueuedOutputStream *
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
135 purple_queued_output_stream_new(GOutputStream *base_stream) {
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
136 g_return_val_if_fail(G_IS_OUTPUT_STREAM(base_stream), NULL);
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
137
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
138 return g_object_new(
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
139 PURPLE_TYPE_QUEUED_OUTPUT_STREAM,
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
140 "base-stream", base_stream,
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
141 NULL);
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
142 }
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
143
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
144 void
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
145 purple_queued_output_stream_push_bytes_async(PurpleQueuedOutputStream *stream,
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
146 GBytes *bytes, int io_priority,
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
147 GCancellable *cancellable,
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
148 GAsyncReadyCallback callback,
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
149 gpointer user_data)
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
150 {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
151 GTask *task;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
152 gboolean set_pending;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
153 GError *error = NULL;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
154
39540
8a5927c69f02 Use more standard GObject setup for queuedoutputstream.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 39169
diff changeset
155 g_return_if_fail(PURPLE_IS_QUEUED_OUTPUT_STREAM(stream));
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
156 g_return_if_fail(bytes != NULL);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
157
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
158 task = g_task_new(stream, cancellable, callback, user_data);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
159 g_task_set_task_data(task, g_bytes_ref(bytes),
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
160 (GDestroyNotify)g_bytes_unref);
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
161 g_task_set_source_tag(task, purple_queued_output_stream_push_bytes_async);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
162 g_task_set_priority(task, io_priority);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
163
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
164 set_pending = g_output_stream_set_pending(G_OUTPUT_STREAM(stream), &error);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
166 /* Since we're allowing queuing requests without blocking,
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
167 * it's not an error to be pending while processing queued operations.
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
168 */
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
169 if(!set_pending &&
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
170 (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_PENDING) ||
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
171 !stream->pending_queued))
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
172 {
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
173 g_task_return_error(task, error);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
174 g_object_unref(task);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
175 return;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
176 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
177
41727
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
178 g_clear_error(&error);
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
179 stream->pending_queued = TRUE;
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
180
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
181 if(set_pending) {
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
182 /* Start processing if there were no pending operations */
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
183 purple_queued_output_stream_start_push_bytes_async(task);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
184 } else {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
185 /* Otherwise queue the data */
41727
d88b05eadbd7 De-privatize PurpleQueuedOutputStream
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41685
diff changeset
186 g_async_queue_push(stream->queue, task);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
187 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
188 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
189
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
190 gboolean
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
191 purple_queued_output_stream_push_bytes_finish(PurpleQueuedOutputStream *stream,
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
192 GAsyncResult *result,
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
193 GError **error)
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
194 {
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
195 g_return_val_if_fail(PURPLE_IS_QUEUED_OUTPUT_STREAM(stream), FALSE);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
196 g_return_val_if_fail(g_task_is_valid(result, stream), FALSE);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
197 g_return_val_if_fail(g_async_result_is_tagged(result,
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
198 purple_queued_output_stream_push_bytes_async),
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
199 FALSE);
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
200
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
201 return g_task_propagate_boolean(G_TASK(result), error);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
202 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
203
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
204 void
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
205 purple_queued_output_stream_clear_queue(PurpleQueuedOutputStream *stream) {
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
206 GTask *task;
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
207
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
208 g_return_if_fail(PURPLE_IS_QUEUED_OUTPUT_STREAM(stream));
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
209
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
210 while((task = g_async_queue_try_pop(stream->queue)) != NULL) {
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
211 g_task_return_new_error(task, G_IO_ERROR, G_IO_ERROR_CANCELLED,
41795
95c0077fe6bb Fix the docs and do some minor clean up for PurpleQueuedOutputStream
Gary Kramlich <grim@reaperworld.com>
parents: 41727
diff changeset
212 "PurpleQueuedOutputStream queue cleared");
39165
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
213 g_object_unref(task);
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
214 }
62b8ef4dd1d3 queuedoutputstream: Refactor to behave better with the rest of Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 38052
diff changeset
215 }

mercurial