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