From: Thadeu Lima de Souza Cascardo Date: Tue, 25 Nov 2008 12:13:42 +0000 (-0200) Subject: Added support for presence hooks X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fchat.git;a=commitdiff_plain;h=40fb126bf869e43a4ff4763c76396abc0c5791d8 Added support for presence hooks --- diff --git a/Makefile b/Makefile index cc14e6c..89a6998 100644 --- 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 message.o + xmpp.o features.o sasl.o bind.o disco.o hook.o message.o presence.o CC = gcc CFLAGS = -g -Wall `pkg-config --cflags iksemel libgsasl glib-2.0 gtk+-2.0` LIBS = -ludns `pkg-config --libs iksemel libgsasl glib-2.0 gtk+-2.0` diff --git a/hook.c b/hook.c index e91e9fb..41ef3c5 100644 --- a/hook.c +++ b/hook.c @@ -58,6 +58,10 @@ hc_xmpp_hook (void *data, int type, iks *stanza) { hc_xmpp_recv_message (xmpp, stanza); } + else if (!iks_strcmp (iks_name (stanza), "presence")) + { + hc_xmpp_recv_presence (xmpp, stanza); + } else if (!iks_strcmp (iks_name (stanza), "iq")) { char *ns = iks_find_attrib (iks_child (stanza), "xmlns"); diff --git a/presence.c b/presence.c new file mode 100644 index 0000000..b8c671d --- /dev/null +++ b/presence.c @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2008 Thadeu Lima de Souza Cascardo + * + * 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_presence (hc_xmpp_t *xmpp, char *to, char *show, char *status) +{ + iks *pres; + iks *sh; + iks *st; + pres = iks_new ("presence"); + if (to != NULL && iks_strcmp (to, "")) + iks_insert_attrib (pres, "to", to); + if (show) + { + sh = iks_insert (pres, "show"); + iks_insert_cdata (sh, show, 0); + } + if (status) + { + st = iks_insert (pres, "status"); + iks_insert_cdata (st, status, 0); + } + hc_xmpp_send_iks (xmpp, pres); + hc_xmpp_sent_presence (xmpp, pres); + iks_delete (pres); +} diff --git a/presence.h b/presence.h new file mode 100644 index 0000000..3d9d5ed --- /dev/null +++ b/presence.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2008 Thadeu Lima de Souza Cascardo + * + * 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_PRESENCE_H +#define HC_XMPP_PRESENCE_H + +void hc_xmpp_send_presence (hc_xmpp_t *, char *, char *, char *); + +#endif diff --git a/xmpp.c b/xmpp.c index 44f5761..b258984 100644 --- a/xmpp.c +++ b/xmpp.c @@ -175,6 +175,18 @@ hc_xmpp_set_sent_msg_hook (hc_xmpp_t *xmpp, hc_xmpp_hook_t hook) xmpp->sentmsghook = hook; } +void +hc_xmpp_set_pres_hook (hc_xmpp_t *xmpp, hc_xmpp_hook_t hook) +{ + xmpp->preshook = hook; +} + +void +hc_xmpp_set_sent_pres_hook (hc_xmpp_t *xmpp, hc_xmpp_hook_t hook) +{ + xmpp->sentpreshook = hook; +} + void hc_xmpp_recv_message (hc_xmpp_t *xmpp, iks *stanza) { @@ -188,3 +200,17 @@ hc_xmpp_sent_message (hc_xmpp_t *xmpp, iks *stanza) if (xmpp->sentmsghook) xmpp->sentmsghook (xmpp, stanza); } + +void +hc_xmpp_recv_presence (hc_xmpp_t *xmpp, iks *stanza) +{ + if (xmpp->preshook) + xmpp->preshook (xmpp, stanza); +} + +void +hc_xmpp_sent_presence (hc_xmpp_t *xmpp, iks *stanza) +{ + if (xmpp->sentpreshook) + xmpp->sentpreshook (xmpp, stanza); +} diff --git a/xmpp.h b/xmpp.h index 652ad5c..8c358b1 100644 --- a/xmpp.h +++ b/xmpp.h @@ -63,8 +63,12 @@ int hc_xmpp_hook (void *, int, iks *); void hc_xmpp_send_stream (hc_xmpp_t *); void hc_xmpp_set_msg_hook (hc_xmpp_t *, hc_xmpp_hook_t); void hc_xmpp_set_sent_msg_hook (hc_xmpp_t *, hc_xmpp_hook_t); +void hc_xmpp_set_pres_hook (hc_xmpp_t *, hc_xmpp_hook_t); +void hc_xmpp_set_sent_pres_hook (hc_xmpp_t *, hc_xmpp_hook_t); void hc_xmpp_register_ns_hook (hc_xmpp_t *, char *, hc_xmpp_hook_t); void hc_xmpp_recv_message (hc_xmpp_t *, iks *); void hc_xmpp_sent_message (hc_xmpp_t *, iks *); +void hc_xmpp_recv_presence (hc_xmpp_t *, iks *); +void hc_xmpp_sent_presence (hc_xmpp_t *, iks *); #endif diff --git a/xmpp_internal.h b/xmpp_internal.h index 68c60d6..af75a88 100644 --- a/xmpp_internal.h +++ b/xmpp_internal.h @@ -44,6 +44,8 @@ struct _hc_xmpp_t Gsasl_session *sasl_session; hc_xmpp_hook_t msghook; hc_xmpp_hook_t sentmsghook; + hc_xmpp_hook_t preshook; + hc_xmpp_hook_t sentpreshook; GHashTable *nshooks; int fd; int tls;