outinfo->idletime = aimutil_get16(&buf[i+4]);
break;
+ /*
+ * Type = 0x0006: ICQ Online Status
+ *
+ * ICQ's Away/DND/etc "enriched" status
+ * Some decoding of values done by Scott <darkagl@pcnet.com>
+ */
+ case 0x0006:
+ outinfo->icqinfo.status = aimutil_get16(buf+i+2+2+2);
+ break;
+
+
+ /*
+ * Type = 0x000a
+ *
+ * ICQ User IP Address.
+ * Ahh, the joy of ICQ security.
+ */
+ case 0x000a:
+ outinfo->icqinfo.ipaddr = aimutil_get32(&buf[i+4]);
+ break;
+
+ /* Type = 0x000c
+ *
+ * random crap containing the IP address,
+ * apparently a port number, and some Other Stuff.
+ *
+ */
+ case 0x000c:
+ memcpy(outinfo->icqinfo.crap, &buf[i+4], 0x25);
+ break;
+
/*
* Type = 0x000d
*
*/
faim_internal int aim_putuserinfo(u_char *buf, int buflen, struct aim_userinfo_s *info)
{
- int i = 0;
+ int i = 0, numtlv = 0;
struct aim_tlvlist_t *tlvlist = NULL;
if (!buf || !info)
i += aimutil_put16(buf+i, info->warnlevel);
- /* XXX: we only put down five */
- i += aimutil_put16(buf+i, 5);
+
aim_addtlvtochain16(&tlvlist, 0x0001, info->flags);
+ numtlv++;
+
aim_addtlvtochain32(&tlvlist, 0x0002, info->membersince);
+ numtlv++;
+
aim_addtlvtochain32(&tlvlist, 0x0003, info->onlinesince);
+ numtlv++;
+
aim_addtlvtochain16(&tlvlist, 0x0004, info->idletime);
- /* XXX: should put caps here */
+ numtlv++;
+
+#if ICQ_OSCAR_SUPPORT
+ if(atoi(info->sn) != 0) {
+ aim_addtlvtochain16(&tlvlist, 0x0006, info->icqinfo.status);
+ aim_addtlvtochain32(&tlvlist, 0x000a, info->icqinfo.ipaddr);
+ }
+#endif
+
+ aim_addtlvtochain_caps(&tlvlist, 0x000d, info->capabilities);
+ numtlv++;
+
aim_addtlvtochain32(&tlvlist, (unsigned short)((info->flags)&AIM_FLAG_AOL?0x0010:0x000f), info->sessionlen);
-
- i += aim_writetlvchain(buf+i, buflen-i, &tlvlist);
+ numtlv++;
+
+ i += aimutil_put16(buf+i, numtlv); /* tlvcount */
+ i += aim_writetlvchain(buf+i, buflen-i, &tlvlist); /* tlvs */
aim_freetlvchain(&tlvlist);
-
+
return i;
}