diff options
Diffstat (limited to 'protocols/jabber/jpacket.c')
-rw-r--r-- | protocols/jabber/jpacket.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/protocols/jabber/jpacket.c b/protocols/jabber/jpacket.c new file mode 100644 index 00000000..9c7ce00d --- /dev/null +++ b/protocols/jabber/jpacket.c @@ -0,0 +1,159 @@ +/* -------------------------------------------------------------------------- + * + * License + * + * The contents of this file are subject to the Jabber Open Source License + * Version 1.0 (the "JOSL"). You may not copy or use this file, in either + * source code or executable form, except in compliance with the JOSL. You + * may obtain a copy of the JOSL at http://www.jabber.org/ or at + * http://www.opensource.org/. + * + * Software distributed under the JOSL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the JOSL + * for the specific language governing rights and limitations under the + * JOSL. + * + * 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. + * + * Alternatively, the contents of this file may be used under the terms of the + * GNU General Public License Version 2 or later (the "GPL"), in which case + * the provisions of the GPL are applicable instead of those above. If you + * wish to allow use of your version of this file only under the terms of the + * GPL and not to allow others to use your version of this file under the JOSL, + * indicate your decision by deleting the provisions above and replace them + * with the notice and other provisions required by the GPL. If you do not + * delete the provisions above, a recipient may use your version of this file + * under either the JOSL or the GPL. + * + * + * --------------------------------------------------------------------------*/ + +#include "jabber.h" +static jpacket jpacket_reset(jpacket p); + +jpacket jpacket_new(xmlnode x) +{ + jpacket p; + + if(x == NULL) + return NULL; + + p = pmalloc(xmlnode_pool(x),sizeof(_jpacket)); + p->x = x; + + return jpacket_reset(p); +} + +static jpacket jpacket_reset(jpacket p) +{ + char *val; + xmlnode x; + + x = p->x; + memset(p,0,sizeof(_jpacket)); + 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(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 */ + 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; + val = xmlnode_get_attrib(x,"from"); + if(val != NULL) + if((p->from = jid_new(p->p, val)) == NULL) + p->type = JPACKET_UNKNOWN; + + return p; +} + + +int jpacket_subtype(jpacket p) +{ + char *type; + int ret = p->subtype; + + if(ret != JPACKET__UNKNOWN) + 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; + 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; + } + + p->subtype = ret; + return ret; +} |