[JDEV] message ack jsm

Dave dave at dave.tj
Sun Jul 14 00:17:44 CDT 2002


Thanks ... this is invaluable for anybody writing a transport from
another system to Jabber :-)

 - Dave


Tom Waters wrote:
> 
> with a ton of help from rob, i wrote my first jsm tonight...
> 
> i've been wanting to get acks from my messages... ... you get a nak in 
> the form of a message type='error' when the user you send the message to 
> doesn't exist, but there's no positive acknowledge, (other than the 
> absence of an error!).
> 
> this jsm works for me...
> 
> /*
>   * Jabber JSM message ack module
>   *
>   * Copyright (C) 2002 Tom Waters <tom_waters at mac.com>
>   * Released under the LGPL v2. See http://www.gnu.org/copyleft/lgpl.html
>   */
> 
> /* $Id: mod_message_ack.c,v 1.0 2002/07/10 17:20:32 waters Exp $ */
> 
> /*
>   * Installation:
>   *
>   * 1. Place mod_message_ack.c in jabber/jsm/modules
>   * 2. Add "mod_message_ack.o" to jsm_modules_OBJECTS in 
> jabber/jsm/modules/Makefile
>   * 3. Add "modules/mod_message_ack.o" to jsm_EXOBJECTS in 
> jabber/jsm/Makefile
>   * 5. "make all" in jabber/jsm, or (re)compile entire server
>   * 6. Add <mod_message_ack>./jsm/jsm.so</mod_message_ack> (or similar) 
> to the
>   *    <load main="jsm"> section of jabber.xml. I add it just before 
> <mod_filter>
>   */
> 
> /*
>   * Usage:
>   *
>   * You send something like this:
>   *
>   *    <message type='chat' to='bob at jabber.example.com'>
>   *      <body>hello</body>
>   *      <ack xmlns='message:ack' id=42/>
>   *    </message>
>   *
>   * Server will respond with something like:
>   *
>   *    <message type='chat' to='you at jabber.example.com' 
> from='bob at jabber.example.com'>
>   *      <body>hello</body>
>   *      <ack xmlns='message:ack' id=42/>
>   *    </message>
>   *
>   * And bob at jabber.example.com will get this:
>   *
>   *    <message type='chat' to='bob at jabber.example.com' 
> from='you at jabber.example.com'>
>   *      <body>hello</body>
>   *    </message>
>   *
>   * If the recipient doesn't exist, you will not get an ack, you'll get 
> an error.
>   */
> 
> #include <jsm.h>
> 
> #define NS_MESSAGE_ACK "message:ack"
> 
> mreturn mod_message_ack_handler(mapi m, void *arg) {
>    xmlnode ack;
>    jpacket ret;
> 
>    if(m->packet->type != JPACKET_MESSAGE)
>      return M_IGNORE;
> 
>    ack = xmlnode_get_tag(m->packet->x, "ack");
> 
>    if (ack == NULL || !NSCHECK(ack, NS_MESSAGE_ACK))
>      return M_PASS;
> 
>    if (xmlnode_get_attrib(ack, "delivered") != NULL)
>      return M_PASS;
> 
>    if (js_user(m->si, m->packet->to, NULL) == NULL) {
>      log_debug("mod_message_ack","not sending ack because %s doesn't 
> exist",
>                jid_full(m->packet->to));
>      return M_PASS;
>    }
> 
>    log_debug("mod_message_ack","sending message ack to %s from %s",
>              jid_user(m->packet->from), jid_user(m->packet->to));
> 
>    ret = jpacket_new(xmlnode_dup(m->packet->x));
> 
>    jutil_tofrom(ret->x);
>    xmlnode_put_attrib(xmlnode_get_tag(ret->x, "ack"), "delivered", "yes");
> 
>    jpacket_reset(ret);
>    js_deliver(m->si, ret);
> 
>    xmlnode_hide(ack);
>    return M_PASS;
> }
> 
> void mod_message_ack(jsmi si) {
>    js_mapi_register(si, e_SERVER, mod_message_ack_handler, NULL);
>    js_mapi_register(si, e_DELIVER, mod_message_ack_handler, NULL);
>    js_mapi_register(si, e_OFFLINE, mod_message_ack_handler, NULL);
> }
> 
> _______________________________________________
> jdev mailing list
> jdev at jabber.org
> http://mailman.jabber.org/listinfo/jdev
> 




More information about the JDev mailing list