]> andersk Git - libfaim.git/commitdiff
- Sat May 26 03:58:27 PDT 2001
authormid <mid>
Sat, 26 May 2001 11:08:17 +0000 (11:08 +0000)
committermid <mid>
Sat, 26 May 2001 11:08:17 +0000 (11:08 +0000)
  - Aha! This is why I could never get icons to work before.
  - Luckily the checksum is painfully simple.

CHANGES
include/aim.h
include/aim_internal.h
src/im.c
utils/faimtest/faimtest.c

diff --git a/CHANGES b/CHANGES
index 322f0835cc05c439fcb5bbfa1d5080b1b95057fb..14bf8c3eb6944516a21542470baadb3a30934bcd 100644 (file)
--- 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
index 1a493240aace2de8aff1f681d7982040350ff783..16217d501699147d1516a4121451b167911f7a68 100644 (file)
@@ -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 *);
index 2ea22641295804b07422ea6edd8e97475ae9661b..8c5314db9a1eac7776342ae5dba1e4e13b3b74b3 100644 (file)
@@ -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 */
index 10b849bac62b8fd553b8bc5e203af248bf59569f..d44e46efefceef04d429a13a4a245fb122b40daa 100644 (file)
--- 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);
index e246c8baa2f1903511e6c66ffeb934811e9eeb3c..a121fb1e6d4550c30ca9e91060104b5cc54cef4f 100644 (file)
@@ -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")) {
 
This page took 0.056325 seconds and 5 git commands to generate.