Tue, 03 Feb 2009 17:10:05 +0000
Jabber IQ handlers should handle non-query child nodes
Historically, all IQ stanzas had a query child; this is no longer the case
(XMPP Ping, Entity Time, etc). Instead, have the handlers use the first
child of the IQ stanza.
Also reduce some of the duplication in XMPP ping code (just use the one in
ping.c)
| 7014 | 1 | /* |
| 15884 | 2 | * purple - Jabber Protocol Plugin |
| 7014 | 3 | * |
| 4 | * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com> | |
| 5 | * | |
| 6 | * This program is free software; you can redistribute it and/or modify | |
| 7 | * it under the terms of the GNU General Public License as published by | |
| 8 | * the Free Software Foundation; either version 2 of the License, or | |
| 9 | * (at your option) any later version. | |
| 10 | * | |
| 11 | * This program is distributed in the hope that it will be useful, | |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | * GNU General Public License for more details. | |
| 15 | * | |
| 16 | * You should have received a copy of the GNU General Public License | |
| 17 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19854
diff
changeset
|
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 7014 | 19 | * |
| 20 | */ | |
| 21 | #include "internal.h" | |
| 22 | #include "debug.h" | |
|
9713
bb37562302a1
[gaim-migrate @ 10574]
Mark Doliner <markdoliner@pidgin.im>
parents:
9554
diff
changeset
|
23 | #include "prpl.h" /* for proto_chat_entry */ |
| 7310 | 24 | #include "notify.h" |
| 8113 | 25 | #include "request.h" |
| 26 | #include "roomlist.h" | |
| 7971 | 27 | #include "util.h" |
| 7014 | 28 | |
| 29 | #include "chat.h" | |
| 7895 | 30 | #include "iq.h" |
| 7014 | 31 | #include "message.h" |
| 7073 | 32 | #include "presence.h" |
| 7923 | 33 | #include "xdata.h" |
|
23626
e21afec2f485
Custom smileys for XMPP according to XEP 0231. Refs #5627.
Marcus Lundblad <malu@pidgin.im>
parents:
23403
diff
changeset
|
34 | #include "data.h" |
| 7014 | 35 | |
| 15884 | 36 | GList *jabber_chat_info(PurpleConnection *gc) |
| 7014 | 37 | { |
| 38 | GList *m = NULL; | |
| 39 | struct proto_chat_entry *pce; | |
| 40 | ||
| 41 | pce = g_new0(struct proto_chat_entry, 1); | |
|
7841
0000a4c68bf8
[gaim-migrate @ 8494]
Mark Doliner <markdoliner@pidgin.im>
parents:
7400
diff
changeset
|
42 | pce->label = _("_Room:"); |
| 7014 | 43 | pce->identifier = "room"; |
| 10959 | 44 | pce->required = TRUE; |
| 7014 | 45 | m = g_list_append(m, pce); |
| 46 | ||
| 47 | pce = g_new0(struct proto_chat_entry, 1); | |
|
7841
0000a4c68bf8
[gaim-migrate @ 8494]
Mark Doliner <markdoliner@pidgin.im>
parents:
7400
diff
changeset
|
48 | pce->label = _("_Server:"); |
| 7014 | 49 | pce->identifier = "server"; |
| 10959 | 50 | pce->required = TRUE; |
| 7014 | 51 | m = g_list_append(m, pce); |
| 52 | ||
| 53 | pce = g_new0(struct proto_chat_entry, 1); | |
|
7841
0000a4c68bf8
[gaim-migrate @ 8494]
Mark Doliner <markdoliner@pidgin.im>
parents:
7400
diff
changeset
|
54 | pce->label = _("_Handle:"); |
| 7014 | 55 | pce->identifier = "handle"; |
| 10959 | 56 | pce->required = TRUE; |
| 7014 | 57 | m = g_list_append(m, pce); |
| 58 | ||
| 59 | pce = g_new0(struct proto_chat_entry, 1); | |
|
7841
0000a4c68bf8
[gaim-migrate @ 8494]
Mark Doliner <markdoliner@pidgin.im>
parents:
7400
diff
changeset
|
60 | pce->label = _("_Password:"); |
| 7014 | 61 | pce->identifier = "password"; |
| 62 | pce->secret = TRUE; | |
| 63 | m = g_list_append(m, pce); | |
| 64 | ||
| 65 | return m; | |
| 66 | } | |
| 67 | ||
| 15884 | 68 | GHashTable *jabber_chat_info_defaults(PurpleConnection *gc, const char *chat_name) |
|
9754
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
69 | { |
|
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
70 | GHashTable *defaults; |
|
9770
d61fe8dcb6d9
[gaim-migrate @ 10638]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9762
diff
changeset
|
71 | JabberStream *js = gc->proto_data; |
|
9754
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
72 | |
|
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
73 | defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); |
|
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
74 | |
|
9770
d61fe8dcb6d9
[gaim-migrate @ 10638]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9762
diff
changeset
|
75 | g_hash_table_insert(defaults, "handle", g_strdup(js->user->node)); |
|
d61fe8dcb6d9
[gaim-migrate @ 10638]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9762
diff
changeset
|
76 | |
|
d61fe8dcb6d9
[gaim-migrate @ 10638]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9762
diff
changeset
|
77 | if (js->chat_servers) |
|
d61fe8dcb6d9
[gaim-migrate @ 10638]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9762
diff
changeset
|
78 | g_hash_table_insert(defaults, "server", g_strdup(js->chat_servers->data)); |
|
d61fe8dcb6d9
[gaim-migrate @ 10638]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9762
diff
changeset
|
79 | |
|
9754
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
80 | if (chat_name != NULL) { |
| 9760 | 81 | JabberID *jid = jabber_id_new(chat_name); |
| 82 | if(jid) { | |
| 83 | g_hash_table_insert(defaults, "room", g_strdup(jid->node)); | |
| 84 | if(jid->domain) | |
|
9770
d61fe8dcb6d9
[gaim-migrate @ 10638]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9762
diff
changeset
|
85 | g_hash_table_replace(defaults, "server", g_strdup(jid->domain)); |
| 15185 | 86 | if(jid->resource) |
| 87 | g_hash_table_replace(defaults, "handle", g_strdup(jid->resource)); | |
| 9760 | 88 | jabber_id_free(jid); |
| 89 | } | |
|
9754
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
90 | } |
|
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
91 | |
|
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
92 | return defaults; |
|
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
93 | } |
|
3a17eee239b2
[gaim-migrate @ 10621]
Nathan Fredrickson <nathan@silverorange.com>
parents:
9713
diff
changeset
|
94 | |
| 7014 | 95 | JabberChat *jabber_chat_find(JabberStream *js, const char *room, |
| 96 | const char *server) | |
| 97 | { | |
| 10607 | 98 | JabberChat *chat = NULL; |
| 7014 | 99 | |
| 10607 | 100 | if(NULL != js->chats) |
| 101 | { | |
|
23130
7193be04646f
Close up scope of a variable, I'm just cleaning up my tree some.
Etan Reisner <deryni@pidgin.im>
parents:
22919
diff
changeset
|
102 | char *room_jid = g_strdup_printf("%s@%s", room, server); |
| 7014 | 103 | |
| 10607 | 104 | chat = g_hash_table_lookup(js->chats, jabber_normalize(NULL, room_jid)); |
| 105 | g_free(room_jid); | |
| 106 | } | |
| 7014 | 107 | |
| 108 | return chat; | |
| 109 | } | |
| 110 | ||
| 111 | struct _find_by_id_data { | |
| 112 | int id; | |
| 113 | JabberChat *chat; | |
| 114 | }; | |
| 115 | ||
|
12323
f52908fb23b0
[gaim-migrate @ 14627]
Richard Laager <rlaager@pidgin.im>
parents:
11393
diff
changeset
|
116 | static void find_by_id_foreach_cb(gpointer key, gpointer value, gpointer user_data) |
| 7014 | 117 | { |
| 118 | JabberChat *chat = value; | |
| 119 | struct _find_by_id_data *fbid = user_data; | |
| 120 | ||
| 121 | if(chat->id == fbid->id) | |
| 122 | fbid->chat = chat; | |
| 123 | } | |
| 124 | ||
| 125 | JabberChat *jabber_chat_find_by_id(JabberStream *js, int id) | |
| 126 | { | |
| 127 | JabberChat *chat; | |
| 128 | struct _find_by_id_data *fbid = g_new0(struct _find_by_id_data, 1); | |
| 7073 | 129 | fbid->id = id; |
| 7014 | 130 | g_hash_table_foreach(js->chats, find_by_id_foreach_cb, fbid); |
| 131 | chat = fbid->chat; | |
| 132 | g_free(fbid); | |
| 133 | return chat; | |
| 134 | } | |
| 135 | ||
| 15884 | 136 | JabberChat *jabber_chat_find_by_conv(PurpleConversation *conv) |
| 9130 | 137 | { |
| 15884 | 138 | PurpleAccount *account = purple_conversation_get_account(conv); |
| 139 | PurpleConnection *gc = purple_account_get_connection(account); | |
|
22804
3a3bc5f12e52
Do not crash from commands in a disconnected chat. Fixes #5208
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
21630
diff
changeset
|
140 | JabberStream *js; |
|
3a3bc5f12e52
Do not crash from commands in a disconnected chat. Fixes #5208
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
21630
diff
changeset
|
141 | int id; |
|
3a3bc5f12e52
Do not crash from commands in a disconnected chat. Fixes #5208
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
21630
diff
changeset
|
142 | if (!gc) |
|
3a3bc5f12e52
Do not crash from commands in a disconnected chat. Fixes #5208
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
21630
diff
changeset
|
143 | return NULL; |
|
3a3bc5f12e52
Do not crash from commands in a disconnected chat. Fixes #5208
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
21630
diff
changeset
|
144 | js = gc->proto_data; |
|
3a3bc5f12e52
Do not crash from commands in a disconnected chat. Fixes #5208
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
21630
diff
changeset
|
145 | id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)); |
| 9130 | 146 | return jabber_chat_find_by_id(js, id); |
| 147 | } | |
| 148 | ||
| 15884 | 149 | void jabber_chat_invite(PurpleConnection *gc, int id, const char *msg, |
| 7014 | 150 | const char *name) |
| 151 | { | |
| 152 | JabberStream *js = gc->proto_data; | |
| 153 | JabberChat *chat; | |
| 154 | xmlnode *message, *body, *x, *invite; | |
| 155 | char *room_jid; | |
| 156 | ||
| 157 | chat = jabber_chat_find_by_id(js, id); | |
| 158 | if(!chat) | |
| 159 | return; | |
| 160 | ||
| 161 | message = xmlnode_new("message"); | |
| 162 | ||
| 163 | room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 164 | ||
| 165 | if(chat->muc) { | |
| 166 | xmlnode_set_attrib(message, "to", room_jid); | |
| 167 | x = xmlnode_new_child(message, "x"); | |
| 13808 | 168 | xmlnode_set_namespace(x, "http://jabber.org/protocol/muc#user"); |
| 7014 | 169 | invite = xmlnode_new_child(x, "invite"); |
| 170 | xmlnode_set_attrib(invite, "to", name); | |
| 171 | body = xmlnode_new_child(invite, "reason"); | |
| 172 | xmlnode_insert_data(body, msg, -1); | |
| 173 | } else { | |
| 174 | xmlnode_set_attrib(message, "to", name); | |
| 175 | body = xmlnode_new_child(message, "body"); | |
| 176 | xmlnode_insert_data(body, msg, -1); | |
| 177 | x = xmlnode_new_child(message, "x"); | |
| 178 | xmlnode_set_attrib(x, "jid", room_jid); | |
| 13808 | 179 | xmlnode_set_namespace(x, "jabber:x:conference"); |
| 7014 | 180 | } |
| 181 | ||
| 182 | jabber_send(js, message); | |
| 183 | xmlnode_free(message); | |
| 184 | g_free(room_jid); | |
| 185 | } | |
| 186 | ||
| 9152 | 187 | void jabber_chat_member_free(JabberChatMember *jcm); |
| 188 | ||
|
9917
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
189 | char *jabber_get_chat_name(GHashTable *data) { |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
190 | char *room, *server, *chat_name = NULL; |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
191 | |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
192 | room = g_hash_table_lookup(data, "room"); |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
193 | server = g_hash_table_lookup(data, "server"); |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
194 | |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
195 | if (room && server) { |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
196 | chat_name = g_strdup_printf("%s@%s", room, server); |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
197 | } |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
198 | return chat_name; |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
199 | } |
|
2fbb3c9fab2b
[gaim-migrate @ 10809]
Daniel Atallah <datallah@pidgin.im>
parents:
9913
diff
changeset
|
200 | |
|
23273
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
201 | static void insert_in_hash_table(gpointer key, gpointer value, gpointer user_data) |
|
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
202 | { |
|
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
203 | GHashTable *hash_table = (GHashTable *)user_data; |
|
23275
c8599f5dac4c
The key and value need to be g_stdup()'d before adding to the hash table
Evan Schoenberg <evands@pidgin.im>
parents:
23273
diff
changeset
|
204 | g_hash_table_insert(hash_table, g_strdup(key), g_strdup(value)); |
|
23273
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
205 | } |
|
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
206 | |
| 15884 | 207 | void jabber_chat_join(PurpleConnection *gc, GHashTable *data) |
| 7014 | 208 | { |
| 209 | JabberChat *chat; | |
| 210 | char *room, *server, *handle, *passwd; | |
| 211 | xmlnode *presence, *x; | |
| 7262 | 212 | char *tmp, *room_jid, *full_jid; |
| 7014 | 213 | JabberStream *js = gc->proto_data; |
| 15884 | 214 | PurplePresence *gpresence; |
| 215 | PurpleStatus *status; | |
| 9954 | 216 | JabberBuddyState state; |
| 14525 | 217 | char *msg; |
| 9954 | 218 | int priority; |
| 7014 | 219 | |
| 220 | room = g_hash_table_lookup(data, "room"); | |
| 221 | server = g_hash_table_lookup(data, "server"); | |
| 222 | handle = g_hash_table_lookup(data, "handle"); | |
| 223 | passwd = g_hash_table_lookup(data, "password"); | |
| 224 | ||
| 8113 | 225 | if(!room || !server) |
| 7014 | 226 | return; |
| 227 | ||
| 8113 | 228 | if(!handle) |
| 229 | handle = js->user->node; | |
| 230 | ||
| 7310 | 231 | if(!jabber_nodeprep_validate(room)) { |
| 232 | char *buf = g_strdup_printf(_("%s is not a valid room name"), room); | |
| 15884 | 233 | purple_notify_error(gc, _("Invalid Room Name"), _("Invalid Room Name"), |
| 7310 | 234 | buf); |
|
23270
2b7db16e721a
As discussed on the devel list, purple_serv_got_join_chat_failed() and the
Evan Schoenberg <evands@pidgin.im>
parents:
22920
diff
changeset
|
235 | purple_serv_got_join_chat_failed(gc, data); |
| 7310 | 236 | g_free(buf); |
| 237 | return; | |
| 238 | } else if(!jabber_nameprep_validate(server)) { | |
| 239 | char *buf = g_strdup_printf(_("%s is not a valid server name"), server); | |
| 15884 | 240 | purple_notify_error(gc, _("Invalid Server Name"), |
| 7310 | 241 | _("Invalid Server Name"), buf); |
|
23270
2b7db16e721a
As discussed on the devel list, purple_serv_got_join_chat_failed() and the
Evan Schoenberg <evands@pidgin.im>
parents:
22920
diff
changeset
|
242 | purple_serv_got_join_chat_failed(gc, data); |
| 7310 | 243 | g_free(buf); |
| 244 | return; | |
| 245 | } else if(!jabber_resourceprep_validate(handle)) { | |
| 246 | char *buf = g_strdup_printf(_("%s is not a valid room handle"), handle); | |
| 15884 | 247 | purple_notify_error(gc, _("Invalid Room Handle"), |
| 7310 | 248 | _("Invalid Room Handle"), buf); |
|
23270
2b7db16e721a
As discussed on the devel list, purple_serv_got_join_chat_failed() and the
Evan Schoenberg <evands@pidgin.im>
parents:
22920
diff
changeset
|
249 | purple_serv_got_join_chat_failed(gc, data); |
|
22902
560976846e56
Fix a small memory leak when failing to join a jabber conference
Mark Doliner <markdoliner@pidgin.im>
parents:
22804
diff
changeset
|
250 | g_free(buf); |
|
560976846e56
Fix a small memory leak when failing to join a jabber conference
Mark Doliner <markdoliner@pidgin.im>
parents:
22804
diff
changeset
|
251 | return; |
| 7310 | 252 | } |
| 253 | ||
| 7014 | 254 | if(jabber_chat_find(js, room, server)) |
| 255 | return; | |
| 256 | ||
|
23270
2b7db16e721a
As discussed on the devel list, purple_serv_got_join_chat_failed() and the
Evan Schoenberg <evands@pidgin.im>
parents:
22920
diff
changeset
|
257 | tmp = g_strdup_printf("%s@%s", room, server); |
|
2b7db16e721a
As discussed on the devel list, purple_serv_got_join_chat_failed() and the
Evan Schoenberg <evands@pidgin.im>
parents:
22920
diff
changeset
|
258 | room_jid = g_strdup(jabber_normalize(NULL, tmp)); |
|
2b7db16e721a
As discussed on the devel list, purple_serv_got_join_chat_failed() and the
Evan Schoenberg <evands@pidgin.im>
parents:
22920
diff
changeset
|
259 | g_free(tmp); |
|
2b7db16e721a
As discussed on the devel list, purple_serv_got_join_chat_failed() and the
Evan Schoenberg <evands@pidgin.im>
parents:
22920
diff
changeset
|
260 | |
| 7014 | 261 | chat = g_new0(JabberChat, 1); |
| 262 | chat->js = gc->proto_data; | |
| 263 | ||
| 264 | chat->room = g_strdup(room); | |
| 265 | chat->server = g_strdup(server); | |
| 8400 | 266 | chat->handle = g_strdup(handle); |
| 7014 | 267 | |
|
23273
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
268 | /* Copy the data hash table to chat->components */ |
|
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
269 | chat->components = g_hash_table_new_full(g_str_hash, g_str_equal, |
|
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
270 | g_free, g_free); |
|
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
271 | g_hash_table_foreach(data, insert_in_hash_table, chat->components); |
|
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
272 | |
| 9152 | 273 | chat->members = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, |
| 274 | (GDestroyNotify)jabber_chat_member_free); | |
| 275 | ||
| 7014 | 276 | g_hash_table_insert(js->chats, room_jid, chat); |
| 277 | ||
| 15884 | 278 | gpresence = purple_account_get_presence(gc->account); |
| 279 | status = purple_presence_get_active_status(gpresence); | |
| 9954 | 280 | |
| 15884 | 281 | purple_status_to_jabber(status, &state, &msg, &priority); |
| 9954 | 282 | |
|
17770
e67998927a3c
Added the ability to define extensions to caps
Andreas Monitzer <am@adiumx.com>
parents:
17007
diff
changeset
|
283 | presence = jabber_presence_create_js(js, state, msg, priority); |
| 7014 | 284 | full_jid = g_strdup_printf("%s/%s", room_jid, handle); |
| 285 | xmlnode_set_attrib(presence, "to", full_jid); | |
| 286 | g_free(full_jid); | |
| 14525 | 287 | g_free(msg); |
| 7014 | 288 | |
| 289 | x = xmlnode_new_child(presence, "x"); | |
| 13808 | 290 | xmlnode_set_namespace(x, "http://jabber.org/protocol/muc"); |
| 7014 | 291 | |
| 292 | if(passwd && *passwd) { | |
| 293 | xmlnode *password = xmlnode_new_child(x, "password"); | |
| 294 | xmlnode_insert_data(password, passwd, -1); | |
| 295 | } | |
| 296 | ||
| 297 | jabber_send(js, presence); | |
| 298 | xmlnode_free(presence); | |
| 299 | } | |
| 300 | ||
| 15884 | 301 | void jabber_chat_leave(PurpleConnection *gc, int id) |
| 7014 | 302 | { |
| 303 | JabberStream *js = gc->proto_data; | |
| 304 | JabberChat *chat = jabber_chat_find_by_id(js, id); | |
| 7974 | 305 | |
| 7014 | 306 | |
| 307 | if(!chat) | |
| 308 | return; | |
| 309 | ||
| 7974 | 310 | jabber_chat_part(chat, NULL); |
| 9152 | 311 | |
|
23403
a8704d47889f
Fix the chat-room rejoining bug where the list appears empty.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
23302
diff
changeset
|
312 | chat->left = TRUE; |
| 7014 | 313 | } |
| 314 | ||
| 315 | void jabber_chat_destroy(JabberChat *chat) | |
| 316 | { | |
| 317 | JabberStream *js = chat->js; | |
| 318 | char *room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 319 | ||
| 7322 | 320 | g_hash_table_remove(js->chats, jabber_normalize(NULL, room_jid)); |
| 7014 | 321 | g_free(room_jid); |
| 8396 | 322 | } |
| 323 | ||
| 324 | void jabber_chat_free(JabberChat *chat) | |
| 325 | { | |
| 326 | if(chat->config_dialog_handle) | |
| 15884 | 327 | purple_request_close(chat->config_dialog_type, chat->config_dialog_handle); |
| 7014 | 328 | |
| 329 | g_free(chat->room); | |
| 330 | g_free(chat->server); | |
|
10504
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10474
diff
changeset
|
331 | g_free(chat->handle); |
|
eae130eefbfe
[gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10474
diff
changeset
|
332 | g_hash_table_destroy(chat->members); |
|
23273
c42eae02c76e
g_hash_table_ref() / g_hash_table_unref() were added in too recent a glib version per Mark. Copy data to chat->components rather than using those.
Evan Schoenberg <evands@pidgin.im>
parents:
23270
diff
changeset
|
333 | g_hash_table_destroy(chat->components); |
| 7014 | 334 | g_free(chat); |
| 335 | } | |
| 336 | ||
| 15884 | 337 | gboolean jabber_chat_find_buddy(PurpleConversation *conv, const char *name) |
| 7014 | 338 | { |
| 15884 | 339 | return purple_conv_chat_find_user(PURPLE_CONV_CHAT(conv), name); |
| 7014 | 340 | } |
| 341 | ||
| 15884 | 342 | char *jabber_chat_buddy_real_name(PurpleConnection *gc, int id, const char *who) |
| 7398 | 343 | { |
| 344 | JabberStream *js = gc->proto_data; | |
| 345 | JabberChat *chat; | |
|
23499
3d18632e27a3
Return the real JID (if available) from the xmpp get_cb_real_name function.
Daniel Atallah <datallah@pidgin.im>
parents:
23403
diff
changeset
|
346 | JabberChatMember *jcm; |
| 7398 | 347 | |
| 348 | chat = jabber_chat_find_by_id(js, id); | |
| 349 | ||
| 350 | if(!chat) | |
| 351 | return NULL; | |
| 352 | ||
|
23499
3d18632e27a3
Return the real JID (if available) from the xmpp get_cb_real_name function.
Daniel Atallah <datallah@pidgin.im>
parents:
23403
diff
changeset
|
353 | jcm = g_hash_table_lookup(chat->members, who); |
|
3d18632e27a3
Return the real JID (if available) from the xmpp get_cb_real_name function.
Daniel Atallah <datallah@pidgin.im>
parents:
23403
diff
changeset
|
354 | if (jcm != NULL && jcm->jid) |
|
3d18632e27a3
Return the real JID (if available) from the xmpp get_cb_real_name function.
Daniel Atallah <datallah@pidgin.im>
parents:
23403
diff
changeset
|
355 | return g_strdup(jcm->jid); |
|
3d18632e27a3
Return the real JID (if available) from the xmpp get_cb_real_name function.
Daniel Atallah <datallah@pidgin.im>
parents:
23403
diff
changeset
|
356 | |
|
3d18632e27a3
Return the real JID (if available) from the xmpp get_cb_real_name function.
Daniel Atallah <datallah@pidgin.im>
parents:
23403
diff
changeset
|
357 | |
| 7398 | 358 | return g_strdup_printf("%s@%s/%s", chat->room, chat->server, who); |
| 359 | } | |
| 7895 | 360 | |
| 7923 | 361 | static void jabber_chat_room_configure_x_data_cb(JabberStream *js, xmlnode *result, gpointer data) |
| 362 | { | |
| 363 | JabberChat *chat = data; | |
| 364 | xmlnode *query; | |
| 365 | JabberIq *iq; | |
| 366 | char *to = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 367 | ||
| 368 | iq = jabber_iq_new_query(js, JABBER_IQ_SET, "http://jabber.org/protocol/muc#owner"); | |
| 369 | xmlnode_set_attrib(iq->node, "to", to); | |
| 370 | g_free(to); | |
| 371 | ||
| 372 | query = xmlnode_get_child(iq->node, "query"); | |
| 373 | ||
| 374 | xmlnode_insert_child(query, result); | |
| 375 | ||
| 376 | jabber_iq_send(iq); | |
| 377 | } | |
| 378 | ||
| 379 | static void jabber_chat_room_configure_cb(JabberStream *js, xmlnode *packet, gpointer data) | |
| 380 | { | |
| 381 | xmlnode *query, *x; | |
| 382 | const char *type = xmlnode_get_attrib(packet, "type"); | |
| 383 | const char *from = xmlnode_get_attrib(packet, "from"); | |
| 7926 | 384 | char *msg; |
| 7923 | 385 | JabberChat *chat; |
| 386 | JabberID *jid; | |
| 387 | ||
| 388 | if(!type || !from) | |
| 389 | return; | |
| 390 | ||
| 391 | ||
| 7926 | 392 | |
| 7923 | 393 | if(!strcmp(type, "result")) { |
| 394 | jid = jabber_id_new(from); | |
| 395 | ||
| 396 | if(!jid) | |
| 397 | return; | |
| 398 | ||
| 399 | chat = jabber_chat_find(js, jid->node, jid->domain); | |
| 400 | jabber_id_free(jid); | |
| 401 | ||
| 402 | if(!chat) | |
| 403 | return; | |
| 404 | ||
| 405 | if(!(query = xmlnode_get_child(packet, "query"))) | |
| 406 | return; | |
| 407 | ||
| 8135 | 408 | for(x = xmlnode_get_child(query, "x"); x; x = xmlnode_get_next_twin(x)) { |
| 7923 | 409 | const char *xmlns; |
| 13808 | 410 | if(!(xmlns = xmlnode_get_namespace(x))) |
| 7923 | 411 | continue; |
| 412 | ||
| 413 | if(!strcmp(xmlns, "jabber:x:data")) { | |
| 15884 | 414 | chat->config_dialog_type = PURPLE_REQUEST_FIELDS; |
| 8396 | 415 | chat->config_dialog_handle = jabber_x_data_request(js, x, jabber_chat_room_configure_x_data_cb, chat); |
| 7923 | 416 | return; |
| 417 | } | |
| 418 | } | |
| 7926 | 419 | } else if(!strcmp(type, "error")) { |
|
21150
bedd1215fb5e
Stop jabber setting wants_to_die itself. This involved plumbing disconnection
Will Thompson <resiak@pidgin.im>
parents:
19897
diff
changeset
|
420 | char *msg = jabber_parse_error(js, packet, NULL); |
| 7926 | 421 | |
| 15884 | 422 | purple_notify_error(js->gc, _("Configuration error"), _("Configuration error"), msg); |
| 7926 | 423 | |
| 8401 | 424 | if(msg) |
| 425 | g_free(msg); | |
| 7926 | 426 | return; |
| 7923 | 427 | } |
| 428 | ||
| 7926 | 429 | msg = g_strdup_printf("Unable to configure room %s", from); |
| 430 | ||
| 15884 | 431 | purple_notify_info(js->gc, _("Unable to configure"), _("Unable to configure"), msg); |
| 7926 | 432 | g_free(msg); |
| 7923 | 433 | |
| 434 | } | |
| 435 | ||
| 436 | void jabber_chat_request_room_configure(JabberChat *chat) { | |
| 437 | JabberIq *iq; | |
| 438 | char *room_jid; | |
| 439 | ||
| 7895 | 440 | if(!chat) |
| 441 | return; | |
| 442 | ||
| 8396 | 443 | chat->config_dialog_handle = NULL; |
| 444 | ||
| 7955 | 445 | if(!chat->muc) { |
| 15884 | 446 | purple_notify_error(chat->js->gc, _("Room Configuration Error"), _("Room Configuration Error"), |
| 7955 | 447 | _("This room is not capable of being configured")); |
| 448 | return; | |
| 449 | } | |
| 450 | ||
| 10474 | 451 | iq = jabber_iq_new_query(chat->js, JABBER_IQ_GET, |
| 7923 | 452 | "http://jabber.org/protocol/muc#owner"); |
| 453 | room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 7895 | 454 | |
| 7923 | 455 | xmlnode_set_attrib(iq->node, "to", room_jid); |
| 456 | ||
| 457 | jabber_iq_set_callback(iq, jabber_chat_room_configure_cb, NULL); | |
| 458 | ||
| 459 | jabber_iq_send(iq); | |
| 460 | ||
| 461 | g_free(room_jid); | |
| 7895 | 462 | } |
| 463 | ||
| 464 | void jabber_chat_create_instant_room(JabberChat *chat) { | |
| 465 | JabberIq *iq; | |
| 466 | xmlnode *query, *x; | |
| 467 | char *room_jid; | |
| 468 | ||
| 469 | if(!chat) | |
| 470 | return; | |
| 471 | ||
| 8396 | 472 | chat->config_dialog_handle = NULL; |
| 473 | ||
| 7895 | 474 | iq = jabber_iq_new_query(chat->js, JABBER_IQ_SET, |
| 475 | "http://jabber.org/protocol/muc#owner"); | |
| 476 | query = xmlnode_get_child(iq->node, "query"); | |
| 477 | x = xmlnode_new_child(query, "x"); | |
| 478 | room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 479 | ||
| 480 | xmlnode_set_attrib(iq->node, "to", room_jid); | |
| 13808 | 481 | xmlnode_set_namespace(x, "jabber:x:data"); |
| 7895 | 482 | xmlnode_set_attrib(x, "type", "submit"); |
| 483 | ||
| 484 | jabber_iq_send(iq); | |
| 485 | ||
| 486 | g_free(room_jid); | |
| 487 | } | |
| 7955 | 488 | |
| 489 | static void jabber_chat_register_x_data_result_cb(JabberStream *js, xmlnode *packet, gpointer data) | |
| 490 | { | |
| 491 | const char *type = xmlnode_get_attrib(packet, "type"); | |
| 492 | ||
| 493 | if(type && !strcmp(type, "error")) { | |
|
21150
bedd1215fb5e
Stop jabber setting wants_to_die itself. This involved plumbing disconnection
Will Thompson <resiak@pidgin.im>
parents:
19897
diff
changeset
|
494 | char *msg = jabber_parse_error(js, packet, NULL); |
| 8401 | 495 | |
| 15884 | 496 | purple_notify_error(js->gc, _("Registration error"), _("Registration error"), msg); |
| 8401 | 497 | |
| 498 | if(msg) | |
| 499 | g_free(msg); | |
| 500 | return; | |
| 7955 | 501 | } |
| 502 | } | |
| 503 | ||
| 504 | static void jabber_chat_register_x_data_cb(JabberStream *js, xmlnode *result, gpointer data) | |
| 505 | { | |
| 506 | JabberChat *chat = data; | |
| 507 | xmlnode *query; | |
| 508 | JabberIq *iq; | |
| 509 | char *to = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 510 | ||
| 511 | iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:register"); | |
| 512 | xmlnode_set_attrib(iq->node, "to", to); | |
| 513 | g_free(to); | |
| 514 | ||
| 515 | query = xmlnode_get_child(iq->node, "query"); | |
| 516 | ||
| 517 | xmlnode_insert_child(query, result); | |
| 518 | ||
| 519 | jabber_iq_set_callback(iq, jabber_chat_register_x_data_result_cb, NULL); | |
| 520 | ||
| 521 | jabber_iq_send(iq); | |
| 522 | } | |
| 523 | ||
| 524 | static void jabber_chat_register_cb(JabberStream *js, xmlnode *packet, gpointer data) | |
| 525 | { | |
| 526 | xmlnode *query, *x; | |
| 527 | const char *type = xmlnode_get_attrib(packet, "type"); | |
| 528 | const char *from = xmlnode_get_attrib(packet, "from"); | |
| 529 | char *msg; | |
| 530 | JabberChat *chat; | |
| 531 | JabberID *jid; | |
| 532 | ||
| 533 | if(!type || !from) | |
| 534 | return; | |
| 535 | ||
| 536 | if(!strcmp(type, "result")) { | |
| 537 | jid = jabber_id_new(from); | |
| 538 | ||
| 539 | if(!jid) | |
| 540 | return; | |
| 541 | ||
| 542 | chat = jabber_chat_find(js, jid->node, jid->domain); | |
| 543 | jabber_id_free(jid); | |
| 544 | ||
| 545 | if(!chat) | |
| 546 | return; | |
| 547 | ||
| 548 | if(!(query = xmlnode_get_child(packet, "query"))) | |
| 549 | return; | |
| 550 | ||
| 8135 | 551 | for(x = xmlnode_get_child(query, "x"); x; x = xmlnode_get_next_twin(x)) { |
| 7955 | 552 | const char *xmlns; |
| 553 | ||
| 13808 | 554 | if(!(xmlns = xmlnode_get_namespace(x))) |
| 7955 | 555 | continue; |
| 556 | ||
| 557 | if(!strcmp(xmlns, "jabber:x:data")) { | |
| 558 | jabber_x_data_request(js, x, jabber_chat_register_x_data_cb, chat); | |
| 559 | return; | |
| 560 | } | |
| 561 | } | |
| 562 | } else if(!strcmp(type, "error")) { | |
|
21150
bedd1215fb5e
Stop jabber setting wants_to_die itself. This involved plumbing disconnection
Will Thompson <resiak@pidgin.im>
parents:
19897
diff
changeset
|
563 | char *msg = jabber_parse_error(js, packet, NULL); |
| 7955 | 564 | |
| 15884 | 565 | purple_notify_error(js->gc, _("Registration error"), _("Registration error"), msg); |
| 7955 | 566 | |
| 8401 | 567 | if(msg) |
| 568 | g_free(msg); | |
| 7955 | 569 | return; |
| 570 | } | |
| 571 | ||
| 572 | msg = g_strdup_printf("Unable to configure room %s", from); | |
| 573 | ||
| 15884 | 574 | purple_notify_info(js->gc, _("Unable to configure"), _("Unable to configure"), msg); |
| 7955 | 575 | g_free(msg); |
| 576 | ||
| 577 | } | |
| 578 | ||
| 579 | void jabber_chat_register(JabberChat *chat) | |
| 580 | { | |
| 581 | JabberIq *iq; | |
| 582 | char *room_jid; | |
| 583 | ||
| 584 | if(!chat) | |
| 585 | return; | |
| 586 | ||
| 587 | room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 588 | ||
| 589 | iq = jabber_iq_new_query(chat->js, JABBER_IQ_GET, "jabber:iq:register"); | |
| 590 | xmlnode_set_attrib(iq->node, "to", room_jid); | |
| 591 | g_free(room_jid); | |
| 592 | ||
| 593 | jabber_iq_set_callback(iq, jabber_chat_register_cb, NULL); | |
| 594 | ||
| 595 | jabber_iq_send(iq); | |
| 596 | } | |
| 597 | ||
| 7971 | 598 | /* merge this with the function below when we get everyone on the same page wrt /commands */ |
| 599 | void jabber_chat_change_topic(JabberChat *chat, const char *topic) | |
| 600 | { | |
| 601 | if(topic && *topic) { | |
| 602 | JabberMessage *jm; | |
| 603 | jm = g_new0(JabberMessage, 1); | |
| 604 | jm->js = chat->js; | |
| 605 | jm->type = JABBER_MESSAGE_GROUPCHAT; | |
| 15884 | 606 | jm->subject = purple_markup_strip_html(topic); |
| 7971 | 607 | jm->to = g_strdup_printf("%s@%s", chat->room, chat->server); |
| 608 | jabber_message_send(jm); | |
| 609 | jabber_message_free(jm); | |
| 610 | } else { | |
| 15884 | 611 | const char *cur = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(chat->conv)); |
| 9762 | 612 | char *buf, *tmp, *tmp2; |
| 7955 | 613 | |
| 9762 | 614 | if(cur) { |
|
10732
5e314ab498bf
[gaim-migrate @ 12334]
Richard Laager <rlaager@pidgin.im>
parents:
10607
diff
changeset
|
615 | tmp = g_markup_escape_text(cur, -1); |
| 15884 | 616 | tmp2 = purple_markup_linkify(tmp); |
| 9762 | 617 | buf = g_strdup_printf(_("current topic is: %s"), tmp2); |
| 618 | g_free(tmp); | |
| 619 | g_free(tmp2); | |
| 620 | } else | |
| 7971 | 621 | buf = g_strdup(_("No topic is set")); |
| 15884 | 622 | purple_conv_chat_write(PURPLE_CONV_CHAT(chat->conv), "", buf, |
| 623 | PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL)); | |
| 7971 | 624 | g_free(buf); |
| 625 | } | |
| 626 | ||
| 627 | } | |
| 628 | ||
| 15884 | 629 | void jabber_chat_set_topic(PurpleConnection *gc, int id, const char *topic) |
| 7971 | 630 | { |
| 631 | JabberStream *js = gc->proto_data; | |
| 632 | JabberChat *chat = jabber_chat_find_by_id(js, id); | |
| 633 | ||
| 634 | if(!chat) | |
| 635 | return; | |
| 636 | ||
| 637 | jabber_chat_change_topic(chat, topic); | |
| 638 | } | |
| 639 | ||
| 640 | ||
| 7972 | 641 | void jabber_chat_change_nick(JabberChat *chat, const char *nick) |
| 642 | { | |
| 643 | xmlnode *presence; | |
| 644 | char *full_jid; | |
| 15884 | 645 | PurplePresence *gpresence; |
| 646 | PurpleStatus *status; | |
| 9954 | 647 | JabberBuddyState state; |
| 14525 | 648 | char *msg; |
| 9954 | 649 | int priority; |
| 7972 | 650 | |
| 651 | if(!chat->muc) { | |
| 15884 | 652 | purple_conv_chat_write(PURPLE_CONV_CHAT(chat->conv), "", |
| 7972 | 653 | _("Nick changing not supported in non-MUC chatrooms"), |
| 15884 | 654 | PURPLE_MESSAGE_SYSTEM, time(NULL)); |
| 7972 | 655 | return; |
| 656 | } | |
| 657 | ||
| 15884 | 658 | gpresence = purple_account_get_presence(chat->js->gc->account); |
| 659 | status = purple_presence_get_active_status(gpresence); | |
| 9954 | 660 | |
| 15884 | 661 | purple_status_to_jabber(status, &state, &msg, &priority); |
| 9954 | 662 | |
|
17770
e67998927a3c
Added the ability to define extensions to caps
Andreas Monitzer <am@adiumx.com>
parents:
17007
diff
changeset
|
663 | presence = jabber_presence_create_js(chat->js, state, msg, priority); |
| 7972 | 664 | full_jid = g_strdup_printf("%s@%s/%s", chat->room, chat->server, nick); |
| 665 | xmlnode_set_attrib(presence, "to", full_jid); | |
| 666 | g_free(full_jid); | |
| 14525 | 667 | g_free(msg); |
| 7972 | 668 | |
| 669 | jabber_send(chat->js, presence); | |
| 670 | xmlnode_free(presence); | |
| 671 | } | |
| 672 | ||
| 7974 | 673 | void jabber_chat_part(JabberChat *chat, const char *msg) |
| 674 | { | |
| 675 | char *room_jid; | |
| 676 | xmlnode *presence; | |
| 7972 | 677 | |
| 8537 | 678 | room_jid = g_strdup_printf("%s@%s/%s", chat->room, chat->server, |
| 679 | chat->handle); | |
| 7974 | 680 | presence = xmlnode_new("presence"); |
| 681 | xmlnode_set_attrib(presence, "to", room_jid); | |
| 682 | xmlnode_set_attrib(presence, "type", "unavailable"); | |
| 683 | if(msg) { | |
| 684 | xmlnode *status = xmlnode_new_child(presence, "status"); | |
| 685 | xmlnode_insert_data(status, msg, -1); | |
| 686 | } | |
| 687 | jabber_send(chat->js, presence); | |
|
24254
2d990726bf92
Updated to use latest spec. in XEP-0231
Marcus Lundblad <malu@pidgin.im>
parents:
24251
diff
changeset
|
688 | |
| 7974 | 689 | xmlnode_free(presence); |
| 690 | g_free(room_jid); | |
| 691 | } | |
| 692 | ||
| 8113 | 693 | static void roomlist_disco_result_cb(JabberStream *js, xmlnode *packet, gpointer data) |
| 694 | { | |
| 695 | xmlnode *query; | |
| 696 | xmlnode *item; | |
| 697 | const char *type; | |
| 7974 | 698 | |
| 8113 | 699 | if(!js->roomlist) |
| 700 | return; | |
| 701 | ||
| 702 | if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result")) { | |
|
21150
bedd1215fb5e
Stop jabber setting wants_to_die itself. This involved plumbing disconnection
Will Thompson <resiak@pidgin.im>
parents:
19897
diff
changeset
|
703 | char *err = jabber_parse_error(js, packet, NULL); |
| 15884 | 704 | purple_notify_error(js->gc, _("Error"), |
|
10094
e80a87320835
[gaim-migrate @ 11112]
Mark Doliner <markdoliner@pidgin.im>
parents:
10091
diff
changeset
|
705 | _("Error retrieving room list"), err); |
| 15884 | 706 | purple_roomlist_set_in_progress(js->roomlist, FALSE); |
| 707 | purple_roomlist_unref(js->roomlist); | |
| 8120 | 708 | js->roomlist = NULL; |
| 8401 | 709 | g_free(err); |
| 8113 | 710 | return; |
| 711 | } | |
| 712 | ||
| 713 | if(!(query = xmlnode_get_child(packet, "query"))) { | |
|
21150
bedd1215fb5e
Stop jabber setting wants_to_die itself. This involved plumbing disconnection
Will Thompson <resiak@pidgin.im>
parents:
19897
diff
changeset
|
714 | char *err = jabber_parse_error(js, packet, NULL); |
| 15884 | 715 | purple_notify_error(js->gc, _("Error"), |
|
10094
e80a87320835
[gaim-migrate @ 11112]
Mark Doliner <markdoliner@pidgin.im>
parents:
10091
diff
changeset
|
716 | _("Error retrieving room list"), err); |
| 15884 | 717 | purple_roomlist_set_in_progress(js->roomlist, FALSE); |
| 718 | purple_roomlist_unref(js->roomlist); | |
| 8120 | 719 | js->roomlist = NULL; |
| 8401 | 720 | g_free(err); |
| 8113 | 721 | return; |
| 722 | } | |
| 723 | ||
| 8135 | 724 | for(item = xmlnode_get_child(query, "item"); item; |
| 725 | item = xmlnode_get_next_twin(item)) { | |
| 8113 | 726 | const char *name; |
| 15884 | 727 | PurpleRoomlistRoom *room; |
| 8113 | 728 | JabberID *jid; |
| 729 | ||
| 730 | if(!(jid = jabber_id_new(xmlnode_get_attrib(item, "jid")))) | |
| 731 | continue; | |
| 732 | name = xmlnode_get_attrib(item, "name"); | |
| 733 | ||
| 734 | ||
| 15884 | 735 | room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, jid->node, NULL); |
| 736 | purple_roomlist_room_add_field(js->roomlist, room, jid->node); | |
| 737 | purple_roomlist_room_add_field(js->roomlist, room, jid->domain); | |
| 738 | purple_roomlist_room_add_field(js->roomlist, room, name ? name : ""); | |
| 739 | purple_roomlist_room_add(js->roomlist, room); | |
| 8113 | 740 | |
| 741 | jabber_id_free(jid); | |
| 742 | } | |
| 15884 | 743 | purple_roomlist_set_in_progress(js->roomlist, FALSE); |
| 744 | purple_roomlist_unref(js->roomlist); | |
| 8113 | 745 | js->roomlist = NULL; |
| 746 | } | |
| 747 | ||
| 10045 | 748 | static void roomlist_cancel_cb(JabberStream *js, const char *server) { |
| 749 | if(js->roomlist) { | |
| 15884 | 750 | purple_roomlist_set_in_progress(js->roomlist, FALSE); |
| 751 | purple_roomlist_unref(js->roomlist); | |
| 10045 | 752 | js->roomlist = NULL; |
| 753 | } | |
| 754 | } | |
| 755 | ||
| 8113 | 756 | static void roomlist_ok_cb(JabberStream *js, const char *server) |
| 757 | { | |
| 758 | JabberIq *iq; | |
| 10045 | 759 | |
| 760 | if(!js->roomlist) | |
| 761 | return; | |
| 8113 | 762 | |
| 763 | if(!server || !*server) { | |
| 15884 | 764 | purple_notify_error(js->gc, _("Invalid Server"), _("Invalid Server"), NULL); |
| 8113 | 765 | return; |
| 766 | } | |
| 767 | ||
| 15884 | 768 | purple_roomlist_set_in_progress(js->roomlist, TRUE); |
| 10045 | 769 | |
| 770 | iq = jabber_iq_new_query(js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#items"); | |
| 771 | ||
| 772 | xmlnode_set_attrib(iq->node, "to", server); | |
| 773 | ||
| 774 | jabber_iq_set_callback(iq, roomlist_disco_result_cb, NULL); | |
| 775 | ||
| 776 | jabber_iq_send(iq); | |
| 777 | } | |
| 778 | ||
| 15884 | 779 | char *jabber_roomlist_room_serialize(PurpleRoomlistRoom *room) |
| 15185 | 780 | { |
| 781 | ||
| 782 | return g_strdup_printf("%s@%s", (char*)room->fields->data, (char*)room->fields->next->data); | |
| 783 | } | |
| 784 | ||
| 15884 | 785 | PurpleRoomlist *jabber_roomlist_get_list(PurpleConnection *gc) |
| 10045 | 786 | { |
| 787 | JabberStream *js = gc->proto_data; | |
| 788 | GList *fields = NULL; | |
| 15884 | 789 | PurpleRoomlistField *f; |
| 10045 | 790 | |
|
9913
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
791 | if(js->roomlist) |
| 15884 | 792 | purple_roomlist_unref(js->roomlist); |
|
9913
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
793 | |
| 15884 | 794 | js->roomlist = purple_roomlist_new(purple_connection_get_account(js->gc)); |
|
9913
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
795 | |
| 15884 | 796 | f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", "room", TRUE); |
|
9913
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
797 | fields = g_list_append(fields, f); |
|
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
798 | |
| 15884 | 799 | f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", "server", TRUE); |
|
9913
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
800 | fields = g_list_append(fields, f); |
|
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
801 | |
| 15884 | 802 | f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, _("Description"), "description", FALSE); |
|
9913
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
803 | fields = g_list_append(fields, f); |
|
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
804 | |
| 15884 | 805 | purple_roomlist_set_fields(js->roomlist, fields); |
|
9913
2e773d9ba800
[gaim-migrate @ 10805]
Daniel Atallah <datallah@pidgin.im>
parents:
9770
diff
changeset
|
806 | |
| 8113 | 807 | |
|
21175
c6d76b49c206
disapproval of revision '8ba833993a115415727bb1b70362e0bd1603c169'
Richard Laager <rlaager@pidgin.im>
parents:
21174
diff
changeset
|
808 | purple_request_input(gc, _("Enter a Conference Server"), _("Enter a Conference Server"), |
| 8113 | 809 | _("Select a conference server to query"), |
|
17007
66c0fa6e5e2a
Removes 'jabber.org' defaults from XMPP. I think we had agreed this was a good idea.
Sean Egan <seanegan@pidgin.im>
parents:
16490
diff
changeset
|
810 | js->chat_servers ? js->chat_servers->data : NULL, |
| 8697 | 811 | FALSE, FALSE, NULL, |
| 15884 | 812 | _("Find Rooms"), PURPLE_CALLBACK(roomlist_ok_cb), |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
15884
diff
changeset
|
813 | _("Cancel"), PURPLE_CALLBACK(roomlist_cancel_cb), |
|
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
15884
diff
changeset
|
814 | purple_connection_get_account(gc), NULL, NULL, |
|
21175
c6d76b49c206
disapproval of revision '8ba833993a115415727bb1b70362e0bd1603c169'
Richard Laager <rlaager@pidgin.im>
parents:
21174
diff
changeset
|
815 | js); |
| 8113 | 816 | |
| 817 | return js->roomlist; | |
| 818 | } | |
| 819 | ||
| 15884 | 820 | void jabber_roomlist_cancel(PurpleRoomlist *list) |
| 8113 | 821 | { |
| 15884 | 822 | PurpleConnection *gc; |
| 8113 | 823 | JabberStream *js; |
| 824 | ||
| 15884 | 825 | gc = purple_account_get_connection(list->account); |
| 8113 | 826 | js = gc->proto_data; |
| 827 | ||
| 15884 | 828 | purple_roomlist_set_in_progress(list, FALSE); |
| 8113 | 829 | |
| 830 | if (js->roomlist == list) { | |
| 831 | js->roomlist = NULL; | |
| 15884 | 832 | purple_roomlist_unref(list); |
| 8113 | 833 | } |
| 834 | } | |
| 835 | ||
| 9152 | 836 | void jabber_chat_member_free(JabberChatMember *jcm) |
| 837 | { | |
| 838 | g_free(jcm->handle); | |
| 839 | g_free(jcm->jid); | |
| 840 | g_free(jcm); | |
| 841 | } | |
| 842 | ||
| 843 | void jabber_chat_track_handle(JabberChat *chat, const char *handle, | |
| 844 | const char *jid, const char *affiliation, const char *role) | |
| 845 | { | |
| 846 | JabberChatMember *jcm = g_new0(JabberChatMember, 1); | |
| 847 | ||
| 848 | jcm->handle = g_strdup(handle); | |
| 849 | jcm->jid = g_strdup(jid); | |
| 850 | ||
| 851 | g_hash_table_replace(chat->members, jcm->handle, jcm); | |
| 852 | ||
| 853 | /* XXX: keep track of role and affiliation */ | |
| 854 | } | |
| 855 | ||
| 856 | void jabber_chat_remove_handle(JabberChat *chat, const char *handle) | |
| 857 | { | |
| 858 | g_hash_table_remove(chat->members, handle); | |
| 859 | } | |
| 860 | ||
| 861 | gboolean jabber_chat_ban_user(JabberChat *chat, const char *who, const char *why) | |
| 862 | { | |
|
19854
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
863 | JabberChatMember *jcm; |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
864 | const char *jid; |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
865 | char *to; |
| 9152 | 866 | JabberIq *iq; |
| 867 | xmlnode *query, *item, *reason; | |
| 868 | ||
|
19854
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
869 | jcm = g_hash_table_lookup(chat->members, who); |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
870 | if (jcm && jcm->jid) |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
871 | jid = jcm->jid; |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
872 | else if (g_utf8_strchr(who, -1, '@') != NULL) |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
873 | jid = who; |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
874 | else |
| 9152 | 875 | return FALSE; |
| 876 | ||
| 877 | iq = jabber_iq_new_query(chat->js, JABBER_IQ_SET, | |
| 878 | "http://jabber.org/protocol/muc#admin"); | |
| 879 | ||
| 880 | to = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 881 | xmlnode_set_attrib(iq->node, "to", to); | |
| 882 | g_free(to); | |
| 883 | ||
| 884 | query = xmlnode_get_child(iq->node, "query"); | |
| 885 | item = xmlnode_new_child(query, "item"); | |
|
19854
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
886 | xmlnode_set_attrib(item, "jid", jid); |
| 9152 | 887 | xmlnode_set_attrib(item, "affiliation", "outcast"); |
| 888 | if(why) { | |
| 889 | reason = xmlnode_new_child(item, "reason"); | |
| 890 | xmlnode_insert_data(reason, why, -1); | |
| 891 | } | |
| 892 | ||
| 893 | jabber_iq_send(iq); | |
| 894 | ||
| 895 | return TRUE; | |
| 896 | } | |
| 8113 | 897 | |
| 11393 | 898 | gboolean jabber_chat_affiliate_user(JabberChat *chat, const char *who, const char *affiliation) |
| 899 | { | |
|
19854
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
900 | JabberChatMember *jcm; |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
901 | const char *jid; |
|
13238
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
902 | char *to; |
| 11393 | 903 | JabberIq *iq; |
| 904 | xmlnode *query, *item; | |
|
13238
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
905 | |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
906 | jcm = g_hash_table_lookup(chat->members, who); |
|
19854
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
907 | if (jcm && jcm->jid) |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
908 | jid = jcm->jid; |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
909 | else if (g_utf8_strchr(who, -1, '@') != NULL) |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
910 | jid = who; |
|
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
911 | else |
| 11393 | 912 | return FALSE; |
| 913 | ||
| 914 | iq = jabber_iq_new_query(chat->js, JABBER_IQ_SET, | |
| 915 | "http://jabber.org/protocol/muc#admin"); | |
| 916 | ||
| 917 | to = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 918 | xmlnode_set_attrib(iq->node, "to", to); | |
| 919 | g_free(to); | |
| 920 | ||
| 921 | query = xmlnode_get_child(iq->node, "query"); | |
| 922 | item = xmlnode_new_child(query, "item"); | |
|
19854
b7971f8bd19a
Add the ability to affiliate people in an xmpp chat room even if
Mark Doliner <markdoliner@pidgin.im>
parents:
17007
diff
changeset
|
923 | xmlnode_set_attrib(item, "jid", jid); |
| 11393 | 924 | xmlnode_set_attrib(item, "affiliation", affiliation); |
| 925 | ||
| 926 | jabber_iq_send(iq); | |
| 927 | ||
| 928 | return TRUE; | |
| 929 | } | |
| 8113 | 930 | |
|
13238
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
931 | gboolean jabber_chat_role_user(JabberChat *chat, const char *who, const char *role) |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
932 | { |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
933 | char *to; |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
934 | JabberIq *iq; |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
935 | xmlnode *query, *item; |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
936 | JabberChatMember *jcm; |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
937 | |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
938 | jcm = g_hash_table_lookup(chat->members, who); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
939 | |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
940 | if (!jcm || !jcm->handle) |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
941 | return FALSE; |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
942 | |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
943 | iq = jabber_iq_new_query(chat->js, JABBER_IQ_SET, |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
944 | "http://jabber.org/protocol/muc#admin"); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
945 | |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
946 | to = g_strdup_printf("%s@%s", chat->room, chat->server); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
947 | xmlnode_set_attrib(iq->node, "to", to); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
948 | g_free(to); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
949 | |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
950 | query = xmlnode_get_child(iq->node, "query"); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
951 | item = xmlnode_new_child(query, "item"); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
952 | xmlnode_set_attrib(item, "nick", jcm->handle); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
953 | xmlnode_set_attrib(item, "role", role); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
954 | |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
955 | jabber_iq_send(iq); |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
956 | |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
957 | return TRUE; |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
958 | } |
|
b98439d90903
[gaim-migrate @ 15603]
Andrej Krivulčík <thefox692@users.sourceforge.net>
parents:
12323
diff
changeset
|
959 | |
| 9152 | 960 | gboolean jabber_chat_kick_user(JabberChat *chat, const char *who, const char *why) |
| 961 | { | |
| 962 | JabberIq *iq; | |
| 963 | JabberChatMember *jcm = g_hash_table_lookup(chat->members, who); | |
| 964 | char *to; | |
| 965 | xmlnode *query, *item, *reason; | |
| 966 | ||
| 967 | if(!jcm || !jcm->jid) | |
| 968 | return FALSE; | |
| 969 | ||
| 970 | iq = jabber_iq_new_query(chat->js, JABBER_IQ_SET, | |
| 971 | "http://jabber.org/protocol/muc#admin"); | |
| 972 | ||
| 973 | to = g_strdup_printf("%s@%s", chat->room, chat->server); | |
| 974 | xmlnode_set_attrib(iq->node, "to", to); | |
| 975 | g_free(to); | |
| 976 | ||
| 977 | query = xmlnode_get_child(iq->node, "query"); | |
| 978 | item = xmlnode_new_child(query, "item"); | |
| 979 | xmlnode_set_attrib(item, "jid", jcm->jid); | |
| 980 | xmlnode_set_attrib(item, "role", "none"); | |
| 981 | if(why) { | |
| 982 | reason = xmlnode_new_child(item, "reason"); | |
| 983 | xmlnode_insert_data(reason, why, -1); | |
| 984 | } | |
| 985 | ||
| 986 | jabber_iq_send(iq); | |
| 987 | ||
| 988 | return TRUE; | |
| 989 | } | |
| 990 | ||
| 10941 | 991 | static void jabber_chat_disco_traffic_cb(JabberStream *js, xmlnode *packet, gpointer data) |
| 992 | { | |
| 993 | JabberChat *chat; | |
|
20225
684334efdc19
applied changes from d4b316d73ebaf93803ca2642e78b8821c3b5d5c7
Luke Schierer <lschiere@pidgin.im>
parents:
19897
diff
changeset
|
994 | /*xmlnode *query;*/ |
| 10941 | 995 | int id = GPOINTER_TO_INT(data); |
| 996 | ||
| 997 | if(!(chat = jabber_chat_find_by_id(js, id))) | |
| 998 | return; | |
| 999 | ||
|
11392
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1000 | /* defaults, in case the conference server doesn't |
|
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1001 | * support this request */ |
|
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1002 | chat->xhtml = TRUE; |
|
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1003 | |
|
20225
684334efdc19
applied changes from d4b316d73ebaf93803ca2642e78b8821c3b5d5c7
Luke Schierer <lschiere@pidgin.im>
parents:
19897
diff
changeset
|
1004 | /* disabling this until more MUC servers support |
|
684334efdc19
applied changes from d4b316d73ebaf93803ca2642e78b8821c3b5d5c7
Luke Schierer <lschiere@pidgin.im>
parents:
19897
diff
changeset
|
1005 | * announcing this |
|
13713
1ae8790174a4
[gaim-migrate @ 16115]
Richard Laager <rlaager@pidgin.im>
parents:
13238
diff
changeset
|
1006 | if(xmlnode_get_child(packet, "error")) { |
| 10941 | 1007 | return; |
| 1008 | } | |
| 1009 | ||
| 1010 | if(!(query = xmlnode_get_child(packet, "query"))) | |
| 1011 | return; | |
| 1012 | ||
|
11392
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1013 | chat->xhtml = FALSE; |
|
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1014 | |
| 10941 | 1015 | for(x = xmlnode_get_child(query, "feature"); x; x = xmlnode_get_next_twin(x)) { |
| 1016 | const char *var = xmlnode_get_attrib(x, "var"); | |
| 1017 | ||
| 1018 | if(var && !strcmp(var, "http://jabber.org/protocol/xhtml-im")) { | |
| 1019 | chat->xhtml = TRUE; | |
| 1020 | } | |
| 1021 | } | |
| 15157 | 1022 | */ |
| 10941 | 1023 | } |
| 1024 | ||
| 1025 | void jabber_chat_disco_traffic(JabberChat *chat) | |
| 1026 | { | |
| 1027 | JabberIq *iq; | |
| 1028 | xmlnode *query; | |
|
11392
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1029 | char *room_jid; |
|
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1030 | |
|
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1031 | room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); |
| 10941 | 1032 | |
| 1033 | iq = jabber_iq_new_query(chat->js, JABBER_IQ_GET, | |
| 1034 | "http://jabber.org/protocol/disco#info"); | |
| 1035 | ||
|
11392
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1036 | xmlnode_set_attrib(iq->node, "to", room_jid); |
|
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1037 | |
| 10941 | 1038 | query = xmlnode_get_child(iq->node, "query"); |
| 1039 | ||
| 1040 | xmlnode_set_attrib(query, "node", "http://jabber.org/protocol/muc#traffic"); | |
| 1041 | ||
| 1042 | jabber_iq_set_callback(iq, jabber_chat_disco_traffic_cb, GINT_TO_POINTER(chat->id)); | |
| 1043 | ||
| 1044 | jabber_iq_send(iq); | |
|
11392
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1045 | |
|
fcf358e5a309
[gaim-migrate @ 13621]
Zmitrok <zmitrok@users.sourceforge.net>
parents:
10959
diff
changeset
|
1046 | g_free(room_jid); |
| 10941 | 1047 | } |
| 9152 | 1048 | |
| 1049 | ||
| 10941 | 1050 |