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