- Fix awful bug in ft listenestablish.
- struct aim_userinfo_s becomes aim_userinfo_t.
- I haven't decided what to do with this. I like it in its current
form to an extent, but it is also not flexible enough. But it would
become too complex and cumbersome if I were to do it more flexibly.
- Also added a few accessor functions that should be used instead of
directly accessing the struct, particularly for the capabilities.
No release numbers
------------------
+ - Wed Oct 3 11:07:22 PDT 2001
+ - Fix awful bug in ft listenestablish.
+ - struct aim_userinfo_s becomes aim_userinfo_t.
+ - I haven't decided what to do with this. I like it in its current
+ form to an extent, but it is also not flexible enough. But it would
+ become too complex and cumbersome if I were to do it more flexibly.
+ - Also added a few accessor functions that should be used instead of
+ directly accessing the struct, particularly for the capabilities.
+
- Wed Sep 19 18:50:34 PDT 2001
- Remove non-standard default features from aim_send_im_ext.
- Sadly, AOL 5.0 ignores messages with non-standard features. Once
/*
* AIM User Info, Standard Form.
*/
-struct aim_userinfo_s {
+typedef struct {
char sn[MAXSNLEN+1];
fu16_t warnlevel;
fu16_t idletime;
fu16_t flags;
fu32_t membersince;
fu32_t onlinesince;
- fu32_t sessionlen;
+ fu32_t sessionlen;
+ int capspresent;
fu16_t capabilities;
struct {
fu16_t status;
fu32_t ipaddr;
fu8_t crap[0x25]; /* until we figure it out... */
} icqinfo;
-};
+} aim_userinfo_t;
+
+faim_export const char *aim_userinfo_sn(aim_userinfo_t *ui);
+faim_export fu16_t aim_userinfo_flags(aim_userinfo_t *ui);
+faim_export fu16_t aim_userinfo_idle(aim_userinfo_t *ui);
+faim_export float aim_userinfo_warnlevel(aim_userinfo_t *ui);
+faim_export time_t aim_userinfo_membersince(aim_userinfo_t *ui);
+faim_export time_t aim_userinfo_onlinesince(aim_userinfo_t *ui);
+faim_export fu32_t aim_userinfo_sessionlen(aim_userinfo_t *ui);
+faim_export int aim_userinfo_hascap(aim_userinfo_t *ui, fu16_t cap);
#define AIM_FLAG_UNCONFIRMED 0x0001 /* "damned transients" */
#define AIM_FLAG_ADMINISTRATOR 0x0002
faim_internal int aim_addtlvtochain_raw(aim_tlvlist_t **list, const fu16_t t, const fu16_t l, const fu8_t *v);
faim_internal int aim_addtlvtochain_caps(aim_tlvlist_t **list, const fu16_t t, const fu16_t caps);
faim_internal int aim_addtlvtochain_noval(aim_tlvlist_t **list, const fu16_t type);
-faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, struct aim_userinfo_s *ui);
+faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, aim_userinfo_t *ui);
faim_internal int aim_addtlvtochain_frozentlvlist(aim_tlvlist_t **list, fu16_t type, aim_tlvlist_t **tl);
faim_internal int aim_counttlvchain(aim_tlvlist_t **list);
faim_internal int aim_sizetlvchain(aim_tlvlist_t **list);
faim_export aim_conn_t *aim_accepttransfer(aim_session_t *sess, aim_conn_t *conn, const char *sn, const fu8_t *cookie, const fu8_t *ip, fu16_t listingfiles, fu16_t listingtotsize, fu16_t listingsize, fu32_t listingchecksum, fu16_t rendid);
faim_export int aim_getinfo(aim_session_t *, aim_conn_t *, const char *, unsigned short);
-faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *info);
+faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *info);
faim_export int aim_sendbuddyoffgoing(aim_session_t *sess, aim_conn_t *conn, const char *sn);
#define AIM_IMPARAM_FLAG_CHANMSGS_ALLOWED 0x00000001
faim_internal int aim_msgcookie_gettype(int reqclass);
faim_internal int aim_cookie_free(aim_session_t *sess, aim_msgcookie_t *cookie);
-faim_internal int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, struct aim_userinfo_s *);
-faim_internal int aim_putuserinfo(aim_bstream_t *bs, struct aim_userinfo_s *info);
+faim_internal int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, aim_userinfo_t *);
+faim_internal int aim_putuserinfo(aim_bstream_t *bs, aim_userinfo_t *info);
faim_internal int aim_chat_readroominfo(aim_bstream_t *bs, struct aim_chat_roominfo *outinfo);
*/
static int buddychange(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
- struct aim_userinfo_s userinfo;
+ aim_userinfo_t userinfo;
aim_rxcallback_t userfunc;
aim_extractuserinfo(sess, bs, &userinfo);
*/
static int infoupdate(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
- struct aim_userinfo_s *userinfo = NULL;
+ aim_userinfo_t *userinfo = NULL;
aim_rxcallback_t userfunc;
int ret = 0;
int usercount = 0;
tmptlv = aim_gettlv(tlvlist, 0x0073, 1);
/* Allocate enough userinfo structs for all occupants */
- userinfo = calloc(usercount, sizeof(struct aim_userinfo_s));
+ userinfo = calloc(usercount, sizeof(aim_userinfo_t));
aim_bstream_init(&occbs, tmptlv->value, tmptlv->length);
static int userlistchange(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
- struct aim_userinfo_s *userinfo = NULL;
+ aim_userinfo_t *userinfo = NULL;
aim_rxcallback_t userfunc;
int curcount = 0, ret = 0;
while (aim_bstream_empty(bs)) {
curcount++;
- userinfo = realloc(userinfo, curcount * sizeof(struct aim_userinfo_s));
+ userinfo = realloc(userinfo, curcount * sizeof(aim_userinfo_t));
aim_extractuserinfo(sess, bs, &userinfo[curcount-1]);
}
*/
static int incomingmsg(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
- struct aim_userinfo_s userinfo;
+ aim_userinfo_t userinfo;
aim_rxcallback_t userfunc;
int ret = 0;
fu8_t *cookie;
char *msg = NULL;
aim_msgcookie_t *ck;
- memset(&userinfo, 0, sizeof(struct aim_userinfo_s));
+ memset(&userinfo, 0, sizeof(aim_userinfo_t));
/*
* ICBM Cookie. Uncache it.
return -1;
}
- if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on) != 0)) {
+ if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0) {
perror("setsockopt(listenfd)");
close(listenfd);
return -1;
* 0101 000b 0000 0000 3c2f 4854 4d4c 3e another ASCII part
*
*/
-static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, struct aim_userinfo_s *userinfo, aim_bstream_t *bs, fu8_t *cookie)
+static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, aim_userinfo_t *userinfo, aim_bstream_t *bs, fu8_t *cookie)
{
fu16_t type, length;
aim_rxcallback_t userfunc;
return ret;
}
-static int incomingim_ch2_buddylist(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_buddylist(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
{
aim_rxcallback_t userfunc;
int ret = 0;
return ret;
}
-static int incomingim_ch2_buddyicon(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_buddyicon(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
{
aim_rxcallback_t userfunc;
int ret = 0;
return ret;
}
-static int incomingim_ch2_voice(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_voice(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
{
aim_msgcookie_t *cachedcook;
int ret = 0;
return ret;
}
-static int incomingim_ch2_chat(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_chat(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
{
aim_tlv_t *miscinfo;
aim_bstream_t tbs;
return ret;
}
-static int incomingim_ch2_getfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_getfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
{
char ip[30];
aim_msgcookie_t *cachedcook;
return ret;
}
-static int incomingim_ch2_sendfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_sendfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
{
#if 0
char ip[30];
return 0;
}
-static int incomingim_ch2_imimage(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_imimage(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
{
aim_rxcallback_t userfunc;
int ret = 0;
}
/* XXX Ugh. I think its obvious. */
-static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, struct aim_userinfo_s *userinfo, aim_tlvlist_t *tlvlist, fu8_t *cookie)
+static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, aim_userinfo_t *userinfo, aim_tlvlist_t *tlvlist, fu8_t *cookie)
{
aim_tlv_t *block1;
aim_tlvlist_t *list2;
int i, ret = 0;
fu8_t cookie[8];
fu16_t channel;
- struct aim_userinfo_s userinfo;
+ aim_userinfo_t userinfo;
- memset(&userinfo, 0x00, sizeof(struct aim_userinfo_s));
+ memset(&userinfo, 0x00, sizeof(aim_userinfo_t));
/*
* Read ICBM Cookie. And throw away.
int ret = 0;
aim_rxcallback_t userfunc;
fu16_t channel, nummissed, reason;
- struct aim_userinfo_s userinfo;
+ aim_userinfo_t userinfo;
while (aim_bstream_empty(bs)) {
return 0;
}
+faim_export const char *aim_userinfo_sn(aim_userinfo_t *ui)
+{
+
+ if (!ui)
+ return NULL;
+
+ return ui->sn;
+}
+
+faim_export fu16_t aim_userinfo_flags(aim_userinfo_t *ui)
+{
+
+ if (!ui)
+ return 0;
+
+ return ui->flags;
+}
+
+faim_export fu16_t aim_userinfo_idle(aim_userinfo_t *ui)
+{
+
+ if (!ui)
+ return 0;
+
+ return ui->idletime;
+}
+
+faim_export float aim_userinfo_warnlevel(aim_userinfo_t *ui)
+{
+
+ if (!ui)
+ return 0.00;
+
+ return (ui->warnlevel / 10);
+}
+
+faim_export time_t aim_userinfo_membersince(aim_userinfo_t *ui)
+{
+
+ if (!ui)
+ return 0;
+
+ return (time_t)ui->membersince;
+}
+
+faim_export time_t aim_userinfo_onlinesince(aim_userinfo_t *ui)
+{
+
+ if (!ui)
+ return 0;
+
+ return (time_t)ui->onlinesince;
+}
+
+faim_export fu32_t aim_userinfo_sessionlen(aim_userinfo_t *ui)
+{
+
+ if (!ui)
+ return 0;
+
+ return ui->sessionlen;
+}
+
+faim_export int aim_userinfo_hascap(aim_userinfo_t *ui, fu16_t cap)
+{
+
+ if (!ui || !ui->capspresent)
+ return -1;
+
+ return !!(ui->capabilities & cap);
+}
+
+
/*
* Capability blocks.
*/
* AIM is fairly regular about providing user info. This is a generic
* routine to extract it in its standard form.
*/
-faim_internal int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, struct aim_userinfo_s *outinfo)
+faim_internal int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, aim_userinfo_t *outinfo)
{
int curtlv, tlvcnt;
fu8_t snlen;
return -EINVAL;
/* Clear out old data first */
- memset(outinfo, 0x00, sizeof(struct aim_userinfo_s));
+ memset(outinfo, 0x00, sizeof(aim_userinfo_t));
/*
* Screen name. Stored as an unterminated string prepended with a
*
*/
outinfo->capabilities = aim_getcap(sess, bs, length);
+ outinfo->capspresent = 1;
} else if (type == 0x000e) {
/*
/*
* Inverse of aim_extractuserinfo()
*/
-faim_internal int aim_putuserinfo(aim_bstream_t *bs, struct aim_userinfo_s *info)
+faim_internal int aim_putuserinfo(aim_bstream_t *bs, aim_userinfo_t *info)
{
aim_tlvlist_t *tlvlist = NULL;
return 0;
}
-faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *info)
+faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *info)
{
aim_frame_t *fr;
aim_snacid_t snacid;
static int userinfo(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
- struct aim_userinfo_s userinfo;
+ aim_userinfo_t userinfo;
char *text_encoding = NULL, *text = NULL;
aim_rxcallback_t userfunc;
aim_tlvlist_t *tlvlist;
{
aim_rxcallback_t userfunc;
fu16_t newevil;
- struct aim_userinfo_s userinfo;
+ aim_userinfo_t userinfo;
- memset(&userinfo, 0, sizeof(struct aim_userinfo_s));
+ memset(&userinfo, 0, sizeof(aim_userinfo_t));
newevil = aimbs_get16(bs);
fu8_t buf[16*16]; /* icky fixed length buffer */
aim_bstream_t bs;
+ if (!caps)
+ return 0; /* nothing there anyway */
+
aim_bstream_init(&bs, buf, sizeof(buf));
aim_putcap(&bs, caps);
return aim_addtlvtochain_raw(list, t, aim_bstream_curpos(&bs), buf);
}
-faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, struct aim_userinfo_s *ui)
+faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, aim_userinfo_t *ui)
{
fu8_t buf[1024]; /* bleh */
aim_bstream_t bs;
static int faimtest_chat_join(aim_session_t *sess, aim_frame_t *fr, ...)
{
va_list ap;
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
int count, i;
va_start(ap, fr);
count = va_arg(ap, int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
va_end(ap);
dvprintf("faimtest: chat: %s: New occupants have joined:\n", (char *)fr->conn->priv);
static int faimtest_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...)
{
va_list ap;
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
int count , i;
va_start(ap, fr);
count = va_arg(ap, int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
va_end(ap);
dvprintf("faimtest: chat: %s: Some occupants have left:\n", (char *)fr->conn->priv);
static int faimtest_chat_infoupdate(aim_session_t *sess, aim_frame_t *fr, ...)
{
va_list ap;
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
struct aim_chat_roominfo *roominfo;
char *roomname;
int usercount, i;
roominfo = va_arg(ap, struct aim_chat_roominfo *);
roomname = va_arg(ap, char *);
usercount = va_arg(ap, int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
roomdesc = va_arg(ap, char *);
unknown_c9 = (fu16_t)va_arg(ap, unsigned int);
creationtime = va_arg(ap, fu32_t);
static int faimtest_chat_incomingmsg(aim_session_t *sess, aim_frame_t *fr, ...)
{
va_list ap;
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
char *msg;
char tmpbuf[1152];
va_start(ap, fr);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
msg = va_arg(ap, char *);
va_end(ap);
static int faimtest_parse_userinfo(aim_session_t *sess, aim_frame_t *fr, ...)
{
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
char *prof_encoding = NULL;
char *prof = NULL;
fu16_t inforeq = 0;
va_list ap;
va_start(ap, fr);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
prof_encoding = va_arg(ap, char *);
prof = va_arg(ap, char *);
inforeq = (fu16_t)va_arg(ap, unsigned int);
va_end(ap);
dvprintf("faimtest: userinfo: sn: %s\n", userinfo->sn);
- dvprintf("faimtest: userinfo: warnlevel: 0x%04x\n", userinfo->warnlevel);
+ dvprintf("faimtest: userinfo: warnlevel: %f\n", aim_userinfo_warnlevel(userinfo));
dvprintf("faimtest: userinfo: flags: 0x%04x = ", userinfo->flags);
printuserflags(userinfo->flags);
dinlineprintf("\n");
return 1;
}
-static int faimtest_handlecmd(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, const char *tmpstr)
+static int faimtest_handlecmd(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, const char *tmpstr)
{
struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
/*
* Channel 1: Standard Message
*/
-static int faimtest_parse_incoming_im_chan1(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch1_args *args)
+static int faimtest_parse_incoming_im_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args)
{
struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
char *tmpstr;
dvprintf("faimtest: icbm: sn = \"%s\"\n", userinfo->sn);
dvprintf("faimtest: icbm: probable client type: %d\n", clienttype);
- dvprintf("faimtest: icbm: warnlevel = 0x%04x\n", userinfo->warnlevel);
+ dvprintf("faimtest: icbm: warnlevel = %f\n", aim_userinfo_warnlevel(userinfo));
dvprintf("faimtest: icbm: flags = 0x%04x = ", userinfo->flags);
printuserflags(userinfo->flags);
dinlineprintf("\n");
dvprintf("faimtest: icbm: membersince = %lu\n", userinfo->membersince);
dvprintf("faimtest: icbm: onlinesince = %lu\n", userinfo->onlinesince);
dvprintf("faimtest: icbm: idletime = 0x%04x\n", userinfo->idletime);
- dvprintf("faimtest: icbm: capabilities = 0x%04x\n", userinfo->capabilities);
+ dvprintf("faimtest: icbm: capabilities = %s = 0x%04x\n", userinfo->capspresent ? "present" : "not present", userinfo->capabilities);
dprintf("faimtest: icbm: icbmflags = ");
if (args->icbmflags & AIM_IMFLAGS_AWAY)
/*
* Channel 2: Rendevous Request
*/
-static int faimtest_parse_incoming_im_chan2(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
+static int faimtest_parse_incoming_im_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args)
{
if (args->reqclass == AIM_CAPS_VOICE) {
dvprintf("faimtest: voice invitation: source sn = %s\n", userinfo->sn);
- dvprintf("faimtest: voice invitation: \twarnlevel = 0x%04x\n", userinfo->warnlevel);
+ dvprintf("faimtest: voice invitation: \twarnlevel = %f\n", aim_userinfo_warnlevel(userinfo));
dvprintf("faimtest: voice invitation: \tclass = 0x%04x = ", userinfo->flags);
printuserflags(userinfo->flags);
dinlineprintf("\n");
} else if (args->reqclass == AIM_CAPS_CHAT) {
dvprintf("faimtest: chat invitation: source sn = %s\n", userinfo->sn);
- dvprintf("faimtest: chat invitation: \twarnlevel = 0x%04x\n", userinfo->warnlevel);
+ dvprintf("faimtest: chat invitation: \twarnlevel = %f\n", aim_userinfo_warnlevel(userinfo));
dvprintf("faimtest: chat invitation: \tclass = 0x%04x = ", userinfo->flags);
printuserflags(userinfo->flags);
dinlineprintf("\n");
static int faimtest_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...)
{
fu16_t channel;
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
va_list ap;
int ret = 0;
va_start(ap, fr);
channel = (fu16_t)va_arg(ap, unsigned int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
if (channel == 1) {
struct aim_incomingim_ch1_args *args;
static int faimtest_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...)
{
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
va_list ap;
va_start(ap, fr);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
va_end(ap);
- dvprintf("%ld %s is now online (flags: %04x = %s%s%s%s%s%s%s%s) (caps = 0x%04x)\n",
+ dvprintf("%ld %s is now online (flags: %04x = %s%s%s%s%s%s%s%s) (caps = %s = 0x%04x)\n",
time(NULL),
userinfo->sn, userinfo->flags,
(userinfo->flags&AIM_FLAG_UNCONFIRMED)?" UNCONFIRMED":"",
(userinfo->flags&AIM_FLAG_AWAY)?" AWAY":"",
(userinfo->flags&AIM_FLAG_UNKNOWN40)?" UNKNOWN40":"",
(userinfo->flags&AIM_FLAG_UNKNOWN80)?" UNKNOWN80":"",
+ userinfo->capspresent ? "present" : "not present",
userinfo->capabilities);
return 1;
}
static int faimtest_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...)
{
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
va_list ap;
va_start(ap, fr);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
va_end(ap);
- dvprintf("%ld %s is now offline (flags: %04x = %s%s%s%s%s%s%s%s) (caps = 0x%04x)\n",
+ dvprintf("%ld %s is now offline (flags: %04x = %s%s%s%s%s%s%s%s) (caps = %s = 0x%04x)\n",
time(NULL),
userinfo->sn, userinfo->flags,
(userinfo->flags&AIM_FLAG_UNCONFIRMED)?" UNCONFIRMED":"",
(userinfo->flags&AIM_FLAG_AWAY)?" AWAY":"",
(userinfo->flags&AIM_FLAG_UNKNOWN40)?" UNKNOWN40":"",
(userinfo->flags&AIM_FLAG_UNKNOWN80)?" UNKNOWN80":"",
+ userinfo->capspresent ? "present" : "not present",
userinfo->capabilities);
return 1;
va_list ap;
fu16_t chan, nummissed, reason;
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
va_start(ap, fr);
chan = (fu16_t)va_arg(ap, unsigned int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
nummissed = (fu16_t)va_arg(ap, unsigned int);
reason = (fu16_t)va_arg(ap, unsigned int);
va_end(ap);
{
va_list ap;
fu16_t newevil;
- struct aim_userinfo_s *userinfo;
+ aim_userinfo_t *userinfo;
va_start(ap, fr);
newevil = (fu16_t)va_arg(ap, unsigned int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
+ userinfo = va_arg(ap, aim_userinfo_t *);
va_end(ap);
/*
/* ft.c */
void getfile_start(aim_session_t *sess, aim_conn_t *conn, const char *sn);
-void getfile_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args);
+void getfile_requested(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args);
void directim_start(aim_session_t *sess, aim_conn_t *conn, const char *sn);
-void directim_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args);
+void directim_requested(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args);
/* chat.c */
void chatnav_redirect(aim_session_t *sess, const char *ip, const fu8_t *cookie);
return;
}
-void getfile_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
+void getfile_requested(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args)
{
struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
aim_conn_t *newconn;
return;
}
-void directim_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
+void directim_requested(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args)
{
aim_conn_t *newconn;