Mercurial > pidgin.yaz
diff libpurple/protocols/oscar/oscar.c @ 28435:4a2adf413aaa
merged with im.pidgin.pidgin
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 24 Aug 2009 17:20:46 +0900 |
parents | e1cd44c7c7af 0a587ffcab9b |
children | 336d03cdced6 |
line wrap: on
line diff
--- a/libpurple/protocols/oscar/oscar.c Wed Aug 19 16:19:45 2009 +0900 +++ b/libpurple/protocols/oscar/oscar.c Mon Aug 24 17:20:46 2009 +0900 @@ -160,7 +160,6 @@ static int purple_parse_misses (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_parse_clientauto (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_parse_userinfo (OscarData *, FlapConnection *, FlapFrame *, ...); -static int purple_got_infoblock (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_parse_motd (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_chatnav_info (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_conv_chat_join (OscarData *, FlapConnection *, FlapFrame *, ...); @@ -840,24 +839,24 @@ od = purple_connection_get_protocol_data(gc); - if (userinfo == NULL) - userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b)); - - if ((user_info == NULL) || ((b == NULL) && (userinfo == NULL))) + if (b == NULL && userinfo == NULL) return; if (b == NULL) b = purple_find_buddy(purple_connection_get_account(gc), userinfo->bn); + else + userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b)); if (b) { presence = purple_buddy_get_presence(b); status = purple_presence_get_active_status(presence); - - message = g_strdup(purple_status_get_attr_string(status, "message")); - itmsurl = g_strdup(purple_status_get_attr_string(status, "itmsurl")); - - } else { - /* This is an OSCAR contact for whom we don't have a PurpleBuddy but do have information. */ + } + + /* If we have both b and userinfo we favor userinfo, because if we're + viewing someone's profile then we want the HTML away message, and + 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)) { @@ -878,6 +877,9 @@ userinfo->itmsurl, userinfo->itmsurl_len); #endif } + } else { + message = g_strdup(purple_status_get_attr_string(status, "message")); + itmsurl = g_strdup(purple_status_get_attr_string(status, "itmsurl")); } is_away = ((status && !purple_status_is_available(status)) || @@ -944,7 +946,6 @@ g_free(message); message = g_strdup(_("Offline")); } - } purple_notify_user_info_add_pair(user_info, _("Status"), message); @@ -1506,7 +1507,6 @@ oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_RIGHTSINFO, purple_parse_locaterights, 0); oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_USERINFO, purple_parse_userinfo, 0); oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_ERROR, purple_parse_locerr, 0); - oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_GOTINFOBLOCK, purple_got_infoblock, 0); oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x0001, purple_parse_genericerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x000f, purple_selfinfo, 0); oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x001f, purple_memrequest, 0); @@ -2167,6 +2167,23 @@ g_return_val_if_fail(info != NULL, 1); g_return_val_if_fail(info->bn != NULL, 1); + /* + * If this is an AIM buddy and their name has formatting, set their + * server alias. + */ + if (!oscar_util_valid_name_icq(info->bn)) { + gboolean bn_has_formatting = FALSE; + char *c; + for (c = info->bn; *c != '\0'; c++) { + if (!islower(*c)) { + bn_has_formatting = TRUE; + break; + } + } + serv_got_alias(gc, info->bn, + bn_has_formatting ? info->bn : NULL); + } + if (info->present & AIM_USERINFO_PRESENT_FLAGS) { if (info->flags & AIM_FLAG_AWAY) buddy_is_away = TRUE; @@ -3320,7 +3337,7 @@ oscar_user_info_append_extra_info(gc, user_info, NULL, userinfo); if ((userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) && !oscar_util_valid_name_sms(userinfo->bn)) { - /* An SMS contact is always online; its Online Since valid is not useful */ + /* An SMS contact is always online; its Online Since value is not useful */ time_t t = userinfo->onlinesince; oscar_user_info_add_pair(user_info, _("Online Since"), purple_date_format_full(localtime(&t))); } @@ -3363,55 +3380,6 @@ return 1; } -static int purple_got_infoblock(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) -{ - PurpleConnection *gc = od->gc; - PurpleAccount *account = purple_connection_get_account(gc); - PurpleBuddy *b; - PurplePresence *presence; - PurpleStatus *status; - gchar *message = NULL; - - va_list ap; - aim_userinfo_t *userinfo; - - va_start(ap, fr); - userinfo = va_arg(ap, aim_userinfo_t *); - va_end(ap); - - b = purple_find_buddy(account, userinfo->bn); - if (b == NULL) - return 1; - - if (!oscar_util_valid_name_icq(userinfo->bn)) - { - if (strcmp(purple_buddy_get_name(b), userinfo->bn) != 0) - serv_got_alias(gc, purple_buddy_get_name(b), userinfo->bn); - else - serv_got_alias(gc, purple_buddy_get_name(b), NULL); - } - - presence = purple_buddy_get_presence(b); - status = purple_presence_get_active_status(presence); - - if (purple_status_is_online(status) && !purple_status_is_available(status) && - userinfo->flags & AIM_FLAG_AWAY && userinfo->away_len > 0 && - userinfo->away != NULL && userinfo->away_encoding != NULL) - { - gchar *charset = oscar_encoding_extract(userinfo->away_encoding); - message = oscar_encoding_to_utf8(account, charset, - userinfo->away, - userinfo->away_len); - g_free(charset); - purple_prpl_got_user_status(account, userinfo->bn, - purple_status_get_id(status), - "message", message, NULL); - g_free(message); - } - - return 1; -} - static int purple_parse_motd(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { char *msg; @@ -6364,6 +6332,44 @@ } static void +oscar_close_directim(gpointer object, gpointer ignored) +{ + PurpleBlistNode *node; + PurpleBuddy *buddy; + PurpleAccount *account; + PurpleConnection *gc; + PurpleConversation *conv; + OscarData *od; + PeerConnection *conn; + const char *name; + + node = object; + + g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); + + buddy = (PurpleBuddy*)node; + name = purple_buddy_get_name(buddy); + account = purple_buddy_get_account(buddy); + gc = purple_account_get_connection(account); + od = gc->proto_data; + conn = peer_connection_find_by_type(od, name, OSCAR_CAPABILITY_DIRECTIM); + + if (conn != NULL) + { + if (!conn->ready) + aim_im_sendch2_cancel(conn); + + peer_connection_destroy(conn, OSCAR_DISCONNECT_LOCAL_CLOSED, NULL); + + /* OSCAR_DISCONNECT_LOCAL_CLOSED doesn't write anything to the convo + * window. Let the user know that we canceled the Direct IM. */ + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, name); + purple_conversation_write(conv, NULL, _("You closed the connection."), + PURPLE_MESSAGE_SYSTEM, time(NULL)); + } +} + +static void oscar_get_aim_info_cb(PurpleBlistNode *node, gpointer ignore) { PurpleBuddy *buddy; @@ -6426,11 +6432,23 @@ oscar_util_name_compare(purple_account_get_username(account), bname) && PURPLE_BUDDY_IS_ONLINE(buddy)) { + PeerConnection *conn; + conn = peer_connection_find_by_type(od, bname, OSCAR_CAPABILITY_DIRECTIM); + if (userinfo->capabilities & OSCAR_CAPABILITY_DIRECTIM) { - act = purple_menu_action_new(_("Direct IM"), - PURPLE_CALLBACK(oscar_ask_directim), - NULL, NULL); + if (conn) + { + act = purple_menu_action_new(_("End Direct IM Session"), + PURPLE_CALLBACK(oscar_close_directim), + NULL, NULL); + } + else + { + act = purple_menu_action_new(_("Direct IM"), + PURPLE_CALLBACK(oscar_ask_directim), + NULL, NULL); + } menu = g_list_prepend(menu, act); } #if 0