Mercurial > ~mikael > mcabber > hg
annotate mcabber/src/xmpp_iqrequest.c @ 1599:dcd5d4c75199
Update/Add headers
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Sun, 11 Oct 2009 15:39:32 +0200 |
parents | a087125d8fc8 |
children | 351427ef0b4b |
rev | line source |
---|---|
1599 | 1 /* |
2 * xmpp_iqrequest.c -- Jabber IQ request handling | |
3 * | |
4 * Copyright (C) 2008-2009 Frank Zschockelt <mcabber@freakysoft.de> | |
5 * Copyright (C) 2005-2009 Mikael Berthe <mikael@lilotux.net> | |
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 */ | |
1598 | 22 |
23 static LmHandlerResult cb_roster(LmMessageHandler *h, LmConnection *c, | |
24 LmMessage *m, gpointer user_data); | |
25 static LmHandlerResult cb_version(LmMessageHandler *h, LmConnection *c, | |
26 LmMessage *m, gpointer user_data); | |
27 static LmHandlerResult cb_time(LmMessageHandler *h, LmConnection *c, | |
28 LmMessage *m, gpointer user_data); | |
29 static LmHandlerResult cb_last(LmMessageHandler *h, LmConnection *c, | |
30 LmMessage *m, gpointer user_data); | |
31 static LmHandlerResult cb_vcard(LmMessageHandler *h, LmConnection *c, | |
32 LmMessage *m, gpointer user_data); | |
29 | 33 |
1598 | 34 static struct IqRequestHandlers |
35 { | |
36 const gchar *xmlns; | |
37 const gchar *querytag; | |
38 LmHandleMessageFunction handler; | |
39 } iq_request_handlers[] = { | |
40 {NS_ROSTER, "query", &cb_roster}, | |
41 {NS_VERSION,"query", &cb_version}, | |
42 {NS_TIME, "query", &cb_time}, | |
43 {NS_LAST, "query", &cb_last}, | |
44 {NS_VCARD, "vCard", &cb_vcard}, | |
45 {NULL, NULL, NULL} | |
46 }; | |
1254
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1224
diff
changeset
|
47 |
1006 | 48 // Enum for vCard attributes |
49 enum vcard_attr { | |
50 vcard_home = 1<<0, | |
51 vcard_work = 1<<1, | |
52 vcard_postal = 1<<2, | |
53 vcard_voice = 1<<3, | |
54 vcard_fax = 1<<4, | |
55 vcard_cell = 1<<5, | |
56 vcard_inet = 1<<6, | |
57 vcard_pref = 1<<7, | |
58 }; | |
683 | 59 |
1598 | 60 // xmlns has to be a namespace from iq_request_handlers[].xmlns |
61 void xmpp_iq_request(const char *fulljid, const char *xmlns) | |
1215
80c095886fb5
Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents:
1213
diff
changeset
|
62 { |
1598 | 63 LmMessage *iq; |
64 LmMessageNode *query; | |
65 LmMessageHandler *handler; | |
66 int i; | |
683 | 67 |
1598 | 68 iq = lm_message_new_with_sub_type(fulljid, LM_MESSAGE_TYPE_IQ, |
69 LM_MESSAGE_SUB_TYPE_GET); | |
70 for (i = 0; strcmp(iq_request_handlers[i].xmlns, xmlns) != 0 ; ++i) | |
71 ; | |
72 query = lm_message_node_add_child(iq->node, | |
73 iq_request_handlers[i].querytag, | |
74 NULL); | |
75 lm_message_node_set_attribute(query, "xmlns", xmlns); | |
76 handler = lm_message_handler_new(iq_request_handlers[i].handler, | |
77 NULL, FALSE); | |
78 lm_connection_send_with_reply(lconnection, iq, handler, NULL); | |
79 lm_message_handler_unref(handler); | |
80 lm_message_unref(iq); | |
577
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
81 } |
29 | 82 |
1353
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
83 // This callback is reached when mcabber receives the first roster update |
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
84 // after the connection. |
1598 | 85 static LmHandlerResult cb_roster(LmMessageHandler *h, LmConnection *c, |
86 LmMessage *m, gpointer user_data) | |
1353
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
87 { |
1598 | 88 LmMessageNode *x; |
89 const char *ns; | |
1353
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
90 |
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
91 // Only execute the hook if the roster has been successfully retrieved |
1598 | 92 if (lm_message_get_sub_type(m) != LM_MESSAGE_SUB_TYPE_RESULT) |
93 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; | |
1353
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
94 |
1598 | 95 x = lm_message_node_find_child(m->node, "query"); |
1353
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
96 if (!x) |
1598 | 97 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
1365 | 98 |
1598 | 99 ns = lm_message_node_get_attribute(x, "xmlns"); |
1365 | 100 if (ns && !strcmp(ns, NS_ROSTER)) |
1598 | 101 handle_iq_roster(NULL, c, m, user_data); |
1353
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
102 |
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
103 // Post-login stuff |
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
104 hook_execute_internal("hook-post-connect"); |
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
105 |
1598 | 106 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1353
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
107 } |
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
108 |
1598 | 109 static LmHandlerResult cb_version(LmMessageHandler *h, LmConnection *c, |
110 LmMessage *m, gpointer user_data) | |
1353
7caedca15e50
Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents:
1348
diff
changeset
|
111 { |
1598 | 112 LmMessageNode *ansqry; |
113 const char *p, *bjid; | |
114 char *tmp; | |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
115 char *buf; |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
116 |
1598 | 117 ansqry = lm_message_node_get_child(m->node, "query"); |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
118 if (!ansqry) { |
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
119 scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result!"); |
1598 | 120 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
121 } |
1598 | 122 |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
123 // Display IQ result sender... |
1598 | 124 p = lm_message_get_from(m); |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
125 if (!p) { |
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
126 scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result (no sender name)."); |
1598 | 127 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
128 } |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
746
diff
changeset
|
129 bjid = p; |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
130 |
782
19121d9f4aa2
Nicer message when receiving IQ result packet
Mikael Berthe <mikael@lilotux.net>
parents:
776
diff
changeset
|
131 buf = g_strdup_printf("Received IQ:version result from <%s>", bjid); |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
132 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
133 |
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
134 // bjid should now really be the "bare JID", let's strip the resource |
1598 | 135 tmp = strchr(bjid, JID_RESOURCE_SEPARATOR); |
136 if (tmp) *tmp = '\0'; | |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
137 |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1283
diff
changeset
|
138 scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0); |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
139 g_free(buf); |
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
140 |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
141 // Get result data... |
1598 | 142 p = lm_message_node_get_child_value(ansqry, "name"); |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
143 if (p) { |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
144 buf = g_strdup_printf("Name: %s", p); |
1333
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
145 scr_WriteIncomingMessage(bjid, buf, |
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
146 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
147 g_free(buf); |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
148 } |
1598 | 149 p = lm_message_node_get_child_value(ansqry, "version"); |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
150 if (p) { |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
151 buf = g_strdup_printf("Version: %s", p); |
1333
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
152 scr_WriteIncomingMessage(bjid, buf, |
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
153 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
154 g_free(buf); |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
155 } |
1598 | 156 p = lm_message_node_get_child_value(ansqry, "os"); |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
157 if (p) { |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
158 buf = g_strdup_printf("OS: %s", p); |
1333
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
159 scr_WriteIncomingMessage(bjid, buf, |
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
160 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
161 g_free(buf); |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
162 } |
1598 | 163 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
690
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
164 } |
3e965a1186c7
Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents:
689
diff
changeset
|
165 |
1598 | 166 static LmHandlerResult cb_time(LmMessageHandler *h, LmConnection *c, |
167 LmMessage *m, gpointer user_data) | |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
168 { |
1598 | 169 LmMessageNode *ansqry; |
170 const char *p, *bjid; | |
171 char *tmp; | |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
172 char *buf; |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
173 |
1598 | 174 ansqry = lm_message_node_get_child(m->node, "query"); |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
175 if (!ansqry) { |
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
176 scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:time result!"); |
1598 | 177 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
178 } |
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
179 // Display IQ result sender... |
1598 | 180 p = lm_message_get_from(m); |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
181 if (!p) { |
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
182 scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:time result (no sender name)."); |
1598 | 183 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
184 } |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
746
diff
changeset
|
185 bjid = p; |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
186 |
782
19121d9f4aa2
Nicer message when receiving IQ result packet
Mikael Berthe <mikael@lilotux.net>
parents:
776
diff
changeset
|
187 buf = g_strdup_printf("Received IQ:time result from <%s>", bjid); |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
188 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
189 |
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
190 // bjid should now really be the "bare JID", let's strip the resource |
1598 | 191 tmp = strchr(bjid, JID_RESOURCE_SEPARATOR); |
192 if (tmp) *tmp = '\0'; | |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
193 |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1283
diff
changeset
|
194 scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0); |
704
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
195 g_free(buf); |
4118a66f2c02
Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents:
703
diff
changeset
|
196 |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
197 // Get result data... |
1598 | 198 p = lm_message_node_get_child_value(ansqry, "utc"); |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
199 if (p) { |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
200 buf = g_strdup_printf("UTC: %s", p); |
1333
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
201 scr_WriteIncomingMessage(bjid, buf, |
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
202 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
203 g_free(buf); |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
204 } |
1598 | 205 p = lm_message_node_get_child_value(ansqry, "tz"); |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
206 if (p) { |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
207 buf = g_strdup_printf("TZ: %s", p); |
1333
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
208 scr_WriteIncomingMessage(bjid, buf, |
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
209 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
210 g_free(buf); |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
211 } |
1598 | 212 p = lm_message_node_get_child_value(ansqry, "display"); |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
213 if (p) { |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
214 buf = g_strdup_printf("Time: %s", p); |
1333
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
215 scr_WriteIncomingMessage(bjid, buf, |
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
216 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1030
923cf5a92b44
[BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents:
965
diff
changeset
|
217 g_free(buf); |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
218 } |
1598 | 219 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
220 } |
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
690
diff
changeset
|
221 |
1598 | 222 static LmHandlerResult cb_last(LmMessageHandler *h, LmConnection *c, |
223 LmMessage *m, gpointer user_data) | |
1015 | 224 { |
1598 | 225 LmMessageNode *ansqry; |
226 const char *p, *bjid; | |
227 char *buf, *tmp; | |
1015 | 228 |
1598 | 229 ansqry = lm_message_node_get_child(m->node, "query"); |
1015 | 230 if (!ansqry) { |
231 scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:last result!"); | |
1598 | 232 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
1015 | 233 } |
234 // Display IQ result sender... | |
1598 | 235 p = lm_message_get_from(m); |
1015 | 236 if (!p) { |
237 scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:last result (no sender name)."); | |
1598 | 238 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
1015 | 239 } |
240 bjid = p; | |
241 | |
242 buf = g_strdup_printf("Received IQ:last result from <%s>", bjid); | |
243 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); | |
244 | |
245 // bjid should now really be the "bare JID", let's strip the resource | |
1598 | 246 tmp = strchr(bjid, JID_RESOURCE_SEPARATOR); |
247 if (tmp) *tmp = '\0'; | |
1015 | 248 |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1283
diff
changeset
|
249 scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0); |
1015 | 250 g_free(buf); |
251 | |
252 // Get result data... | |
1598 | 253 p = lm_message_node_get_attribute(ansqry, "seconds"); |
1015 | 254 if (p) { |
255 long int s; | |
256 GString *sbuf; | |
257 sbuf = g_string_new("Idle time: "); | |
258 s = atol(p); | |
259 // Days | |
260 if (s > 86400L) { | |
261 g_string_append_printf(sbuf, "%ldd ", s/86400L); | |
262 s %= 86400L; | |
263 } | |
264 // hh:mm:ss | |
265 g_string_append_printf(sbuf, "%02ld:", s/3600L); | |
266 s %= 3600L; | |
267 g_string_append_printf(sbuf, "%02ld:%02ld", s/60L, s%60L); | |
1268
dbc907b2d92f
Add configurable colors for info and incoming messages (Michal 'vorner' Vaner)
Mikael Berthe <mikael@lilotux.net>
parents:
1261
diff
changeset
|
268 scr_WriteIncomingMessage(bjid, sbuf->str, |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1283
diff
changeset
|
269 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1015 | 270 g_string_free(sbuf, TRUE); |
271 } else { | |
272 scr_WriteIncomingMessage(bjid, "No idle time reported.", | |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1283
diff
changeset
|
273 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1015 | 274 } |
1598 | 275 p = lm_message_node_get_value(ansqry); |
1015 | 276 if (p) { |
277 buf = g_strdup_printf("Status message: %s", p); | |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1283
diff
changeset
|
278 scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0); |
1015 | 279 g_free(buf); |
280 } | |
1598 | 281 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1015 | 282 } |
283 | |
1006 | 284 static void display_vcard_item(const char *bjid, const char *label, |
285 enum vcard_attr vcard_attrib, const char *text) | |
286 { | |
287 char *buf; | |
288 | |
289 if (!text || !bjid || !label) | |
290 return; | |
291 | |
292 buf = g_strdup_printf("%s: %s%s%s%s%s%s%s%s%s%s", label, | |
293 (vcard_attrib & vcard_home ? "[home]" : ""), | |
294 (vcard_attrib & vcard_work ? "[work]" : ""), | |
295 (vcard_attrib & vcard_postal ? "[postal]" : ""), | |
296 (vcard_attrib & vcard_voice ? "[voice]" : ""), | |
297 (vcard_attrib & vcard_fax ? "[fax]" : ""), | |
298 (vcard_attrib & vcard_cell ? "[cell]" : ""), | |
299 (vcard_attrib & vcard_inet ? "[inet]" : ""), | |
300 (vcard_attrib & vcard_pref ? "[pref]" : ""), | |
301 (vcard_attrib ? " " : ""), | |
302 text); | |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1283
diff
changeset
|
303 scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0); |
1006 | 304 g_free(buf); |
305 } | |
306 | |
1598 | 307 static void handle_vcard_node(const char *barejid, LmMessageNode *vcardnode) |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
308 { |
1598 | 309 LmMessageNode *x; |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
310 const char *p; |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
311 |
1598 | 312 for (x = vcardnode->children ; x; x = x->next) { |
1006 | 313 const char *data; |
314 enum vcard_attr vcard_attrib = 0; | |
315 | |
1598 | 316 p = x->name; |
317 data = lm_message_node_get_value(x); | |
1006 | 318 if (!p || !data) |
319 continue; | |
320 | |
321 if (!strcmp(p, "FN")) | |
322 display_vcard_item(barejid, "Name", vcard_attrib, data); | |
323 else if (!strcmp(p, "NICKNAME")) | |
324 display_vcard_item(barejid, "Nickname", vcard_attrib, data); | |
325 else if (!strcmp(p, "URL")) | |
326 display_vcard_item(barejid, "URL", vcard_attrib, data); | |
327 else if (!strcmp(p, "BDAY")) | |
328 display_vcard_item(barejid, "Birthday", vcard_attrib, data); | |
329 else if (!strcmp(p, "TZ")) | |
330 display_vcard_item(barejid, "Timezone", vcard_attrib, data); | |
331 else if (!strcmp(p, "TITLE")) | |
332 display_vcard_item(barejid, "Title", vcard_attrib, data); | |
333 else if (!strcmp(p, "ROLE")) | |
334 display_vcard_item(barejid, "Role", vcard_attrib, data); | |
335 else if (!strcmp(p, "DESC")) | |
336 display_vcard_item(barejid, "Comment", vcard_attrib, data); | |
337 else if (!strcmp(p, "N")) { | |
1598 | 338 data = lm_message_node_get_child_value(x, "FAMILY"); |
1006 | 339 display_vcard_item(barejid, "Family Name", vcard_attrib, data); |
1598 | 340 data = lm_message_node_get_child_value(x, "GIVEN"); |
1006 | 341 display_vcard_item(barejid, "Given Name", vcard_attrib, data); |
1598 | 342 data = lm_message_node_get_child_value(x, "MIDDLE"); |
1006 | 343 display_vcard_item(barejid, "Middle Name", vcard_attrib, data); |
344 } else if (!strcmp(p, "ORG")) { | |
1598 | 345 data = lm_message_node_get_child_value(x, "ORGNAME"); |
1006 | 346 display_vcard_item(barejid, "Organisation name", vcard_attrib, data); |
1598 | 347 data = lm_message_node_get_child_value(x, "ORGUNIT"); |
1006 | 348 display_vcard_item(barejid, "Organisation unit", vcard_attrib, data); |
349 } else { | |
350 // The HOME, WORK and PREF attributes are common to the remaining fields | |
351 // (ADR, TEL & EMAIL) | |
1598 | 352 if (lm_message_node_get_child(x, "HOME")) |
1006 | 353 vcard_attrib |= vcard_home; |
1598 | 354 if (lm_message_node_get_child(x, "WORK")) |
1006 | 355 vcard_attrib |= vcard_work; |
1598 | 356 if (lm_message_node_get_child(x, "PREF")) |
1006 | 357 vcard_attrib |= vcard_pref; |
358 if (!strcmp(p, "ADR")) { // Address | |
1598 | 359 if (lm_message_node_get_child(x, "POSTAL")) |
1006 | 360 vcard_attrib |= vcard_postal; |
1598 | 361 data = lm_message_node_get_child_value(x, "EXTADD"); |
1006 | 362 display_vcard_item(barejid, "Addr (ext)", vcard_attrib, data); |
1598 | 363 data = lm_message_node_get_child_value(x, "STREET"); |
1006 | 364 display_vcard_item(barejid, "Street", vcard_attrib, data); |
1598 | 365 data = lm_message_node_get_child_value(x, "LOCALITY"); |
1006 | 366 display_vcard_item(barejid, "Locality", vcard_attrib, data); |
1598 | 367 data = lm_message_node_get_child_value(x, "REGION"); |
1006 | 368 display_vcard_item(barejid, "Region", vcard_attrib, data); |
1598 | 369 data = lm_message_node_get_child_value(x, "PCODE"); |
1006 | 370 display_vcard_item(barejid, "Postal code", vcard_attrib, data); |
1598 | 371 data = lm_message_node_get_child_value(x, "CTRY"); |
1006 | 372 display_vcard_item(barejid, "Country", vcard_attrib, data); |
373 } else if (!strcmp(p, "TEL")) { // Telephone | |
1598 | 374 data = lm_message_node_get_child_value(x, "NUMBER"); |
1005 | 375 if (data) { |
1598 | 376 if (lm_message_node_get_child(x, "VOICE")) |
1006 | 377 vcard_attrib |= vcard_voice; |
1598 | 378 if (lm_message_node_get_child(x, "FAX")) |
1006 | 379 vcard_attrib |= vcard_fax; |
1598 | 380 if (lm_message_node_get_child(x, "CELL")) |
1006 | 381 vcard_attrib |= vcard_cell; |
382 display_vcard_item(barejid, "Phone", vcard_attrib, data); | |
1005 | 383 } |
1006 | 384 } else if (!strcmp(p, "EMAIL")) { // Email |
1598 | 385 if (lm_message_node_get_child(x, "INTERNET")) |
1006 | 386 vcard_attrib |= vcard_inet; |
1598 | 387 data = lm_message_node_get_child_value(x, "USERID"); |
1006 | 388 display_vcard_item(barejid, "Email", vcard_attrib, data); |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
389 } |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
390 } |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
391 } |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
392 } |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
393 |
1598 | 394 static LmHandlerResult cb_vcard(LmMessageHandler *h, LmConnection *c, |
395 LmMessage *m, gpointer user_data) | |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
396 { |
1598 | 397 LmMessageNode *ansqry; |
398 const char *p, *bjid; | |
399 char *buf, *tmp; | |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
400 |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
401 // Display IQ result sender... |
1598 | 402 p = lm_message_get_from(m); |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
403 if (!p) { |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
404 scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:vCard result (no sender name)."); |
1598 | 405 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
406 } |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
407 bjid = p; |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
408 |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
409 buf = g_strdup_printf("Received IQ:vCard result from <%s>", bjid); |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
410 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
411 |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
412 // Get the vCard node |
1598 | 413 ansqry = lm_message_node_get_child(m->node, "vCard"); |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
414 if (!ansqry) { |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
415 scr_LogPrint(LPRINT_LOGNORM, "Empty IQ:vCard result!"); |
1340
2031f4b2cced
Fix a small memory leak
Mikael Berthe <mikael@lilotux.net>
parents:
1334
diff
changeset
|
416 g_free(buf); |
1598 | 417 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
418 } |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
419 |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
420 // bjid should really be the "bare JID", let's strip the resource |
1598 | 421 tmp = strchr(bjid, JID_RESOURCE_SEPARATOR); |
422 if (tmp) *tmp = '\0'; | |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
423 |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1283
diff
changeset
|
424 scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0); |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
425 g_free(buf); |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
426 |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
427 // Get result data... |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
428 handle_vcard_node(bjid, ansqry); |
1598 | 429 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1003
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
430 } |
c8b1a52b2fd6
Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents:
1002
diff
changeset
|
431 |
1598 | 432 static void storage_bookmarks_parse_conference(LmMessageNode *node) |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
433 { |
1058 | 434 const char *fjid, *name, *autojoin; |
1379
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
435 const char *pstatus, *awhois; |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
436 char *bjid; |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
437 GSList *room_elt; |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
438 |
1598 | 439 fjid = lm_message_node_get_attribute(node, "jid"); |
1058 | 440 if (!fjid) |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
441 return; |
1598 | 442 name = lm_message_node_get_attribute(node, "name"); |
443 autojoin = lm_message_node_get_attribute(node, "autojoin"); | |
444 awhois = lm_message_node_get_attribute(node, "autowhois"); | |
445 pstatus = lm_message_node_get_child_value(node, "print_status"); | |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
446 |
1058 | 447 bjid = jidtodisp(fjid); // Bare jid |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
448 |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
449 // Make sure this is a room (it can be a conversion user->room) |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
450 room_elt = roster_find(bjid, jidsearch, 0); |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
451 if (!room_elt) { |
1355 | 452 room_elt = roster_add_user(bjid, name, NULL, ROSTER_TYPE_ROOM, |
453 sub_none, -1); | |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
454 } else { |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
455 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
456 /* |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
457 // If the name is available, should we use it? |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
458 // I don't think so, it would be confusing because this item is already |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
459 // in the roster. |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
460 if (name) |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
461 buddy_setname(room_elt->data, name); |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
462 */ |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
463 } |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
464 |
1379
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
465 // Set the print_status and auto_whois values |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
466 if (pstatus) { |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
467 enum room_printstatus i; |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
468 for (i = status_none; i <= status_all; i++) |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
469 if (!strcasecmp(pstatus, strprintstatus[i])) |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
470 break; |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
471 if (i <= status_all) |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
472 buddy_setprintstatus(room_elt->data, i); |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
473 } |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
474 if (awhois) { |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
475 enum room_autowhois i = autowhois_default; |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
476 if (!strcmp(awhois, "1")) |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
477 i = autowhois_on; |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
478 else if (!strcmp(awhois, "0")) |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
479 i = autowhois_off; |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
480 if (i != autowhois_default) |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
481 buddy_setautowhois(room_elt->data, i); |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
482 } |
74b7621537d7
MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
483 |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
484 // Is autojoin set? |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
485 // If it is, we'll look up for more information (nick? password?) and |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
486 // try to join the room. |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
487 if (autojoin && !strcmp(autojoin, "1")) { |
1598 | 488 const char *nick, *passwd; |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
489 char *tmpnick = NULL; |
1598 | 490 nick = lm_message_node_get_child_value(node, "nick"); |
491 passwd = lm_message_node_get_child_value(node, "password"); | |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
492 if (!nick || !*nick) |
1395
d431cd75eb53
Use bookmarked nickname when manually joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
1393
diff
changeset
|
493 nick = tmpnick = default_muc_nickname(NULL); |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
494 // Let's join now |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
495 scr_LogPrint(LPRINT_LOGNORM, "Auto-join bookmark <%s>", bjid); |
1598 | 496 xmpp_room_join(bjid, nick, passwd); |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
497 g_free(tmpnick); |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
498 } |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
499 g_free(bjid); |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
500 } |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
501 |
1598 | 502 static LmHandlerResult cb_storage_bookmarks(LmMessageHandler *h, |
503 LmConnection *c, | |
504 LmMessage *m, gpointer user_data) | |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
505 { |
1598 | 506 LmMessageNode *x, *ansqry; |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
507 char *p; |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
508 |
1598 | 509 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) { |
1213
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
510 // No server support, or no bookmarks? |
1598 | 511 p = m->node->children->name; |
1213
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
512 if (p && !strcmp(p, "item-not-found")) { |
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
513 // item-no-found means the server has Private Storage, but it's |
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
514 // currently empty. |
1598 | 515 if (bookmarks) |
516 lm_message_node_unref(bookmarks); | |
517 bookmarks = lm_message_node_new("storage", "storage:bookmarks"); | |
1213
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
518 // We return 0 so that the IQ error message be |
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
519 // not displayed, as it isn't a real error. |
1598 | 520 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1213
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
521 } |
1598 | 522 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Unhandled error |
1213
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
523 } |
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
524 |
1598 | 525 ansqry = lm_message_node_get_child(m->node, "query"); |
526 ansqry = lm_message_node_get_child(ansqry, "storage"); | |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
527 if (!ansqry) { |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
528 scr_LogPrint(LPRINT_LOG, "Invalid IQ:private result! (storage:bookmarks)"); |
1213
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
529 return 0; |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
530 } |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
531 |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
532 // Walk through the storage tags |
1598 | 533 for (x = ansqry->children ; x; x = x->next) { |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
534 // If the current node is a conference item, parse it and update the roster |
1598 | 535 if (x->name && !strcmp(x->name, "conference")) |
1004
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
536 storage_bookmarks_parse_conference(x); |
b57a01ffeed6
Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1003
diff
changeset
|
537 } |
1598 | 538 // "Copy" the bookmarks node |
539 if (bookmarks) | |
540 lm_message_node_unref(bookmarks); | |
541 lm_message_node_deep_ref(ansqry); | |
542 bookmarks = ansqry; | |
1213
4a7db2870685
Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
543 return 0; |
686
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
685
diff
changeset
|
544 } |
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
685
diff
changeset
|
545 |
577
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
546 |
1598 | 547 static LmHandlerResult cb_storage_rosternotes(LmMessageHandler *h, |
548 LmConnection *c, | |
549 LmMessage *m, gpointer user_data) | |
1261
704adf4df2d0
Send service-unavailable when Last Activity is disabled
Mikael Berthe <mikael@lilotux.net>
parents:
1255
diff
changeset
|
550 { |
1598 | 551 LmMessageNode *ansqry; |
1158
c30c315dc447
XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents:
1134
diff
changeset
|
552 |
1598 | 553 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) { |
554 const char *p; | |
555 // No server support, or no roster notes? | |
556 p = m->node->children->name; | |
557 if (p && !strcmp(p, "item-not-found")) { | |
558 // item-no-found means the server has Private Storage, but it's | |
559 // currently empty. | |
560 if (rosternotes) | |
561 lm_message_node_unref(rosternotes); | |
562 rosternotes = lm_message_node_new("storage", "storage:rosternotes"); | |
563 // We return 0 so that the IQ error message be | |
564 // not displayed, as it isn't a real error. | |
565 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
1158
c30c315dc447
XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents:
1134
diff
changeset
|
566 } |
1598 | 567 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Unhandled error |
1158
c30c315dc447
XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents:
1134
diff
changeset
|
568 } |
c30c315dc447
XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents:
1134
diff
changeset
|
569 |
1598 | 570 ansqry = lm_message_node_get_child(m->node, "query"); |
571 ansqry = lm_message_node_get_child(ansqry, "storage"); | |
572 if (!ansqry) { | |
573 scr_LogPrint(LPRINT_LOG, "Invalid IQ:private result! " | |
574 "(storage:rosternotes)"); | |
575 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
1158
c30c315dc447
XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents:
1134
diff
changeset
|
576 } |
1598 | 577 // Copy the rosternotes node |
578 if (rosternotes) | |
579 lm_message_node_unref(rosternotes); | |
580 lm_message_node_deep_ref(ansqry); | |
581 rosternotes = ansqry; | |
582 return 0; | |
1158
c30c315dc447
XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents:
1134
diff
changeset
|
583 } |
c30c315dc447
XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents:
1134
diff
changeset
|
584 |
995
c89e7993c4d9
Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
585 |
1598 | 586 static struct IqRequestStorageHandlers |
1254
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1224
diff
changeset
|
587 { |
1598 | 588 const gchar *storagens; |
589 LmHandleMessageFunction handler; | |
590 } iq_request_storage_handlers[] = { | |
591 {"storage:rosternotes", &cb_storage_rosternotes}, | |
592 {"storage:bookmarks", &cb_storage_bookmarks}, | |
593 {NULL, NULL} | |
594 }; | |
619
44ddf9bec3a5
Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
613
diff
changeset
|
595 |
1598 | 596 void xmpp_request_storage(const gchar *storage) |
619
44ddf9bec3a5
Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
613
diff
changeset
|
597 { |
1598 | 598 LmMessage *iq; |
599 LmMessageNode *query; | |
600 LmMessageHandler *handler; | |
601 int i; | |
703
8cbcbff8de7d
Fix UTC time in IQ:version queries
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
602 |
1598 | 603 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, |
604 LM_MESSAGE_SUB_TYPE_GET); | |
605 query = lm_message_node_add_child(iq->node, "query", NULL); | |
606 lm_message_node_set_attribute(query, "xmlns", NS_PRIVATE); | |
607 lm_message_node_set_attribute(lm_message_node_add_child | |
608 (query, "storage", NULL), | |
609 "xmlns", storage); | |
1283
2faf179166f3
Implement XEP-0202 (Entity Time)
Mikael Berthe <mikael@lilotux.net>
parents:
1268
diff
changeset
|
610 |
1598 | 611 for (i = 0; |
612 strcmp(iq_request_storage_handlers[i].storagens, storage) != 0; | |
613 ++i) ; | |
595
0c1d37300862
IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents:
582
diff
changeset
|
614 |
1598 | 615 handler = lm_message_handler_new(iq_request_storage_handlers[i].handler, |
616 NULL, FALSE); | |
617 lm_connection_send_with_reply(lconnection, iq, handler, NULL); | |
618 lm_message_handler_unref(handler); | |
619 lm_message_unref(iq); | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
620 } |
1599 | 621 |
622 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |