Mercurial > ~mikael > mcabber > hg
annotate mcabber/mcabber/xmpp_helper.c @ 2223:965e0282c128
Backed out changeset fa516ef22145
Turns out that in this hash the value pointer is the same as the
key pointer, so there's no need to free both the key and the value.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Fri, 06 Nov 2015 22:31:40 +0100 |
parents | ea90906cb691 |
children | f5402d705f67 |
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> |
2020
46a21258ad91
Fix some compiler warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1999
diff
changeset
|
25 #include <stdio.h> // snprintf |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
26 |
1598 | 27 #include "xmpp_helper.h" |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
28 #include "settings.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
29 #include "utils.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
30 #include "caps.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
31 #include "logprint.h" |
1607 | 32 #include "config.h" |
1598 | 33 |
34 time_t iqlast; // last message/status change time | |
35 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
36 extern char *imstatus_showmap[]; |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
37 |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
38 struct xmpp_error xmpp_errors[] = { |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
39 {XMPP_ERROR_REDIRECT, "302", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
40 "Redirect", "redirect", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
41 {XMPP_ERROR_BAD_REQUEST, "400", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
42 "Bad Request", "bad-request", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
43 {XMPP_ERROR_NOT_AUTHORIZED, "401", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
44 "Not Authorized", "not-authorized", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
45 {XMPP_ERROR_PAYMENT_REQUIRED, "402", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
46 "Payment Required", "payment-required", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
47 {XMPP_ERROR_FORBIDDEN, "403", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
48 "Forbidden", "forbidden", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
49 {XMPP_ERROR_NOT_FOUND, "404", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
50 "Not Found", "item-not-found", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
51 {XMPP_ERROR_NOT_ALLOWED, "405", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
52 "Not Allowed", "not-allowed", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
53 {XMPP_ERROR_NOT_ACCEPTABLE, "406", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
54 "Not Acceptable", "not-acceptable", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
55 {XMPP_ERROR_REGISTRATION_REQUIRED, "407", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
56 "Registration required", "registration-required", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
57 {XMPP_ERROR_REQUEST_TIMEOUT, "408", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
58 "Request Timeout", "remote-server-timeout", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
59 {XMPP_ERROR_CONFLICT, "409", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
60 "Conflict", "conflict", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
61 {XMPP_ERROR_INTERNAL_SERVER_ERROR, "500", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
62 "Internal Server Error", "internal-server-error", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
63 {XMPP_ERROR_NOT_IMPLEMENTED, "501", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
64 "Not Implemented", "feature-not-implemented", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
65 {XMPP_ERROR_REMOTE_SERVER_ERROR, "502", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
66 "Remote Server Error", "service-unavailable", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
67 {XMPP_ERROR_SERVICE_UNAVAILABLE, "503", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
68 "Service Unavailable", "service-unavailable", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
69 {XMPP_ERROR_REMOTE_SERVER_TIMEOUT, "504", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
70 "Remote Server Timeout", "remote-server-timeout", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
71 {XMPP_ERROR_DISCONNECTED, "510", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
72 "Disconnected", "service-unavailable", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
73 {0, NULL, NULL, NULL, NULL} |
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; | |
2210 | 111 |
112 if (G_UNLIKELY(!node || !child)) return NULL; | |
113 | |
1598 | 114 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
|
115 if (tmp) { |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
116 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
|
117 return (val ? val : ""); |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
118 } |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
119 return NULL; |
1598 | 120 } |
121 | |
122 static LmMessageNode *hidden = NULL; | |
123 | |
124 void lm_message_node_hide(LmMessageNode *node) | |
125 { | |
126 LmMessageNode *parent = node->parent, *prev_sibling = node->prev; | |
127 | |
128 if (hidden) { | |
129 hidden->children = hidden->next = hidden->prev = hidden->parent = NULL; | |
130 lm_message_node_unref(hidden); | |
131 } | |
132 | |
133 if (parent->children == node) | |
134 parent->children = node->next; | |
135 if (prev_sibling) | |
136 prev_sibling->next = node->next; | |
137 if (node->next) | |
138 node->next->prev = prev_sibling; | |
139 } | |
140 | |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1704
diff
changeset
|
141 // 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
|
142 // It's used for rosternotes/bookmarks |
1598 | 143 LmMessageNode *lm_message_node_new(const gchar *name, const gchar *xmlns) |
144 { | |
145 LmMessageNode *node; | |
146 | |
147 node = g_new0 (LmMessageNode, 1); | |
2210 | 148 if (G_UNLIKELY(!node)) return NULL; |
149 | |
1598 | 150 node->name = g_strdup (name); |
151 node->value = NULL; | |
152 node->raw_mode = FALSE; | |
153 node->attributes = NULL; | |
154 node->next = NULL; | |
155 node->prev = NULL; | |
156 node->parent = NULL; | |
157 node->children = NULL; | |
158 | |
159 node->ref_count = 1; | |
160 lm_message_node_set_attribute(node, "xmlns", xmlns); | |
161 return node; | |
162 } | |
163 | |
164 void lm_message_node_insert_childnode(LmMessageNode *node, | |
165 LmMessageNode *child) | |
166 { | |
167 LmMessageNode *x; | |
2210 | 168 if (G_UNLIKELY(!node)) return; |
1598 | 169 lm_message_node_deep_ref(child); |
170 | |
171 if (node->children == NULL) | |
172 node->children = child; | |
173 else { | |
174 for (x = node->children; x->next; x = x->next) | |
175 ; | |
176 x->next = child; | |
177 } | |
178 } | |
179 | |
180 void lm_message_node_deep_ref(LmMessageNode *node) | |
181 { | |
2210 | 182 if (G_UNLIKELY(!node)) return; |
1598 | 183 lm_message_node_ref(node); |
184 lm_message_node_deep_ref(node->next); | |
185 lm_message_node_deep_ref(node->children); | |
186 } | |
187 | |
188 const gchar* lm_message_get_from(LmMessage *m) | |
189 { | |
190 return lm_message_node_get_attribute(m->node, "from"); | |
191 } | |
192 | |
193 const gchar* lm_message_get_id(LmMessage *m) | |
194 { | |
195 return lm_message_node_get_attribute(m->node, "id"); | |
196 } | |
197 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
198 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
|
199 LmMessageSubType type) |
1598 | 200 { |
201 LmMessage *new; | |
202 const char *from = lm_message_node_get_attribute(m->node, "from"); | |
203 const char *id = lm_message_node_get_attribute(m->node, "id"); | |
204 | |
205 new = lm_message_new_with_sub_type(from, LM_MESSAGE_TYPE_IQ, | |
206 type); | |
207 if (id) | |
208 lm_message_node_set_attribute(new->node, "id", id); | |
209 | |
210 return new; | |
211 } | |
212 | |
1600 | 213 // entity_version(enum imstatus status) |
1598 | 214 // Return a static version string for Entity Capabilities. |
215 // It should be specific to the client version, please change the id | |
216 // if you alter mcabber's disco support (or add something to the version | |
217 // number) so that it doesn't conflict with the official client. | |
1600 | 218 const char *entity_version(enum imstatus status) |
1598 | 219 { |
1607 | 220 #ifndef MODULES_ENABLE |
1600 | 221 static char *ver, *ver_notavail; |
1607 | 222 #endif |
1598 | 223 |
1600 | 224 if (ver && (status != notavail)) |
1598 | 225 return ver; |
1600 | 226 if (ver_notavail) |
227 return ver_notavail; | |
1598 | 228 |
1600 | 229 caps_add(""); |
230 caps_set_identity("", "client", PACKAGE_STRING, "pc"); | |
231 caps_add_feature("", NS_DISCO_INFO); | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1972
diff
changeset
|
232 caps_add_feature("", NS_CAPS); |
1600 | 233 caps_add_feature("", NS_MUC); |
234 // advertise ChatStates only if they aren't disabled | |
235 if (!settings_opt_get_int("disable_chatstates")) | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
236 caps_add_feature("", NS_CHATSTATES); |
1600 | 237 caps_add_feature("", NS_TIME); |
238 caps_add_feature("", NS_XMPP_TIME); | |
239 caps_add_feature("", NS_VERSION); | |
240 caps_add_feature("", NS_PING); | |
241 caps_add_feature("", NS_COMMANDS); | |
1602 | 242 caps_add_feature("", NS_RECEIPTS); |
1951
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1901
diff
changeset
|
243 caps_add_feature("", NS_X_CONFERENCE); |
1600 | 244 if (!settings_opt_get_int("iq_last_disable") && |
245 (!settings_opt_get_int("iq_last_disable_when_notavail") || | |
246 status != notavail)) | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
247 caps_add_feature("", NS_LAST); |
1607 | 248 #ifdef MODULES_ENABLE |
249 { | |
250 GSList *el = xmpp_additional_features; | |
251 while (el) { | |
252 caps_add_feature("", el->data); | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
253 el = g_slist_next(el); |
1607 | 254 } |
255 } | |
256 #endif | |
1598 | 257 |
1600 | 258 if (status == notavail) { |
259 ver_notavail = caps_generate(); | |
260 return ver_notavail; | |
261 } | |
262 | |
263 ver = caps_generate(); | |
1598 | 264 return ver; |
265 } | |
266 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
267 LmMessageNode *lm_message_node_find_xmlns(LmMessageNode *node, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
268 const char *xmlns) |
1598 | 269 { |
270 LmMessageNode *x; | |
271 const char *p; | |
272 | |
2210 | 273 if (G_UNLIKELY(!node)) return NULL; |
2209
412322678d59
Fix segfault when receiving a <private> Carbons message tag
Mikael Berthe <mikael@lilotux.net>
parents:
2033
diff
changeset
|
274 |
1598 | 275 for (x = node->children ; x; x = x->next) { |
276 if ((p = lm_message_node_get_attribute(x, "xmlns")) && !strcmp(p, xmlns)) | |
277 break; | |
278 } | |
279 return x; | |
280 } | |
281 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
282 time_t lm_message_node_get_timestamp(LmMessageNode *node) |
1598 | 283 { |
284 LmMessageNode *x; | |
285 const char *p; | |
286 | |
287 x = lm_message_node_find_xmlns(node, NS_XMPP_DELAY); | |
288 if (x && (!strcmp(x->name, "delay")) && | |
289 (p = lm_message_node_get_attribute(x, "stamp")) != NULL) | |
290 return from_iso8601(p, 1); | |
291 x = lm_message_node_find_xmlns(node, NS_DELAY); | |
292 if (x && (p = lm_message_node_get_attribute(x, "stamp")) != NULL) | |
293 return from_iso8601(p, 1); | |
294 return 0; | |
295 } | |
296 | |
297 // lm_message_new_presence(status, recipient, message) | |
298 // Create an xmlnode with default presence attributes | |
299 // 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
|
300 LmMessage *lm_message_new_presence(enum imstatus st, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
301 const char *recipient, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
302 const char *msg) |
1598 | 303 { |
304 unsigned int prio; | |
305 LmMessage *x = lm_message_new(recipient, LM_MESSAGE_TYPE_PRESENCE); | |
306 | |
307 switch(st) { | |
308 case away: | |
309 case notavail: | |
310 case dontdisturb: | |
311 case freeforchat: | |
312 lm_message_node_add_child(x->node, "show", imstatus_showmap[st]); | |
313 break; | |
314 | |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1951
diff
changeset
|
315 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE |
1598 | 316 case invisible: |
317 lm_message_node_set_attribute(x->node, "type", "invisible"); | |
318 break; | |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1951
diff
changeset
|
319 #endif |
1598 | 320 |
321 case offline: | |
322 lm_message_node_set_attribute(x->node, "type", "unavailable"); | |
323 break; | |
324 | |
325 default: | |
326 break; | |
327 } | |
328 | |
329 if (st == away || st == notavail) | |
330 prio = settings_opt_get_int("priority_away"); | |
331 else | |
332 prio = settings_opt_get_int("priority"); | |
333 | |
334 if (prio) { | |
335 char strprio[8]; | |
336 snprintf(strprio, 8, "%d", (int)prio); | |
337 lm_message_node_add_child(x->node, "priority", strprio); | |
338 } | |
339 | |
340 if (msg) | |
341 lm_message_node_add_child(x->node, "status", msg); | |
342 | |
343 return x; | |
344 } | |
345 | |
346 static const char *defaulterrormsg(guint code) | |
347 { | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
348 int i; |
1598 | 349 |
350 for (i = 0; xmpp_errors[i].code; ++i) { | |
351 if (xmpp_errors[i].code == code) | |
352 return xmpp_errors[i].meaning; | |
353 } | |
354 return NULL; | |
355 } | |
356 | |
357 // display_server_error(x) | |
358 // Display the error to the user | |
359 // 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
|
360 void display_server_error(LmMessageNode *x, const char *from) |
1598 | 361 { |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
362 const char *desc = NULL, *errname = NULL, *s; |
1598 | 363 char *sdesc, *tmp; |
364 | |
365 if (!x) return; | |
366 | |
367 /* RFC3920: | |
368 * The <error/> element: | |
369 * o MUST contain a child element corresponding to one of the defined | |
370 * stanza error conditions specified below; this element MUST be | |
371 * qualified by the 'urn:ietf:params:xml:ns:xmpp-stanzas' namespace. | |
372 */ | |
373 if (x->children) | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
374 errname = x->children->name; |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
375 |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
376 if (from) |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
377 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
|
378 (errname ? errname : ""), from); |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
379 else |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
380 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
|
381 (errname ? errname : "")); |
1598 | 382 |
383 // For backward compatibility | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
384 if (!errname && ((s = lm_message_node_get_attribute(x, "code")) != NULL)) { |
1598 | 385 // Default message |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
386 desc = defaulterrormsg(atoi(s)); |
1598 | 387 } |
388 | |
389 // Error tag data is better, if available | |
390 s = lm_message_node_get_value(x); | |
391 if (s && *s) desc = s; | |
392 | |
393 // And sometimes there is a text message | |
394 s = lm_message_node_get_child_value(x, "text"); | |
395 if (s && *s) desc = s; | |
396 | |
397 // 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
|
398 if (!desc || !*desc) |
1598 | 399 return; |
400 | |
401 // Strip trailing newlines | |
402 sdesc = g_strdup(desc); | |
403 for (tmp = sdesc; *tmp; tmp++) ; | |
404 if (tmp > sdesc) | |
405 tmp--; | |
406 while (tmp >= sdesc && (*tmp == '\n' || *tmp == '\r')) | |
407 *tmp-- = '\0'; | |
408 | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
409 if (*sdesc) |
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
410 scr_LogPrint(LPRINT_LOGNORM, "Error message from server: %s", sdesc); |
1598 | 411 g_free(sdesc); |
412 } | |
413 | |
1811 | 414 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ |