comparison mcabber/src/jab_iq.c @ 607:cf722bff6579

Improve IQ management
author Mikael Berthe <mikael@lilotux.net>
date Thu, 15 Dec 2005 18:29:14 +0100
parents 0b4ed231ebc2
children a6b8b373e4de
comparison
equal deleted inserted replaced
606:0b4ed231ebc2 607:cf722bff6579
162 if (!ns) return; 162 if (!ns) return;
163 163
164 if (!strcmp(ns, NS_ROSTER)) { 164 if (!strcmp(ns, NS_ROSTER)) {
165 handle_iq_roster(x); 165 handle_iq_roster(x);
166 166
167 // Post-login stuff FIXME shouldn't be there 167 // Post-login stuff
168 // Usually we request the roster only at connection time
169 // so we should be there only once. (That's ugly, however)
168 jb_setstatus(available, NULL, NULL); 170 jb_setstatus(available, NULL, NULL);
169 } 171 }
170 } 172 }
171 173
172 static void handle_iq_get(jconn conn, char *from, xmlnode xmldata) 174 static void handle_iq_get(jconn conn, char *from, xmlnode xmldata)
173 { 175 {
174 char *id; 176 char *id;
175 xmlnode x, y, z; 177 xmlnode x, y, z;
176 178
177 id = xmlnode_get_attrib(xmldata, "id"); 179 id = xmlnode_get_attrib(xmldata, "id");
178 if (!id) return; 180 if (!id) {
181 scr_LogPrint(LPRINT_LOG, "IQ get stanza with no ID, ignored.");
182 return;
183 }
179 184
180 // Nothing implemented yet. 185 // Nothing implemented yet.
181 x = xmlnode_new_tag("iq"); 186 x = xmlnode_dup(xmldata);
182 xmlnode_put_attrib(x, "to", from); 187 xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
183 xmlnode_put_attrib(x, "id", id); 188 xmlnode_hide_attrib(x, "from");
189
184 xmlnode_put_attrib(x, "type", TMSG_ERROR); 190 xmlnode_put_attrib(x, "type", TMSG_ERROR);
185 y = xmlnode_insert_tag(x, TMSG_ERROR); 191 y = xmlnode_insert_tag(x, TMSG_ERROR);
186 xmlnode_put_attrib(y, "code", "501"); 192 xmlnode_put_attrib(y, "code", "501");
187 xmlnode_put_attrib(y, "type", "cancel"); 193 xmlnode_put_attrib(y, "type", "cancel");
188 z = xmlnode_insert_tag(y, "feature-not-implemented"); 194 z = xmlnode_insert_tag(y, "feature-not-implemented");
192 xmlnode_free(x); 198 xmlnode_free(x);
193 } 199 }
194 200
195 static void handle_iq_set(jconn conn, char *from, xmlnode xmldata) 201 static void handle_iq_set(jconn conn, char *from, xmlnode xmldata)
196 { 202 {
197 char *id; 203 char *id, *ns;
198 xmlnode x, y, z; 204 xmlnode x, y, z;
205 guint iq_error = FALSE;
199 206
200 id = xmlnode_get_attrib(xmldata, "id"); 207 id = xmlnode_get_attrib(xmldata, "id");
208 if (!id)
209 scr_LogPrint(LPRINT_LOG, "IQ set stanza with no ID...");
210
211 x = xmlnode_get_tag(xmldata, "query");
212 ns = xmlnode_get_attrib(x, "xmlns");
213 if (ns && !strcmp(ns, NS_ROSTER)) {
214 handle_iq_roster(x);
215 } else {
216 iq_error = TRUE;
217 }
218
201 if (!id) return; 219 if (!id) return;
202 220
203 /* Not implemented yet: send an error stanza */ 221 if (!iq_error) {
204 x = xmlnode_new_tag("iq"); 222 x = xmlnode_new_tag("iq");
205 xmlnode_put_attrib(x, "to", from); 223 xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
206 xmlnode_put_attrib(x, "id", id); 224 xmlnode_put_attrib(x, "type", "result");
207 xmlnode_put_attrib(x, "type", TMSG_ERROR); 225 xmlnode_put_attrib(x, "id", id);
208 y = xmlnode_insert_tag(x, TMSG_ERROR); 226 } else {
209 xmlnode_put_attrib(y, "code", "501"); 227 /* Not implemented yet: send an error stanza */
210 xmlnode_put_attrib(y, "type", "cancel"); 228 x = xmlnode_dup(xmldata);
211 z = xmlnode_insert_tag(y, "feature-not-implemented"); 229 xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
212 xmlnode_put_attrib(z, "xmlns", NS_XMPP_STANZAS); 230 xmlnode_hide_attrib(x, "from");
231 xmlnode_put_attrib(x, "type", "result");
232 xmlnode_put_attrib(x, "type", TMSG_ERROR);
233 y = xmlnode_insert_tag(x, TMSG_ERROR);
234 xmlnode_put_attrib(y, "code", "501");
235 xmlnode_put_attrib(y, "type", "cancel");
236 z = xmlnode_insert_tag(y, "feature-not-implemented");
237 xmlnode_put_attrib(z, "xmlns", NS_XMPP_STANZAS);
238 }
213 239
214 jab_send(conn, x); 240 jab_send(conn, x);
215 xmlnode_free(x); 241 xmlnode_free(x);
216 } 242 }
217 243