Mercurial > pidgin.yaz
annotate src/protocols/oscar/buddylist.c @ 4693:78d5be1af6a6
[gaim-migrate @ 5004]
this fixes the problem with special characters in screennames getting
stripped. I think this only affects jabber, which is the only one that
allows such nonsense ;-)
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Mon, 10 Mar 2003 16:36:16 +0000 |
parents | 2532f1192da3 |
children | 0b64f386a7b8 |
rev | line source |
---|---|
3952 | 1 /* |
2 * Family 0x0003 - Old-style Buddylist Management (non-SSI). | |
3 * | |
4 */ | |
2086 | 5 |
6 #define FAIM_INTERNAL | |
7 #include <aim.h> | |
8 | |
9 /* | |
3952 | 10 * Subtype 0x0002 - Request rights. |
2086 | 11 * |
3952 | 12 * Request Buddy List rights. |
2086 | 13 * |
14 */ | |
3952 | 15 faim_export int aim_bos_reqbuddyrights(aim_session_t *sess, aim_conn_t *conn) |
2086 | 16 { |
3952 | 17 return aim_genericreq_n(sess, conn, 0x0003, 0x0002); |
2086 | 18 } |
19 | |
3952 | 20 /* |
21 * Subtype 0x0003 - Rights. | |
22 * | |
23 */ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
24 static int rights(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
2086 | 25 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
26 aim_rxcallback_t userfunc; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
27 aim_tlvlist_t *tlvlist; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
28 fu16_t maxbuddies = 0, maxwatchers = 0; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
29 int ret = 0; |
2086 | 30 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
31 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
32 * TLVs follow |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
33 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
34 tlvlist = aim_readtlvchain(bs); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
35 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
36 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
37 * TLV type 0x0001: Maximum number of buddies. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
38 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
39 if (aim_gettlv(tlvlist, 0x0001, 1)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
40 maxbuddies = aim_gettlv16(tlvlist, 0x0001, 1); |
2086 | 41 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
42 /* |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
43 * TLV type 0x0002: Maximum number of watchers. |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
44 * |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
45 * Watchers are other users who have you on their buddy |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
46 * list. (This is called the "reverse list" by a certain |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
47 * other IM protocol.) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
48 * |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
49 */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
50 if (aim_gettlv(tlvlist, 0x0002, 1)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
51 maxwatchers = aim_gettlv16(tlvlist, 0x0002, 1); |
2086 | 52 |
3213 | 53 /* |
54 * TLV type 0x0003: Unknown. | |
55 * | |
56 * ICQ only? | |
57 */ | |
58 | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
59 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
60 ret = userfunc(sess, rx, maxbuddies, maxwatchers); |
2086 | 61 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
62 aim_freetlvchain(&tlvlist); |
2086 | 63 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
64 return ret; |
2086 | 65 } |
66 | |
67 /* | |
3952 | 68 * Subtype 0x0004 - Add buddy to list. |
2086 | 69 * |
70 * Adds a single buddy to your buddy list after login. | |
3952 | 71 * XXX This should just be an extension of setbuddylist() |
2086 | 72 * |
73 */ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
74 faim_export int aim_add_buddy(aim_session_t *sess, aim_conn_t *conn, const char *sn) |
2086 | 75 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
76 aim_frame_t *fr; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
77 aim_snacid_t snacid; |
2086 | 78 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
79 if (!sn || !strlen(sn)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
80 return -EINVAL; |
2086 | 81 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
82 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn)))) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
83 return -ENOMEM; |
2086 | 84 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
85 snacid = aim_cachesnac(sess, 0x0003, 0x0004, 0x0000, sn, strlen(sn)+1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
86 aim_putsnac(&fr->data, 0x0003, 0x0004, 0x0000, snacid); |
2086 | 87 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
88 aimbs_put8(&fr->data, strlen(sn)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
89 aimbs_putraw(&fr->data, sn, strlen(sn)); |
2086 | 90 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
91 aim_tx_enqueue(sess, fr); |
2086 | 92 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
93 return 0; |
2086 | 94 } |
95 | |
96 /* | |
3952 | 97 * Subtype 0x0004 - Add multiple buddies to your buddy list. |
98 * | |
99 * This just builds the "set buddy list" command then queues it. | |
100 * | |
101 * buddy_list = "Screen Name One&ScreenNameTwo&"; | |
102 * | |
103 * XXX Clean this up. | |
104 * | |
105 */ | |
106 faim_export int aim_bos_setbuddylist(aim_session_t *sess, aim_conn_t *conn, const char *buddy_list) | |
107 { | |
108 aim_frame_t *fr; | |
109 aim_snacid_t snacid; | |
110 int len = 0; | |
111 char *localcpy = NULL; | |
112 char *tmpptr = NULL; | |
113 | |
114 if (!buddy_list || !(localcpy = strdup(buddy_list))) | |
115 return -EINVAL; | |
116 | |
117 for (tmpptr = strtok(localcpy, "&"); tmpptr; ) { | |
118 faimdprintf(sess, 2, "---adding: %s (%d)\n", tmpptr, strlen(tmpptr)); | |
119 len += 1 + strlen(tmpptr); | |
120 tmpptr = strtok(NULL, "&"); | |
121 } | |
122 | |
123 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+len))) | |
124 return -ENOMEM; | |
125 | |
126 snacid = aim_cachesnac(sess, 0x0003, 0x0004, 0x0000, NULL, 0); | |
127 aim_putsnac(&fr->data, 0x0003, 0x0004, 0x0000, snacid); | |
128 | |
129 strncpy(localcpy, buddy_list, strlen(buddy_list) + 1); | |
130 | |
131 for (tmpptr = strtok(localcpy, "&"); tmpptr; ) { | |
132 | |
133 faimdprintf(sess, 2, "---adding: %s (%d)\n", tmpptr, strlen(tmpptr)); | |
134 | |
135 aimbs_put8(&fr->data, strlen(tmpptr)); | |
136 aimbs_putraw(&fr->data, tmpptr, strlen(tmpptr)); | |
137 tmpptr = strtok(NULL, "&"); | |
138 } | |
139 | |
140 aim_tx_enqueue(sess, fr); | |
141 | |
142 free(localcpy); | |
143 | |
144 return 0; | |
145 } | |
146 | |
147 /* | |
148 * Subtype 0x0005 - Remove buddy from list. | |
149 * | |
2086 | 150 * XXX generalise to support removing multiple buddies (basically, its |
151 * the same as setbuddylist() but with a different snac subtype). | |
152 * | |
153 */ | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
154 faim_export int aim_remove_buddy(aim_session_t *sess, aim_conn_t *conn, const char *sn) |
2086 | 155 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
156 aim_frame_t *fr; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
157 aim_snacid_t snacid; |
2086 | 158 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
159 if (!sn || !strlen(sn)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
160 return -EINVAL; |
2086 | 161 |
2315
7ec21662ffc2
[gaim-migrate @ 2325]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2246
diff
changeset
|
162 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn)))) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
163 return -ENOMEM; |
2086 | 164 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
165 snacid = aim_cachesnac(sess, 0x0003, 0x0005, 0x0000, sn, strlen(sn)+1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
166 aim_putsnac(&fr->data, 0x0003, 0x0005, 0x0000, snacid); |
2086 | 167 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
168 aimbs_put8(&fr->data, strlen(sn)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
169 aimbs_putraw(&fr->data, sn, strlen(sn)); |
2086 | 170 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
171 aim_tx_enqueue(sess, fr); |
2086 | 172 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
173 return 0; |
2086 | 174 } |
175 | |
3952 | 176 /* |
177 * Subtype 0x000b | |
178 * | |
179 * XXX Why would we send this? | |
180 * | |
181 */ | |
182 faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *info) | |
183 { | |
184 aim_frame_t *fr; | |
185 aim_snacid_t snacid; | |
186 | |
187 if (!sess || !conn || !info) | |
188 return -EINVAL; | |
189 | |
190 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 1152))) | |
191 return -ENOMEM; | |
192 | |
193 snacid = aim_cachesnac(sess, 0x0003, 0x000b, 0x0000, NULL, 0); | |
194 | |
195 aim_putsnac(&fr->data, 0x0003, 0x000b, 0x0000, snacid); | |
196 aim_putuserinfo(&fr->data, info); | |
197 | |
198 aim_tx_enqueue(sess, fr); | |
199 | |
200 return 0; | |
201 } | |
202 | |
203 /* | |
204 * Subtype 0x000c | |
205 * | |
206 * XXX Why would we send this? | |
207 * | |
208 */ | |
209 faim_export int aim_sendbuddyoffgoing(aim_session_t *sess, aim_conn_t *conn, const char *sn) | |
210 { | |
211 aim_frame_t *fr; | |
212 aim_snacid_t snacid; | |
213 | |
214 if (!sess || !conn || !sn) | |
215 return -EINVAL; | |
216 | |
217 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn)))) | |
218 return -ENOMEM; | |
219 | |
220 snacid = aim_cachesnac(sess, 0x0003, 0x000c, 0x0000, NULL, 0); | |
221 | |
222 aim_putsnac(&fr->data, 0x0003, 0x000c, 0x0000, snacid); | |
223 aimbs_put8(&fr->data, strlen(sn)); | |
224 aimbs_putraw(&fr->data, sn, strlen(sn)); | |
225 | |
226 aim_tx_enqueue(sess, fr); | |
227 | |
228 return 0; | |
229 } | |
230 | |
231 /* | |
232 * Subtypes 0x000b and 0x000c - Change in buddy status | |
233 * | |
234 * Oncoming Buddy notifications contain a subset of the | |
235 * user information structure. Its close enough to run | |
236 * through aim_extractuserinfo() however. | |
237 * | |
238 * Although the offgoing notification contains no information, | |
239 * it is still in a format parsable by extractuserinfo. | |
240 * | |
241 */ | |
242 static int buddychange(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) | |
243 { | |
244 aim_userinfo_t userinfo; | |
245 aim_rxcallback_t userfunc; | |
246 | |
247 aim_extractuserinfo(sess, bs, &userinfo); | |
248 | |
249 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) | |
250 return userfunc(sess, rx, &userinfo); | |
251 | |
252 return 0; | |
253 } | |
254 | |
255 static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) | |
256 { | |
257 | |
258 if (snac->subtype == 0x0003) | |
259 return rights(sess, mod, rx, snac, bs); | |
260 else if ((snac->subtype == 0x000b) || (snac->subtype == 0x000c)) | |
261 return buddychange(sess, mod, rx, snac, bs); | |
262 | |
263 return 0; | |
264 } | |
265 | |
266 faim_internal int buddylist_modfirst(aim_session_t *sess, aim_module_t *mod) | |
267 { | |
268 | |
269 mod->family = 0x0003; | |
270 mod->version = 0x0001; | |
271 mod->toolid = 0x0110; | |
4071 | 272 mod->toolversion = 0x0629; |
3952 | 273 mod->flags = 0; |
274 strncpy(mod->name, "buddylist", sizeof(mod->name)); | |
275 mod->snachandler = snachandler; | |
276 | |
277 return 0; | |
278 } |