# HG changeset patch # User Mark Doliner # Date 1065410493 0 # Node ID 895cd1d03efba6727f878715d8f99cdbb767adaf # Parent 511b4edb467ccd607810b70278f3ea75b217e44c [gaim-migrate @ 7740] I added buddy comment support for AIM and ICQ I also fixed a tini memleak in gaim_request_something when using a multiline dialog. I also tried to organize ChangeLog some. I put stuff that I thought normal people would care about the most at the top, and tried to group stuff aimed at plugin authors together, and nearer to the bottom. Feel free to do a better job than me. committer: Tailor Script diff -r 511b4edb467c -r 895cd1d03efb ChangeLog --- a/ChangeLog Mon Oct 06 02:28:43 2003 +0000 +++ b/ChangeLog Mon Oct 06 03:21:33 2003 +0000 @@ -1,29 +1,32 @@ Gaim: The Pimpin' Penguin IM Clone that's good for the soul! version 0.71 - * Some plugins must be updated again (Christian) + * The right-click menu for e-mail links now presents a "Copy E-Mail + Address" item + * Fix sort by idle to behave as it did pre-contact support (David + Smock) * Display AIM away messages in the tooltip for buddies when - they are away. - * Re-write of Jabber protocol plugin - * Massive core/UI splitting. - * Conversation API changes. + they are away + * Support for Buddy Comments for AIM buddies + * Window icons are now set as buddy icons or status icons + * Get User Info in MSN and Yahoo now return an error indicating that + the information doesn't exist if the profile is empty (parts by + Nathan Poznick) + * Added startup notification support for window managers that support it. + * Zephyr formatting fixes (Arun A Tharuvai) + * Zephyr can connect to chats (Karsten Huneycutt) * SSL support can now be provided by third party plugins. - * Added startup notification support for window managers that support it. * Multiple copies of gaim installed at different locations no longer attempt to load the same, possibly incompatible plugins (Robert McQueen) - * The right-click menu for e-mail links now presents a "Copy E-Mail - Address" item. - * Zephyr formatting fixes (Arun A Tharuvai) - * Zephyr can connect to chats (Karsten Huneycutt) - * Get User Info in MSN and Yahoo now return an error indicating that - the information doesn't exist if the profile is empty (parts by - Nathan Poznick) - * Fix sort by idle to behave as it did pre-contact support (David - Smock) + * Implemented another new Yahoo! authentication method + * Massive core/UI splitting. + * Re-write of Jabber protocol plugin + * Conversation API changes. + * Some plugins must be updated due to code variable changes, + function name changes, and change of behavior for certain + functions. * Chinese (Traditional) translation updated (Ambrose C. Li) - * Implemented another new Yahoo! authentication method - * Window icons are now set as buddy icons or status icons version 0.70 (09/28/2003): * Implemented Yahoo's new authentication method (Cerulean Studios) diff -r 511b4edb467c -r 895cd1d03efb src/gtkrequest.c --- a/src/gtkrequest.c Mon Oct 06 02:28:43 2003 +0000 +++ b/src/gtkrequest.c Mon Oct 06 03:21:33 2003 +0000 @@ -71,6 +71,7 @@ input_response_cb(GtkDialog *dialog, gint id, GaimGtkRequestData *data) { const char *value; + char *multiline_value; if (data->u.input.multiline) { GtkTextIter start_iter, end_iter; @@ -80,8 +81,9 @@ gtk_text_buffer_get_start_iter(buffer, &start_iter); gtk_text_buffer_get_end_iter(buffer, &end_iter); - value = gtk_text_buffer_get_text(buffer, &start_iter, &end_iter, + multiline_value = gtk_text_buffer_get_text(buffer, &start_iter, &end_iter, FALSE); + value = multiline_value; } else value = gtk_entry_get_text(GTK_ENTRY(data->u.input.entry)); @@ -91,6 +93,9 @@ else if (data->cbs[1] != NULL) ((GaimRequestInputCb)data->cbs[1])(data->user_data, value); + if (data->u.input.multiline) + g_free(multiline_value); + gaim_request_close(GAIM_REQUEST_INPUT, data); } diff -r 511b4edb467c -r 895cd1d03efb src/protocols/oscar/aim.h --- a/src/protocols/oscar/aim.h Mon Oct 06 02:28:43 2003 +0000 +++ b/src/protocols/oscar/aim.h Mon Oct 06 03:21:33 2003 +0000 @@ -1207,6 +1207,7 @@ faim_export int aim_ssi_getpermdeny(struct aim_ssi_item *list); faim_export fu32_t aim_ssi_getpresence(struct aim_ssi_item *list); faim_export char *aim_ssi_getalias(struct aim_ssi_item *list, const char *gn, const char *sn); +faim_export char *aim_ssi_getcomment(struct aim_ssi_item *list, const char *gn, const char *sn); faim_export int aim_ssi_waitingforauth(struct aim_ssi_item *list, const char *gn, const char *sn); /* Client functions for changing SSI data */ @@ -1218,6 +1219,7 @@ faim_export int aim_ssi_deldeny(aim_session_t *sess, const char *name); faim_export int aim_ssi_movebuddy(aim_session_t *sess, const char *oldgn, const char *newgn, const char *sn); faim_export int aim_ssi_aliasbuddy(aim_session_t *sess, const char *gn, const char *sn, const char *alias); +faim_export int aim_ssi_editcomment(aim_session_t *sess, const char *gn, const char *sn, const char *alias); faim_export int aim_ssi_rename_group(aim_session_t *sess, const char *oldgn, const char *newgn); faim_export int aim_ssi_cleanlist(aim_session_t *sess); faim_export int aim_ssi_deletelist(aim_session_t *sess); diff -r 511b4edb467c -r 895cd1d03efb src/protocols/oscar/oscar.c --- a/src/protocols/oscar/oscar.c Mon Oct 06 02:28:43 2003 +0000 +++ b/src/protocols/oscar/oscar.c Mon Oct 06 03:21:33 2003 +0000 @@ -6071,11 +6071,65 @@ return m; } +static void oscar_ssi_editcomment(struct name_data *data, const char *text) { + struct oscar_data *od = data->gc->proto_data; + GaimBuddy *b; + GaimGroup *g; + + if (!(b = gaim_find_buddy(gaim_connection_get_account(data->gc), data->name))) { + oscar_free_name_data(data); + return; + } + + if (!(g = gaim_find_buddys_group(b))) { + oscar_free_name_data(data); + return; + } + + aim_ssi_editcomment(od->sess, g->name, data->name, text); + oscar_free_name_data(data); +} + +static void oscar_buddycb_edit_comment(GaimConnection *gc, const char *name) { + struct oscar_data *od = gc->proto_data; + struct name_data *data = g_new(struct name_data, 1); + GaimBuddy *b; + GaimGroup *g; + char *comment; + gchar *comment_utf8; + + if (!(b = gaim_find_buddy(gaim_connection_get_account(gc), name))) + return; + if (!(g = gaim_find_buddys_group(b))) + return; + comment = aim_ssi_getcomment(od->sess->ssi.local, g->name, name); + comment_utf8 = comment ? gaim_utf8_try_convert(comment) : NULL; + + data->gc = gc; + data->name = g_strdup(name); + data->nick = NULL; + + gaim_request_input(gc, NULL, _("Buddy Comment:"), NULL, + comment_utf8, TRUE, FALSE, + _("OK"), G_CALLBACK(oscar_ssi_editcomment), + _("Cancel"), G_CALLBACK(oscar_free_name_data), + data); + + free(comment); + g_free(comment_utf8); +} + static GList *oscar_buddy_menu(GaimConnection *gc, const char *who) { struct oscar_data *od = gc->proto_data; GList *m = NULL; struct proto_buddy_menu *pbm; + pbm = g_new0(struct proto_buddy_menu, 1); + pbm->label = _("Edit Buddy Comment"); + pbm->callback = oscar_buddycb_edit_comment; + pbm->gc = gc; + m = g_list_append(m, pbm); + if (od->icq) { #if 0 pbm = g_new0(struct proto_buddy_menu, 1); diff -r 511b4edb467c -r 895cd1d03efb src/protocols/oscar/ssi.c --- a/src/protocols/oscar/ssi.c Mon Oct 06 02:28:43 2003 +0000 +++ b/src/protocols/oscar/ssi.c Mon Oct 06 03:21:33 2003 +0000 @@ -385,7 +385,7 @@ * @param list A pointer to the current list of items. * @param gn The group of the buddy. * @param sn The name of the buddy. - * @return A pointer to a NULL terminated string that is the buddies + * @return A pointer to a NULL terminated string that is the buddy's * alias, or NULL if the buddy has no alias. You should free * this returned value! */ @@ -405,6 +405,31 @@ } /** + * Locally find the comment of the given buddy. + * + * @param list A pointer to the current list of items. + * @param gn The group of the buddy. + * @param sn The name of the buddy. + * @return A pointer to a NULL terminated string that is the buddy's + * comment, or NULL if the buddy has no comment. You should free + * this returned value! + */ +faim_export char *aim_ssi_getcomment(struct aim_ssi_item *list, const char *gn, const char *sn) +{ + struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, gn, sn, AIM_SSI_TYPE_BUDDY); + if (cur) { + aim_tlv_t *tlv = aim_tlv_gettlv(cur->data, 0x013c, 1); + if (tlv && tlv->length) { + char *alias = (char *)malloc((tlv->length+1)*sizeof(char)); + strncpy(alias, tlv->value, tlv->length); + alias[tlv->length] = 0; + return alias; + } + } + return NULL; +} + +/** * Locally find if you are waiting for authorization for a buddy. * * @param list A pointer to the current list of items. @@ -882,7 +907,7 @@ * @param gn The group that the buddy is currently in. * @param sn The screen name of the buddy. * @param alias The new alias for the buddy, or NULL if you want to remove - * a buddies alias. + * a buddy's comment. * @return Return 0 if no errors, otherwise return the error number. */ faim_export int aim_ssi_aliasbuddy(aim_session_t *sess, const char *gn, const char *sn, const char *alias) @@ -908,6 +933,38 @@ } /** + * Change the comment stored on the server for a given buddy. + * + * @param sess The oscar session. + * @param gn The group that the buddy is currently in. + * @param sn The screen name of the buddy. + * @param alias The new comment for the buddy, or NULL if you want to remove + * a buddy's comment. + * @return Return 0 if no errors, otherwise return the error number. + */ +faim_export int aim_ssi_editcomment(aim_session_t *sess, const char *gn, const char *sn, const char *comment) +{ + struct aim_ssi_item *tmp; + + if (!sess || !gn || !sn) + return -EINVAL; + + if (!(tmp = aim_ssi_itemlist_finditem(sess->ssi.local, gn, sn, AIM_SSI_TYPE_BUDDY))) + return -EINVAL; + + /* Either add or remove the 0x0131 TLV from the TLV chain */ + if ((comment != NULL) && (strlen(comment) > 0)) + aim_tlvlist_replace_raw(&tmp->data, 0x013c, strlen(comment), comment); + else + aim_tlvlist_remove(&tmp->data, 0x013c); + + /* Sync our local list with the server list */ + aim_ssi_sync(sess); + + return 0; +} + +/** * Rename a group. * * @param sess The oscar session.