2 * Copyright (C) 2009 Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 createiq (char *type, char *to, char *qnam, char *xmlns, iks **query)
31 snprintf (sid, 32, "ps%d", id++);
33 iks_insert_attrib (iq, "type", type);
34 iks_insert_attrib (iq, "to", to);
35 iks_insert_attrib (iq, "id", sid);
36 *query = iks_insert (iq, qnam);
37 iks_insert_attrib (*query, "xmlns", xmlns);
42 catnode (iksparser *parser, char *node)
46 iq = createiq ("get", "pubsub.jabber-br.org", "query",
47 "http://jabber.org/protocol/disco#info", &query);
49 iks_insert_attrib (query, "node", node);
50 iks_send (parser, iq);
55 listnode (iksparser *parser, char *node)
59 iq = createiq ("get", "pubsub.jabber-br.org", "query",
60 "http://jabber.org/protocol/disco#items", &query);
62 iks_insert_attrib (query, "node", node);
63 iks_send (parser, iq);
68 createnode (iksparser *parser, char *node)
72 iq = createiq ("set", "pubsub.jabber-br.org", "pubsub",
73 "http://jabber.org/protocol/pubsub", &query);
74 iks_insert_attrib (iks_insert (query, "create"), "node", node);
75 iks_send (parser, iq);
80 getnode (iksparser *parser, char *node)
84 iq = createiq ("get", "pubsub.jabber-br.org", "pubsub",
85 "http://jabber.org/protocol/pubsub", &query);
86 iks_insert_attrib (iks_insert (query, "items"), "node", node);
87 iks_send (parser, iq);
92 vcard (iksparser *parser)
96 iq = createiq ("get", "pubsub.jabber-br.org", "vCard", "vcard-temp", &query);
97 iks_send (parser, iq);
102 createmood (char *line)
105 mood = iks_new ("mood");
106 iks_insert_attrib (mood, "xmlns", "http://jabber.org/protocol/mood");
107 iks_insert (mood, line);
112 pushmood (iksparser *parser, char *node, char *line)
119 iq = createiq ("set", "pubsub.jabber-br.org", "pubsub",
120 "http://jabber.org/protocol/pubsub", &query);
121 publish = iks_insert (query, "publish");
122 iks_insert_attrib (publish, "node", node);
123 item = iks_insert (publish, "item");
124 mood = createmood (line);
125 iks_insert_node (item, mood);
126 iks_send (parser, iq);
131 process_mood (iksparser *parser, char *cmdline)
135 orig_cmdline = cmdline = strdup (cmdline);
136 cmd = strsep (&cmdline, " ");
137 if (!strcmp (cmd, "ls"))
138 listnode (parser, cmdline);
139 else if (!strcmp (cmd, "cat"))
140 catnode (parser, cmdline);
141 else if (!strcmp (cmd, "vcard"))
143 else if (!strcmp (cmd, "create"))
144 createnode (parser, cmdline);
145 else if (!strcmp (cmd, "get"))
146 getnode (parser, cmdline);
147 else if (!strcmp (cmd, "push"))
150 node = strsep (&cmdline, " ");
151 pushmood (parser, node, cmdline);
157 xmpp_session_hook (iksparser *parser, iks *node)
161 iks_insert_attrib (iq, "type", "set");
162 iks_insert_attrib (iq, "id", "session1");
163 iks_insert_attrib (iks_insert (iq, "session"),
164 "xmlns", "urn:ietf:params:xml:ns:xmpp-session");
165 iks_send (parser, iq);
171 xmpp_initial_presence_hook (iksparser *parser, iks *node)
174 pres = iks_make_pres (IKS_SHOW_AVAILABLE, "Microblogging here!");
175 iks_send (parser, pres);
181 xmpp_id_hook (iksparser *parser, iks *node, char *id)
183 if (!iks_strcmp (id, "bind1"))
185 xmpp_session_hook (parser, node);
188 else if (!iks_strcmp (id, "session1"))
190 xmpp_initial_presence_hook (parser, node);
193 else if (!iks_strncmp (id, "ps", 2))
195 printf ("%s\n", iks_string (iks_stack (node), node));
201 xmpp_ns_hook (iksparser *parser, iks *node, char *ns)
207 xmpp_iq_error (iksparser *parser, iks *node)
212 if (!iks_strcmp (iks_find_attrib (node, "type"), "error"))
214 to = iks_find_attrib (node, "to");
215 from = iks_find_attrib (node, "from");
217 iks_insert_attrib (node, "from", to);
219 iks_insert_attrib (node, "from", NULL);
221 iks_insert_attrib (node, "to", from);
223 iks_insert_attrib (node, "to", NULL);
224 iks_insert_attrib (node, "type", "error");
225 enode = iks_insert (node, "error");
226 iks_insert_attrib (enode, "type", "cancel");
227 iks_insert_attrib (iks_insert (enode, "feature-not-implemented"),
228 "xmlns", "urn:ietf:params:xml:ns:xmpp-stanzas");
229 iks_send (parser, node);
234 xmpp_tls_hook (iksparser *parser, iks *node)
236 iks_start_tls (parser);
241 xmpp_sasl_hook (iksparser *parser, iks* node)
243 iks_start_sasl (parser, IKS_SASL_DIGEST_MD5, "pubsub", "pubsub");
248 xmpp_bind_hook (iksparser *parser, iks *node)
252 iks_insert_attrib (iq, "type", "set");
253 iks_insert_attrib (iq, "id", "bind1");
254 iks_insert_attrib (iks_insert (iq, "bind"),
255 "xmlns", "urn:ietf:params:xml:ns:xmpp-bind");
256 iks_send (parser, iq);
262 xmpp_features_hook (iksparser *parser, iks *node)
266 for (feat = iks_child (node); feat != NULL; feat = iks_next (feat))
268 ns = iks_find_attrib (feat, "xmlns");
269 if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-tls"))
271 xmpp_tls_hook (parser, node);
274 else if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-sasl"))
276 xmpp_sasl_hook (parser, node);
279 else if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-bind"))
281 xmpp_bind_hook (parser, node);
289 xmpp_other_hook (iksparser *parser, iks *node, char *ns)
291 if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-sasl"))
293 if (!iks_strcmp (iks_name (node), "success"))
294 iks_send_header (parser, "jabber-br.org");
300 const char * jid = "cascardo@jabber-br.org";
303 hook (void *data, int type, iks *node)
310 parser = *(iksparser **) data;
311 name = iks_name (node);
312 id = iks_find_attrib (node, "id");
313 ns = iks_find_attrib (node, "xmlns");
314 iqns = iks_find_attrib (iks_child (node), "xmlns");
315 if (!iks_strcmp (name, "message"))
318 from = iks_find_attrib (node, "from");
319 if (!iks_strncmp (from, jid, iks_strlen (jid)))
321 char *body = iks_find_cdata (node, "body");
323 process_mood (parser, body);
327 printf ("%s is not authorized\n", from);
331 else if (!iks_strcmp (name, "presence"))
334 from = iks_find_attrib (node, "from");
335 printf ("I sense a disturbance in the force: %s!\n", from);
337 else if (!iks_strcmp (name, "iq"))
339 if (xmpp_id_hook (parser, node, id) == 0)
341 if (xmpp_ns_hook (parser, node, iqns) == 0)
343 xmpp_iq_error (parser, node);
345 else if (!iks_strcmp (name, "stream:features"))
347 if (xmpp_features_hook (parser, node) == 0)
352 if (xmpp_other_hook (parser, node, ns) == 0)
354 printf ("No no: %s\n", name);
360 main (int argc, char **argv)
363 parser = iks_stream_new ("jabber:client", &parser, hook);
364 iks_connect_tcp (parser, "jabber-br.org", 5222);
366 iks_recv (parser, -1);