Mercurial > ~mikael > mcabber > hg
annotate mcabber/mcabber/xmpp_helper.c @ 1909:9c14153e2580
Do not display unhandled IQ result messages to the log window
We display the message only in the debug log file, because these messages
are usually ignored anyway (ideally we would create a handler explicitly
when sending the initial IQ request).
Thanks to VarLog for the report!
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Sun, 18 Apr 2010 14:14:05 +0200 |
parents | 84bb3e893586 |
children | 1a01a7ef4e43 |
rev | line source |
---|---|
1598 | 1 /* |
1599 | 2 * xmpp_helper.c -- Jabber protocol helper functions |
1598 | 3 * |
1901
84bb3e893586
Update some file headers
Mikael Berthe <mikael@lilotux.net>
parents:
1896
diff
changeset
|
4 * Copyright (C) 2008-2010 Frank Zschockelt <mcabber@freakysoft.de> |
84bb3e893586
Update some file headers
Mikael Berthe <mikael@lilotux.net>
parents:
1896
diff
changeset
|
5 * Copyright (C) 2005-2010 Mikael Berthe <mikael@lilotux.net> |
1598 | 6 * |
7 * This program is free software; you can redistribute it and/or modify | |
8 * it under the terms of the GNU General Public License as published by | |
9 * the Free Software Foundation; either version 2 of the License, or (at | |
10 * your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License | |
18 * along with this program; if not, write to the Free Software | |
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
20 * USA | |
21 */ | |
22 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
23 #include <string.h> |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
24 #include <stdlib.h> |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
25 |
1598 | 26 #include "xmpp_helper.h" |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
27 #include "settings.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
28 #include "utils.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
29 #include "caps.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
30 #include "logprint.h" |
1607 | 31 #include "config.h" |
1598 | 32 |
33 time_t iqlast; // last message/status change time | |
34 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
35 extern char *imstatus_showmap[]; |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
36 |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
37 struct xmpp_error xmpp_errors[] = { |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
38 {XMPP_ERROR_REDIRECT, "302", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
39 "Redirect", "redirect", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
40 {XMPP_ERROR_BAD_REQUEST, "400", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
41 "Bad Request", "bad-request", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
42 {XMPP_ERROR_NOT_AUTHORIZED, "401", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
43 "Not Authorized", "not-authorized", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
44 {XMPP_ERROR_PAYMENT_REQUIRED, "402", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
45 "Payment Required", "payment-required", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
46 {XMPP_ERROR_FORBIDDEN, "403", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
47 "Forbidden", "forbidden", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
48 {XMPP_ERROR_NOT_FOUND, "404", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
49 "Not Found", "item-not-found", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
50 {XMPP_ERROR_NOT_ALLOWED, "405", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
51 "Not Allowed", "not-allowed", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
52 {XMPP_ERROR_NOT_ACCEPTABLE, "406", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
53 "Not Acceptable", "not-acceptable", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
54 {XMPP_ERROR_REGISTRATION_REQUIRED, "407", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
55 "Registration required", "registration-required", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
56 {XMPP_ERROR_REQUEST_TIMEOUT, "408", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
57 "Request Timeout", "remote-server-timeout", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
58 {XMPP_ERROR_CONFLICT, "409", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
59 "Conflict", "conflict", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
60 {XMPP_ERROR_INTERNAL_SERVER_ERROR, "500", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
61 "Internal Server Error", "internal-server-error", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
62 {XMPP_ERROR_NOT_IMPLEMENTED, "501", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
63 "Not Implemented", "feature-not-implemented", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
64 {XMPP_ERROR_REMOTE_SERVER_ERROR, "502", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
65 "Remote Server Error", "service-unavailable", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
66 {XMPP_ERROR_SERVICE_UNAVAILABLE, "503", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
67 "Service Unavailable", "service-unavailable", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
68 {XMPP_ERROR_REMOTE_SERVER_TIMEOUT, "504", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
69 "Remote Server Timeout", "remote-server-timeout", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
70 {XMPP_ERROR_DISCONNECTED, "510", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
71 "Disconnected", "service-unavailable", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
72 {0, NULL, NULL, NULL, NULL} |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
73 }; |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
74 |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
75 |
1607 | 76 #ifdef MODULES_ENABLE |
77 static GSList *xmpp_additional_features = NULL; | |
78 static char *ver, *ver_notavail; | |
79 | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
80 void xmpp_add_feature(const char *xmlns) |
1607 | 81 { |
82 if (xmlns) { | |
83 ver = NULL; | |
84 ver_notavail = NULL; | |
85 xmpp_additional_features = g_slist_append(xmpp_additional_features, | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
86 g_strdup(xmlns)); |
1607 | 87 } |
88 } | |
89 | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
90 void xmpp_del_feature(const char *xmlns) |
1607 | 91 { |
92 GSList *feature = xmpp_additional_features; | |
93 while (feature) { | |
94 if (!strcmp(feature->data, xmlns)) { | |
95 ver = NULL; | |
96 ver_notavail = NULL; | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
97 g_free(feature->data); |
1607 | 98 xmpp_additional_features = g_slist_delete_link(xmpp_additional_features, |
99 feature); | |
100 return; | |
101 } | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
102 feature = g_slist_next(feature); |
1607 | 103 } |
104 } | |
105 #endif | |
106 | |
1598 | 107 const gchar* lm_message_node_get_child_value(LmMessageNode *node, |
108 const gchar *child) | |
109 { | |
110 LmMessageNode *tmp; | |
111 tmp = lm_message_node_find_child(node, child); | |
1896
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
112 if (tmp) { |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
113 const gchar *val = lm_message_node_get_value(tmp); |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
114 return (val ? val : ""); |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
115 } |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
116 return NULL; |
1598 | 117 } |
118 | |
119 static LmMessageNode *hidden = NULL; | |
120 | |
121 void lm_message_node_hide(LmMessageNode *node) | |
122 { | |
123 LmMessageNode *parent = node->parent, *prev_sibling = node->prev; | |
124 | |
125 if (hidden) { | |
126 hidden->children = hidden->next = hidden->prev = hidden->parent = NULL; | |
127 lm_message_node_unref(hidden); | |
128 } | |
129 | |
130 if (parent->children == node) | |
131 parent->children = node->next; | |
132 if (prev_sibling) | |
133 prev_sibling->next = node->next; | |
134 if (node->next) | |
135 node->next->prev = prev_sibling; | |
136 } | |
137 | |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1704
diff
changeset
|
138 // Maybe not a good idea, because it uses internals of loudmouth... |
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1704
diff
changeset
|
139 // It's used for rosternotes/bookmarks |
1598 | 140 LmMessageNode *lm_message_node_new(const gchar *name, const gchar *xmlns) |
141 { | |
142 LmMessageNode *node; | |
143 | |
144 node = g_new0 (LmMessageNode, 1); | |
145 node->name = g_strdup (name); | |
146 node->value = NULL; | |
147 node->raw_mode = FALSE; | |
148 node->attributes = NULL; | |
149 node->next = NULL; | |
150 node->prev = NULL; | |
151 node->parent = NULL; | |
152 node->children = NULL; | |
153 | |
154 node->ref_count = 1; | |
155 lm_message_node_set_attribute(node, "xmlns", xmlns); | |
156 return node; | |
157 } | |
158 | |
159 void lm_message_node_insert_childnode(LmMessageNode *node, | |
160 LmMessageNode *child) | |
161 { | |
162 LmMessageNode *x; | |
163 lm_message_node_deep_ref(child); | |
164 | |
165 if (node->children == NULL) | |
166 node->children = child; | |
167 else { | |
168 for (x = node->children; x->next; x = x->next) | |
169 ; | |
170 x->next = child; | |
171 } | |
172 } | |
173 | |
174 void lm_message_node_deep_ref(LmMessageNode *node) | |
175 { | |
176 if (node == NULL) | |
177 return; | |
178 lm_message_node_ref(node); | |
179 lm_message_node_deep_ref(node->next); | |
180 lm_message_node_deep_ref(node->children); | |
181 } | |
182 | |
183 const gchar* lm_message_get_from(LmMessage *m) | |
184 { | |
185 return lm_message_node_get_attribute(m->node, "from"); | |
186 } | |
187 | |
188 const gchar* lm_message_get_id(LmMessage *m) | |
189 { | |
190 return lm_message_node_get_attribute(m->node, "id"); | |
191 } | |
192 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
193 LmMessage *lm_message_new_iq_from_query(LmMessage *m, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
194 LmMessageSubType type) |
1598 | 195 { |
196 LmMessage *new; | |
197 const char *from = lm_message_node_get_attribute(m->node, "from"); | |
198 const char *id = lm_message_node_get_attribute(m->node, "id"); | |
199 | |
200 new = lm_message_new_with_sub_type(from, LM_MESSAGE_TYPE_IQ, | |
201 type); | |
202 if (id) | |
203 lm_message_node_set_attribute(new->node, "id", id); | |
204 | |
205 return new; | |
206 } | |
207 | |
1600 | 208 // entity_version(enum imstatus status) |
1598 | 209 // Return a static version string for Entity Capabilities. |
210 // It should be specific to the client version, please change the id | |
211 // if you alter mcabber's disco support (or add something to the version | |
212 // number) so that it doesn't conflict with the official client. | |
1600 | 213 const char *entity_version(enum imstatus status) |
1598 | 214 { |
1607 | 215 #ifndef MODULES_ENABLE |
1600 | 216 static char *ver, *ver_notavail; |
1607 | 217 #endif |
1598 | 218 |
1600 | 219 if (ver && (status != notavail)) |
1598 | 220 return ver; |
1600 | 221 if (ver_notavail) |
222 return ver_notavail; | |
1598 | 223 |
1600 | 224 caps_add(""); |
225 caps_set_identity("", "client", PACKAGE_STRING, "pc"); | |
226 caps_add_feature("", NS_DISCO_INFO); | |
227 caps_add_feature("", NS_MUC); | |
228 // advertise ChatStates only if they aren't disabled | |
229 if (!settings_opt_get_int("disable_chatstates")) | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
230 caps_add_feature("", NS_CHATSTATES); |
1600 | 231 caps_add_feature("", NS_TIME); |
232 caps_add_feature("", NS_XMPP_TIME); | |
233 caps_add_feature("", NS_VERSION); | |
234 caps_add_feature("", NS_PING); | |
235 caps_add_feature("", NS_COMMANDS); | |
1602 | 236 caps_add_feature("", NS_RECEIPTS); |
1600 | 237 if (!settings_opt_get_int("iq_last_disable") && |
238 (!settings_opt_get_int("iq_last_disable_when_notavail") || | |
239 status != notavail)) | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
240 caps_add_feature("", NS_LAST); |
1607 | 241 #ifdef MODULES_ENABLE |
242 { | |
243 GSList *el = xmpp_additional_features; | |
244 while (el) { | |
245 caps_add_feature("", el->data); | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
246 el = g_slist_next(el); |
1607 | 247 } |
248 } | |
249 #endif | |
1598 | 250 |
1600 | 251 if (status == notavail) { |
252 ver_notavail = caps_generate(); | |
253 return ver_notavail; | |
254 } | |
255 | |
256 ver = caps_generate(); | |
1598 | 257 return ver; |
258 } | |
259 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
260 LmMessageNode *lm_message_node_find_xmlns(LmMessageNode *node, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
261 const char *xmlns) |
1598 | 262 { |
263 LmMessageNode *x; | |
264 const char *p; | |
265 | |
266 for (x = node->children ; x; x = x->next) { | |
267 if ((p = lm_message_node_get_attribute(x, "xmlns")) && !strcmp(p, xmlns)) | |
268 break; | |
269 } | |
270 return x; | |
271 } | |
272 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
273 time_t lm_message_node_get_timestamp(LmMessageNode *node) |
1598 | 274 { |
275 LmMessageNode *x; | |
276 const char *p; | |
277 | |
278 x = lm_message_node_find_xmlns(node, NS_XMPP_DELAY); | |
279 if (x && (!strcmp(x->name, "delay")) && | |
280 (p = lm_message_node_get_attribute(x, "stamp")) != NULL) | |
281 return from_iso8601(p, 1); | |
282 x = lm_message_node_find_xmlns(node, NS_DELAY); | |
283 if (x && (p = lm_message_node_get_attribute(x, "stamp")) != NULL) | |
284 return from_iso8601(p, 1); | |
285 return 0; | |
286 } | |
287 | |
288 // lm_message_new_presence(status, recipient, message) | |
289 // Create an xmlnode with default presence attributes | |
290 // Note: the caller must free the node after use | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
291 LmMessage *lm_message_new_presence(enum imstatus st, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
292 const char *recipient, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
293 const char *msg) |
1598 | 294 { |
295 unsigned int prio; | |
296 LmMessage *x = lm_message_new(recipient, LM_MESSAGE_TYPE_PRESENCE); | |
297 | |
298 switch(st) { | |
299 case away: | |
300 case notavail: | |
301 case dontdisturb: | |
302 case freeforchat: | |
303 lm_message_node_add_child(x->node, "show", imstatus_showmap[st]); | |
304 break; | |
305 | |
306 case invisible: | |
307 lm_message_node_set_attribute(x->node, "type", "invisible"); | |
308 break; | |
309 | |
310 case offline: | |
311 lm_message_node_set_attribute(x->node, "type", "unavailable"); | |
312 break; | |
313 | |
314 default: | |
315 break; | |
316 } | |
317 | |
318 if (st == away || st == notavail) | |
319 prio = settings_opt_get_int("priority_away"); | |
320 else | |
321 prio = settings_opt_get_int("priority"); | |
322 | |
323 if (prio) { | |
324 char strprio[8]; | |
325 snprintf(strprio, 8, "%d", (int)prio); | |
326 lm_message_node_add_child(x->node, "priority", strprio); | |
327 } | |
328 | |
329 if (msg) | |
330 lm_message_node_add_child(x->node, "status", msg); | |
331 | |
332 return x; | |
333 } | |
334 | |
335 static const char *defaulterrormsg(guint code) | |
336 { | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
337 int i; |
1598 | 338 |
339 for (i = 0; xmpp_errors[i].code; ++i) { | |
340 if (xmpp_errors[i].code == code) | |
341 return xmpp_errors[i].meaning; | |
342 } | |
343 return NULL; | |
344 } | |
345 | |
346 // display_server_error(x) | |
347 // Display the error to the user | |
348 // x: error tag xmlnode pointer | |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
349 void display_server_error(LmMessageNode *x, const char *from) |
1598 | 350 { |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
351 const char *desc = NULL, *errname = NULL, *s; |
1598 | 352 char *sdesc, *tmp; |
353 | |
354 if (!x) return; | |
355 | |
356 /* RFC3920: | |
357 * The <error/> element: | |
358 * o MUST contain a child element corresponding to one of the defined | |
359 * stanza error conditions specified below; this element MUST be | |
360 * qualified by the 'urn:ietf:params:xml:ns:xmpp-stanzas' namespace. | |
361 */ | |
362 if (x->children) | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
363 errname = x->children->name; |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
364 |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
365 if (from) |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
366 scr_LogPrint(LPRINT_LOGNORM, "Received error packet [%s] from <%s>", |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
367 (errname ? errname : ""), from); |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
368 else |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
369 scr_LogPrint(LPRINT_LOGNORM, "Received error packet [%s]", |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
370 (errname ? errname : "")); |
1598 | 371 |
372 // For backward compatibility | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
373 if (!errname && ((s = lm_message_node_get_attribute(x, "code")) != NULL)) { |
1598 | 374 // Default message |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
375 desc = defaulterrormsg(atoi(s)); |
1598 | 376 } |
377 | |
378 // Error tag data is better, if available | |
379 s = lm_message_node_get_value(x); | |
380 if (s && *s) desc = s; | |
381 | |
382 // And sometimes there is a text message | |
383 s = lm_message_node_get_child_value(x, "text"); | |
384 | |
385 if (s && *s) desc = s; | |
386 | |
387 // If we still have no description, let's give up | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
388 if (!desc || !*desc) |
1598 | 389 return; |
390 | |
391 // Strip trailing newlines | |
392 sdesc = g_strdup(desc); | |
393 for (tmp = sdesc; *tmp; tmp++) ; | |
394 if (tmp > sdesc) | |
395 tmp--; | |
396 while (tmp >= sdesc && (*tmp == '\n' || *tmp == '\r')) | |
397 *tmp-- = '\0'; | |
398 | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
399 if (*sdesc) |
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
400 scr_LogPrint(LPRINT_LOGNORM, "Error message from server: %s", sdesc); |
1598 | 401 g_free(sdesc); |
402 } | |
403 | |
1811 | 404 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ |