Mercurial > pidgin
view plugins/jabber/jutil.c @ 2061:f82299f8fbc8
[gaim-migrate @ 2071]
i've heard this works better
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Wed, 20 Jun 2001 21:11:24 +0000 |
parents | afa63ac2fd84 |
children |
line wrap: on
line source
#include "jabber.h" /* util for making presence packets */ xmlnode jutil_presnew(int type, char *to, char *status) { xmlnode pres; pres = xmlnode_new_tag("presence"); switch(type) { case JPACKET__SUBSCRIBE: xmlnode_put_attrib(pres,"type","subscribe"); break; case JPACKET__UNSUBSCRIBE: xmlnode_put_attrib(pres,"type","unsubscribe"); break; case JPACKET__SUBSCRIBED: xmlnode_put_attrib(pres,"type","subscribed"); break; case JPACKET__UNSUBSCRIBED: xmlnode_put_attrib(pres,"type","unsubscribed"); break; case JPACKET__PROBE: xmlnode_put_attrib(pres,"type","probe"); break; case JPACKET__UNAVAILABLE: xmlnode_put_attrib(pres,"type","unavailable"); break; } if(to != NULL) xmlnode_put_attrib(pres,"to",to); if(status != NULL) xmlnode_insert_cdata(xmlnode_insert_tag(pres,"status"),status,strlen(status)); return pres; } /* util for making IQ packets */ xmlnode jutil_iqnew(int type, char *ns) { xmlnode iq; iq = xmlnode_new_tag("iq"); switch(type) { case JPACKET__GET: xmlnode_put_attrib(iq,"type","get"); break; case JPACKET__SET: xmlnode_put_attrib(iq,"type","set"); break; case JPACKET__RESULT: xmlnode_put_attrib(iq,"type","result"); break; case JPACKET__ERROR: xmlnode_put_attrib(iq,"type","error"); break; } xmlnode_put_attrib(xmlnode_insert_tag(iq,"query"),"xmlns",ns); return iq; } /* util for making message packets */ xmlnode jutil_msgnew(char *type, char *to, char *subj, char *body) { xmlnode msg; msg = xmlnode_new_tag("message"); xmlnode_put_attrib (msg, "type", type); xmlnode_put_attrib (msg, "to", to); if (subj) { xmlnode_insert_cdata (xmlnode_insert_tag (msg, "subject"), subj, strlen (subj)); } xmlnode_insert_cdata (xmlnode_insert_tag (msg, "body"), body, strlen (body)); return msg; } /* util for making stream packets */ xmlnode jutil_header(char* xmlns, char* server) { xmlnode result; if ((xmlns == NULL)||(server == NULL)) return NULL; result = xmlnode_new_tag("stream:stream"); xmlnode_put_attrib(result, "xmlns:stream", "http://etherx.jabber.org/streams"); xmlnode_put_attrib(result, "xmlns", xmlns); xmlnode_put_attrib(result, "to", server); return result; } /* returns the priority on a presence packet */ int jutil_priority(xmlnode x) { char *str; int p; if(x == NULL) return -1; if(xmlnode_get_attrib(x,"type") != NULL) return -1; x = xmlnode_get_tag(x,"priority"); if(x == NULL) return 0; str = xmlnode_get_data((x)); if(str == NULL) return 0; p = atoi(str); if(p >= 0) return p; else return 0; } void jutil_tofrom(xmlnode x) { char *to, *from; to = xmlnode_get_attrib(x,"to"); from = xmlnode_get_attrib(x,"from"); xmlnode_put_attrib(x,"from",to); xmlnode_put_attrib(x,"to",from); } xmlnode jutil_iqresult(xmlnode x) { xmlnode cur; jutil_tofrom(x); xmlnode_put_attrib(x,"type","result"); /* hide all children of the iq, they go back empty */ for(cur = xmlnode_get_firstchild(x); cur != NULL; cur = xmlnode_get_nextsibling(cur)) xmlnode_hide(cur); return x; } char *jutil_timestamp(void) { time_t t; struct tm *new_time; static char timestamp[18]; int ret; t = time(NULL); if(t == (time_t)-1) return NULL; new_time = gmtime(&t); ret = snprintf(timestamp, 18, "%d%02d%02dT%02d:%02d:%02d", 1900+new_time->tm_year, new_time->tm_mon+1, new_time->tm_mday, new_time->tm_hour, new_time->tm_min, new_time->tm_sec); if(ret == -1) return NULL; return timestamp; } void jutil_error(xmlnode x, terror E) { xmlnode err; char code[4]; xmlnode_put_attrib(x,"type","error"); err = xmlnode_insert_tag(x,"error"); snprintf(code,4,"%d",E.code); xmlnode_put_attrib(err,"code",code); if(E.msg != NULL) xmlnode_insert_cdata(err,E.msg,strlen(E.msg)); jutil_tofrom(x); } void jutil_delay(xmlnode msg, char *reason) { xmlnode delay; delay = xmlnode_insert_tag(msg,"x"); xmlnode_put_attrib(delay,"xmlns",NS_DELAY); xmlnode_put_attrib(delay,"from",xmlnode_get_attrib(msg,"to")); xmlnode_put_attrib(delay,"stamp",jutil_timestamp()); if(reason != NULL) xmlnode_insert_cdata(delay,reason,strlen(reason)); } #define KEYBUF 100 char *jutil_regkey(char *key, char *seed) { static char keydb[KEYBUF][41]; static char seeddb[KEYBUF][41]; static int last = -1; char *str, strint[32]; int i; /* blanket the keydb first time */ if(last == -1) { last = 0; memset(&keydb,0,KEYBUF*41); memset(&seeddb,0,KEYBUF*41); srand(time(NULL)); } /* creation phase */ if(key == NULL && seed != NULL) { /* create a random key hash and store it */ sprintf(strint,"%d",rand()); strcpy(keydb[last],shahash(strint)); /* store a hash for the seed associated w/ this key */ strcpy(seeddb[last],shahash(seed)); /* return it all */ str = keydb[last]; last++; if(last == KEYBUF) last = 0; return str; } /* validation phase */ str = shahash(seed); for(i=0;i<KEYBUF;i++) if(j_strcmp(keydb[i],key) == 0 && j_strcmp(seeddb[i],str) == 0) { seeddb[i][0] = '\0'; /* invalidate this key */ return keydb[i]; } return NULL; }