# HG changeset patch # User Mark Doliner # Date 1236295021 0 # Node ID 3f3d21ae182507bbbc5a6c43beae6f080653d93c # Parent cf75f0ca4b86e6f2766fa0bdb6c8667f2edf97c2 Create two helper functions for setting the available message and iTunes Music Store url. I guess this might be slightly more ineffecient, but this code is only called when your status changes, and it's much cleaner this way. diff -r cf75f0ca4b86 -r 3f3d21ae1825 libpurple/protocols/oscar/bstream.c --- a/libpurple/protocols/oscar/bstream.c Thu Mar 05 21:39:09 2009 +0000 +++ b/libpurple/protocols/oscar/bstream.c Thu Mar 05 23:17:01 2009 +0000 @@ -311,3 +311,37 @@ return byte_stream_putle32(bs, atoi(purple_account_get_username(account))); } + +void byte_stream_put_bart_asset(ByteStream *bs, guint16 type, ByteStream *data) +{ + byte_stream_put16(bs, type); + + if (data != NULL && data->len > 0) { + /* Flags. 0x04 means "this asset has data attached to it" */ + byte_stream_put8(bs, 0x04); /* Flags */ + byte_stream_put8(bs, data->len); /* Length */ + byte_stream_rewind(data); + byte_stream_putbs(bs, data, data->len); /* Data */ + } else { + byte_stream_put8(bs, 0x00); /* No flags */ + byte_stream_put8(bs, 0x00); /* Length */ + /* No data */ + } +} + +void byte_stream_put_bart_asset_str(ByteStream *bs, guint16 type, const char *datastr) +{ + ByteStream data; + size_t len = datastr != NULL ? strlen(datastr) : 0; + + if (len > 0) { + byte_stream_new(&data, 2 + len + 2); + byte_stream_put16(&data, len); /* Length */ + byte_stream_putstr(&data, datastr); /* String */ + byte_stream_put16(&data, 0x0000); /* Unknown */ + byte_stream_put_bart_asset(bs, type, &data); + byte_stream_destroy(&data); + } else { + byte_stream_put_bart_asset(bs, type, NULL); + } +} diff -r cf75f0ca4b86 -r 3f3d21ae1825 libpurple/protocols/oscar/family_oservice.c --- a/libpurple/protocols/oscar/family_oservice.c Thu Mar 05 21:39:09 2009 +0000 +++ b/libpurple/protocols/oscar/family_oservice.c Thu Mar 05 23:17:01 2009 +0000 @@ -853,28 +853,15 @@ if (setavailmsg) { - int availmsglen, itmsurllen; + size_t availmsglen, itmsurllen; ByteStream tmpbs; availmsglen = (availmsg != NULL) ? strlen(availmsg) : 0; itmsurllen = (itmsurl != NULL) ? strlen(itmsurl) : 0; byte_stream_new(&tmpbs, availmsglen + 8 + itmsurllen + 8); - byte_stream_put16(&tmpbs, 0x0002); - byte_stream_put8(&tmpbs, 0x04); /* Flags */ - byte_stream_put8(&tmpbs, availmsglen + 4); - byte_stream_put16(&tmpbs, availmsglen); - if (availmsglen > 0) - byte_stream_putstr(&tmpbs, availmsg); - byte_stream_put16(&tmpbs, 0x0000); - - byte_stream_put16(&tmpbs, 0x0009); - byte_stream_put8(&tmpbs, 0x04); /* Flags */ - byte_stream_put8(&tmpbs, itmsurllen + 4); - byte_stream_put16(&tmpbs, itmsurllen); - if (itmsurllen > 0) - byte_stream_putstr(&tmpbs, itmsurl); - byte_stream_put16(&tmpbs, 0x0000); + byte_stream_put_bart_asset_str(&tmpbs, 0x0002, availmsg); + byte_stream_put_bart_asset_str(&tmpbs, 0x0009, itmsurl); aim_tlvlist_add_raw(&tlvlist, 0x001d, byte_stream_curpos(&tmpbs), tmpbs.data); diff -r cf75f0ca4b86 -r 3f3d21ae1825 libpurple/protocols/oscar/oscar.h --- a/libpurple/protocols/oscar/oscar.h Thu Mar 05 21:39:09 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.h Thu Mar 05 23:17:01 2009 +0000 @@ -1594,6 +1594,18 @@ int byte_stream_putuid(ByteStream *bs, OscarData *od); int byte_stream_putcaps(ByteStream *bs, guint32 caps); +/** + * Inserts a BART asset block into the given byte stream. The flags + * and length are set appropriately based on the value of data. + */ +void byte_stream_put_bart_asset(ByteStream *bs, guint16 type, ByteStream *data); + +/** + * A helper function that calls byte_stream_put_bart_asset with the + * appropriate data ByteStream given the datastr. + */ +void byte_stream_put_bart_asset_str(ByteStream *bs, guint16 type, const char *datastr); + /* * Generic SNAC structure. Rarely if ever used. */