jacc

Jabber/XMPP client for Plan 9
git clone git://r-36.net/jacc
Log | Files | Refs | LICENSE

roster.c (3097B)


      1 /*
      2  * Copy me if you can.
      3  * by 20h
      4  */
      5 
      6 #include <u.h>
      7 #include <libc.h>
      8 #include "dat.h"
      9 #include "roster.h"
     10 
     11 void
     12 freerostern(rostern *r)
     13 {
     14 	if(r != nil){
     15 		if(r->name != nil)
     16 			free(r->name);
     17 		if(r->jid != nil)
     18 			free(r->jid);
     19 		if(r->status != nil)
     20 			free(r->status);
     21 		if(r->group != nil)
     22 			free(r->group);
     23 		if(r->show != nil)
     24 			free(r->show);
     25 		if(r->subsc != nil)
     26 			free(r->subsc);
     27 		free(r);
     28 	}
     29 	return;
     30 }
     31 
     32 void
     33 freerosterl(rostern *r)
     34 {
     35 	rostern *b;
     36 
     37 	if(r != nil){
     38 		while(r->n != nil){
     39 			b = r->n;
     40 			freerostern(r);
     41 			r = b;
     42 		}
     43 		freerostern(r);
     44 	}
     45 
     46 	return;
     47 }
     48 
     49 void
     50 freejabberc(jabberc *j)
     51 {
     52 
     53 	if(j != nil){
     54 		if(j->stat != nil)
     55 			free(j->stat);
     56 		if(j->name != nil)
     57 			free(j->name);
     58 		if(j->reso != nil)
     59 			free(j->reso);
     60 		if(j->serv != nil)
     61 			free(j->serv);
     62 		if(j->jid != nil)
     63 			free(j->jid);
     64 		if(j->rost != nil)
     65 			freerosterl(j->rost);
     66 		if(j->show != nil)
     67 			free(j->show);
     68 		free(j);
     69 	}
     70 	return;
     71 }
     72 
     73 rostern *
     74 mkrostern(void)
     75 {
     76 	return reallocj(nil, sizeof(rostern), 2);
     77 }
     78 
     79 jabberc *
     80 mkjabberc(void)
     81 {
     82 	return reallocj(nil, sizeof(jabberc), 2);
     83 }
     84 
     85 rostern *
     86 delrostern(rostern *r)
     87 {
     88 	rostern *ret;
     89 	
     90 	ret = nil;
     91 
     92 	//print("delrostern: %x r->n: %x r->p: %x\n", r, r->n, r->p);
     93 	if(r->n != nil && r->p != nil){
     94 		r->n->p = r->p;
     95 		r->p->n = r->n;
     96 		ret = r->p;
     97 	} else {
     98 		if(r->n != nil){
     99 			r->n->p = nil;
    100 			ret = r->n;
    101 		} else {
    102 			if(r->p != nil){
    103 				r->p->n = nil;
    104 				ret = r->p;
    105 			}
    106 		}
    107 	}
    108 	freerostern(r);
    109 
    110 	return ret;
    111 }
    112 
    113 rostern *
    114 lastrostern(rostern *r)
    115 {
    116 	while(r->n != nil)
    117 		r = r->n;
    118 
    119 	return r;
    120 }
    121 
    122 rostern *
    123 addrostern(rostern *r, rostern *n)
    124 {
    125 	rostern *ret;
    126 
    127 	//print("addrostern: %x %x %x\n", r, n, n->jid);
    128 	ret = lastrostern(r);
    129 	ret->n = n;
    130 	n->p = ret;
    131 	n->n = nil;
    132 
    133 	return n;
    134 }
    135 
    136 rostern *
    137 statusrostern(rostern *r, char *name, char *jid, char *status, char *show)
    138 {
    139 	r = searchrostern(r, name, jid);
    140 	if(r != nil){
    141 		if(show != nil){
    142 			if(r->show != nil)
    143 				if(!strcmp(r->show, show))
    144 					return nil;
    145 			if(r->show != nil)
    146 				free(r->show);
    147 			r->show = strdup(show);
    148 		}
    149 		if(status != nil){
    150 			if(r->status != nil)
    151 				if(!strcmp(r->status, status))
    152 					return nil;
    153 			if(r->status != nil)
    154 				free(r->status);
    155 			r->status = strdup(status);
    156 		}
    157 	}
    158 
    159 	return r;
    160 }
    161 
    162 char *
    163 namerostern(rostern *r, char *jid, char *name)
    164 {
    165 
    166 	r = searchrostern(r, name, jid);
    167 	if(r != nil){
    168 		if(jid != nil)
    169 			if(r->name != nil)
    170 				return r->name;
    171 		if(name != nil)
    172 			if(r->jid != nil)
    173 				return r->jid;
    174 	}
    175 
    176 	if(jid != nil)
    177 		return jid;
    178 	return name;
    179 }
    180 
    181 rostern *
    182 searchrostern(rostern *r, char *name, char *jid)
    183 {
    184 
    185 	//print("searchrostern: r: %x n: %x j: %x\n", r, name, jid);
    186 	while(r != nil){
    187 		if(name != nil && r->name != nil)
    188 			if(!strcmp(name, r->name))
    189 				return r;
    190 		if(jid != nil && r->jid != nil)
    191 			if(!strncmp(jid, r->jid, strlen(jid)) || !strncmp(jid, r->jid, strlen(r->jid)))
    192 				return r;
    193 		r = r->n;
    194 	}
    195 
    196 	return nil;
    197 }
    198 
    199 rostern *
    200 delname(rostern *r, char *name, char *jid)
    201 {
    202 	rostern *ret;
    203 
    204 	ret = searchrostern(r, name, jid);
    205 	if(ret != nil){
    206 		if(ret == r)
    207 			return delrostern(ret);
    208 
    209 		delrostern(ret);
    210 	}
    211 
    212 	return r;
    213 }