src/protocols/oscar/icq.c

changeset 4151
29004a3d21a0
parent 4102
06290da3f88d
child 4154
e1c6a1bdcf5a
equal deleted inserted replaced
4150:fd30caf1a296 4151:29004a3d21a0
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;

mercurial