+
+/*
+ * Inverse of aim_extractuserinfo()
+ */
+faim_internal int aim_putuserinfo(u_char *buf, int buflen, struct aim_userinfo_s *info)
+{
+ int i = 0, numtlv = 0;
+ struct aim_tlvlist_t *tlvlist = NULL;
+
+ if (!buf || !info)
+ return 0;
+
+ i += aimutil_put8(buf+i, strlen(info->sn));
+ i += aimutil_putstr(buf+i, info->sn, strlen(info->sn));
+
+ i += aimutil_put16(buf+i, info->warnlevel);
+
+
+ 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);
+ 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);
+ numtlv++;
+
+ i += aimutil_put16(buf+i, numtlv); /* tlvcount */
+ i += aim_writetlvchain(buf+i, buflen-i, &tlvlist); /* tlvs */
+ aim_freetlvchain(&tlvlist);
+
+ return i;
+}
+
+faim_export int aim_sendbuddyoncoming(struct aim_session_t *sess, struct aim_conn_t *conn, struct aim_userinfo_s *info)
+{
+ struct command_tx_struct *tx;
+ int i = 0;
+
+ if (!sess || !conn || !info)
+ return 0;
+
+ if (!(tx = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 1152)))
+ return -1;
+
+ tx->lock = 1;
+
+ i += aimutil_put16(tx->data+i, 0x0003);
+ i += aimutil_put16(tx->data+i, 0x000b);
+ i += aimutil_put16(tx->data+i, 0x0000);
+ i += aimutil_put16(tx->data+i, 0x0000);
+ i += aimutil_put16(tx->data+i, 0x0000);
+
+ i += aim_putuserinfo(tx->data+i, tx->commandlen-i, info);
+
+ tx->commandlen = i;
+ tx->lock = 0;
+ aim_tx_enqueue(sess, tx);
+
+ return 0;
+}
+
+faim_export int aim_sendbuddyoffgoing(struct aim_session_t *sess, struct aim_conn_t *conn, char *sn)
+{
+ struct command_tx_struct *tx;
+ int i = 0;
+
+ if (!sess || !conn || !sn)
+ return 0;
+
+ if (!(tx = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10+1+strlen(sn))))
+ return -1;
+
+ tx->lock = 1;
+
+ i += aimutil_put16(tx->data+i, 0x0003);
+ i += aimutil_put16(tx->data+i, 0x000c);
+ i += aimutil_put16(tx->data+i, 0x0000);
+ i += aimutil_put16(tx->data+i, 0x0000);
+ i += aimutil_put16(tx->data+i, 0x0000);
+
+ i += aimutil_put8(tx->data+i, strlen(sn));
+ i += aimutil_putstr(tx->data+i, sn, strlen(sn));
+
+ tx->lock = 0;
+ aim_tx_enqueue(sess, tx);
+
+ return 0;
+}
+