+ iks_insert_attrib (node, "from", NULL);
+ if (from)
+ iks_insert_attrib (node, "to", from);
+ else
+ iks_insert_attrib (node, "to", NULL);
+ iks_insert_attrib (node, "type", "error");
+ enode = iks_insert (node, "error");
+ iks_insert_attrib (enode, "type", "cancel");
+ iks_insert_attrib (iks_insert (enode, "feature-not-implemented"),
+ "xmlns", "urn:ietf:params:xml:ns:xmpp-stanzas");
+ iks_send (parser, node);
+ return 0;
+}
+
+int
+xmpp_tls_hook (iksparser *parser, iks *node)
+{
+ iks_start_tls (parser);
+ return 0;
+}
+
+int
+xmpp_sasl_hook (iksparser *parser, iks* node)
+{
+ iks_start_sasl (parser, IKS_SASL_DIGEST_MD5, "pubsub", "pubsub");
+ return 0;
+}
+
+int
+xmpp_bind_hook (iksparser *parser, iks *node)
+{
+ iks *iq;
+ iq = iks_new ("iq");
+ iks_insert_attrib (iq, "type", "set");
+ iks_insert_attrib (iq, "id", "bind1");
+ iks_insert_attrib (iks_insert (iq, "bind"),
+ "xmlns", "urn:ietf:params:xml:ns:xmpp-bind");
+ iks_send (parser, iq);
+ iks_delete (iq);
+ return 0;
+}
+
+int
+xmpp_features_hook (iksparser *parser, iks *node)
+{
+ iks *feat;
+ char *ns;
+ for (feat = iks_child (node); feat != NULL; feat = iks_next (feat))