protocols/ircv3/purpleircv3capabilities.c

Thu, 11 Apr 2024 21:32:59 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 11 Apr 2024 21:32:59 -0500
changeset 42692
12506cd6fa96
parent 42652
225762d4e206
permissions
-rw-r--r--

Remove PurpleConnectionUiOps as they are no longer used

Testing Done:
Checked in with the turtles.

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

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 *
42568
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
7 * source distribution.
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
8 *
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
9 * This library is free software; you can redistribute it and/or modify
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * 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
11 * 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
12 * (at your option) any later version.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
42568
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
14 * This library is distributed in the hope that it will be useful,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * 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
16 * 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
17 * GNU General Public License for more details.
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 * You should have received a copy of the GNU General Public License
42568
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
20 * along with this library; if not, see <https://www.gnu.org/licenses/>.
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include "purpleircv3capabilities.h"
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 #include "purpleircv3connection.h"
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26 #include "purpleircv3core.h"
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
27 #include "purpleircv3sasl.h"
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 enum {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 PROP_0,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31 PROP_CONNECTION,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32 N_PROPERTIES,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33 };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35
41952
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
36 /* 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
37 * 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
38 * 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
39 */
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
40 #ifdef SIG_ACK
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
41 # undef SIG_ACK
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
42 #endif /* SIG_ACK */
e128168d9ea5 Fix a compilation error on windows and many warnings
Gary Kramlich <grim@reaperworld.com>
parents: 41951
diff changeset
43
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 enum {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 SIG_READY,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46 SIG_ACK,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 SIG_NAK,
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
48 SIG_DONE,
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
49 SIG_NEW,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
50 SIG_DEL,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 N_SIGNALS,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53 static guint signals[N_SIGNALS] = {0, };
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 struct _PurpleIRCv3Capabilities {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 GObject parent;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 PurpleIRCv3Connection *connection;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 GHashTable *caps;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 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
62
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
63 gatomicrefcount wait_counters;
41951
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
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 * Helpers
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 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 purple_ircv3_capabilities_set_connection(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 PurpleIRCv3Connection *connection)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 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
74
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 if(g_set_object(&capabilities->connection, connection)) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 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
77 properties[PROP_CONNECTION]);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
81 static void
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
82 purple_ircv3_capabilities_finish(PurpleIRCv3Capabilities *capabilities) {
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
83 purple_ircv3_connection_writef(capabilities->connection,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
84 "CAP END");
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
85
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
86 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
87 }
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
88
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
89 static void
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
90 purple_ircv3_capabilities_add(PurpleIRCv3Capabilities *capabilities,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
91 const char *capability)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
92 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
93 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
94
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
95 if(equals != NULL) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
96 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
97 char *value = g_strdup(equals + 1);
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 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
100 } else {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
101 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
102 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
103 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
104
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105 /******************************************************************************
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
106 * Callbacks
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
107 *****************************************************************************/
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
108 static void
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
109 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
110 G_GNUC_UNUSED const char *capability,
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
111 G_GNUC_UNUSED gpointer data)
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 /* 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
114 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
115 }
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
116
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
117 /******************************************************************************
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118 * PurpleIRCv3Capabilities Implementation
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121 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
122 {
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
123 PurpleAccount *account = NULL;
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
124 PurpleConnection *purple_connection = NULL;
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
126 purple_connection = PURPLE_CONNECTION(capabilities->connection);
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
127 account = purple_connection_get_account(purple_connection);
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
128
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
129 /* 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
130 * require-password option.
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
131 */
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
132 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
133 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
134
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
135 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
136
42023
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
137 if(found) {
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
138 purple_ircv3_sasl_request(capabilities);
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
139 }
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
140 }
5bda87b90d8d Implement SASL for IRCv3 using GSASL
Gary Kramlich <grim@reaperworld.com>
parents: 42006
diff changeset
141
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
142 /* 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
143 * 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
144 */
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
145 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
146
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
147 /* 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
148 * 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
149 */
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
150 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
151 "message-tags"))
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
152 {
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
153 g_signal_connect(capabilities, "ack::message-tags",
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
154 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
155 NULL);
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42055
diff changeset
156 }
42294
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 /* 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
159 * 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
160 * 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
161 */
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42287
diff changeset
162 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
163 PURPLE_IRCV3_CAPABILITY_SERVER_TIME);
41951
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
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167 * GObject Implementation
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168 *****************************************************************************/
42570
a980db2607fd Make sure all of the final types in the protocols are defined as such
Gary Kramlich <grim@reaperworld.com>
parents: 42568
diff changeset
169 G_DEFINE_DYNAMIC_TYPE_EXTENDED(PurpleIRCv3Capabilities,
a980db2607fd Make sure all of the final types in the protocols are defined as such
Gary Kramlich <grim@reaperworld.com>
parents: 42568
diff changeset
170 purple_ircv3_capabilities, G_TYPE_OBJECT,
a980db2607fd Make sure all of the final types in the protocols are defined as such
Gary Kramlich <grim@reaperworld.com>
parents: 42568
diff changeset
171 G_TYPE_FLAG_FINAL, {})
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 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
175 GValue *value, GParamSpec *pspec)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 switch(param_id) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180 case PROP_CONNECTION:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181 g_value_set_object(value,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 purple_ircv3_capabilities_get_connection(capabilities));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184 default:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185 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
186 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
187 }
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
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
190 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
191 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
192 const GValue *value, GParamSpec *pspec)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
194 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
195
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
196 switch(param_id) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
197 case PROP_CONNECTION:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
198 purple_ircv3_capabilities_set_connection(capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
199 g_value_get_object(value));
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
200 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
201 default:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
202 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
203 break;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
204 }
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
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
207 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
208 purple_ircv3_capabilities_dispose(GObject *obj) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
209 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(obj);
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 g_clear_object(&capabilities->connection);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
212
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
213 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
214 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217 purple_ircv3_capabilities_finalize(GObject *obj) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218 PurpleIRCv3Capabilities *capabilities = PURPLE_IRCV3_CAPABILITIES(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 g_hash_table_destroy(capabilities->caps);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
221 g_ptr_array_free(capabilities->requests, TRUE);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
222
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
223 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
224 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
225
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
226 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
227 purple_ircv3_capabilities_init(PurpleIRCv3Capabilities *capabilities) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
228 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
229 g_free);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
230 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
231
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
232 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
233 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
235 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
236 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
237 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
238
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
239 static void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
240 purple_ircv3_capabilities_class_init(PurpleIRCv3CapabilitiesClass *klass) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
241 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
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 obj_class->dispose = purple_ircv3_capabilities_dispose;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
244 obj_class->finalize = purple_ircv3_capabilities_finalize;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
245 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
246 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
247
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 * PurpleIRCv3Capabilities:connection:
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 * 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
252 * with.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
253 *
42619
3dd7cd0eabf1 Remove the micro version from Since tags in IRCv3 prpl
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42570
diff changeset
254 * Since: 3.0
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
255 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
256 properties[PROP_CONNECTION] = g_param_spec_object(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
257 "connection", "connection",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
258 "The connection this capabilities was created for.",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
259 PURPLE_IRCV3_TYPE_CONNECTION,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
260 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
261
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
262 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
263
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
264 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
265 * PurpleIRCv3Capabilities::ready:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
266 * @capabilities: The instance.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
267 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
268 * Emitted when @capabilities has finished receiving the list of
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
269 * capabilities from the server at startup.
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 * 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
272 * signals.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
273 *
42619
3dd7cd0eabf1 Remove the micro version from Since tags in IRCv3 prpl
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42570
diff changeset
274 * Since: 3.0
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
275 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
276 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
277 "ready",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
278 G_OBJECT_CLASS_TYPE(klass),
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
279 G_SIGNAL_RUN_LAST,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
280 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
281 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
282 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
283 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
284 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
285 0);
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 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
288 * PurpleIRCv3Capabilities::ack:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
289 * @capabilities: The instance.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
290 * @capability: The capability string.
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 * 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
293 * purple_ircv3_capabilities_request.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
294 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
295 * 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
296 *
42619
3dd7cd0eabf1 Remove the micro version from Since tags in IRCv3 prpl
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42570
diff changeset
297 * Since: 3.0
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
298 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
299 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
300 "ack",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
301 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
302 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
303 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
304 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
305 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
306 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
307 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
308 1,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
309 G_TYPE_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 /**
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
312 * PurpleIRCv3Capabilities::nak:
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
313 * @capabilities: The instance.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
314 * @capability: The capability string.
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 * 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
317 * purple_ircv3_capabilities_request.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
318 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
319 * 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
320 *
42619
3dd7cd0eabf1 Remove the micro version from Since tags in IRCv3 prpl
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42570
diff changeset
321 * Since: 3.0
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
322 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
323 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
324 "nak",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
325 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
326 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
327 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
328 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
329 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
330 NULL,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
331 G_TYPE_NONE,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
332 1,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
333 G_TYPE_STRING);
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
334
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
335 /**
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
336 * PurpleIRCv3Capabilities::done:
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
337 * @capabilities: The instance.
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 * 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
340 * nak'd by the server.
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
341 *
42619
3dd7cd0eabf1 Remove the micro version from Since tags in IRCv3 prpl
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42570
diff changeset
342 * Since: 3.0
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
343 */
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
344 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
345 "done",
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
346 G_OBJECT_CLASS_TYPE(klass),
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
347 G_SIGNAL_RUN_LAST,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
348 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
349 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
350 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
351 NULL,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
352 G_TYPE_NONE,
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
353 0);
41957
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 /**
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
356 * PurpleIRCv3Capabilities::new:
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
357 * @capabilities: The instance.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
358 * @added: The newly added capabilities.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
359 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
360 * 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
361 * [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
362 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
363 * 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
364 * 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
365 * 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
366 * 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
367 *
42619
3dd7cd0eabf1 Remove the micro version from Since tags in IRCv3 prpl
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42570
diff changeset
368 * Since: 3.0
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
369 */
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
370 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
371 "new",
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
372 G_OBJECT_CLASS_TYPE(klass),
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
373 G_SIGNAL_RUN_LAST,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
374 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
375 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
376 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
377 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
378 G_TYPE_NONE,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
379 1,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
380 G_TYPE_STRV);
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 /**
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
383 * PurpleIRCv3Capabilities::del:
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
384 * @capabilities: The instance.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
385 * @removed: The capabilities that were removed.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
386 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
387 * 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
388 * [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
389 *
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
390 * 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
391 * 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
392 * #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
393 * interested in have been removed.
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
394 *
42619
3dd7cd0eabf1 Remove the micro version from Since tags in IRCv3 prpl
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 42570
diff changeset
395 * Since: 3.0
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
396 */
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
397 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
398 "del",
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
399 G_OBJECT_CLASS_TYPE(klass),
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
400 G_SIGNAL_RUN_LAST,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
401 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
402 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
403 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
404 NULL,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
405 G_TYPE_NONE,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
406 1,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
407 G_TYPE_STRV);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
408 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
409
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
410 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
411 * Command handlers
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
412 *****************************************************************************/
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
413 static gboolean
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
414 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
415 guint n_params,
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
416 GStrv params,
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
417 G_GNUC_UNUSED GError **error)
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
418 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
419 gboolean done = TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
420 gchar **parts = NULL;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
421
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
422 /* Check if we have more messages coming. */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
423 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
424 parts = g_strsplit(params[1], " ", -1);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
425 done = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
426 } else {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
427 parts = g_strsplit(params[0], " ", -1);
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 /* 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
431 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
432 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
433 }
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 g_strfreev(parts);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
436
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
437 if(done) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
438 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
439
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
440 /* 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
441 * we're done with capability negotiation.
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 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
444 purple_ircv3_capabilities_remove_wait(capabilities);
41951
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 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
447
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
448 return TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
449 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
450
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
451 static gboolean
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
452 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
453 GStrv params,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
454 guint sig,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
455 const char *method,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
456 GError **error)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
457 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
458 char *caps = g_strjoinv(" ", params);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
459 guint index = 0;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
460 gboolean found = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
461 gboolean ret = TRUE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
462
42040
86284f7119e1 IRCv3: Add detail to the ack and nak signals for PurpleIRCv3Capabilities
Gary Kramlich <grim@reaperworld.com>
parents: 42023
diff changeset
463 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
464
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
465 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
466 g_str_equal, &index);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
467 if(found) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
468 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
469 } else {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
470 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
471 "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
472 ret = FALSE;
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 g_free(caps);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
475
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
476 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
477 purple_ircv3_capabilities_remove_wait(capabilities);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
478 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
479
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
480 return ret;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
481 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
482
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
483 static gboolean
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
484 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
485 guint n_params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
486 GStrv params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
487 G_GNUC_UNUSED GError **error)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
488 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
489 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
490 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
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 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
494
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
495 return TRUE;
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
496 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
497
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
498 static gboolean
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
499 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
500 guint n_params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
501 GStrv params,
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
502 G_GNUC_UNUSED GError **error)
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
503 {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
504 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
505 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
506 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
507
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
508 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
509
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
510 return TRUE;
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
511 }
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
512
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
513 /******************************************************************************
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
514 * Internal API
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 void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
517 purple_ircv3_capabilities_register(GPluginNativePlugin *plugin) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
518 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
519 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
520
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
521 PurpleIRCv3Capabilities *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
522 purple_ircv3_capabilities_new(PurpleIRCv3Connection *connection) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
523 return g_object_new(
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
524 PURPLE_IRCV3_TYPE_CAPABILITIES,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
525 "connection", connection,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
526 NULL);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
527 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
528
41954
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
529 void
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
530 purple_ircv3_capabilities_start(PurpleIRCv3Capabilities *capabilities) {
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
531 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
532 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
533 }
558106ebf999 Various clean ups to the IRCv3 connection process
Gary Kramlich <grim@reaperworld.com>
parents: 41952
diff changeset
534
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
535 gboolean
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
536 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
537 GError **error,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
538 gpointer data)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
539 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
540 PurpleIRCv3Connection *connection = data;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
541 PurpleIRCv3Capabilities *capabilities = NULL;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
542 GStrv params = NULL;
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
543 GStrv subparams = NULL;
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
544 const char *subcommand = NULL;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
545 guint n_params = 0;
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
546 guint n_subparams = 0;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
547
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
548 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
549 if(params != NULL) {
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
550 n_params = g_strv_length(params);
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42294
diff changeset
551 }
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
552
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
553 if(n_params < 2) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
554 return FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
555 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
556
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
557 capabilities = purple_ircv3_connection_get_capabilities(connection);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
558
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
559 /* 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
560 * handlers.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
561 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
562 * 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
563 * 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
564 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
565 * 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
566 * purely for dispatching to our subcommand handlers.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
567 *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
568 * 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
569 * 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
570 * 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
571 * 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
572 * ignoring the nick and subcommand.
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
573 */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
574 subcommand = params[1];
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
575 n_subparams = n_params - 2;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
576 subparams = params + 2;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
577
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
578 /* Dispatch the subcommand. */
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
579 if(purple_strequal(subcommand, "LS") ||
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
580 purple_strequal(subcommand, "LIST"))
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
581 {
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
582 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
583 subparams, error);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
584 } else if(purple_strequal(subcommand, "ACK")) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
585 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
586 subparams,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
587 signals[SIG_ACK],
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
588 "ACK",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
589 error);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
590 } else if(purple_strequal(subcommand, "NAK")) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
591 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
592 subparams,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
593 signals[SIG_NAK],
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
594 "NAK",
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
595 error);
41957
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
596 } else if(purple_strequal(subcommand, "NEW")) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
597 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
598 subparams, error);
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
599 } else if(purple_strequal(subcommand, "DEL")) {
17fd3bcecaeb Add support for CAP NEW and CAP DEL
Gary Kramlich <grim@reaperworld.com>
parents: 41954
diff changeset
600 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
601 subparams, error);
41951
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
602 }
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 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
605 "No handler for CAP subcommand %s", subcommand);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
606
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
607 return FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
608 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
609
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 * Public API
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 PurpleIRCv3Connection *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
614 purple_ircv3_capabilities_get_connection(PurpleIRCv3Capabilities *capabilities)
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 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
617
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
618 return capabilities->connection;
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
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
621 void
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
622 purple_ircv3_capabilities_request(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
623 const char *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 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
626 g_return_if_fail(capability != NULL);
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 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
629
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
630 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
631 capability);
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
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
634 const char *
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
635 purple_ircv3_capabilities_lookup(PurpleIRCv3Capabilities *capabilities,
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
636 const char *name, gboolean *found)
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
637 {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
638 gpointer value = NULL;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
639 gboolean real_found = FALSE;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
640
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
641 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
642 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
643
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
644 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
645 &value);
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
646
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
647 if(found != NULL) {
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
648 *found = real_found;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
649 }
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
650
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
651 return value;
00c472cd0fff Create PurpleIRCv3Capabilities for managing capabilities for each connection
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
652 }
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
653
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
654 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
655 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
656 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
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 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
659
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 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
661 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
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 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
664 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
665 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
666 }
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
667
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
668 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
669 }
2f5bbcc91854 IRCv3: Negotiate the message-tags capability and make sure our regex matches the BNF
Gary Kramlich <grim@reaperworld.com>
parents: 42040
diff changeset
670
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
671 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
672 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
673 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
674
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_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
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
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 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
679 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
680 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
681
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
682 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
683 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
684 }
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
685 }

mercurial