# HG changeset patch # User Marcus Lundblad # Date 1252352019 0 # Node ID b6cc239e256424110f27efab75a7314b1c1514db # Parent f200f76289626e385767ca2c347bc0fb99807823# Parent 3b820f5d7d6a5c7b4f5b5d4840626c9deeb335cb merge of '4bf270f4acb1ba37f3a3aa264be813d4b16878ed' and '97e003ed2bc2bafbb993693c9ae9c6d667731cc1' diff -r f200f7628962 -r b6cc239e2564 libpurple/protocols/oscar/family_auth.c --- a/libpurple/protocols/oscar/family_auth.c Mon Sep 07 19:33:37 2009 +0000 +++ b/libpurple/protocols/oscar/family_auth.c Mon Sep 07 19:33:39 2009 +0000 @@ -277,7 +277,7 @@ * If set, old-fashioned buddy lists will not work. You will need * to use SSI. */ - aim_tlvlist_add_8(&tlvlist, 0x004a, (allow_multiple_logins ? 0x01 : 0x02)); + aim_tlvlist_add_8(&tlvlist, 0x004a, (allow_multiple_logins ? 0x01 : 0x03)); aim_tlvlist_write(&frame->data, &tlvlist); diff -r f200f7628962 -r b6cc239e2564 libpurple/protocols/oscar/family_icbm.c --- a/libpurple/protocols/oscar/family_icbm.c Mon Sep 07 19:33:37 2009 +0000 +++ b/libpurple/protocols/oscar/family_icbm.c Mon Sep 07 19:33:39 2009 +0000 @@ -1466,7 +1466,7 @@ /* Should this be ASCII -> UNICODE -> Custom */ static const guint16 charsetpri[] = { AIM_CHARSET_ASCII, /* ASCII first */ - AIM_CHARSET_CUSTOM, /* then ISO-8859-1 */ + AIM_CHARSET_LATIN_1, /* then ISO-8859-1 */ AIM_CHARSET_UNICODE, /* UNICODE as last resort */ }; static const int charsetpricount = 3; @@ -2714,7 +2714,7 @@ * and Purple 0.60 and newer. * */ -int aim_im_sendmtn(OscarData *od, guint16 type1, const char *bn, guint16 type2) +int aim_im_sendmtn(OscarData *od, guint16 channel, const char *bn, guint16 event) { FlapConnection *conn; ByteStream bs; @@ -2730,19 +2730,14 @@ snacid = aim_cachesnac(od, SNAC_FAMILY_ICBM, 0x0014, 0x0000, NULL, 0); - /* - * 8 days of light - * Er, that is to say, 8 bytes of 0's - */ - byte_stream_put16(&bs, 0x0000); - byte_stream_put16(&bs, 0x0000); - byte_stream_put16(&bs, 0x0000); - byte_stream_put16(&bs, 0x0000); + /* ICBM cookie */ + byte_stream_put32(&bs, 0x00000000); + byte_stream_put32(&bs, 0x00000000); /* - * Type 1 (should be 0x0001 for mtn) + * Channel (should be 0x0001 for mtn) */ - byte_stream_put16(&bs, type1); + byte_stream_put16(&bs, channel); /* * Dest buddy name @@ -2751,9 +2746,9 @@ byte_stream_putstr(&bs, bn); /* - * Type 2 (should be 0x0000, 0x0001, or 0x0002 for mtn) + * Event (should be 0x0000, 0x0001, or 0x0002 for mtn) */ - byte_stream_put16(&bs, type2); + byte_stream_put16(&bs, event); flap_connection_send_snac(od, conn, SNAC_FAMILY_ICBM, 0x0014, 0x0000, snacid, &bs); @@ -2775,16 +2770,16 @@ aim_rxcallback_t userfunc; char *bn; guint8 bnlen; - guint16 type1, type2; - - byte_stream_advance(bs, 8); /* Unknown - All 0's */ - type1 = byte_stream_get16(bs); + guint16 channel, event; + + byte_stream_advance(bs, 8); /* ICBM cookie */ + channel = byte_stream_get16(bs); bnlen = byte_stream_get8(bs); bn = byte_stream_getstr(bs, bnlen); - type2 = byte_stream_get16(bs); + event = byte_stream_get16(bs); if ((userfunc = aim_callhandler(od, snac->family, snac->subtype))) - ret = userfunc(od, conn, frame, type1, bn, type2); + ret = userfunc(od, conn, frame, channel, bn, event); g_free(bn); diff -r f200f7628962 -r b6cc239e2564 libpurple/protocols/oscar/family_locate.c --- a/libpurple/protocols/oscar/family_locate.c Mon Sep 07 19:33:37 2009 +0000 +++ b/libpurple/protocols/oscar/family_locate.c Mon Sep 07 19:33:39 2009 +0000 @@ -676,6 +676,13 @@ outinfo->sessionlen = byte_stream_get32(bs); outinfo->present |= AIM_USERINFO_PRESENT_SESSIONLEN; + } else if (type == 0x0014) { + /* + * My instance number. + */ + guint8 instance_number; + instance_number = byte_stream_get8(bs); + } else if (type == 0x0019) { /* * OSCAR short capability information. A shortened @@ -797,10 +804,32 @@ } else if (type == 0x001f) { /* + * Upper bytes of user flags. Can be any size + * * Seen on a buddy using DeadAIM. Data was 4 bytes: * 0x00 00 00 10 */ + } else if (type == 0x0023) { + /* + * Last Buddy Feed update time, in seconds since the epoch. + */ + + } else if (type == 0x0026) { + /* + * Time that the profile was set, in seconds since the epoch. + */ + + } else if (type == 0x0027) { + /* + * Time that the away message was set, in seconds since the epoch. + */ + + } else if (type == 0x002a) { + /* + * Country code based on GeoIP data. + */ + } else { /* diff -r f200f7628962 -r b6cc239e2564 libpurple/protocols/oscar/oscar.c --- a/libpurple/protocols/oscar/oscar.c Mon Sep 07 19:33:37 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.c Mon Sep 07 19:33:39 2009 +0000 @@ -241,7 +241,7 @@ { if ((unsigned char)utf8[i] > 0x7f) { /* not ASCII! */ - charset = AIM_CHARSET_CUSTOM; + charset = AIM_CHARSET_LATIN_1; break; } i++; @@ -428,7 +428,7 @@ if (charset == AIM_CHARSET_UNICODE) { charsetstr1 = "UTF-16BE"; charsetstr2 = "UTF-8"; - } else if (charset == AIM_CHARSET_CUSTOM) { + } else if (charset == AIM_CHARSET_LATIN_1) { if ((sourcebn != NULL) && oscar_util_valid_name_icq(sourcebn)) charsetstr1 = purple_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); else @@ -539,7 +539,7 @@ */ *msg = g_convert(from, -1, charsetstr, "UTF-8", NULL, &msglen, &err); if (*msg != NULL) { - *charset = AIM_CHARSET_CUSTOM; + *charset = AIM_CHARSET_LATIN_1; *charsubset = 0x0000; *msglen_int = msglen; return; @@ -829,19 +829,25 @@ the "message" attribute of the status contains only the plaintext message. */ if (userinfo) { - if ((userinfo->flags & AIM_FLAG_AWAY)) { - /* Away message? */ - if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { - tmp = oscar_encoding_extract(userinfo->away_encoding); - message = oscar_encoding_to_utf8(account, tmp, userinfo->away, - userinfo->away_len); - g_free(tmp); - } + if ((userinfo->flags & AIM_FLAG_AWAY) + && userinfo->away_len > 0 + && userinfo->away != NULL + && userinfo->away_encoding != NULL) + { + /* Away message */ + tmp = oscar_encoding_extract(userinfo->away_encoding); + message = oscar_encoding_to_utf8(account, + tmp, userinfo->away, userinfo->away_len); + g_free(tmp); } else { - /* Available message? */ + /* + * Available message or non-HTML away message (because that's + * all we have right now. + */ if ((userinfo->status != NULL) && userinfo->status[0] != '\0') { - message = oscar_encoding_to_utf8(account, userinfo->status_encoding, - userinfo->status, userinfo->status_len); + message = oscar_encoding_to_utf8(account, + userinfo->status_encoding, userinfo->status, + userinfo->status_len); } #if defined (_WIN32) || defined (__APPLE__) if (userinfo->itmsurl && (userinfo->itmsurl[0] != '\0')) @@ -2801,7 +2807,7 @@ gchar *reason = NULL; if (msg2[5] != NULL) - reason = purple_plugin_oscar_decode_im_part(account, bn, AIM_CHARSET_CUSTOM, 0x0000, msg2[5], strlen(msg2[5])); + reason = purple_plugin_oscar_decode_im_part(account, bn, AIM_CHARSET_LATIN_1, 0x0000, msg2[5], strlen(msg2[5])); purple_debug_info("oscar", "Received an authorization request from UIN %u\n", @@ -3230,16 +3236,16 @@ static int purple_parse_mtn(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { PurpleConnection *gc = od->gc; va_list ap; - guint16 type1, type2; + guint16 channel, event; char *bn; va_start(ap, fr); - type1 = (guint16) va_arg(ap, unsigned int); + channel = (guint16) va_arg(ap, unsigned int); bn = va_arg(ap, char *); - type2 = (guint16) va_arg(ap, unsigned int); + event = (guint16) va_arg(ap, unsigned int); va_end(ap); - switch (type2) { + switch (event) { case 0x0000: { /* Text has been cleared */ serv_got_typing_stopped(gc, bn); } break; @@ -3252,12 +3258,14 @@ serv_got_typing(gc, bn, 0, PURPLE_TYPING); } break; + case 0x000f: { /* Closed IM window */ + serv_got_typing_stopped(gc, bn); + } break; + default: { - /* - * It looks like iChat sometimes sends typing notification - * with type1=0x0001 and type2=0x000f. Not sure why. - */ - purple_debug_info("oscar", "Received unknown typing notification message from %s. Type1 is 0x%04x and type2 is 0x%04hx.\n", bn, type1, type2); + purple_debug_info("oscar", "Received unknown typing " + "notification message from %s. Channel is 0x%04x " + "and event is 0x%04hx.\n", bn, channel, event); } break; } @@ -4687,7 +4695,7 @@ if (charset == AIM_CHARSET_UNICODE) { encoded = g_convert(str, -1, "UTF-16BE", "UTF-8", NULL, ret_len, NULL); *encoding = "unicode-2-0"; - } else if (charset == AIM_CHARSET_CUSTOM) { + } else if (charset == AIM_CHARSET_LATIN_1) { encoded = g_convert(str, -1, "ISO-8859-1", "UTF-8", NULL, ret_len, NULL); *encoding = "iso-8859-1"; } else { @@ -5590,7 +5598,7 @@ buddy = purple_find_buddy(account, bn); if (msg != NULL) - reason = purple_plugin_oscar_decode_im_part(account, bn, AIM_CHARSET_CUSTOM, 0x0000, msg, strlen(msg)); + reason = purple_plugin_oscar_decode_im_part(account, bn, AIM_CHARSET_LATIN_1, 0x0000, msg, strlen(msg)); data = g_new(struct name_data, 1); data->gc = gc; @@ -5827,7 +5835,7 @@ charsetstr = "us-ascii"; else if (charset == AIM_CHARSET_UNICODE) charsetstr = "unicode-2-0"; - else if (charset == AIM_CHARSET_CUSTOM) + else if (charset == AIM_CHARSET_LATIN_1) charsetstr = "iso-8859-1"; aim_chat_send_im(od, c->conn, 0, buf2, len, charsetstr, "en"); g_free(buf2); diff -r f200f7628962 -r b6cc239e2564 libpurple/protocols/oscar/oscar.h --- a/libpurple/protocols/oscar/oscar.h Mon Sep 07 19:33:37 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.h Mon Sep 07 19:33:39 2009 +0000 @@ -808,9 +808,9 @@ #define AIM_IMFLAGS_OFFLINE 0x0800 /* send to offline user */ #define AIM_IMFLAGS_TYPINGNOT 0x1000 /* typing notification */ -#define AIM_CHARSET_ASCII 0x0000 -#define AIM_CHARSET_UNICODE 0x0002 /* UTF-16BE */ -#define AIM_CHARSET_CUSTOM 0x0003 +#define AIM_CHARSET_ASCII 0x0000 /* ISO 646 */ +#define AIM_CHARSET_UNICODE 0x0002 /* ISO 10646 (UTF-16/UCS-2BE) */ +#define AIM_CHARSET_LATIN_1 0x0003 /* ISO 8859-1 */ /* * Multipart message structures. @@ -1006,7 +1006,7 @@ /* 0x0008 */ int aim_im_warn(OscarData *od, FlapConnection *conn, const char *destbn, guint32 flags); /* 0x000b */ int aim_im_denytransfer(OscarData *od, const char *bn, const guchar *cookie, guint16 code); /* 0x0010 */ int aim_im_reqofflinemsgs(OscarData *od); -/* 0x0014 */ int aim_im_sendmtn(OscarData *od, guint16 type1, const char *bn, guint16 type2); +/* 0x0014 */ int aim_im_sendmtn(OscarData *od, guint16 channel, const char *bn, guint16 event); void aim_icbm_makecookie(guchar* cookie); gchar *oscar_encoding_extract(const char *encoding); gchar *oscar_encoding_to_utf8(PurpleAccount *account, const char *encoding, const char *text, int textlen); @@ -1026,11 +1026,12 @@ #define AIM_FLAG_ICQ 0x0040 #define AIM_FLAG_WIRELESS 0x0080 #define AIM_FLAG_UNKNOWN100 0x0100 -#define AIM_FLAG_UNKNOWN200 0x0200 +#define AIM_FLAG_IMFORWARDING 0x0200 #define AIM_FLAG_ACTIVEBUDDY 0x0400 #define AIM_FLAG_UNKNOWN800 0x0800 -#define AIM_FLAG_ABINTERNAL 0x1000 -#define AIM_FLAG_ALLUSERS 0x001f +#define AIM_FLAG_ONEWAYWIRELESS 0x1000 +#define AIM_FLAG_NOKNOCKKNOCK 0x00040000 +#define AIM_FLAG_FORWARD_MOBILE 0x00080000 #define AIM_USERINFO_PRESENT_FLAGS 0x00000001 #define AIM_USERINFO_PRESENT_MEMBERSINCE 0x00000002