libpurple/protocols/ircv3/purpleircv3capabilities.c

Tue, 12 Dec 2023 03:48:15 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 12 Dec 2023 03:48:15 -0600
changeset 42547
7a4558293dca
parent 42333
a34601ac633c
child 42568
31e8c7c92e2f
permissions
-rw-r--r--

Add birb as a subproject and make IRCv3 use it

Testing Done:
Connected an IRCv3 account to twitch without issue.

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

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"
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
23 #include "purpleircv3sasl.h"
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 enum {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26 PROP_0,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 PROP_CONNECTION,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28 N_PROPERTIES,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31
41952
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
32 /* 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
33 * 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
34 * 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
35 */
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
36 #ifdef SIG_ACK
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
37 # undef SIG_ACK
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
38 #endif /* SIG_ACK */
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
39
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 enum {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41 SIG_READY,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 SIG_ACK,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 SIG_NAK,
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
44 SIG_DONE,
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
45 SIG_NEW,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
46 SIG_DEL,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 N_SIGNALS,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49 static guint signals[N_SIGNALS] = {0, };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 struct _PurpleIRCv3Capabilities {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 GObject parent;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54 PurpleIRCv3Connection *connection;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 GHashTable *caps;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 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
58
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 gatomicrefcount wait_counters;
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 };
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 * Helpers
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 purple_ircv3_capabilities_set_connection(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 PurpleIRCv3Connection *connection)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 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
70
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 if(g_set_object(&capabilities->connection, connection)) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 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
73 properties[PROP_CONNECTION]);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 }
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
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
77 static void
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
78 purple_ircv3_capabilities_finish(PurpleIRCv3Capabilities *capabilities) {
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
79 purple_ircv3_connection_writef(capabilities->connection,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
80 "CAP END");
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
81
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
82 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
83 }
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
84
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
85 static void
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
86 purple_ircv3_capabilities_add(PurpleIRCv3Capabilities *capabilities,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
87 const char *capability)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
88 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
89 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
90
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
91 if(equals != NULL) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
92 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
93 char *value = g_strdup(equals + 1);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
94
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
95 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
96 } else {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
97 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
98 }
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
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
101 /******************************************************************************
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
102 * Callbacks
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
103 *****************************************************************************/
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
104 static void
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
105 ircv3_capabilities_message_tags_ack_cb(PurpleIRCv3Capabilities *capabilities,
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
106 G_GNUC_UNUSED const char *capability,
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
107 G_GNUC_UNUSED gpointer data)
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
108 {
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
109 /* We have message tags so add the stuff we support that depends on it. */
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
110 purple_ircv3_capabilities_lookup_and_request(capabilities, "msgid");
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
111 }
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
112
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
113 /******************************************************************************
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114 * PurpleIRCv3Capabilities Implementation
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117 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
118 {
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
119 PurpleAccount *account = NULL;
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
120 PurpleConnection *purple_connection = NULL;
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
122 purple_connection = PURPLE_CONNECTION(capabilities->connection);
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
123 account = purple_connection_get_account(purple_connection);
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
124
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
125 /* Don't request the sasl capability unless the user has selected the
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
126 * require-password option.
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
127 */
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
128 if(purple_account_get_require_password(account)) {
42055
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
129 gboolean found = FALSE;
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
130
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
131 purple_ircv3_capabilities_lookup(capabilities, "sasl", &found);
42055
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
132
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
133 if(found) {
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
134 purple_ircv3_sasl_request(capabilities);
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
135 }
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
136 }
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
137
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
138 /* 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
139 * 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
140 */
42055
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
141 purple_ircv3_capabilities_lookup_and_request(capabilities, "cap-notify");
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
142
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
143 /* message-tags is used for a lot of stuff so we need to tell everyone we
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
144 * do in fact support it.
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
145 */
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
146 if(purple_ircv3_capabilities_lookup_and_request(capabilities,
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
147 "message-tags"))
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
148 {
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
149 g_signal_connect(capabilities, "ack::message-tags",
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
150 G_CALLBACK(ircv3_capabilities_message_tags_ack_cb),
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
151 NULL);
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
152 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42287
diff changeset
153
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42287
diff changeset
154 /* The server-time capability just tells the server to send a tag to
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42287
diff changeset
155 * messages, so we just need to request it and then handle the tag when
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42287
diff changeset
156 * we're processing messages if it exists.
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42287
diff changeset
157 */
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42287
diff changeset
158 purple_ircv3_capabilities_lookup_and_request(capabilities,
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42287
diff changeset
159 PURPLE_IRCV3_CAPABILITY_SERVER_TIME);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161
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 * GObject Implementation
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_DEFINE_DYNAMIC_TYPE(PurpleIRCv3Capabilities, purple_ircv3_capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 G_TYPE_OBJECT)
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_get_property(GObject *obj, guint param_id,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170 GValue *value, GParamSpec *pspec)
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 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 switch(param_id) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 case PROP_CONNECTION:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 g_value_set_object(value,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177 purple_ircv3_capabilities_get_connection(capabilities));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 default:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180 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
181 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
186 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
187 const GValue *value, GParamSpec *pspec)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
188 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
189 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
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 switch(param_id) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
192 case PROP_CONNECTION:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 purple_ircv3_capabilities_set_connection(capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
194 g_value_get_object(value));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
195 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
196 default:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
197 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
198 break;
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
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
202 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
203 purple_ircv3_capabilities_dispose(GObject *obj) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
204 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
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 g_clear_object(&capabilities->connection);
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 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
209 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
210
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
211 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
212 purple_ircv3_capabilities_finalize(GObject *obj) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
213 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
214
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215 g_hash_table_destroy(capabilities->caps);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216 g_ptr_array_free(capabilities->requests, TRUE);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218 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
219 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
220
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
221 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
222 purple_ircv3_capabilities_init(PurpleIRCv3Capabilities *capabilities) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
223 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
224 g_free);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
225 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
226
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
227 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
228 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
229
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
230 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
231 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
232 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
233
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
235 purple_ircv3_capabilities_class_init(PurpleIRCv3CapabilitiesClass *klass) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
236 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
237
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
238 obj_class->dispose = purple_ircv3_capabilities_dispose;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
239 obj_class->finalize = purple_ircv3_capabilities_finalize;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
240 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
241 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
242
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 * PurpleIRCv3Capabilities:connection:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
245 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
246 * 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
247 * with.
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 properties[PROP_CONNECTION] = g_param_spec_object(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
252 "connection", "connection",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
253 "The connection this capabilities was created for.",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
254 PURPLE_IRCV3_TYPE_CONNECTION,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
255 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
256
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
257 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
258
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
259 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
260 * PurpleIRCv3Capabilities::ready:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
261 * @capabilities: The instance.
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 * 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
264 * capabilities from the server at startup.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
265 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
266 * 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
267 * signals.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
268 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
269 * Since: 3.0.0
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 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
272 "ready",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
273 G_OBJECT_CLASS_TYPE(klass),
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
274 G_SIGNAL_RUN_LAST,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
275 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
276 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
277 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
278 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
279 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
280 0);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
281
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
282 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
283 * PurpleIRCv3Capabilities::ack:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
284 * @capabilities: The instance.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
285 * @capability: The capability string.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
286 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
287 * 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
288 * purple_ircv3_capabilities_request.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
289 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
290 * 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
291 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
292 * Since: 3.0.0
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
293 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
294 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
295 "ack",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
296 G_OBJECT_CLASS_TYPE(klass),
42040
86284f7119e1 IRCv3: Add detail to the ack and nak signals for PurpleIRCv3Capabilities
Gary Kramlich <grim@reaperworld.com>
parents: 42023
diff changeset
297 G_SIGNAL_DETAILED | G_SIGNAL_RUN_LAST,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
298 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
299 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
300 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
301 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
302 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
303 1,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
304 G_TYPE_STRING);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
305
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
306 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
307 * PurpleIRCv3Capabilities::nak:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
308 * @capabilities: The instance.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
309 * @capability: The capability string.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
310 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
311 * 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
312 * purple_ircv3_capabilities_request.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
313 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
314 * 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
315 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
316 * Since: 3.0.0
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
317 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
318 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
319 "nak",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
320 G_OBJECT_CLASS_TYPE(klass),
42040
86284f7119e1 IRCv3: Add detail to the ack and nak signals for PurpleIRCv3Capabilities
Gary Kramlich <grim@reaperworld.com>
parents: 42023
diff changeset
321 G_SIGNAL_DETAILED | G_SIGNAL_RUN_LAST,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
322 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
323 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
324 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
325 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
326 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
327 1,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
328 G_TYPE_STRING);
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
329
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
330 /**
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
331 * PurpleIRCv3Capabilities::done:
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
332 * @capabilities: The instance.
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
333 *
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
334 * 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
335 * nak'd by the server.
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
336 *
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
337 * Since: 3.0.0
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
338 */
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
339 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
340 "done",
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
341 G_OBJECT_CLASS_TYPE(klass),
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
342 G_SIGNAL_RUN_LAST,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
343 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
344 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
345 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
346 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
347 G_TYPE_NONE,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
348 0);
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
349
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
350 /**
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
351 * PurpleIRCv3Capabilities::new:
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
352 * @capabilities: The instance.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
353 * @added: The newly added capabilities.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
354 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
355 * 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
356 * [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
357 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
358 * 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
359 * 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
360 * 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
361 * 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
362 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
363 * Since: 3.0.0
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
364 */
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
365 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
366 "new",
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
367 G_OBJECT_CLASS_TYPE(klass),
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
368 G_SIGNAL_RUN_LAST,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
369 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
370 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
371 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
372 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
373 G_TYPE_NONE,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
374 1,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
375 G_TYPE_STRV);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
376
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
377 /**
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
378 * PurpleIRCv3Capabilities::del:
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
379 * @capabilities: The instance.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
380 * @removed: The capabilities that were removed.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
381 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
382 * 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
383 * [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
384 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
385 * 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
386 * 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
387 * #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
388 * interested in have been removed.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
389 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
390 * Since: 3.0.0
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
391 */
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
392 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
393 "del",
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
394 G_OBJECT_CLASS_TYPE(klass),
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
395 G_SIGNAL_RUN_LAST,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
396 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
397 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
398 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
399 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
400 G_TYPE_NONE,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
401 1,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
402 G_TYPE_STRV);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
403 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
404
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
405 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
406 * Command handlers
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
407 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
408 static gboolean
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
409 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
410 guint n_params,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
411 GStrv params,
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
412 G_GNUC_UNUSED GError **error)
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
413 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
414 gboolean done = TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
415 gchar **parts = NULL;
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 /* Check if we have more messages coming. */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
418 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
419 parts = g_strsplit(params[1], " ", -1);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
420 done = FALSE;
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 parts = g_strsplit(params[0], " ", -1);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
423 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
424
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
425 /* 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
426 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
427 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
428 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
429
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
430 g_strfreev(parts);
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 if(done) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
433 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
434
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
435 /* 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
436 * we're done with capability negotiation.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
437 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
438 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
439 purple_ircv3_capabilities_remove_wait(capabilities);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
440 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
441 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
442
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
443 return TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
444 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
445
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
446 static gboolean
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
447 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
448 GStrv params,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
449 guint sig,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
450 const char *method,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
451 GError **error)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
452 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
453 char *caps = g_strjoinv(" ", params);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
454 guint index = 0;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
455 gboolean found = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
456 gboolean ret = TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
457
42040
86284f7119e1 IRCv3: Add detail to the ack and nak signals for PurpleIRCv3Capabilities
Gary Kramlich <grim@reaperworld.com>
parents: 42023
diff changeset
458 g_signal_emit(capabilities, sig, g_quark_from_string(caps), caps);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
459
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
460 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
461 g_str_equal, &index);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
462 if(found) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
463 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
464 } else {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
465 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
466 "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
467 ret = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
468 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
469 g_free(caps);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
470
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
471 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
472 purple_ircv3_capabilities_remove_wait(capabilities);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
473 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
474
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
475 return ret;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
476 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
477
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
478 static gboolean
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
479 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
480 guint n_params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
481 GStrv params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
482 G_GNUC_UNUSED GError **error)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
483 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
484 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
485 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
486 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
487
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
488 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
489
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
490 return TRUE;
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
491 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
492
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
493 static gboolean
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
494 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
495 guint n_params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
496 GStrv params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
497 G_GNUC_UNUSED GError **error)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
498 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
499 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
500 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
501 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
502
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
503 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
504
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
505 return TRUE;
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
506 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
507
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
508 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
509 * Internal API
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 void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
512 purple_ircv3_capabilities_register(GPluginNativePlugin *plugin) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
513 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
514 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
515
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
516 PurpleIRCv3Capabilities *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
517 purple_ircv3_capabilities_new(PurpleIRCv3Connection *connection) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
518 return g_object_new(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
519 PURPLE_IRCV3_TYPE_CAPABILITIES,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
520 "connection", connection,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
521 NULL);
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
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
524 void
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
525 purple_ircv3_capabilities_start(PurpleIRCv3Capabilities *capabilities) {
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
526 purple_ircv3_connection_writef(capabilities->connection, "CAP LS %s",
42287
8fc84ffcdcb2 IRCv3: Use constants for capability names
Gary Kramlich <grim@reaperworld.com>
parents: 42056
diff changeset
527 PURPLE_IRCV3_CAPABILITY_CAP_LS_VERSION);
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
528 }
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
529
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
530 gboolean
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
531 purple_ircv3_capabilities_message_handler(PurpleIRCv3Message *message,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
532 GError **error,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
533 gpointer data)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
534 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
535 PurpleIRCv3Connection *connection = data;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
536 PurpleIRCv3Capabilities *capabilities = NULL;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
537 GStrv params = NULL;
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
538 GStrv subparams = NULL;
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
539 const char *subcommand = NULL;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
540 guint n_params = 0;
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
541 guint n_subparams = 0;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
542
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
543 params = purple_ircv3_message_get_params(message);
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
544 if(params != NULL) {
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
545 n_params = g_strv_length(params);
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
546 }
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
547
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
548 if(n_params < 2) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
549 return FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
550 }
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 capabilities = purple_ircv3_connection_get_capabilities(connection);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
553
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
554 /* 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
555 * handlers.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
556 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
557 * 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
558 * 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
559 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
560 * 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
561 * purely for dispatching to our subcommand handlers.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
562 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
563 * 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
564 * 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
565 * 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
566 * 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
567 * ignoring the nick and subcommand.
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 subcommand = params[1];
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
570 n_subparams = n_params - 2;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
571 subparams = params + 2;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
572
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
573 /* Dispatch the subcommand. */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
574 if(purple_strequal(subcommand, "LS") ||
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
575 purple_strequal(subcommand, "LIST"))
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
576 {
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
577 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
578 subparams, error);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
579 } else if(purple_strequal(subcommand, "ACK")) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
580 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
581 subparams,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
582 signals[SIG_ACK],
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
583 "ACK",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
584 error);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
585 } else if(purple_strequal(subcommand, "NAK")) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
586 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
587 subparams,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
588 signals[SIG_NAK],
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
589 "NAK",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
590 error);
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
591 } else if(purple_strequal(subcommand, "NEW")) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
592 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
593 subparams, error);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
594 } else if(purple_strequal(subcommand, "DEL")) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
595 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
596 subparams, error);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
597 }
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 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
600 "No handler for CAP subcommand %s", subcommand);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
601
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
602 return FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
603 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
604
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
605 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
606 * Public API
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
607 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
608 PurpleIRCv3Connection *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
609 purple_ircv3_capabilities_get_connection(PurpleIRCv3Capabilities *capabilities)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
610 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
611 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
612
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
613 return capabilities->connection;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
614 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
615
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
616 void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
617 purple_ircv3_capabilities_request(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
618 const char *capability)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
619 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
620 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
621 g_return_if_fail(capability != NULL);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
622
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
623 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
624
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
625 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
626 capability);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
627 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
628
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
629 const char *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
630 purple_ircv3_capabilities_lookup(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
631 const char *name, gboolean *found)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
632 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
633 gpointer value = NULL;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
634 gboolean real_found = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
635
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
636 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
637 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
638
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
639 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
640 &value);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
641
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
642 if(found != NULL) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
643 *found = real_found;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
644 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
645
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
646 return value;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
647 }
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
648
42055
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
649 gboolean
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
650 purple_ircv3_capabilities_lookup_and_request(PurpleIRCv3Capabilities *capabilities,
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
651 const char *name)
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
652 {
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
653 gboolean found = FALSE;
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
654
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
655 g_return_val_if_fail(PURPLE_IRCV3_IS_CAPABILITIES(capabilities), FALSE);
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
656 g_return_val_if_fail(name != NULL, FALSE);
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
657
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
658 purple_ircv3_capabilities_lookup(capabilities, name, &found);
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
659 if(found) {
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
660 purple_ircv3_capabilities_request(capabilities, name);
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
661 }
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
662
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
663 return found;
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
664 }
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
665
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
666 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
667 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
668 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
669
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
670 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
671 }
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
672
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
673 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
674 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
675 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
676
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
677 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
678 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
679 }
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
680 }

mercurial