Mercurial > ~mikael > mcabber > hg
comparison mcabber/libjabber/pproxy.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 |
comparison
equal
deleted
inserted
replaced
416:48e7808c4191 | 417:c3ae9251c197 |
---|---|
11 * | 11 * |
12 * You should have received a copy of the GNU General Public License | 12 * You should have received a copy of the GNU General Public License |
13 * along with this program; if not, write to the Free Software | 13 * along with this program; if not, write to the Free Software |
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
15 * | 15 * |
16 * Jabber | 16 * Copyrights |
17 * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ | 17 * |
18 * Portions created by or assigned to Jabber.com, Inc. are | |
19 * Copyright (c) 1999-2002 Jabber.com, Inc. All Rights Reserved. Contact | |
20 * information for Jabber.com, Inc. is available at http://www.jabber.com/. | |
21 * | |
22 * Portions Copyright (c) 1998-1999 Jeremie Miller. | |
23 * | |
24 * Acknowledgements | |
25 * | |
26 * Special thanks to the Jabber Open Source Contributors for their | |
27 * suggestions and support of Jabber. | |
28 * | |
29 * | |
30 */ | |
31 | |
32 /** | |
33 * @file pproxy.c | |
34 * @brief presence proxy database - DEPRECATED | |
35 * | |
36 * @deprecated these functions are not used by jabberd itself (but aim-t uses them), they will be removed from jabberd | |
37 * | |
38 * The presence proxy database is used to store presences for different resources of a JID. | |
39 * | |
40 * these aren't the most efficient things in the world, a hash optimized for tiny spaces would be far better | |
18 */ | 41 */ |
19 | 42 |
20 #include "jabber.h" | 43 #include "jabber.h" |
21 | 44 |
22 /* these aren't the most efficient things in the world, a hash optimized for tiny spaces would be far better */ | 45 /* these aren't the most efficient things in the world, a hash optimized for tiny spaces would be far better */ |
40 ppdb cur; | 63 ppdb cur; |
41 | 64 |
42 if(db == NULL || id == NULL) return NULL; | 65 if(db == NULL || id == NULL) return NULL; |
43 | 66 |
44 for(cur = db->next; cur != NULL; cur = cur->next) | 67 for(cur = db->next; cur != NULL; cur = cur->next) |
45 if(jid_cmp(cur->id,id) == 0) return cur; | 68 if(jid_cmp(cur->id,id) == 0) return cur; |
46 | 69 |
47 return NULL; | 70 return NULL; |
48 } | 71 } |
49 | 72 |
50 ppdb ppdb_insert(ppdb db, jid id, xmlnode x) | 73 ppdb ppdb_insert(ppdb db, jid id, xmlnode x) |
51 { | 74 { |
52 char *res; | |
53 ppdb cur, curu; | 75 ppdb cur, curu; |
54 pool p; | 76 pool p; |
55 | 77 |
56 if(id == NULL || id->server == NULL || x == NULL) | 78 if(id == NULL || id->server == NULL || x == NULL) |
57 return db; | 79 return db; |
58 | 80 |
59 /* new ppdb list dummy holder */ | 81 /* new ppdb list dummy holder */ |
60 if(db == NULL) | 82 if(db == NULL) |
61 { | 83 { |
62 p = pool_heap(1024); | 84 p = pool_heap(1024); |
63 db = _ppdb_new(p,id); | 85 db = _ppdb_new(p,NULL); |
64 } | 86 } |
65 | 87 |
66 cur = _ppdb_get(db,id); | 88 cur = _ppdb_get(db,id); |
67 | 89 |
68 /* just update it */ | 90 /* just update it */ |
69 if(cur != NULL) | 91 if(cur != NULL) |
70 { | 92 { |
71 xmlnode_free(cur->x); | 93 xmlnode_free(cur->x); |
72 cur->x = xmlnode_dup(x); | 94 cur->x = xmlnode_dup(x); |
73 cur->pri = jutil_priority(x); | 95 cur->pri = jutil_priority(x); |
74 return db; | 96 return db; |
75 } | 97 } |
76 | 98 |
77 /* make an entry for it */ | 99 /* make an entry for it */ |
78 cur = _ppdb_new(db->p,id); | 100 cur = _ppdb_new(db->p,id); |
79 cur->x = xmlnode_dup(x); | 101 cur->x = xmlnode_dup(x); |
80 cur->pri = jutil_priority(x); | 102 cur->pri = jutil_priority(x); |
81 cur->next = db->next; | 103 cur->next = db->next; |
82 db->next = cur; | 104 db->next = cur; |
83 | 105 |
84 /* this is a presence from a resource, make an entry for just the user */ | 106 /* if this is a user's resource presence, get the the user entry */ |
85 if(id->user != NULL && id->resource != NULL) | 107 if(id->user != NULL && (curu = _ppdb_get(db,jid_user(id))) != cur) |
86 { | 108 { |
87 /* modify the id to just user@host */ | 109 /* no user entry, make one */ |
88 res = id->resource; | 110 if(curu == NULL) |
89 jid_set(id,NULL,JID_RESOURCE); | 111 { |
90 curu = _ppdb_get(db,id); | 112 curu = _ppdb_new(db->p,jid_user(id)); |
91 | 113 curu->next = db->next; |
92 /* no user entry, make one */ | 114 db->next = curu; |
93 if(curu == NULL) | 115 } |
94 { | 116 |
95 curu = _ppdb_new(db->p,id); | 117 /* insert this resource into the user list */ |
96 curu->next = db->next; | 118 cur->user = curu->user; |
97 db->next = curu; | 119 curu->user = cur; |
98 } | |
99 | |
100 /* restore the id */ | |
101 jid_set(id,res,JID_RESOURCE); | |
102 | |
103 /* insert this resource into the user list */ | |
104 cur->user = curu->user; | |
105 curu->user = cur; | |
106 } | 120 } |
107 | 121 |
108 return db; | 122 return db; |
109 } | 123 } |
110 | 124 |
121 /* not user@host check, just return */ | 135 /* not user@host check, just return */ |
122 if(id->user == NULL || id->resource != NULL) return cur->x; | 136 if(id->user == NULL || id->resource != NULL) return cur->x; |
123 | 137 |
124 top = cur; | 138 top = cur; |
125 for(cur = cur->user; cur != NULL; cur = cur->user) | 139 for(cur = cur->user; cur != NULL; cur = cur->user) |
126 if(cur->pri >= top->pri) top = cur; | 140 if(cur->pri >= top->pri) top = cur; |
127 | 141 |
128 if(top != NULL && top->pri >= 0) return top->x; | 142 if(top != NULL && top->pri >= 0) return top->x; |
129 | 143 |
130 return NULL; | 144 return NULL; |
131 } | 145 } |
139 if(db == NULL || id == NULL) return NULL; | 153 if(db == NULL || id == NULL) return NULL; |
140 | 154 |
141 /* MODE: if this is NOT just user@host addy, return just the single entry */ | 155 /* MODE: if this is NOT just user@host addy, return just the single entry */ |
142 if(id->user == NULL || id->resource != NULL) | 156 if(id->user == NULL || id->resource != NULL) |
143 { | 157 { |
144 /* we were just here, return now */ | 158 /* we were just here, return now */ |
145 if(last != NULL) | 159 if(last != NULL) |
146 { | 160 { |
147 last = NULL; | 161 last = NULL; |
148 return NULL; | 162 return NULL; |
149 } | 163 } |
150 | 164 |
151 last = _ppdb_get(db,id); | 165 last = _ppdb_get(db,id); |
152 if(last != NULL) | 166 if(last != NULL) |
153 return last->x; | 167 return last->x; |
154 else | 168 else |
155 return NULL; | 169 return NULL; |
156 } | 170 } |
157 | 171 |
158 /* handle looping for user@host */ | 172 /* handle looping for user@host */ |
159 | 173 |
160 /* we're already in the loop */ | 174 /* we're already in the loop */ |
161 if(last != NULL) | 175 if(last != NULL) |
162 { | 176 { |
163 /* this is the last entry in the list */ | 177 /* this is the last entry in the list */ |
164 if(last->user == NULL) | 178 if(last->user == NULL) |
165 { | 179 { |
166 last = NULL; | 180 last = NULL; |
167 return NULL; | 181 return NULL; |
168 } | 182 } |
169 | 183 |
170 last = last->user; | 184 last = last->user; |
171 return last->x; | 185 return last->x; |
172 } | 186 } |
173 | 187 |
174 /* start a new loop */ | 188 /* start a new loop */ |
175 cur = _ppdb_get(db,id); | 189 cur = _ppdb_get(db,id); |
176 | 190 |
177 if(cur == NULL) return NULL; | 191 if(cur == NULL) return NULL; |
178 | 192 |
179 last = cur->user; | 193 last = cur->user; |
180 if(last != NULL) | 194 if(last != NULL) |
181 return last->x; | 195 return last->x; |
182 else | 196 else |
183 return NULL; | 197 return NULL; |
184 } | 198 } |
185 | 199 |
186 | 200 |
187 void ppdb_free(ppdb db) | 201 void ppdb_free(ppdb db) |
188 { | 202 { |
189 ppdb cur; | 203 ppdb cur; |
190 | 204 |
191 if(db == NULL) return; | 205 if(db == NULL) return; |
192 | 206 |
193 for(cur = db; cur != NULL; cur = cur->next) | 207 for(cur = db; cur != NULL; cur = cur->next) |
194 xmlnode_free(cur->x); | 208 xmlnode_free(cur->x); |
195 | 209 |
196 pool_free(db->p); | 210 pool_free(db->p); |
197 } | 211 } |
198 | 212 |