- Aha! This is why I could never get icons to work before.
- Luckily the checksum is painfully simple.
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
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 *, ...);
int msglen;
int iconlen;
time_t iconstamp;
+ unsigned short iconsum;
};
struct aim_incomingim_ch1_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 *);
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 */
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).
*
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);
}
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;
/* 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);
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)
{
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);
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")) {