diff mcabber/libjabber/jpacket.c @ 417:c3ae9251c197

Sync libjabber with upstream Sync with jabberd-1.4.4.
author Mikael Berthe <mikael@lilotux.net>
date Thu, 01 Sep 2005 23:29:21 +0200
parents bf3d6e241714
children
line wrap: on
line diff
--- a/mcabber/libjabber/jpacket.c	Thu Sep 01 21:18:19 2005 +0200
+++ b/mcabber/libjabber/jpacket.c	Thu Sep 01 23:29:21 2005 +0200
@@ -13,18 +13,46 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  *
- *  Jabber
- *  Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
+ * Copyrights
+ *
+ * Portions created by or assigned to Jabber.com, Inc. are
+ * Copyright (c) 1999-2002 Jabber.com, Inc.  All Rights Reserved.  Contact
+ * information for Jabber.com, Inc. is available at http://www.jabber.com/.
+ *
+ * Portions Copyright (c) 1998-1999 Jeremie Miller.
+ *
+ * Acknowledgements
+ *
+ * Special thanks to the Jabber Open Source Contributors for their
+ * suggestions and support of Jabber.
+ *
+ */
+
+/**
+ * @file jpacket.c
+ * @brief a jpacket is a wrapper around an xmlnode that contains an XMPP stanza
+ *
+ * A jpacket adds some variables to an xmlnode that contains a stanza, so that
+ * jabberd is able to cache information on the stanza type (message, presence, iq)
+ * that is contained in this jpacket and to further classify the presence stanzas.
+ * It also adds some pointers to important data inside the xmlnode, that has
+ * to be accessed often (e.g. sender and receiver of a stanza).
  */
 
 #include "jabber.h"
 
+/**
+ * create a new jpacket by wrapping an xmlnode
+ *
+ * @param x the xmlnode that should be wrapped
+ * @return the newly created jpacket (NULL on failure)
+ */
 jpacket jpacket_new(xmlnode x)
 {
     jpacket p;
 
     if(x == NULL)
-	return NULL;
+        return NULL;
 
     p = pmalloc(xmlnode_pool(x),sizeof(_jpacket));
     p->x = x;
@@ -32,6 +60,12 @@
     return jpacket_reset(p);
 }
 
+/**
+ * recalculate the information the jpacket holds about the stanza
+ *
+ * @param p the packet that should get its information recalculated
+ * @return the jpacket (as given as the p parameter)
+ */
 jpacket jpacket_reset(jpacket p)
 {
     char *val;
@@ -42,90 +76,97 @@
     p->x = x;
     p->p = xmlnode_pool(x);
 
-    if(strncmp(xmlnode_get_name(x),"message",7) == 0)
-    {
-	p->type = JPACKET_MESSAGE;
-    }else if(strncmp(xmlnode_get_name(x),"presence",8) == 0)
-    {
-	p->type = JPACKET_PRESENCE;
-	val = xmlnode_get_attrib(x, "type");
-	if(val == NULL)
-	    p->subtype = JPACKET__AVAILABLE;
-	else if(strcmp(val,"unavailable") == 0)
-	    p->subtype = JPACKET__UNAVAILABLE;
-	else if(strcmp(val,"probe") == 0)
-	    p->subtype = JPACKET__PROBE;
-	else if(*val == 's' || *val == 'u')
-	    p->type = JPACKET_S10N;
-	else if(strcmp(val,"available") == 0)
-	{ /* someone is using type='available' which is frowned upon */
-	    xmlnode_hide_attrib(x,"type");
-	    p->subtype = JPACKET__AVAILABLE;
-	}else
-	    p->type = JPACKET_UNKNOWN;
-    }else if(strncmp(xmlnode_get_name(x),"iq",2) == 0)
-    {
-	p->type = JPACKET_IQ;
-	p->iq = xmlnode_get_tag(x,"?xmlns");
-	p->iqns = xmlnode_get_attrib(p->iq,"xmlns");
+    if(strncmp(xmlnode_get_name(x),"message",7) == 0) {
+        p->type = JPACKET_MESSAGE;
+    } else if(strncmp(xmlnode_get_name(x),"presence",8) == 0) {
+        p->type = JPACKET_PRESENCE;
+        val = xmlnode_get_attrib(x, "type");
+        if(val == NULL)
+            p->subtype = JPACKET__AVAILABLE;
+        else if(strcmp(val,"unavailable") == 0)
+            p->subtype = JPACKET__UNAVAILABLE;
+        else if(strcmp(val,"probe") == 0)
+            p->subtype = JPACKET__PROBE;
+        else if(strcmp(val,"error") == 0)
+            p->subtype = JPACKET__ERROR;
+        else if(strcmp(val,"invisible") == 0)
+            p->subtype = JPACKET__INVISIBLE;
+        else if(*val == 's' || *val == 'u')
+            p->type = JPACKET_S10N;
+        else if(strcmp(val,"available") == 0) {
+	    /* someone is using type='available' which is frowned upon */
+	    /* XXX better reject this presence? */
+            xmlnode_hide_attrib(x,"type");
+            p->subtype = JPACKET__AVAILABLE;
+        } else
+            p->type = JPACKET_UNKNOWN;
+    } else if(strncmp(xmlnode_get_name(x),"iq",2) == 0) {
+        p->type = JPACKET_IQ;
+        p->iq = xmlnode_get_tag(x,"?xmlns");
+        p->iqns = xmlnode_get_attrib(p->iq,"xmlns");
     }
 
     /* set up the jids if any, flag packet as unknown if they are unparseable */
     val = xmlnode_get_attrib(x,"to");
     if(val != NULL)
-	if((p->to = jid_new(p->p, val)) == NULL)
-	    p->type = JPACKET_UNKNOWN;
+        if((p->to = jid_new(p->p, val)) == NULL)
+            p->type = JPACKET_UNKNOWN;
     val = xmlnode_get_attrib(x,"from");
     if(val != NULL)
-	if((p->from = jid_new(p->p, val)) == NULL)
-	    p->type = JPACKET_UNKNOWN;
+        if((p->from = jid_new(p->p, val)) == NULL)
+            p->type = JPACKET_UNKNOWN;
 
     return p;
 }
 
-
+/**
+ * get the subtype of a jpacket
+ *
+ * @param p the jpacket for which the caller wants to know the subtype
+ * @return the subtype of the jpacket (one of the JPACKET__* constants)
+ */
 int jpacket_subtype(jpacket p)
 {
     char *type;
     int ret = p->subtype;
 
     if(ret != JPACKET__UNKNOWN)
-	return ret;
+        return ret;
 
     ret = JPACKET__NONE; /* default, when no type attrib is specified */
     type = xmlnode_get_attrib(p->x, "type");
     if(j_strcmp(type,"error") == 0)
-	ret = JPACKET__ERROR;
+        ret = JPACKET__ERROR;
     else
-	switch(p->type)
-	{
-	case JPACKET_MESSAGE:
-	    if(j_strcmp(type,"chat") == 0)
-		ret = JPACKET__CHAT;
-	    else if(j_strcmp(type,"groupchat") == 0)
-		ret = JPACKET__GROUPCHAT;
-	    else if(j_strcmp(type,"headline") == 0)
-		ret = JPACKET__HEADLINE;
-	    break;
-	case JPACKET_S10N:
-	    if(j_strcmp(type,"subscribe") == 0)
-		ret = JPACKET__SUBSCRIBE;
-	    else if(j_strcmp(type,"subscribed") == 0)
-		ret = JPACKET__SUBSCRIBED;
-	    else if(j_strcmp(type,"unsubscribe") == 0)
-		ret = JPACKET__UNSUBSCRIBE;
-	    else if(j_strcmp(type,"unsubscribed") == 0)
-		ret = JPACKET__UNSUBSCRIBED;
-	    break;
-	case JPACKET_IQ:
-	    if(j_strcmp(type,"get") == 0)
-		ret = JPACKET__GET;
-	    else if(j_strcmp(type,"set") == 0)
-		ret = JPACKET__SET;
-	    else if(j_strcmp(type,"result") == 0)
-		ret = JPACKET__RESULT;
-	    break;
-	}
+        switch(p->type)
+        {
+        case JPACKET_MESSAGE:
+            if(j_strcmp(type,"chat") == 0)
+                ret = JPACKET__CHAT;
+            else if(j_strcmp(type,"groupchat") == 0)
+                ret = JPACKET__GROUPCHAT;
+            else if(j_strcmp(type,"headline") == 0)
+                ret = JPACKET__HEADLINE;
+            break;
+        case JPACKET_S10N:
+            if(j_strcmp(type,"subscribe") == 0)
+                ret = JPACKET__SUBSCRIBE;
+            else if(j_strcmp(type,"subscribed") == 0)
+                ret = JPACKET__SUBSCRIBED;
+            else if(j_strcmp(type,"unsubscribe") == 0)
+                ret = JPACKET__UNSUBSCRIBE;
+            else if(j_strcmp(type,"unsubscribed") == 0)
+                ret = JPACKET__UNSUBSCRIBED;
+            break;
+        case JPACKET_IQ:
+            if(j_strcmp(type,"get") == 0)
+                ret = JPACKET__GET;
+            else if(j_strcmp(type,"set") == 0)
+                ret = JPACKET__SET;
+            else if(j_strcmp(type,"result") == 0)
+                ret = JPACKET__RESULT;
+            break;
+        }
 
     p->subtype = ret;
     return ret;