From 50038c743397ba3020dcc7611292764fdd9d6ae9 Mon Sep 17 00:00:00 2001 From: mid Date: Sat, 26 May 2001 11:08:17 +0000 Subject: [PATCH] - Sat May 26 03:58:27 PDT 2001 - Aha! This is why I could never get icons to work before. - Luckily the checksum is painfully simple. --- CHANGES | 4 ++++ include/aim.h | 8 +++++--- include/aim_internal.h | 2 ++ src/im.c | 22 +++++++++++++++++++--- utils/faimtest/faimtest.c | 8 ++++++-- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 322f083..14bf8c3 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ No release numbers ------------------ + - Sat May 26 03:58:27 PDT 2001 + - Aha! This is why I could never get icons to work before. + - Luckily the checksum is painfully simple. + - Sat May 26 01:37:39 PDT 2001 - So this is my big merge with the ActiveBuddy version... - Remove use of tlvchains from IM parsing for better performance diff --git a/include/aim.h b/include/aim.h index 1a49324..16217d5 100644 --- a/include/aim.h +++ b/include/aim.h @@ -475,10 +475,10 @@ faim_export unsigned long aim_debugconn_sendconnect(struct aim_session_t *sess, faim_export int aim_logoff(struct aim_session_t *); -#ifndef FAIM_INTERNAL +#if !defined(FAIM_INTERNAL) || defined(FAIM_INTERNAL_INSANE) /* the library should never call aim_conn_kill */ faim_export void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn); -#endif /* ndef FAIM_INTERNAL */ +#endif typedef int (*aim_rxcallback_t)(struct aim_session_t *, struct command_rx_struct *, ...); @@ -659,6 +659,7 @@ struct aim_sendimext_args { int msglen; int iconlen; time_t iconstamp; + unsigned short iconsum; }; struct aim_incomingim_ch1_args { @@ -701,7 +702,8 @@ struct aim_incomingim_ch2_args { faim_export unsigned long aim_send_im_ext(struct aim_session_t *sess, struct aim_conn_t *conn, struct aim_sendimext_args *args); faim_export unsigned long aim_send_im(struct aim_session_t *, struct aim_conn_t *, const char *destsn, unsigned short flags, const char *msg); -faim_export int aim_send_icon(struct aim_session_t *sess, struct aim_conn_t *conn, const char *sn, const unsigned char *icon, int iconlen, time_t stamp); +faim_export int aim_send_icon(struct aim_session_t *sess, struct aim_conn_t *conn, const char *sn, const unsigned char *icon, int iconlen, time_t stamp, unsigned short iconsum); +faim_export unsigned short aim_iconsum(const unsigned char *buf, int buflen); faim_export int aim_send_im_direct(struct aim_session_t *, struct aim_conn_t *, char *); faim_export struct aim_conn_t * aim_directim_initiate(struct aim_session_t *, struct aim_conn_t *, struct aim_directim_priv *, char *destsn); faim_export struct aim_conn_t *aim_directim_connect(struct aim_session_t *, struct aim_conn_t *, struct aim_directim_priv *); diff --git a/include/aim_internal.h b/include/aim_internal.h index 2ea2264..8c5314d 100644 --- a/include/aim_internal.h +++ b/include/aim_internal.h @@ -126,10 +126,12 @@ faim_internal int aim_chat_readroominfo(u_char *buf, struct aim_chat_roominfo *o faim_internal void faimdprintf(struct aim_session_t *sess, int dlevel, const char *format, ...); +#ifndef FAIM_INTERNAL_INSANE /* why the hell wont cpp let you use #error inside #define's? */ /* isn't it single-pass? so the #error would get passed to the compiler --jbm */ #define printf() printf called inside libfaim #define sprintf() unbounded sprintf used inside libfaim +#endif #endif /* __AIM_INTERNAL_H__ */ #endif /* FAIM_INTERNAL */ diff --git a/src/im.c b/src/im.c index 10b849b..d44e46e 100644 --- a/src/im.c +++ b/src/im.c @@ -65,6 +65,20 @@ faim_export unsigned short aim_fingerprintclient(unsigned char *msghdr, int len) return AIM_CLIENTTYPE_UNKNOWN; } +/* This should be endian-safe now... but who knows... */ +faim_export unsigned short aim_iconsum(const unsigned char *buf, int buflen) +{ + unsigned long sum; + int i; + + for (i = 0, sum = 0; i < buflen; i += 2) + sum += (buf[i+1] << 8) + buf[i]; + + sum = ((sum & 0xffff0000) >> 16) + (sum & 0x0000ffff); + + return sum & 0xffff; +} + /* * Send an ICBM (instant message). * @@ -224,7 +238,8 @@ faim_export unsigned long aim_send_im_ext(struct aim_session_t *sess, struct aim curbyte += aimutil_put16(newpacket->data+curbyte, 0x0008); curbyte += aimutil_put16(newpacket->data+curbyte, 0x000c); curbyte += aimutil_put32(newpacket->data+curbyte, args->iconlen); - curbyte += aimutil_put32(newpacket->data+curbyte, 0x00000001); + curbyte += aimutil_put16(newpacket->data+curbyte, 0x0001); + curbyte += aimutil_put16(newpacket->data+curbyte, args->iconsum); curbyte += aimutil_put32(newpacket->data+curbyte, args->iconstamp); } @@ -263,7 +278,7 @@ faim_export unsigned long aim_send_im(struct aim_session_t *sess, struct aim_con return aim_send_im_ext(sess, conn, &args); } -faim_export int aim_send_icon(struct aim_session_t *sess, struct aim_conn_t *conn, const char *sn, const unsigned char *icon, int iconlen, time_t stamp) +faim_export int aim_send_icon(struct aim_session_t *sess, struct aim_conn_t *conn, const char *sn, const unsigned char *icon, int iconlen, time_t stamp, unsigned short iconsum) { struct command_tx_struct *np; int i,curbyte = 0; @@ -327,7 +342,8 @@ faim_export int aim_send_icon(struct aim_session_t *sess, struct aim_conn_t *con /* TLV t(2711) */ curbyte += aimutil_put16(np->data+curbyte, 0x2711); curbyte += aimutil_put16(np->data+curbyte, 4+4+4+iconlen+strlen(AIM_ICONIDENT)); - curbyte += aimutil_put32(np->data+curbyte, 0x00000000/*0x0000d92c*/); + curbyte += aimutil_put16(np->data+curbyte, 0x0000); + curbyte += aimutil_put16(np->data+curbyte, iconsum); curbyte += aimutil_put32(np->data+curbyte, iconlen); curbyte += aimutil_put32(np->data+curbyte, stamp); memcpy(np->data+curbyte, icon, iconlen); diff --git a/utils/faimtest/faimtest.c b/utils/faimtest/faimtest.c index e246c8b..a121fb1 100644 --- a/utils/faimtest/faimtest.c +++ b/utils/faimtest/faimtest.c @@ -164,6 +164,7 @@ static char *listingpath; static unsigned char *buddyicon = NULL; static int buddyiconlen = 0; static time_t buddyiconstamp = 0; +static unsigned short buddyiconsum = 0; static void faimtest_debugcb(struct aim_session_t *sess, int level, const char *format, va_list va) { @@ -408,7 +409,9 @@ int main(int argc, char **argv) buddyicon = malloc(buddyiconlen); fread(buddyicon, 1, st.st_size, f); - dvprintf("read %d bytes of %s for buddy icon\n", buddyiconlen, buddyiconpath); + buddyiconsum = aim_iconsum(buddyicon, buddyiconlen); + + dvprintf("read %d bytes of %s for buddy icon (sum 0x%08x)\n", buddyiconlen, buddyiconpath, buddyiconsum); fclose(f); @@ -1214,12 +1217,13 @@ static int faimtest_handlecmd(struct aim_session_t *sess, struct command_rx_stru args.msglen = strlen(iconmsg); args.iconlen = buddyiconlen; args.iconstamp = buddyiconstamp; + args.iconsum = buddyiconsum; aim_send_im_ext(sess, command->conn, &args); } else if (strstr(tmpstr, "sendicon") && buddyicon) { - aim_send_icon(sess, command->conn, userinfo->sn, buddyicon, buddyiconlen, buddyiconstamp); + aim_send_icon(sess, command->conn, userinfo->sn, buddyicon, buddyiconlen, buddyiconstamp, buddyiconsum); } else if (strstr(tmpstr, "warnme")) { -- 2.45.1