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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
1 /*
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
2 * xmpp_helper.c -- Jabber protocol helper functions
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
6 *
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or (at
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
10 * your option) any later version.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
11 *
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful, but
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
15 * General Public License for more details.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
16 *
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
20 * USA
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
21 */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
32 #include "config.h"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
33
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
34 time_t iqlast; // last message/status change time
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
76 #ifdef MODULES_ENABLE
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
77 static GSList *xmpp_additional_features = NULL;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
78 static char *ver, *ver_notavail;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
81 {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
82 if (xmlns) {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
83 ver = NULL;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
84 ver_notavail = NULL;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
87 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
88 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
91 {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
92 GSList *feature = xmpp_additional_features;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
93 while (feature) {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
94 if (!strcmp(feature->data, xmlns)) {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
95 ver = NULL;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
98 xmpp_additional_features = g_slist_delete_link(xmpp_additional_features,
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
99 feature);
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
100 return;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
103 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
104 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
105 #endif
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
106
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
107 const gchar* lm_message_node_get_child_value(LmMessageNode *node,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
108 const gchar *child)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
109 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
110 LmMessageNode *tmp;
2210
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
111
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
112 if (G_UNLIKELY(!node || !child)) return NULL;
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
113
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
120 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
121
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
122 static LmMessageNode *hidden = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
123
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
124 void lm_message_node_hide(LmMessageNode *node)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
125 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
126 LmMessageNode *parent = node->parent, *prev_sibling = node->prev;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
127
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
128 if (hidden) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
129 hidden->children = hidden->next = hidden->prev = hidden->parent = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
130 lm_message_node_unref(hidden);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
131 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
132
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
133 if (parent->children == node)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
134 parent->children = node->next;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
135 if (prev_sibling)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
136 prev_sibling->next = node->next;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
137 if (node->next)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
138 node->next->prev = prev_sibling;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
139 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
143 LmMessageNode *lm_message_node_new(const gchar *name, const gchar *xmlns)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
144 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
145 LmMessageNode *node;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
146
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
147 node = g_new0 (LmMessageNode, 1);
2210
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
148 if (G_UNLIKELY(!node)) return NULL;
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
149
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
150 node->name = g_strdup (name);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
151 node->value = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
152 node->raw_mode = FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
153 node->attributes = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
154 node->next = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
155 node->prev = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
156 node->parent = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
157 node->children = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
158
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
159 node->ref_count = 1;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
160 lm_message_node_set_attribute(node, "xmlns", xmlns);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
161 return node;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
162 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
163
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
164 void lm_message_node_insert_childnode(LmMessageNode *node,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
165 LmMessageNode *child)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
166 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
167 LmMessageNode *x;
2210
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
168 if (G_UNLIKELY(!node)) return;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
169 lm_message_node_deep_ref(child);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
170
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
171 if (node->children == NULL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
172 node->children = child;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
173 else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
174 for (x = node->children; x->next; x = x->next)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
175 ;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
176 x->next = child;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
177 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
178 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
179
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
180 void lm_message_node_deep_ref(LmMessageNode *node)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
181 {
2210
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
182 if (G_UNLIKELY(!node)) return;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
183 lm_message_node_ref(node);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
184 lm_message_node_deep_ref(node->next);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
185 lm_message_node_deep_ref(node->children);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
186 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
187
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
188 const gchar* lm_message_get_from(LmMessage *m)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
189 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
190 return lm_message_node_get_attribute(m->node, "from");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
191 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
192
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
193 const gchar* lm_message_get_id(LmMessage *m)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
194 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
195 return lm_message_node_get_attribute(m->node, "id");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
196 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
200 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
201 LmMessage *new;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
202 const char *from = lm_message_node_get_attribute(m->node, "from");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
203 const char *id = lm_message_node_get_attribute(m->node, "id");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
204
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
205 new = lm_message_new_with_sub_type(from, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
206 type);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
207 if (id)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
208 lm_message_node_set_attribute(new->node, "id", id);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
209
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
210 return new;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
211 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
212
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
213 // entity_version(enum imstatus status)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
214 // Return a static version string for Entity Capabilities.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
215 // It should be specific to the client version, please change the id
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
216 // if you alter mcabber's disco support (or add something to the version
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
217 // number) so that it doesn't conflict with the official client.
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
218 const char *entity_version(enum imstatus status)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
219 {
1607
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
220 #ifndef MODULES_ENABLE
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
221 static char *ver, *ver_notavail;
1607
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
222 #endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
223
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
224 if (ver && (status != notavail))
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
225 return ver;
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
226 if (ver_notavail)
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
227 return ver_notavail;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
228
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
229 caps_add("");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
230 caps_set_identity("", "client", PACKAGE_STRING, "pc");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
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
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
233 caps_add_feature("", NS_MUC);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
234 // advertise ChatStates only if they aren't disabled
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
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
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
237 caps_add_feature("", NS_TIME);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
238 caps_add_feature("", NS_XMPP_TIME);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
239 caps_add_feature("", NS_VERSION);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
240 caps_add_feature("", NS_PING);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
241 caps_add_feature("", NS_COMMANDS);
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
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
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
244 if (!settings_opt_get_int("iq_last_disable") &&
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
245 (!settings_opt_get_int("iq_last_disable_when_notavail") ||
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
248 #ifdef MODULES_ENABLE
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
249 {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
250 GSList *el = xmpp_additional_features;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
251 while (el) {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
254 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
255 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
256 #endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
257
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
258 if (status == notavail) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
259 ver_notavail = caps_generate();
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
260 return ver_notavail;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
261 }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
262
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
263 ver = caps_generate();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
264 return ver;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
265 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
269 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
270 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
271 const char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
272
2210
ea90906cb691 Add a few more checks
Mikael Berthe <mikael@lilotux.net>
parents: 2209
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
275 for (x = node->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
276 if ((p = lm_message_node_get_attribute(x, "xmlns")) && !strcmp(p, xmlns))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
277 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
278 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
279 return x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
280 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
283 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
284 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
285 const char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
286
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
287 x = lm_message_node_find_xmlns(node, NS_XMPP_DELAY);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
288 if (x && (!strcmp(x->name, "delay")) &&
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
289 (p = lm_message_node_get_attribute(x, "stamp")) != NULL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
290 return from_iso8601(p, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
291 x = lm_message_node_find_xmlns(node, NS_DELAY);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
292 if (x && (p = lm_message_node_get_attribute(x, "stamp")) != NULL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
293 return from_iso8601(p, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
294 return 0;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
295 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
296
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
297 // lm_message_new_presence(status, recipient, message)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
298 // Create an xmlnode with default presence attributes
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
303 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
304 unsigned int prio;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
305 LmMessage *x = lm_message_new(recipient, LM_MESSAGE_TYPE_PRESENCE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
306
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
307 switch(st) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
308 case away:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
309 case notavail:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
310 case dontdisturb:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
311 case freeforchat:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
312 lm_message_node_add_child(x->node, "show", imstatus_showmap[st]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
313 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
314
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1951
diff changeset
315 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
316 case invisible:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
317 lm_message_node_set_attribute(x->node, "type", "invisible");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
318 break;
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1951
diff changeset
319 #endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
320
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
321 case offline:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
322 lm_message_node_set_attribute(x->node, "type", "unavailable");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
323 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
324
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
325 default:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
326 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
327 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
328
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
329 if (st == away || st == notavail)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
330 prio = settings_opt_get_int("priority_away");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
331 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
332 prio = settings_opt_get_int("priority");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
333
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
334 if (prio) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
335 char strprio[8];
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
336 snprintf(strprio, 8, "%d", (int)prio);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
337 lm_message_node_add_child(x->node, "priority", strprio);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
338 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
339
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
340 if (msg)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
341 lm_message_node_add_child(x->node, "status", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
342
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
343 return x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
344 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
345
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
346 static const char *defaulterrormsg(guint code)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
347 {
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
348 int i;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
349
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
350 for (i = 0; xmpp_errors[i].code; ++i) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
351 if (xmpp_errors[i].code == code)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
352 return xmpp_errors[i].meaning;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
353 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
354 return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
355 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
356
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
357 // display_server_error(x)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
358 // Display the error to the user
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
363 char *sdesc, *tmp;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
364
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
365 if (!x) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
366
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
367 /* RFC3920:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
368 * The <error/> element:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
369 * o MUST contain a child element corresponding to one of the defined
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
370 * stanza error conditions specified below; this element MUST be
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
371 * qualified by the 'urn:ietf:params:xml:ns:xmpp-stanzas' namespace.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
372 */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
382
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
385 // Default message
1704
ab502d645378 Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents: 1697
diff changeset
386 desc = defaulterrormsg(atoi(s));
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
387 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
388
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
389 // Error tag data is better, if available
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
390 s = lm_message_node_get_value(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
391 if (s && *s) desc = s;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
392
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
393 // And sometimes there is a text message
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
394 s = lm_message_node_get_child_value(x, "text");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
395 if (s && *s) desc = s;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
396
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
399 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
400
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
401 // Strip trailing newlines
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
402 sdesc = g_strdup(desc);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
403 for (tmp = sdesc; *tmp; tmp++) ;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
404 if (tmp > sdesc)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
405 tmp--;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
406 while (tmp >= sdesc && (*tmp == '\n' || *tmp == '\r'))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
407 *tmp-- = '\0';
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
411 g_free(sdesc);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
412 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
413
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
414 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */