Added support for a message hook and simple message sending
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Mon, 24 Nov 2008 23:29:52 +0000 (21:29 -0200)
committerThadeu Lima de Souza Cascardo <cascardo@minaslivre.org>
Tue, 25 Nov 2008 01:51:42 +0000 (23:51 -0200)
Makefile
hook.c
message.c [new file with mode: 0644]
message.h [new file with mode: 0644]
xmpp.c
xmpp.h
xmpp_internal.h

index de2d9c2..2b9dd43 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 OBJECTS = sort_udns.o tcp_connect.o iksemel_extra.o \
-       xmpp.o features.o sasl.o bind.o disco.o hook.o
+       xmpp.o features.o sasl.o bind.o disco.o hook.o message.o
 CC = gcc
 CFLAGS = -g -Wall `pkg-config --cflags iksemel libgsasl glib-2.0`
 LIBS = -ludns `pkg-config --libs iksemel libgsasl glib-2.0`
diff --git a/hook.c b/hook.c
index 43eeef2..e91e9fb 100644 (file)
--- a/hook.c
+++ b/hook.c
@@ -54,7 +54,11 @@ int
 hc_xmpp_hook (void *data, int type, iks *stanza)
 {
   hc_xmpp_t *xmpp = (hc_xmpp_t *) data;
-  if (!iks_strcmp (iks_name (stanza), "iq"))
+  if (!iks_strcmp (iks_name (stanza), "message"))
+    {
+      hc_xmpp_recv_message (xmpp, stanza);
+    }
+  else if (!iks_strcmp (iks_name (stanza), "iq"))
     {
       char *ns = iks_find_attrib (iks_child (stanza), "xmlns");
       hc_xmpp_hook_t hook;
diff --git a/message.c b/message.c
new file mode 100644 (file)
index 0000000..be28d5d
--- /dev/null
+++ b/message.c
@@ -0,0 +1,32 @@
+/*
+ *  Copyright (C) 2008  Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "xmpp.h"
+
+void
+hc_xmpp_send_message (hc_xmpp_t *xmpp, char *to, char *body)
+{
+  iks *msg;
+  iks *bd;
+  msg = iks_new ("message");
+  iks_insert_attrib (msg, "to", to);
+  bd = iks_insert (msg, "body");
+  iks_insert_cdata (bd, body, 0);
+  hc_xmpp_send_iks (xmpp, msg);
+  iks_delete (msg);
+}
diff --git a/message.h b/message.h
new file mode 100644 (file)
index 0000000..a9bde84
--- /dev/null
+++ b/message.h
@@ -0,0 +1,24 @@
+/*
+ *  Copyright (C) 2008  Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef HC_XMPP_MESSAGE_H
+#define HC_XMPP_MESSAGE_H
+
+void hc_xmpp_send_message (hc_xmpp_t *, char *, char *);
+
+#endif
diff --git a/xmpp.c b/xmpp.c
index e5eed9d..94cd9ab 100644 (file)
--- a/xmpp.c
+++ b/xmpp.c
@@ -38,6 +38,7 @@ hc_xmpp_new (iksStreamHook *hook, char *server, char *user, char *pass)
   xmpp->tls = NONE;
   xmpp->sasl = NONE;
   xmpp->status = HC_XMPP_NONE;
+  xmpp->msghook = NULL;
   xmpp->nshooks = g_hash_table_new (g_str_hash, g_str_equal);
   g_hash_table_insert (xmpp->nshooks, HC_XMPP_NS_BIND, hc_xmpp_hook_bind);
   g_hash_table_insert (xmpp->nshooks, HC_XMPP_NS_SESSION, hc_xmpp_hook_session);
@@ -160,3 +161,16 @@ hc_xmpp_register_ns_hook (hc_xmpp_t *xmpp, char *ns, hc_xmpp_hook_t hook)
 {
   g_hash_table_insert (xmpp->nshooks, ns, hook);
 }
+
+void
+hc_xmpp_set_msg_hook (hc_xmpp_t *xmpp, hc_xmpp_hook_t hook)
+{
+  xmpp->msghook = hook;
+}
+
+void
+hc_xmpp_recv_message (hc_xmpp_t *xmpp, iks *stanza)
+{
+  if (xmpp->msghook)
+    xmpp->msghook (xmpp, stanza);
+}
diff --git a/xmpp.h b/xmpp.h
index 66c64d2..c45d7ac 100644 (file)
--- a/xmpp.h
+++ b/xmpp.h
@@ -62,5 +62,6 @@ int hc_xmpp_status (hc_xmpp_t *);
 int hc_xmpp_hook (void *, int, iks *);
 void hc_xmpp_send_stream (hc_xmpp_t *);
 void hc_xmpp_register_ns_hook (hc_xmpp_t *, char *, hc_xmpp_hook_t);
+void hc_xmpp_recv_message (hc_xmpp_t *, iks *);
 
 #endif
index 2a120e0..1196cf8 100644 (file)
@@ -42,6 +42,7 @@ struct _hc_xmpp_t
   iksparser *parser;
   Gsasl *sasl_ctx;
   Gsasl_session *sasl_session;
+  hc_xmpp_hook_t msghook;
   GHashTable *nshooks;
   int fd;
   int tls;