| 136 aimbs_putle16(&fr->data, bslen - 2); |
136 aimbs_putle16(&fr->data, bslen - 2); |
| 137 aimbs_putle32(&fr->data, atoi(sess->sn)); |
137 aimbs_putle32(&fr->data, atoi(sess->sn)); |
| 138 aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */ |
138 aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */ |
| 139 aimbs_putle16(&fr->data, snacid); /* eh. */ |
139 aimbs_putle16(&fr->data, snacid); /* eh. */ |
| 140 aimbs_putle16(&fr->data, 0x051f); /* shrug. */ |
140 aimbs_putle16(&fr->data, 0x051f); /* shrug. */ |
| |
141 aimbs_putle32(&fr->data, atoi(uin)); |
| |
142 |
| |
143 aim_tx_enqueue(sess, fr); |
| |
144 |
| |
145 return 0; |
| |
146 } |
| |
147 |
| |
148 faim_export int aim_icq_getallinfo(aim_session_t *sess, const char *uin) |
| |
149 { |
| |
150 aim_conn_t *conn; |
| |
151 aim_frame_t *fr; |
| |
152 aim_snacid_t snacid; |
| |
153 int bslen; |
| |
154 |
| |
155 if (!uin || uin[0] < '0' || uin[0] > '9') |
| |
156 return -EINVAL; |
| |
157 |
| |
158 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015))) |
| |
159 return -EINVAL; |
| |
160 |
| |
161 bslen = 2 + 4 + 2 + 2 + 2 + 4; |
| |
162 |
| |
163 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen))) |
| |
164 return -ENOMEM; |
| |
165 |
| |
166 snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0); |
| |
167 aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid); |
| |
168 |
| |
169 /* For simplicity, don't bother using a tlvlist */ |
| |
170 aimbs_put16(&fr->data, 0x0001); |
| |
171 aimbs_put16(&fr->data, bslen); |
| |
172 |
| |
173 aimbs_putle16(&fr->data, bslen - 2); |
| |
174 aimbs_putle32(&fr->data, atoi(sess->sn)); |
| |
175 aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */ |
| |
176 aimbs_putle16(&fr->data, snacid); /* eh. */ |
| |
177 aimbs_putle16(&fr->data, 0x04b2); /* shrug. */ |
| 141 aimbs_putle32(&fr->data, atoi(uin)); |
178 aimbs_putle32(&fr->data, atoi(uin)); |
| 142 |
179 |
| 143 aim_tx_enqueue(sess, fr); |
180 aim_tx_enqueue(sess, fr); |
| 144 |
181 |
| 145 return 0; |
182 return 0; |
| 196 } else if (cmd == 0x0042) { |
233 } else if (cmd == 0x0042) { |
| 197 aim_rxcallback_t userfunc; |
234 aim_rxcallback_t userfunc; |
| 198 |
235 |
| 199 if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSGCOMPLETE))) |
236 if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSGCOMPLETE))) |
| 200 ret = userfunc(sess, rx); |
237 ret = userfunc(sess, rx); |
| 201 } else if (cmd == 0x07da) { |
238 |
| |
239 } else if (cmd == 0x07da) { /* information */ |
| 202 fu16_t subtype; |
240 fu16_t subtype; |
| |
241 struct aim_icq_info *info; |
| |
242 aim_rxcallback_t userfunc; |
| 203 |
243 |
| 204 subtype = aimbs_getle16(&qbs); |
244 subtype = aimbs_getle16(&qbs); |
| |
245 info = (struct aim_icq_info *)malloc(sizeof(struct aim_icq_info)); |
| |
246 memset(info, 0, sizeof(struct aim_icq_info)); |
| |
247 aim_bstream_advance(&qbs, 1); /* 0x0a */ |
| |
248 |
| |
249 switch (subtype) { |
| |
250 case 0x00c8: { /* info summary (useful stuff) */ |
| |
251 info->nick = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
252 info->first = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
253 info->last = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
254 aim_bstream_advance(&qbs, aimbs_getle16(&qbs)); |
| |
255 info->homecity = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
256 info->homestate = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
257 aim_bstream_advance(&qbs, aimbs_getle16(&qbs)); |
| |
258 aim_bstream_advance(&qbs, aimbs_getle16(&qbs)); |
| |
259 info->homeaddr = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
260 aim_bstream_advance(&qbs, aimbs_getle16(&qbs)); |
| |
261 info->homezip = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
262 info->homecountry = aimbs_getle16(&qbs); |
| |
263 } break; |
| |
264 |
| |
265 case 0x00dc: { /* personal web page */ |
| |
266 aim_bstream_advance(&qbs, 3); |
| |
267 info->personalwebpage = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
268 } break; |
| |
269 |
| |
270 case 0x00eb: { /* email address(es) */ |
| |
271 aim_bstream_advance(&qbs, 2); /* Number of email addresses? */ |
| |
272 info->email = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
273 } break; |
| |
274 |
| |
275 case 0x00d2: { /* work information */ |
| |
276 info->workcity = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
277 info->workstate = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
278 aim_bstream_advance(&qbs, aimbs_getle16(&qbs)); |
| |
279 aim_bstream_advance(&qbs, aimbs_getle16(&qbs)); |
| |
280 info->workaddr = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
281 info->workzip = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
282 info->workcountry = aimbs_getle16(&qbs); |
| |
283 info->workcompany = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
284 info->workdivision = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
285 info->workposition = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
286 aim_bstream_advance(&qbs, 2); /* Number of webpage addresses? */ |
| |
287 info->workwebpage = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
288 } break; |
| |
289 |
| |
290 case 0x00e6: { /* additional personal information */ |
| |
291 info->info = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
292 } break; |
| |
293 |
| |
294 case 0x00f0: { /* personal interests */ |
| |
295 } break; |
| |
296 |
| |
297 case 0x00fa: { /* past background and current organizations */ |
| |
298 } break; |
| |
299 |
| |
300 case 0x010e: { /* unknown */ |
| |
301 } break; |
| |
302 |
| |
303 case 0x019a: { /* simple info */ |
| |
304 aim_bstream_advance(&qbs, 2); |
| |
305 info->uin = aimbs_getle32(&qbs); |
| |
306 info->nick = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
307 info->first = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
308 info->last = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
309 info->email = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); |
| |
310 } break; |
| |
311 } /* End switch statement */ |
| 205 |
312 |
| 206 if (subtype == 0x019a) { |
313 if (subtype == 0x019a) { |
| 207 fu16_t tlen; |
|
| 208 struct aim_icq_simpleinfo info; |
|
| 209 aim_rxcallback_t userfunc; |
|
| 210 |
|
| 211 memset(&info, 0, sizeof(info)); |
|
| 212 |
|
| 213 aimbs_getle8(&qbs); /* no clue */ |
|
| 214 aimbs_getle16(&qbs); /* no clue */ |
|
| 215 info.uin = aimbs_getle32(&qbs); |
|
| 216 tlen = aimbs_getle16(&qbs); |
|
| 217 info.nick = aimbs_getstr(&qbs, tlen); |
|
| 218 tlen = aimbs_getle16(&qbs); |
|
| 219 info.first = aimbs_getstr(&qbs, tlen); |
|
| 220 tlen = aimbs_getle16(&qbs); |
|
| 221 info.last = aimbs_getstr(&qbs, tlen); |
|
| 222 tlen = aimbs_getle16(&qbs); |
|
| 223 info.email = aimbs_getstr(&qbs, tlen); |
|
| 224 /* no clue what the rest of it is */ |
|
| 225 |
|
| 226 if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_SIMPLEINFO))) |
314 if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_SIMPLEINFO))) |
| 227 ret = userfunc(sess, rx, &info); |
315 ret = userfunc(sess, rx, info); |
| 228 |
316 } else { |
| 229 free(info.nick); |
317 if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALLINFO))) |
| 230 free(info.first); |
318 ret = userfunc(sess, rx, info); |
| 231 free(info.last); |
|
| 232 free(info.email); |
|
| 233 } |
319 } |
| 234 |
320 |
| |
321 free(info->nick); |
| |
322 free(info->first); |
| |
323 free(info->last); |
| |
324 free(info->email); |
| |
325 free(info->personalwebpage); |
| |
326 free(info->info); |
| |
327 free(info->homecity); |
| |
328 free(info->homestate); |
| |
329 free(info->homeaddr); |
| |
330 free(info->homezip); |
| |
331 free(info->workcity); |
| |
332 free(info->workstate); |
| |
333 free(info->workaddr); |
| |
334 free(info->workzip); |
| |
335 free(info->workcompany); |
| |
336 free(info->workdivision); |
| |
337 free(info->workposition); |
| |
338 free(info->workwebpage); |
| |
339 free(info); |
| 235 } |
340 } |
| 236 |
341 |
| 237 aim_freetlvchain(&tl); |
342 aim_freetlvchain(&tl); |
| 238 |
343 |
| 239 return ret; |
344 return ret; |