libpurple/protocols/ircv3/purpleircv3capabilities.c

Thu, 05 Jan 2023 22:41:48 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 05 Jan 2023 22:41:48 -0600
changeset 42006
d3c594113fe1
parent 41957
17fd3bcecaeb
child 42023
5bda87b90d8d
permissions
-rw-r--r--

Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation

Testing Done:
Connected an IRCv3 account to a local ergo instance and verified that the capabilties we ended properly.

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

41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * This program is free software; you can redistribute it and/or modify
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * the Free Software Foundation; either version 2 of the License, or
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 * (at your option) any later version.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 * GNU General Public License for more details.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * along with this program; if not, see <https://www.gnu.org/licenses/>.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 #include "purpleircv3capabilities.h"
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 #include "purpleircv3connection.h"
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22 #include "purpleircv3core.h"
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
24 #define PURPLE_IRCV3_CAPABILITIES_VERSION "302"
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
25
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26 enum {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 PROP_0,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28 PROP_CONNECTION,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 N_PROPERTIES,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32
41952
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
33 /* Windows is does something weird with signal handling that includes defining
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
34 * SIG_ACK. We don't care about that here, so we undef it if we find it.
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
35 * See https://learn.microsoft.com/en-us/cpp/c-runtime-library/signal-action-constants?view=msvc-170
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
36 */
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
37 #ifdef SIG_ACK
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
38 # undef SIG_ACK
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
39 #endif /* SIG_ACK */
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
40
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41 enum {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 SIG_READY,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 SIG_ACK,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 SIG_NAK,
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
45 SIG_DONE,
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
46 SIG_NEW,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
47 SIG_DEL,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 N_SIGNALS,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49 };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50 static guint signals[N_SIGNALS] = {0, };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 struct _PurpleIRCv3Capabilities {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53 GObject parent;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 PurpleIRCv3Connection *connection;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 GHashTable *caps;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 GPtrArray *requests;
42006
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
59
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
60 gatomicrefcount wait_counters;
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 * Helpers
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 purple_ircv3_capabilities_set_connection(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 PurpleIRCv3Connection *connection)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 g_return_if_fail(PURPLE_IRCV3_IS_CAPABILITIES(capabilities));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 if(g_set_object(&capabilities->connection, connection)) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 g_object_notify_by_pspec(G_OBJECT(capabilities),
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 properties[PROP_CONNECTION]);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
78 static void
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
79 purple_ircv3_capabilities_finish(PurpleIRCv3Capabilities *capabilities) {
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
80 purple_ircv3_connection_writef(capabilities->connection,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
81 "CAP END");
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
82
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
83 g_signal_emit(capabilities, signals[SIG_DONE], 0);
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
84 }
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
85
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
86 static void
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
87 purple_ircv3_capabilities_add(PurpleIRCv3Capabilities *capabilities,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
88 const char *capability)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
89 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
90 char *equals = g_strstr_len(capability, -1, "=");
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
91
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
92 if(equals != NULL) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
93 char *key = g_strndup(capability, equals - capability);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
94 char *value = g_strdup(equals + 1);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
95
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
96 g_hash_table_insert(capabilities->caps, key, value);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
97 } else {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
98 g_hash_table_insert(capabilities->caps, g_strdup(capability), NULL);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
99 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
100 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
101
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
102 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
103 * PurpleIRCv3Capabilities Implementation
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
104 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
106 purple_ircv3_capabilities_default_ready_cb(PurpleIRCv3Capabilities *capabilities)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
107 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
108 gboolean found = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
109
42006
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
110 /* cap-notify is implied when we use CAP LS 302, so this is really just to
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
111 * make sure it's requested.
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
112 */
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
113 purple_ircv3_capabilities_lookup(capabilities, "cap-notify", &found);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114 if(found) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115 purple_ircv3_capabilities_request(capabilities, "cap-notify");
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120 * GObject Implementation
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
122 G_DEFINE_DYNAMIC_TYPE(PurpleIRCv3Capabilities, purple_ircv3_capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
123 G_TYPE_OBJECT)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
124
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
126 purple_ircv3_capabilities_get_property(GObject *obj, guint param_id,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
127 GValue *value, GParamSpec *pspec)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
131 switch(param_id) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
132 case PROP_CONNECTION:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
133 g_value_set_object(value,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
134 purple_ircv3_capabilities_get_connection(capabilities));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136 default:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
143 purple_ircv3_capabilities_set_property(GObject *obj, guint param_id,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 const GValue *value, GParamSpec *pspec)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 switch(param_id) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 case PROP_CONNECTION:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
150 purple_ircv3_capabilities_set_connection(capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151 g_value_get_object(value));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 default:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160 purple_ircv3_capabilities_dispose(GObject *obj) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
162
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
163 g_clear_object(&capabilities->connection);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
164
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165 G_OBJECT_CLASS(purple_ircv3_capabilities_parent_class)->dispose(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169 purple_ircv3_capabilities_finalize(GObject *obj) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172 g_hash_table_destroy(capabilities->caps);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173 g_ptr_array_free(capabilities->requests, TRUE);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 G_OBJECT_CLASS(purple_ircv3_capabilities_parent_class)->finalize(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 purple_ircv3_capabilities_init(PurpleIRCv3Capabilities *capabilities) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180 capabilities->caps = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181 g_free);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 capabilities->requests = g_ptr_array_new_full(0, g_free);
42006
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
183
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
184 g_atomic_ref_count_init(&capabilities->wait_counters);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
186
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
187 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
188 purple_ircv3_capabilities_class_finalize(G_GNUC_UNUSED PurpleIRCv3CapabilitiesClass *klass) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
189 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
190
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
191 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
192 purple_ircv3_capabilities_class_init(PurpleIRCv3CapabilitiesClass *klass) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
194
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
195 obj_class->dispose = purple_ircv3_capabilities_dispose;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
196 obj_class->finalize = purple_ircv3_capabilities_finalize;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
197 obj_class->get_property = purple_ircv3_capabilities_get_property;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
198 obj_class->set_property = purple_ircv3_capabilities_set_property;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
199
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
200 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
201 * PurpleIRCv3Capabilities:connection:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
202 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
203 * The PurpleIRCv3Connection object that this capabilities was created
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
204 * with.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
205 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
206 * Since: 3.0.0
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
207 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
208 properties[PROP_CONNECTION] = g_param_spec_object(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
209 "connection", "connection",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
210 "The connection this capabilities was created for.",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
211 PURPLE_IRCV3_TYPE_CONNECTION,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
212 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
213
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
214 g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217 * PurpleIRCv3Capabilities::ready:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218 * @capabilities: The instance.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
219 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
220 * Emitted when @capabilities has finished receiving the list of
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
221 * capabilities from the server at startup.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
222 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
223 * For dynamically added capabilities see the `added` and `removed`
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
224 * signals.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
225 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
226 * Since: 3.0.0
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
227 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
228 signals[SIG_READY] = g_signal_new_class_handler(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
229 "ready",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
230 G_OBJECT_CLASS_TYPE(klass),
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
231 G_SIGNAL_RUN_LAST,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
232 G_CALLBACK(purple_ircv3_capabilities_default_ready_cb),
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
233 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
235 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
236 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
237 0);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
238
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
239 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
240 * PurpleIRCv3Capabilities::ack:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
241 * @capabilities: The instance.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
242 * @capability: The capability string.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
243 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
244 * Emitted when the server has acknowledged a `CAP REQ` call from
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
245 * purple_ircv3_capabilities_request.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
246 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
247 * The value of @capability will be the same as the one that was requested.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
248 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
249 * Since: 3.0.0
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
250 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
251 signals[SIG_ACK] = g_signal_new_class_handler(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
252 "ack",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
253 G_OBJECT_CLASS_TYPE(klass),
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
254 G_SIGNAL_RUN_LAST,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
255 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
256 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
257 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
258 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
259 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
260 1,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
261 G_TYPE_STRING);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
262
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
263 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
264 * PurpleIRCv3Capabilities::nak:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
265 * @capabilities: The instance.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
266 * @capability: The capability string.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
267 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
268 * Emitted when the server has nacked a `CAP REQ` call from
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
269 * purple_ircv3_capabilities_request.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
270 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
271 * The value of @capability will be the same as the one that was requested.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
272 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
273 * Since: 3.0.0
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
274 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
275 signals[SIG_NAK] = g_signal_new_class_handler(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
276 "nak",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
277 G_OBJECT_CLASS_TYPE(klass),
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
278 G_SIGNAL_RUN_LAST,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
279 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
280 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
281 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
282 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
283 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
284 1,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
285 G_TYPE_STRING);
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
286
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
287 /**
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
288 * PurpleIRCv3Capabilities::done:
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
289 * @capabilities: The instance.
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
290 *
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
291 * Emitted when all of the requested capabilities have been either ack'd or
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
292 * nak'd by the server.
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
293 *
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
294 * Since: 3.0.0
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
295 */
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
296 signals[SIG_DONE] = g_signal_new_class_handler(
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
297 "done",
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
298 G_OBJECT_CLASS_TYPE(klass),
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
299 G_SIGNAL_RUN_LAST,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
300 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
301 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
302 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
303 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
304 G_TYPE_NONE,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
305 0);
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
306
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
307 /**
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
308 * PurpleIRCv3Capabilities::new:
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
309 * @capabilities: The instance.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
310 * @added: The newly added capabilities.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
311 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
312 * Emitted when the server sends the `CAP NEW` command. @added is a
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
313 * [type@GLib.Strv] of the new capabilities the server added.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
314 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
315 * There are two approaches to how you can use this signal. You can check
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
316 * each item in @added for the values you need and parsing their values, or
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
317 * you can call #purple_ircv3_capabilities_lookup to see if the
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
318 * capabilities you're interested in have been added.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
319 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
320 * Since: 3.0.0
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
321 */
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
322 signals[SIG_NEW] = g_signal_new_class_handler(
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
323 "new",
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
324 G_OBJECT_CLASS_TYPE(klass),
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
325 G_SIGNAL_RUN_LAST,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
326 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
327 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
328 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
329 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
330 G_TYPE_NONE,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
331 1,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
332 G_TYPE_STRV);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
333
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
334 /**
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
335 * PurpleIRCv3Capabilities::del:
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
336 * @capabilities: The instance.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
337 * @removed: The capabilities that were removed.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
338 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
339 * Emitted when the server sends the `CAP DEL` command. @removed is a
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
340 * [type@GLib.Strv] of the capabilities that the server removed.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
341 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
342 * There are two approaches to how you can use this signal. You can check
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
343 * each item in @removed for the values you care about, or you can call
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
344 * #purple_ircv3_capabilities_lookup to see if the capabilities you're
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
345 * interested in have been removed.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
346 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
347 * Since: 3.0.0
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
348 */
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
349 signals[SIG_DEL] = g_signal_new_class_handler(
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
350 "del",
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
351 G_OBJECT_CLASS_TYPE(klass),
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
352 G_SIGNAL_RUN_LAST,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
353 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
354 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
355 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
356 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
357 G_TYPE_NONE,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
358 1,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
359 G_TYPE_STRV);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
360 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
361
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
362 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
363 * Command handlers
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
364 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
365 static gboolean
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
366 purple_ircv3_capabilities_handle_list(PurpleIRCv3Capabilities *capabilities,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
367 guint n_params,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
368 GStrv params,
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
369 G_GNUC_UNUSED GError **error)
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
370 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
371 gboolean done = TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
372 gchar **parts = NULL;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
373
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
374 /* Check if we have more messages coming. */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
375 if(n_params > 1 && purple_strequal(params[0], "*")) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
376 parts = g_strsplit(params[1], " ", -1);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
377 done = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
378 } else {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
379 parts = g_strsplit(params[0], " ", -1);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
380 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
381
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
382 /* Add each capability to our hash table, splitting the keys and values. */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
383 for(int i = 0; parts[i] != NULL; i++) {
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
384 purple_ircv3_capabilities_add(capabilities, parts[i]);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
385 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
386
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
387 g_strfreev(parts);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
388
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
389 if(done) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
390 g_signal_emit(capabilities, signals[SIG_READY], 0, signals[SIG_READY]);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
391
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
392 /* If no capabilities were requested after we emitted the ready signal
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
393 * we're done with capability negotiation.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
394 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
395 if(capabilities->requests->len == 0) {
42006
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
396 purple_ircv3_capabilities_remove_wait(capabilities);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
397 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
398 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
399
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
400 return TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
401 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
402
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
403 static gboolean
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
404 purple_ircv3_capabilities_handle_ack_nak(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
405 GStrv params,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
406 guint sig,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
407 const char *method,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
408 GError **error)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
409 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
410 char *caps = g_strjoinv(" ", params);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
411 guint index = 0;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
412 gboolean found = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
413 gboolean ret = TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
414
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
415 g_signal_emit(capabilities, sig, 0, caps);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
416
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
417 found = g_ptr_array_find_with_equal_func(capabilities->requests, caps,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
418 g_str_equal, &index);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
419 if(found) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
420 g_ptr_array_remove_index(capabilities->requests, index);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
421 } else {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
422 g_set_error(error, PURPLE_IRCV3_DOMAIN, 0,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
423 "received CAP %s for unknown capability %s", method, caps);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
424 ret = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
425 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
426 g_free(caps);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
427
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
428 if(capabilities->requests->len == 0) {
42006
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
429 purple_ircv3_capabilities_remove_wait(capabilities);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
430 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
431
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
432 return ret;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
433 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
434
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
435 static gboolean
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
436 purple_ircv3_capabilities_handle_new(PurpleIRCv3Capabilities *capabilities,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
437 guint n_params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
438 GStrv params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
439 G_GNUC_UNUSED GError **error)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
440 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
441 for(guint i = 0; i < n_params; i++) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
442 purple_ircv3_capabilities_add(capabilities, params[i]);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
443 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
444
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
445 g_signal_emit(capabilities, signals[SIG_NEW], 0, params);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
446
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
447 return TRUE;
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
448 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
449
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
450 static gboolean
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
451 purple_ircv3_capabilities_handle_del(PurpleIRCv3Capabilities *capabilities,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
452 guint n_params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
453 GStrv params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
454 G_GNUC_UNUSED GError **error)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
455 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
456 for(guint i = 0; i < n_params; i++) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
457 g_hash_table_remove(capabilities->caps, params[i]);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
458 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
459
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
460 g_signal_emit(capabilities, signals[SIG_DEL], 0, params);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
461
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
462 return TRUE;
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
463 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
464
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
465 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
466 * Internal API
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
467 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
468 void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
469 purple_ircv3_capabilities_register(GPluginNativePlugin *plugin) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
470 purple_ircv3_capabilities_register_type(G_TYPE_MODULE(plugin));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
471 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
472
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
473 PurpleIRCv3Capabilities *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
474 purple_ircv3_capabilities_new(PurpleIRCv3Connection *connection) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
475 return g_object_new(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
476 PURPLE_IRCV3_TYPE_CAPABILITIES,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
477 "connection", connection,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
478 NULL);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
479 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
480
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
481 void
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
482 purple_ircv3_capabilities_start(PurpleIRCv3Capabilities *capabilities) {
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
483 purple_ircv3_connection_writef(capabilities->connection, "CAP LS %s",
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
484 PURPLE_IRCV3_CAPABILITIES_VERSION);
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
485 }
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
486
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
487 gboolean
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
488 purple_ircv3_capabilities_message_handler(G_GNUC_UNUSED GHashTable *tags,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
489 G_GNUC_UNUSED const char *source,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
490 G_GNUC_UNUSED const char *command,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
491 guint n_params,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
492 GStrv params,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
493 GError **error,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
494 gpointer data)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
495 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
496 PurpleIRCv3Connection *connection = data;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
497 PurpleIRCv3Capabilities *capabilities = NULL;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
498 const char *subcommand = NULL;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
499 guint n_subparams = 0;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
500 GStrv subparams = NULL;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
501
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
502 if(n_params < 2) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
503 return FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
504 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
505
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
506 capabilities = purple_ircv3_connection_get_capabilities(connection);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
507
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
508 /* Initialize some variables to make it easier to call our sub command
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
509 * handlers.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
510 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
511 * params[0] is the nick or * if it hasn't been negotiated yet, we don't
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
512 * have a need for this, so we ignore it.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
513 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
514 * params[1] is the CAP subcommand sent from the server. We use it here
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
515 * purely for dispatching to our subcommand handlers.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
516 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
517 * params[2] and higher are the parameters to the subcommand. To make the
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
518 * code a bit easier all around, we subtract 2 from n_params to remove
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
519 * references to the nick and subcommand name. Like wise, we add 2 to the
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
520 * params GStrv which will now point to the second item in the array again
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
521 * ignoring the nick and subcommand.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
522 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
523 subcommand = params[1];
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
524 n_subparams = n_params - 2;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
525 subparams = params + 2;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
526
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
527 /* Dispatch the subcommand. */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
528 if(purple_strequal(subcommand, "LS") ||
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
529 purple_strequal(subcommand, "LIST"))
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
530 {
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
531 return purple_ircv3_capabilities_handle_list(capabilities, n_subparams,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
532 subparams, error);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
533 } else if(purple_strequal(subcommand, "ACK")) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
534 return purple_ircv3_capabilities_handle_ack_nak(capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
535 subparams,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
536 signals[SIG_ACK],
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
537 "ACK",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
538 error);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
539 } else if(purple_strequal(subcommand, "NAK")) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
540 return purple_ircv3_capabilities_handle_ack_nak(capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
541 subparams,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
542 signals[SIG_NAK],
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
543 "NAK",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
544 error);
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
545 } else if(purple_strequal(subcommand, "NEW")) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
546 return purple_ircv3_capabilities_handle_new(capabilities, n_subparams,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
547 subparams, error);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
548 } else if(purple_strequal(subcommand, "DEL")) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
549 return purple_ircv3_capabilities_handle_del(capabilities, n_subparams,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
550 subparams, error);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
551 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
552
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
553 g_set_error(error, PURPLE_IRCV3_DOMAIN, 0,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
554 "No handler for CAP subcommand %s", subcommand);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
555
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
556 return FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
557 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
558
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
559 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
560 * Public API
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
561 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
562 PurpleIRCv3Connection *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
563 purple_ircv3_capabilities_get_connection(PurpleIRCv3Capabilities *capabilities)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
564 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
565 g_return_val_if_fail(PURPLE_IRCV3_IS_CAPABILITIES(capabilities), NULL);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
566
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
567 return capabilities->connection;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
568 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
569
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
570 void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
571 purple_ircv3_capabilities_request(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
572 const char *capability)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
573 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
574 g_return_if_fail(PURPLE_IRCV3_IS_CAPABILITIES(capabilities));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
575 g_return_if_fail(capability != NULL);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
576
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
577 g_ptr_array_add(capabilities->requests, g_strdup(capability));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
578
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
579 purple_ircv3_connection_writef(capabilities->connection, "CAP REQ :%s",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
580 capability);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
581 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
582
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
583 const char *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
584 purple_ircv3_capabilities_lookup(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
585 const char *name, gboolean *found)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
586 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
587 gpointer value = NULL;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
588 gboolean real_found = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
589
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
590 g_return_val_if_fail(PURPLE_IRCV3_IS_CAPABILITIES(capabilities), NULL);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
591 g_return_val_if_fail(name != NULL, NULL);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
592
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
593 real_found = g_hash_table_lookup_extended(capabilities->caps, name, NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
594 &value);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
595
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
596 if(found != NULL) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
597 *found = real_found;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
598 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
599
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
600 return value;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
601 }
42006
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
602
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
603 void
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
604 purple_ircv3_capabilities_add_wait(PurpleIRCv3Capabilities *capabilities) {
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
605 g_return_if_fail(PURPLE_IRCV3_IS_CAPABILITIES(capabilities));
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
606
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
607 g_atomic_ref_count_inc(&capabilities->wait_counters);
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
608 }
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
609
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
610 void
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
611 purple_ircv3_capabilities_remove_wait(PurpleIRCv3Capabilities *capabilities) {
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
612 g_return_if_fail(PURPLE_IRCV3_IS_CAPABILITIES(capabilities));
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
613
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
614 if(g_atomic_ref_count_dec(&capabilities->wait_counters)) {
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
615 purple_ircv3_capabilities_finish(capabilities);
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
616 }
d3c594113fe1 Add an atomic reference counters to the IRCv3 capabilities to track when we're done with negotiation
Gary Kramlich <grim@reaperworld.com>
parents: 41957
diff changeset
617 }

mercurial