# HG changeset patch # User Stu Tomlinson # Date 1136737042 0 # Node ID 95a73ce6e285b3ddf1b718bd9080e5ceacb17960 # Parent c5acba513363550380e7b5c0ee70b2253f057775 [gaim-migrate @ 15108] Patch from Pekka Riikonen to add Buddy Icon support to SILC. This requires SILC Toolkit 1.0.2, but I modified it so you can build without buddy icon support on older toolkit versions. committer: Tailor Script diff -r c5acba513363 -r 95a73ce6e285 ChangeLog --- a/ChangeLog Sun Jan 08 01:16:23 2006 +0000 +++ b/ChangeLog Sun Jan 08 16:17:22 2006 +0000 @@ -113,6 +113,7 @@ * Whiteboard support (Pekka Riikonen) * Sending/receiving images in IMs (Pekka Riikonen) * Cipher and HMAC selection support (Pekka Riikonen) + * Buddy Icon support (Pekka Riikonen) Other Protocol Changes: * Bonjour (Rendezvous) protocol support (Juanjo Molinero Horno, Google diff -r c5acba513363 -r 95a73ce6e285 src/protocols/silc/buddy.c --- a/src/protocols/silc/buddy.c Sun Jan 08 01:16:23 2006 +0000 +++ b/src/protocols/silc/buddy.c Sun Jan 08 16:17:22 2006 +0000 @@ -609,8 +609,7 @@ buddy = (GaimBuddy *) node; gc = gaim_account_get_connection(buddy->account); - silcgaim_buddy_privkey(gc, buddy->name); - + silcgaim_buddy_getkey(gc, buddy->name); } static void @@ -752,6 +751,9 @@ SilcAttribute attribute; SilcVCardStruct vcard; SilcAttributeObjMime message, extension; +#ifdef SILC_ATTRIBUTE_USER_ICON + SilcAttributeObjMime usericon; +#endif SilcAttributeObjPk serverpk, usersign, serversign; gboolean usign_success = TRUE, ssign_success = TRUE; char filename[512], filename2[512], *fingerprint = NULL, *tmp; @@ -795,6 +797,9 @@ memset(&vcard, 0, sizeof(vcard)); memset(&message, 0, sizeof(message)); memset(&extension, 0, sizeof(extension)); +#ifdef SILC_ATTRIBUTE_USER_ICON + memset(&usericon, 0, sizeof(usericon)); +#endif memset(&serverpk, 0, sizeof(serverpk)); memset(&usersign, 0, sizeof(usersign)); memset(&serversign, 0, sizeof(serversign)); @@ -827,6 +832,14 @@ continue; break; +#ifdef SILC_ATTRIBUTE_USER_ICON + case SILC_ATTRIBUTE_USER_ICON: + if (!silc_attribute_get_object(attr, (void *)&usericon, + sizeof(usericon))) + continue; + break; +#endif + case SILC_ATTRIBUTE_SERVER_PUBLIC_KEY: if (serverpk.type) continue; @@ -958,6 +971,28 @@ silc_file_writefile(filename2, (char *)extension.mime, extension.mime_len); } + +#ifdef SILC_ATTRIBUTE_USER_ICON + /* Save user icon */ + if (usericon.mime) { + SilcMime m = silc_mime_decode(usericon.mime, + usericon.mime_len); + if (m) { + const char *type = silc_mime_get_field(m, "Content-Type"); + if (!strcmp(type, "image/jpeg") || + !strcmp(type, "image/gif") || + !strcmp(type, "image/bmp") || + !strcmp(type, "image/png")) { + const unsigned char *data; + SilcUInt32 data_len; + data = silc_mime_get_data(m, &data_len); + if (data) + gaim_buddy_icons_set_for_user(gaim_buddy_get_account(r->b), gaim_buddy_get_name(r->b), (void *)data, data_len); + } + silc_mime_free(m); + } + } +#endif } /* Save the public key path to buddy properties, as it is used @@ -1319,6 +1354,9 @@ SILC_ATTRIBUTE_PREFERRED_CONTACT, SILC_ATTRIBUTE_TIMEZONE, SILC_ATTRIBUTE_GEOLOCATION, +#ifdef SILC_ATTRIBUTE_USER_ICON + SILC_ATTRIBUTE_USER_ICON, +#endif SILC_ATTRIBUTE_DEVICE_INFO, 0); userpk.type = "silc-rsa"; userpk.data = silc_pkcs_public_key_encode(public_key, &userpk.data_len); @@ -1634,3 +1672,66 @@ } return m; } + +#ifdef SILC_ATTRIBUTE_USER_ICON +void silcgaim_buddy_set_icon(GaimConnection *gc, const char *iconfile) +{ + SilcGaim sg = gc->proto_data; + SilcClient client = sg->client; + SilcClientConnection conn = sg->conn; + SilcMime mime; + GaimBuddyIcon ic; + char type[32]; + unsigned char *icon; + const char *t; + struct stat st; + FILE *fp; + SilcAttributeObjMime obj; + + /* Remove */ + if (!iconfile) { + silc_client_attribute_del(client, conn, + SILC_ATTRIBUTE_USER_ICON, NULL); + return; + } + + /* Add */ + if (g_stat(iconfile, &st) < 0) + return; + fp = g_fopen(iconfile, "rb"); + if (!fp) + return; + ic.data = g_malloc(st.st_size); + if (!ic.data) + return; + ic.len = fread(ic.data, 1, st.st_size, fp); + fclose(fp); + + mime = silc_mime_alloc(); + if (!mime) { + g_free(ic.data); + return; + } + + t = gaim_buddy_icon_get_type((const GaimBuddyIcon *)&ic); + if (!t) { + g_free(ic.data); + silc_mime_free(mime); + return; + } + if (!strcmp(t, "jpg")) + t = "jpeg"; + g_snprintf(type, sizeof(type), "image/%s", t); + silc_mime_add_field(mime, "Content-Type", type); + silc_mime_add_data(mime, ic.data, ic.len); + + obj.mime = icon = silc_mime_encode(mime, &obj.mime_len); + if (obj.mime) + silc_client_attribute_add(client, conn, + SILC_ATTRIBUTE_USER_ICON, &obj, sizeof(obj)); + + silc_free(icon); + g_free(ic.data); + silc_mime_free(mime); +} +#endif diff -r c5acba513363 -r 95a73ce6e285 src/protocols/silc/silc.c --- a/src/protocols/silc/silc.c Sun Jan 08 01:16:23 2006 +0000 +++ b/src/protocols/silc/silc.c Sun Jan 08 16:17:22 2006 +0000 @@ -206,6 +206,9 @@ if (!gaim_account_get_bool(account, "reject-attrs", FALSE)) { SilcUInt32 mask; const char *tmp; +#ifdef SILC_ATTRIBUTE_USER_ICON + char *icon; +#endif #ifdef HAVE_SYS_UTSNAME_H struct utsname u; #endif @@ -240,6 +243,13 @@ silc_client_attribute_add(client, conn, SILC_ATTRIBUTE_TIMEZONE, (void *)tmp, strlen(tmp)); + +#ifdef SILC_ATTRIBUTE_USER_ICON + /* Set our buddy icon */ + icon = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(account)); + silcgaim_buddy_set_icon(gc, icon); + g_free(icon); +#endif } silc_free(params.detach_data); @@ -1724,7 +1734,11 @@ #endif NULL, /* user_splits */ NULL, /* protocol_options */ - NO_BUDDY_ICONS, /* icon_spec */ +#ifdef SILC_ATTRIBUTE_USER_ICON + {"jpeg,gif,png,bmp", 0, 0, 96, 96, GAIM_ICON_SCALE_DISPLAY}, /* icon_spec */ +#else + NO_BUDDY_ICONS, +#endif silcgaim_list_icon, /* list_icon */ silcgaim_list_emblems, /* list_emblems */ silcgaim_status_text, /* status_text */ @@ -1768,7 +1782,11 @@ NULL, /* buddy_free */ NULL, /* convo_closed */ NULL, /* normalize */ - NULL, /* set_buddy_icon */ +#ifdef SILC_ATTRIBUTE_USER_ICON + silcgaim_buddy_set_icon, /* set_buddy_icon */ +#else + NULL, +#endif NULL, /* remove_group */ NULL, /* get_cb_real_name */ silcgaim_chat_set_topic, /* set_chat_topic */ diff -r c5acba513363 -r 95a73ce6e285 src/protocols/silc/silcgaim.h --- a/src/protocols/silc/silcgaim.h Sun Jan 08 01:16:23 2006 +0000 +++ b/src/protocols/silc/silcgaim.h Sun Jan 08 16:17:22 2006 +0000 @@ -144,6 +144,9 @@ void silcgaim_parse_attrs(SilcDList attrs, char **moodstr, char **statusstr, char **contactstr, char **langstr, char **devicestr, char **tzstr, char **geostr); +#ifdef SILC_ATTRIBUTE_USER_ICON +void silcgaim_buddy_set_icon(GaimConnection *gc, const char *iconfile); +#endif #ifdef HAVE_SILCMIME_H char *silcgaim_file2mime(const char *filename); SilcDList silcgaim_image_message(const char *msg, SilcUInt32 *mflags);