Mercurial > hg
comparison mcabber/src/jab_iq.c @ 577:5c6d364130ee
Move IQ Jabber stuff to a separate file
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Sun, 04 Dec 2005 11:06:59 +0100 |
parents | mcabber/src/jabglue.c@8b3db0b555a1 |
children | b3ab662757a0 |
comparison
equal
deleted
inserted
replaced
576:8b3db0b555a1 | 577:5c6d364130ee |
---|---|
1 /* | |
2 * jab_iq.c -- Jabber protocol IQ-related fonctions | |
3 * | |
4 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net> | |
5 * Some parts initially came from the centericq project: | |
6 * Copyright (C) 2002-2005 by Konstantin Klyagin <konst@konst.org.ua> | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or (at | |
11 * your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
21 * USA | |
22 */ | |
23 | |
24 #include "jabglue.h" | |
25 #include "jab_priv.h" | |
26 #include "roster.h" | |
27 #include "utils.h" | |
28 #include "logprint.h" | |
29 | |
30 int s_id; // XXX | |
31 | |
32 static void gotloggedin(void) | |
33 { | |
34 xmlnode x; | |
35 | |
36 x = jutil_iqnew(JPACKET__GET, NS_AGENTS); | |
37 xmlnode_put_attrib(x, "id", "Agent List"); | |
38 jab_send(jc, x); | |
39 xmlnode_free(x); | |
40 | |
41 x = jutil_iqnew(JPACKET__GET, NS_ROSTER); | |
42 xmlnode_put_attrib(x, "id", "Roster"); | |
43 jab_send(jc, x); | |
44 xmlnode_free(x); | |
45 } | |
46 | |
47 static void gotroster(xmlnode x) | |
48 { | |
49 xmlnode y; | |
50 const char *jid, *name, *group; | |
51 char *buddyname; | |
52 char *cleanalias; | |
53 | |
54 for (y = xmlnode_get_tag(x, "item"); y; y = xmlnode_get_nextsibling(y)) { | |
55 gchar *name_noutf8 = NULL; | |
56 gchar *group_noutf8 = NULL; | |
57 | |
58 jid = xmlnode_get_attrib(y, "jid"); | |
59 name = xmlnode_get_attrib(y, "name"); | |
60 //sub = xmlnode_get_attrib(y, "subscription"); // TODO Not used | |
61 | |
62 group = xmlnode_get_tag_data(y, "group"); | |
63 | |
64 if (!jid) | |
65 continue; | |
66 | |
67 buddyname = cleanalias = jidtodisp(jid); | |
68 | |
69 if (name) { | |
70 name_noutf8 = from_utf8(name); | |
71 if (name_noutf8) | |
72 buddyname = name_noutf8; | |
73 else | |
74 scr_LogPrint(LPRINT_LOG, "Decoding of buddy alias has failed: %s", | |
75 name); | |
76 } | |
77 | |
78 if (group) { | |
79 group_noutf8 = from_utf8(group); | |
80 if (!group_noutf8) | |
81 scr_LogPrint(LPRINT_LOG, "Decoding of buddy group has failed: %s", | |
82 group); | |
83 } | |
84 | |
85 roster_add_user(cleanalias, buddyname, group_noutf8, ROSTER_TYPE_USER); | |
86 if (name_noutf8) g_free(name_noutf8); | |
87 if (group_noutf8) g_free(group_noutf8); | |
88 g_free(cleanalias); | |
89 } | |
90 | |
91 // Post-login stuff | |
92 jb_setstatus(available, NULL, NULL); | |
93 buddylist_build(); | |
94 } | |
95 | |
96 static void gotagents(jconn conn, xmlnode x) | |
97 { | |
98 xmlnode y; | |
99 const char *alias; | |
100 const char *name, *desc; | |
101 | |
102 y = xmlnode_get_tag(x, "agent"); | |
103 | |
104 for (; y; y = xmlnode_get_nextsibling(y)) { | |
105 enum agtype atype = unknown; | |
106 | |
107 alias = xmlnode_get_attrib(y, "jid"); | |
108 if (!alias) | |
109 continue; | |
110 | |
111 name = xmlnode_get_tag_data(y, "name"); | |
112 desc = xmlnode_get_tag_data(y, "description"); | |
113 // TODO | |
114 // service = xmlnode_get_tag_data(y, "service"); | |
115 | |
116 if (xmlnode_get_tag(y, TMSG_GROUPCHAT)) atype = groupchat; | |
117 else if (xmlnode_get_tag(y, "transport")) atype = transport; | |
118 else if (xmlnode_get_tag(y, "search")) atype = search; | |
119 | |
120 if (atype == transport) { | |
121 char *cleanjid = jidtodisp(alias); | |
122 roster_add_user(cleanjid, NULL, JABBER_AGENT_GROUP, | |
123 ROSTER_TYPE_AGENT); | |
124 g_free(cleanjid); | |
125 } | |
126 if (alias && name && desc) { | |
127 scr_LogPrint(LPRINT_LOGNORM, "Agent: %s / %s / %s / type=%d", | |
128 alias, name, desc, atype); | |
129 | |
130 if (atype == search) { | |
131 x = jutil_iqnew (JPACKET__GET, NS_SEARCH); | |
132 xmlnode_put_attrib(x, "to", alias); | |
133 xmlnode_put_attrib(x, "id", "Agent info"); | |
134 jab_send(conn, x); | |
135 xmlnode_free(x); | |
136 } | |
137 | |
138 if (xmlnode_get_tag(y, "register")) { | |
139 x = jutil_iqnew (JPACKET__GET, NS_REGISTER); | |
140 xmlnode_put_attrib(x, "to", alias); | |
141 xmlnode_put_attrib(x, "id", "Agent info"); | |
142 jab_send(conn, x); | |
143 xmlnode_free(x); | |
144 } | |
145 } | |
146 } | |
147 | |
148 /* | |
149 if (find(jhook.agents.begin(), jhook.agents.end(), DEFAULT_CONFSERV) == jhook.agents.end()) | |
150 jhook.agents.insert(jhook.agents.begin(), agent(DEFAULT_CONFSERV, DEFAULT_CONFSERV, | |
151 _("Default Jabber conference server"), agent::atGroupchat)); | |
152 | |
153 */ | |
154 } | |
155 | |
156 static void handle_iq_result(jconn conn, char *from, xmlnode xmldata) | |
157 { | |
158 xmlnode x; | |
159 char *p; | |
160 char *ns; | |
161 | |
162 if ((p = xmlnode_get_attrib(xmldata, "id")) != NULL) { | |
163 int iid = atoi(p); | |
164 | |
165 //scr_LogPrint(LPRINT_DEBUG, "iid = %d", iid); | |
166 if (iid == s_id) { | |
167 if (!regmode) { | |
168 if (jstate == STATE_GETAUTH) { | |
169 if ((x = xmlnode_get_tag(xmldata, "query")) != NULL) | |
170 if (!xmlnode_get_tag(x, "digest")) { | |
171 jc->sid = 0; | |
172 } | |
173 | |
174 s_id = atoi(jab_auth(jc)); | |
175 jstate = STATE_SENDAUTH; | |
176 } else { | |
177 gotloggedin(); | |
178 jstate = STATE_LOGGED; | |
179 } | |
180 } else { | |
181 regdone = TRUE; | |
182 } | |
183 return; | |
184 } | |
185 | |
186 if (!strcmp(p, "VCARDreq")) { | |
187 x = xmlnode_get_firstchild(xmldata); | |
188 if (!x) x = xmldata; | |
189 | |
190 //jhook.gotvcard(ic, x); TODO | |
191 scr_LogPrint(LPRINT_LOGNORM, "Got VCARD"); | |
192 return; | |
193 } else if (!strcmp(p, "versionreq")) { | |
194 // jhook.gotversion(ic, xmldata); TODO | |
195 scr_LogPrint(LPRINT_LOGNORM, "Got version"); | |
196 return; | |
197 } | |
198 } | |
199 | |
200 x = xmlnode_get_tag(xmldata, "query"); | |
201 if (!x) return; | |
202 | |
203 ns = xmlnode_get_attrib(x, "xmlns"); | |
204 if (!ns) return; | |
205 | |
206 if (!strcmp(ns, NS_ROSTER)) { | |
207 gotroster(x); | |
208 } else if (!strcmp(ns, NS_AGENTS)) { | |
209 gotagents(conn, x); | |
210 } else if (!strcmp(ns, NS_SEARCH) || !strcmp(ns, NS_REGISTER)) { | |
211 char *id = xmlnode_get_attrib(xmldata, "id"); | |
212 if (!id) id = ""; | |
213 | |
214 if (!strcmp(id, "Agent info")) { | |
215 // jhook.gotagentinfo(xmldata); TODO | |
216 scr_LogPrint(LPRINT_LOGNORM, "Got agent info"); | |
217 } else if (!strcmp(id, "Lookup")) { | |
218 // jhook.gotsearchresults(xmldata); TODO | |
219 scr_LogPrint(LPRINT_LOGNORM, "Got search results"); | |
220 } else if (!strcmp(id, "Register")) { | |
221 if (!from) | |
222 return; | |
223 x = jutil_iqnew(JPACKET__GET, NS_REGISTER); | |
224 xmlnode_put_attrib(x, "to", from); | |
225 xmlnode_put_attrib(x, "id", "Agent info"); | |
226 jab_send(conn, x); | |
227 xmlnode_free(x); | |
228 } | |
229 | |
230 } | |
231 } | |
232 | |
233 static void handle_iq_get(jconn conn, char *from, xmlnode xmldata) | |
234 { | |
235 char *id; | |
236 xmlnode x, y, z; | |
237 | |
238 id = xmlnode_get_attrib(xmldata, "id"); | |
239 if (!id) return; | |
240 | |
241 // Nothing implemented yet. | |
242 x = xmlnode_new_tag("iq"); | |
243 xmlnode_put_attrib(x, "type", "result"); | |
244 xmlnode_put_attrib(x, "to", from); | |
245 xmlnode_put_attrib(x, "id", id); | |
246 xmlnode_put_attrib(x, "type", TMSG_ERROR); | |
247 y = xmlnode_insert_tag(x, TMSG_ERROR); | |
248 xmlnode_put_attrib(y, "code", "503"); | |
249 xmlnode_put_attrib(y, "type", "cancel"); | |
250 z = xmlnode_insert_tag(y, "feature-not-implemented"); | |
251 xmlnode_put_attrib(z, "xmlns", | |
252 "urn:ietf:params:xml:ns:xmpp-stanzas"); | |
253 jab_send(conn, x); | |
254 xmlnode_free(x); | |
255 } | |
256 | |
257 static void handle_iq_set(jconn conn, char *from, xmlnode xmldata) | |
258 { | |
259 /* FIXME: send error */ | |
260 } | |
261 | |
262 void handle_packet_iq(jconn conn, char *type, char *from, xmlnode xmldata) | |
263 { | |
264 if (!type) | |
265 return; | |
266 | |
267 if (!strcmp(type, "result")) { | |
268 handle_iq_result(conn, from, xmldata); | |
269 } else if (!strcmp(type, "get")) { | |
270 handle_iq_get(conn, from, xmldata); | |
271 } else if (!strcmp(type, "set")) { | |
272 handle_iq_set(conn, from, xmldata); | |
273 } else if (!strcmp(type, TMSG_ERROR)) { | |
274 xmlnode x = xmlnode_get_tag(xmldata, TMSG_ERROR); | |
275 if (x) | |
276 display_server_error(x); | |
277 } | |
278 } | |
279 | |
280 /* vim: set expandtab cindent cinoptions=>2:2(0: For Vim users... */ |