comparison libpurple/protocols/oscar/oscar.c @ 29852:a538cb73f897

propagate from branch 'im.pidgin.pidgin' (head b0098e2250f135d121960d8152e144e7e344125e) to branch 'im.pidgin.cpw.rekkanoryo.icqxstatus' (head dcd3ab65d5cfcd79b00a7b95ab5fe788da64c112)
author Marcus Lundblad <ml@update.uu.se>
date Sun, 07 Feb 2010 19:31:56 +0000
parents da49e136fb34 5391094529c6
children a0fb6798d87c
comparison
equal deleted inserted replaced
29372:791606778223 29852:a538cb73f897
59 #define OSCAR_STATUS_ID_NA "na" 59 #define OSCAR_STATUS_ID_NA "na"
60 #define OSCAR_STATUS_ID_OCCUPIED "occupied" 60 #define OSCAR_STATUS_ID_OCCUPIED "occupied"
61 #define OSCAR_STATUS_ID_FREE4CHAT "free4chat" 61 #define OSCAR_STATUS_ID_FREE4CHAT "free4chat"
62 #define OSCAR_STATUS_ID_CUSTOM "custom" 62 #define OSCAR_STATUS_ID_CUSTOM "custom"
63 #define OSCAR_STATUS_ID_MOBILE "mobile" 63 #define OSCAR_STATUS_ID_MOBILE "mobile"
64 #define OSCAR_STATUS_ID_EVIL "evil"
65 #define OSCAR_STATUS_ID_DEPRESSION "depression"
66 #define OSCAR_STATUS_ID_ATHOME "athome"
67 #define OSCAR_STATUS_ID_ATWORK "atwork"
68 #define OSCAR_STATUS_ID_LUNCH "lunch"
64 69
65 #define AIMHASHDATA "http://pidgin.im/aim_data.php3" 70 #define AIMHASHDATA "http://pidgin.im/aim_data.php3"
66 71
67 #define OSCAR_CONNECT_STEPS 6 72 #define OSCAR_CONNECT_STEPS 6
68 73
69 static OscarCapability purple_caps = (OSCAR_CAPABILITY_CHAT | OSCAR_CAPABILITY_BUDDYICON | OSCAR_CAPABILITY_DIRECTIM | 74 static OscarCapability purple_caps = (OSCAR_CAPABILITY_CHAT | OSCAR_CAPABILITY_BUDDYICON | OSCAR_CAPABILITY_DIRECTIM |
70 OSCAR_CAPABILITY_SENDFILE | OSCAR_CAPABILITY_UNICODE | OSCAR_CAPABILITY_INTEROPERATE | 75 OSCAR_CAPABILITY_SENDFILE | OSCAR_CAPABILITY_UNICODE | OSCAR_CAPABILITY_INTEROPERATE |
71 OSCAR_CAPABILITY_SHORTCAPS | OSCAR_CAPABILITY_TYPING); 76 OSCAR_CAPABILITY_SHORTCAPS | OSCAR_CAPABILITY_TYPING | OSCAR_CAPABILITY_ICQSERVERRELAY | OSCAR_CAPABILITY_NEWCAPS | OSCAR_CAPABILITY_XTRAZ);
72 77
73 static guint8 features_aim[] = {0x01, 0x01, 0x01, 0x02}; 78 static guint8 features_aim[] = {0x01, 0x01, 0x01, 0x02};
74 static guint8 features_icq[] = {0x01, 0x06}; 79 static guint8 features_icq[] = {0x01, 0x06};
75 static guint8 features_icq_offline[] = {0x01}; 80 static guint8 features_icq_offline[] = {0x01};
76 static guint8 ck[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 81 static guint8 ck[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
178 static int purple_parse_offgoing (OscarData *, FlapConnection *, FlapFrame *, ...); 183 static int purple_parse_offgoing (OscarData *, FlapConnection *, FlapFrame *, ...);
179 static int purple_parse_incoming_im(OscarData *, FlapConnection *, FlapFrame *, ...); 184 static int purple_parse_incoming_im(OscarData *, FlapConnection *, FlapFrame *, ...);
180 static int purple_parse_misses (OscarData *, FlapConnection *, FlapFrame *, ...); 185 static int purple_parse_misses (OscarData *, FlapConnection *, FlapFrame *, ...);
181 static int purple_parse_clientauto (OscarData *, FlapConnection *, FlapFrame *, ...); 186 static int purple_parse_clientauto (OscarData *, FlapConnection *, FlapFrame *, ...);
182 static int purple_parse_userinfo (OscarData *, FlapConnection *, FlapFrame *, ...); 187 static int purple_parse_userinfo (OscarData *, FlapConnection *, FlapFrame *, ...);
188 static int purple_got_infoblock (OscarData *, FlapConnection *, FlapFrame *, ...);
183 static int purple_parse_motd (OscarData *, FlapConnection *, FlapFrame *, ...); 189 static int purple_parse_motd (OscarData *, FlapConnection *, FlapFrame *, ...);
184 static int purple_chatnav_info (OscarData *, FlapConnection *, FlapFrame *, ...); 190 static int purple_chatnav_info (OscarData *, FlapConnection *, FlapFrame *, ...);
185 static int purple_conv_chat_join (OscarData *, FlapConnection *, FlapFrame *, ...); 191 static int purple_conv_chat_join (OscarData *, FlapConnection *, FlapFrame *, ...);
186 static int purple_conv_chat_leave (OscarData *, FlapConnection *, FlapFrame *, ...); 192 static int purple_conv_chat_leave (OscarData *, FlapConnection *, FlapFrame *, ...);
187 static int purple_conv_chat_info_update (OscarData *, FlapConnection *, FlapFrame *, ...); 193 static int purple_conv_chat_info_update (OscarData *, FlapConnection *, FlapFrame *, ...);
188 static int purple_conv_chat_incoming_msg(OscarData *, FlapConnection *, FlapFrame *, ...); 194 static int purple_conv_chat_incoming_msg(OscarData *, FlapConnection *, FlapFrame *, ...);
189 static int purple_email_parseupdate(OscarData *, FlapConnection *, FlapFrame *, ...); 195 static int purple_email_parseupdate(OscarData *, FlapConnection *, FlapFrame *, ...);
190 static int purple_icon_parseicon (OscarData *, FlapConnection *, FlapFrame *, ...); 196 static int purple_icon_parseicon (OscarData *, FlapConnection *, FlapFrame *, ...);
191 static int oscar_icon_req (OscarData *, FlapConnection *, FlapFrame *, ...); 197 static int oscar_icon_req (OscarData *, FlapConnection *, FlapFrame *, ...);
192 static int purple_parse_msgack (OscarData *, FlapConnection *, FlapFrame *, ...); 198 static int purple_parse_msgack (OscarData *, FlapConnection *, FlapFrame *, ...);
199 static int purple_parse_ratechange (OscarData *, FlapConnection *, FlapFrame *, ...);
193 static int purple_parse_evilnotify (OscarData *, FlapConnection *, FlapFrame *, ...); 200 static int purple_parse_evilnotify (OscarData *, FlapConnection *, FlapFrame *, ...);
194 static int purple_parse_searcherror(OscarData *, FlapConnection *, FlapFrame *, ...); 201 static int purple_parse_searcherror(OscarData *, FlapConnection *, FlapFrame *, ...);
195 static int purple_parse_searchreply(OscarData *, FlapConnection *, FlapFrame *, ...); 202 static int purple_parse_searchreply(OscarData *, FlapConnection *, FlapFrame *, ...);
196 static int purple_bosrights (OscarData *, FlapConnection *, FlapFrame *, ...); 203 static int purple_bosrights (OscarData *, FlapConnection *, FlapFrame *, ...);
197 static int purple_connerr (OscarData *, FlapConnection *, FlapFrame *, ...); 204 static int purple_connerr (OscarData *, FlapConnection *, FlapFrame *, ...);
223 static void purple_icons_fetch(PurpleConnection *gc); 230 static void purple_icons_fetch(PurpleConnection *gc);
224 231
225 void oscar_set_info(PurpleConnection *gc, const char *info); 232 void oscar_set_info(PurpleConnection *gc, const char *info);
226 static void oscar_set_info_and_status(PurpleAccount *account, gboolean setinfo, const char *rawinfo, gboolean setstatus, PurpleStatus *status); 233 static void oscar_set_info_and_status(PurpleAccount *account, gboolean setinfo, const char *rawinfo, gboolean setstatus, PurpleStatus *status);
227 static void oscar_set_extendedstatus(PurpleConnection *gc); 234 static void oscar_set_extendedstatus(PurpleConnection *gc);
235 static void oscar_format_username(PurpleConnection *gc, const char *nick);
228 static gboolean purple_ssi_rerequestdata(gpointer data); 236 static gboolean purple_ssi_rerequestdata(gpointer data);
229 237
230 static void oscar_free_name_data(struct name_data *data) { 238 static void oscar_free_name_data(struct name_data *data) {
231 g_free(data->name); 239 g_free(data->name);
232 g_free(data->nick); 240 g_free(data->nick);
700 tmp = _("Send File"); 708 tmp = _("Send File");
701 break; 709 break;
702 case OSCAR_CAPABILITY_GAMES: 710 case OSCAR_CAPABILITY_GAMES:
703 case OSCAR_CAPABILITY_GAMES2: 711 case OSCAR_CAPABILITY_GAMES2:
704 tmp = _("Games"); 712 tmp = _("Games");
713 break;
714 case OSCAR_CAPABILITY_XTRAZ:
715 case OSCAR_CAPABILITY_NEWCAPS:
716 tmp = _("ICQ Xtraz");
705 break; 717 break;
706 case OSCAR_CAPABILITY_ADDINS: 718 case OSCAR_CAPABILITY_ADDINS:
707 tmp = _("Add-Ins"); 719 tmp = _("Add-Ins");
708 break; 720 break;
709 case OSCAR_CAPABILITY_SENDBUDDYLIST: 721 case OSCAR_CAPABILITY_SENDBUDDYLIST:
782 return g_strdup(_("Away")); 794 return g_strdup(_("Away"));
783 else if (state & AIM_ICQ_STATE_WEBAWARE) 795 else if (state & AIM_ICQ_STATE_WEBAWARE)
784 return g_strdup(_("Web Aware")); 796 return g_strdup(_("Web Aware"));
785 else if (state & AIM_ICQ_STATE_INVISIBLE) 797 else if (state & AIM_ICQ_STATE_INVISIBLE)
786 return g_strdup(_("Invisible")); 798 return g_strdup(_("Invisible"));
799 else if (state & AIM_ICQ_STATE_EVIL)
800 return g_strdup(_("Evil"));
801 else if (state & AIM_ICQ_STATE_DEPRESSION)
802 return g_strdup(_("Depression"));
803 else if (state & AIM_ICQ_STATE_ATHOME)
804 return g_strdup_(_("At home"));
805 else if (state & AIM_ICQ_STATE_ATWORK)
806 return g_strdup(_("At work"));
807 else if (state & AIM_ICQ_STATE_LUNCH)
808 return g_strdup(_("At lunch"));
787 else 809 else
788 return g_strdup(_("Online")); 810 return g_strdup(_("Online"));
789 } 811 }
790 812
791 static void 813 static void
957 message = tmp; 979 message = tmp;
958 } else { 980 } else {
959 g_free(message); 981 g_free(message);
960 message = g_strdup(_("Offline")); 982 message = g_strdup(_("Offline"));
961 } 983 }
984 }
985
986 if (presence) {
987 const char *mood;
988 const char *description;
989 status = purple_presence_get_status(presence, "mood");
990 mood = purple_status_get_attr_string(status, PURPLE_MOOD_NAME);
991 description = icq_get_custom_icon_description(mood);
992 if (description && *description)
993 purple_notify_user_info_add_pair(user_info, _("Mood"), _(description));
962 } 994 }
963 995
964 purple_notify_user_info_add_pair(user_info, _("Status"), message); 996 purple_notify_user_info_add_pair(user_info, _("Status"), message);
965 g_free(message); 997 g_free(message);
966 } 998 }
2238 status_id = OSCAR_STATUS_ID_OCCUPIED; 2270 status_id = OSCAR_STATUS_ID_OCCUPIED;
2239 else if (type & AIM_ICQ_STATE_AWAY) 2271 else if (type & AIM_ICQ_STATE_AWAY)
2240 status_id = OSCAR_STATUS_ID_AWAY; 2272 status_id = OSCAR_STATUS_ID_AWAY;
2241 else if (type & AIM_ICQ_STATE_INVISIBLE) 2273 else if (type & AIM_ICQ_STATE_INVISIBLE)
2242 status_id = OSCAR_STATUS_ID_INVISIBLE; 2274 status_id = OSCAR_STATUS_ID_INVISIBLE;
2275 else if (type & AIM_ICQ_STATE_EVIL)
2276 status_id = OSCAR_STATUS_ID_EVIL;
2277 else if (type & AIM_ICQ_STATE_DEPRESSION)
2278 status_id = OSCAR_STATUS_ID_DEPRESSION;
2279 else if (type & AIM_ICQ_STATE_ATHOME)
2280 status_id = OSCAR_STATUS_ID_ATHOME;
2281 else if (type & AIM_ICQ_STATE_ATWORK)
2282 status_id = OSCAR_STATUS_ID_ATWORK;
2283 else if (type & AIM_ICQ_STATE_LUNCH)
2284 status_id = OSCAR_STATUS_ID_LUNCH;
2243 else 2285 else
2244 status_id = OSCAR_STATUS_ID_AVAILABLE; 2286 status_id = OSCAR_STATUS_ID_AVAILABLE;
2245 } else { 2287 } else {
2246 if (type & AIM_ICQ_STATE_INVISIBLE) 2288 if (type & AIM_ICQ_STATE_INVISIBLE)
2247 status_id = OSCAR_STATUS_ID_INVISIBLE; 2289 status_id = OSCAR_STATUS_ID_INVISIBLE;
2550 static int 2592 static int
2551 incomingim_chan2(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, IcbmArgsCh2 *args) 2593 incomingim_chan2(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, IcbmArgsCh2 *args)
2552 { 2594 {
2553 PurpleConnection *gc; 2595 PurpleConnection *gc;
2554 PurpleAccount *account; 2596 PurpleAccount *account;
2597 PurpleMessageFlags flags = 0;
2555 char *message = NULL; 2598 char *message = NULL;
2599 char *rtfmsg = NULL;
2556 2600
2557 g_return_val_if_fail(od != NULL, 0); 2601 g_return_val_if_fail(od != NULL, 0);
2558 g_return_val_if_fail(od->gc != NULL, 0); 2602 g_return_val_if_fail(od->gc != NULL, 0);
2559 2603
2560 gc = od->gc; 2604 gc = od->gc;
2580 if (g_utf8_validate(args->msg, args->msglen, NULL)) 2624 if (g_utf8_validate(args->msg, args->msglen, NULL))
2581 message = g_strdup(args->msg); 2625 message = g_strdup(args->msg);
2582 } 2626 }
2583 } 2627 }
2584 2628
2629 if (args->info.rtfmsg.rtfmsg != NULL)
2630 {
2631 if (args->encoding != NULL)
2632 {
2633 char *encoding = NULL;
2634 encoding = oscar_encoding_extract(args->encoding);
2635 rtfmsg = oscar_encoding_to_utf8(account, encoding, args->info.rtfmsg.rtfmsg,
2636 strlen(args->info.rtfmsg.rtfmsg));
2637 g_free(encoding);
2638 } else {
2639 if (g_utf8_validate(args->info.rtfmsg.rtfmsg, strlen(args->info.rtfmsg.rtfmsg), NULL))
2640 rtfmsg = g_strdup(args->info.rtfmsg.rtfmsg);
2641 }
2642 }
2585 if (args->type & OSCAR_CAPABILITY_CHAT) 2643 if (args->type & OSCAR_CAPABILITY_CHAT)
2586 { 2644 {
2587 char *encoding, *utf8name, *tmp; 2645 char *encoding, *utf8name, *tmp;
2588 GHashTable *components; 2646 GHashTable *components;
2589 2647
2665 NULL); 2723 NULL);
2666 } 2724 }
2667 2725
2668 else if (args->type & OSCAR_CAPABILITY_ICQSERVERRELAY) 2726 else if (args->type & OSCAR_CAPABILITY_ICQSERVERRELAY)
2669 { 2727 {
2670 purple_debug_error("oscar", "Got an ICQ Server Relay message of " 2728 purple_debug_info("oscar", "Got an ICQ Server Relay message of "
2671 "type %d\n", args->info.rtfmsg.msgtype); 2729 "type %d\n", args->info.rtfmsg.msgtype);
2672 } 2730 purple_debug_info("oscar", "Sending X-Status Reply\n");
2673 2731
2732 if(args->info.rtfmsg.msgtype == 26)
2733 icq_relay_xstatus(od, userinfo->sn, args->cookie);
2734
2735 if(args->info.rtfmsg.msgtype == 1)
2736 {
2737 if(rtfmsg)
2738 {
2739 serv_got_im(gc, userinfo->sn, rtfmsg, flags,
2740 time(NULL));
2741 }
2742 else
2743 {
2744 serv_got_im(gc, userinfo->sn,
2745 args->info.rtfmsg.rtfmsg, flags,
2746 time(NULL));
2747 }
2748 }
2749 }
2674 else 2750 else
2675 { 2751 {
2676 purple_debug_error("oscar", "Unknown request class %hu\n", 2752 purple_debug_error("oscar", "Unknown request class %hu\n",
2677 args->type); 2753 args->type);
2678 } 2754 }
3248 purple_notify_userinfo(gc, who, user_info, NULL, NULL); 3324 purple_notify_userinfo(gc, who, user_info, NULL, NULL);
3249 purple_notify_user_info_destroy(user_info); 3325 purple_notify_user_info_destroy(user_info);
3250 3326
3251 } break; 3327 } break;
3252 3328
3329 case 0x0006: { /* Reply from an ICQ status message request */
3330 char *statusmsg, **splitmsg;
3331 PurpleNotifyUserInfo *user_info;
3332
3333 /* Split at (carriage return/newline)'s, then rejoin later with BRs between. */
3334 statusmsg = oscar_icqstatus(state);
3335 splitmsg = g_strsplit(msg, "\r\n", 0);
3336
3337 user_info = purple_notify_user_info_new();
3338
3339 purple_notify_user_info_add_pair(user_info, _("UIN"), who);
3340 purple_notify_user_info_add_pair(user_info, _("Status"), statusmsg);
3341 purple_notify_user_info_add_section_break(user_info);
3342 purple_notify_user_info_add_pair(user_info, NULL, g_strjoinv("<BR>", splitmsg));
3343
3344 g_free(statusmsg);
3345 g_strfreev(splitmsg);
3346
3347 purple_notify_userinfo(gc, who, user_info, NULL, NULL);
3348 purple_notify_user_info_destroy(user_info);
3349
3350 } break;
3351
3253 default: { 3352 default: {
3254 purple_debug_warning("oscar", 3353 purple_debug_warning("oscar",
3255 "Received an unknown client auto-response from %s. " 3354 "Received an unknown client auto-response from %s. "
3256 "Type 0x%04hx\n", who, reason); 3355 "Type 0x%04hx\n", who, reason);
3257 } break; 3356 } break;
3491 purple_notify_user_info_add_pair(user_info, NULL, tmp); 3590 purple_notify_user_info_add_pair(user_info, NULL, tmp);
3492 g_free(tmp); 3591 g_free(tmp);
3493 3592
3494 purple_notify_userinfo(gc, userinfo->bn, user_info, NULL, NULL); 3593 purple_notify_userinfo(gc, userinfo->bn, user_info, NULL, NULL);
3495 purple_notify_user_info_destroy(user_info); 3594 purple_notify_user_info_destroy(user_info);
3595
3596 return 1;
3597 }
3598
3599 static int purple_got_infoblock(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
3600 {
3601 PurpleConnection *gc = od->gc;
3602 PurpleAccount *account = purple_connection_get_account(gc);
3603 PurpleBuddy *b;
3604 PurplePresence *presence;
3605 PurpleStatus *status;
3606 gchar *message = NULL;
3607
3608 va_list ap;
3609 aim_userinfo_t *userinfo;
3610
3611 va_start(ap, fr);
3612 userinfo = va_arg(ap, aim_userinfo_t *);
3613 va_end(ap);
3614
3615 b = purple_find_buddy(account, userinfo->bn);
3616 if (b == NULL)
3617 return 1;
3618
3619 if (!oscar_util_valid_name_icq(userinfo->bn))
3620 {
3621 if (strcmp(purple_buddy_get_name(b), userinfo->bn) != 0)
3622 serv_got_alias(gc, purple_buddy_get_name(b), userinfo->bn);
3623 else
3624 serv_got_alias(gc, purple_buddy_get_name(b), NULL);
3625 }
3626
3627 presence = purple_buddy_get_presence(b);
3628 status = purple_presence_get_active_status(presence);
3629
3630 if (purple_status_is_online(status) && !purple_status_is_available(status) &&
3631 userinfo->flags & AIM_FLAG_AWAY && userinfo->away_len > 0 &&
3632 userinfo->away != NULL && userinfo->away_encoding != NULL)
3633 {
3634 gchar *charset = oscar_encoding_extract(userinfo->away_encoding);
3635 message = oscar_encoding_to_utf8(account, charset,
3636 userinfo->away,
3637 userinfo->away_len);
3638 g_free(charset);
3639 purple_prpl_got_user_status(account, userinfo->bn,
3640 purple_status_get_id(status),
3641 "message", message, NULL);
3642 g_free(message);
3643 }
3496 3644
3497 return 1; 3645 return 1;
3498 } 3646 }
3499 3647
3500 static int purple_parse_motd(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) 3648 static int purple_parse_motd(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
4846 data |= AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY; 4994 data |= AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY;
4847 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT)) 4995 else if (!strcmp(status_id, OSCAR_STATUS_ID_FREE4CHAT))
4848 data |= AIM_ICQ_STATE_CHAT; 4996 data |= AIM_ICQ_STATE_CHAT;
4849 else if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE)) 4997 else if (!strcmp(status_id, OSCAR_STATUS_ID_INVISIBLE))
4850 data |= AIM_ICQ_STATE_INVISIBLE; 4998 data |= AIM_ICQ_STATE_INVISIBLE;
4999 else if (!strcmp(status_id, OSCAR_STATUS_ID_EVIL))
5000 data |= AIM_ICQ_STATE_EVIL;
5001 else if (!strcmp(status_id, OSCAR_STATUS_ID_DEPRESSION))
5002 data |= AIM_ICQ_STATE_DEPRESSION;
5003 else if (!strcmp(status_id, OSCAR_STATUS_ID_ATWORK))
5004 data |= AIM_ICQ_STATE_ATWORK;
5005 else if (!strcmp(status_id, OSCAR_STATUS_ID_ATHOME))
5006 data |= AIM_ICQ_STATE_ATHOME;
5007 else if (!strcmp(status_id, OSCAR_STATUS_ID_LUNCH))
5008 data |= AIM_ICQ_STATE_LUNCH;
4851 else if (!strcmp(status_id, OSCAR_STATUS_ID_CUSTOM)) 5009 else if (!strcmp(status_id, OSCAR_STATUS_ID_CUSTOM))
4852 data |= AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY; 5010 data |= AIM_ICQ_STATE_OUT | AIM_ICQ_STATE_AWAY;
4853 5011
4854 aim_srv_setextrainfo(od, TRUE, data, FALSE, NULL, NULL); 5012 aim_srv_setextrainfo(od, TRUE, data, FALSE, NULL, NULL);
4855 } 5013 }
5004 return; 5162 return;
5005 5163
5006 if (!purple_account_is_connected(account)) 5164 if (!purple_account_is_connected(account))
5007 return; 5165 return;
5008 5166
5009 pc = purple_account_get_connection(account); 5167 /* There's no need to do the stuff below for mood updates. */
5010 od = purple_connection_get_protocol_data(pc); 5168 if (purple_status_type_get_primitive(purple_status_get_type(status)) == PURPLE_STATUS_MOOD) {
5169 PurpleConnection *gc = purple_account_get_connection(account);
5170 aim_locate_setcaps((OscarData *)gc->proto_data, purple_caps);
5171 return;
5172 }
5011 5173
5012 /* Set the AIM-style away message for both AIM and ICQ accounts */ 5174 /* Set the AIM-style away message for both AIM and ICQ accounts */
5013 oscar_set_info_and_status(account, FALSE, NULL, TRUE, status); 5175 oscar_set_info_and_status(account, FALSE, NULL, TRUE, status);
5014 5176
5015 /* Set the ICQ status for ICQ accounts only */ 5177 /* Set the ICQ status for ICQ accounts only */
5959 g_free(buf); 6121 g_free(buf);
5960 6122
5961 return 0; 6123 return 0;
5962 } 6124 }
5963 6125
6126 PurpleMood* oscar_get_purple_moods(PurpleAccount *account)
6127 {
6128 return icq_get_purple_moods(account);
6129 }
6130
5964 const char *oscar_list_icon_icq(PurpleAccount *a, PurpleBuddy *b) 6131 const char *oscar_list_icon_icq(PurpleAccount *a, PurpleBuddy *b)
5965 { 6132 {
5966 const char *name = b ? purple_buddy_get_name(b) : NULL; 6133 const char *name = b ? purple_buddy_get_name(b) : NULL;
5967 if ((b == NULL) || (name == NULL) || oscar_util_valid_name_sms(name)) 6134 if ((b == NULL) || (name == NULL) || oscar_util_valid_name_sms(name))
5968 { 6135 {
6035 return "hiptop"; 6202 return "hiptop";
6036 if (userinfo->capabilities & OSCAR_CAPABILITY_SECUREIM) 6203 if (userinfo->capabilities & OSCAR_CAPABILITY_SECUREIM)
6037 return "secure"; 6204 return "secure";
6038 if (userinfo->icqinfo.status & AIM_ICQ_STATE_BIRTHDAY) 6205 if (userinfo->icqinfo.status & AIM_ICQ_STATE_BIRTHDAY)
6039 return "birthday"; 6206 return "birthday";
6207
6208 /* Make the mood icon override anything below this. */
6209 if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_MOOD))
6210 return NULL;
6211
6212 if (userinfo->capabilities & OSCAR_CAPABILITY_HIPTOP)
6213 return "hiptop";
6040 } 6214 }
6041 return NULL; 6215 return NULL;
6042 } 6216 }
6043 6217
6044 void oscar_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full) 6218 void oscar_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full)
6257 purple_value_new(PURPLE_TYPE_STRING), 6431 purple_value_new(PURPLE_TYPE_STRING),
6258 "itmsurl", _("iTunes Music Store Link"), 6432 "itmsurl", _("iTunes Music Store Link"),
6259 purple_value_new(PURPLE_TYPE_STRING), NULL); 6433 purple_value_new(PURPLE_TYPE_STRING), NULL);
6260 status_types = g_list_prepend(status_types, type); 6434 status_types = g_list_prepend(status_types, type);
6261 6435
6262 type = purple_status_type_new_full(PURPLE_STATUS_AVAILABLE, 6436 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
6263 OSCAR_STATUS_ID_FREE4CHAT, 6437 OSCAR_STATUS_ID_FREE4CHAT,
6264 _("Free For Chat"), TRUE, is_icq, FALSE); 6438 _("Free For Chat"), TRUE, is_icq, FALSE,
6439 "message", _("Message"),
6440 purple_value_new(PURPLE_TYPE_STRING), NULL);
6441
6442 status_types = g_list_prepend(status_types, type);
6443
6444 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
6445 OSCAR_STATUS_ID_EVIL,
6446 _("Evil"), TRUE, is_icq, FALSE,
6447 "message", _("Message"),
6448 purple_value_new(PURPLE_TYPE_STRING), NULL);
6449 status_types = g_list_prepend(status_types, type);
6450
6451
6452 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
6453 OSCAR_STATUS_ID_DEPRESSION,
6454 _("Depression"), TRUE, is_icq, FALSE,
6455 "message", _("Message"),
6456 purple_value_new(PURPLE_TYPE_STRING), NULL);
6457 status_types = g_list_prepend(status_types, type);
6458
6459
6460 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
6461 OSCAR_STATUS_ID_ATHOME,
6462 _("At home"), TRUE, is_icq, FALSE,
6463 "message", _("Message"),
6464 purple_value_new(PURPLE_TYPE_STRING), NULL);
6465 status_types = g_list_prepend(status_types, type);
6466
6467
6468 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
6469 OSCAR_STATUS_ID_ATWORK,
6470 _("At work"), TRUE, is_icq, FALSE,
6471 "message", _("Message"),
6472 purple_value_new(PURPLE_TYPE_STRING), NULL);
6473
6474 status_types = g_list_prepend(status_types, type);
6475
6476
6477 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
6478 OSCAR_STATUS_ID_LUNCH,
6479 _("Lunch"), TRUE, is_icq, FALSE,
6480 "message", _("Message"),
6481 purple_value_new(PURPLE_TYPE_STRING), NULL);
6482
6265 status_types = g_list_prepend(status_types, type); 6483 status_types = g_list_prepend(status_types, type);
6266 6484
6267 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY, 6485 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY,
6268 OSCAR_STATUS_ID_AWAY, 6486 OSCAR_STATUS_ID_AWAY,
6269 NULL, TRUE, TRUE, FALSE, 6487 NULL, TRUE, TRUE, FALSE,
6270 "message", _("Message"), 6488 "message", _("Message"),
6271 purple_value_new(PURPLE_TYPE_STRING), NULL); 6489 purple_value_new(PURPLE_TYPE_STRING), NULL);
6272 status_types = g_list_prepend(status_types, type); 6490 status_types = g_list_prepend(status_types, type);
6273 6491
6274 type = purple_status_type_new_full(PURPLE_STATUS_INVISIBLE, 6492 type = purple_status_type_new_with_attrs(PURPLE_STATUS_INVISIBLE,
6275 OSCAR_STATUS_ID_INVISIBLE, 6493 OSCAR_STATUS_ID_INVISIBLE,
6276 NULL, TRUE, TRUE, FALSE); 6494 NULL, TRUE, TRUE, FALSE,
6495 "message", _("Message"),
6496 purple_value_new(PURPLE_TYPE_STRING), NULL);
6497
6277 status_types = g_list_prepend(status_types, type); 6498 status_types = g_list_prepend(status_types, type);
6278 6499
6279 type = purple_status_type_new_full(PURPLE_STATUS_MOBILE, OSCAR_STATUS_ID_MOBILE, NULL, FALSE, FALSE, TRUE); 6500 type = purple_status_type_new_full(PURPLE_STATUS_MOBILE, OSCAR_STATUS_ID_MOBILE, NULL, FALSE, FALSE, TRUE);
6280 status_types = g_list_prepend(status_types, type); 6501 status_types = g_list_prepend(status_types, type);
6281 6502
6304 type = purple_status_type_new_full(PURPLE_STATUS_OFFLINE, 6525 type = purple_status_type_new_full(PURPLE_STATUS_OFFLINE,
6305 OSCAR_STATUS_ID_OFFLINE, 6526 OSCAR_STATUS_ID_OFFLINE,
6306 NULL, TRUE, TRUE, FALSE); 6527 NULL, TRUE, TRUE, FALSE);
6307 status_types = g_list_prepend(status_types, type); 6528 status_types = g_list_prepend(status_types, type);
6308 6529
6309 status_types = g_list_reverse(status_types); 6530 type = purple_status_type_new_with_attrs(PURPLE_STATUS_MOOD,
6310 6531 "mood", NULL, TRUE, is_icq, TRUE,
6311 return status_types; 6532 PURPLE_MOOD_NAME, _("Mood Name"), purple_value_new(PURPLE_TYPE_STRING),
6533 PURPLE_MOOD_COMMENT, _("Mood Comment"), purple_value_new(PURPLE_TYPE_STRING),
6534 NULL);
6535 status_types = g_list_prepend(status_types, type);
6536
6537 return g_list_reverse(status_types);
6312 } 6538 }
6313 6539
6314 static void oscar_ssi_editcomment(struct name_data *data, const char *text) { 6540 static void oscar_ssi_editcomment(struct name_data *data, const char *text) {
6315 PurpleConnection *gc; 6541 PurpleConnection *gc;
6316 PurpleAccount *account; 6542 PurpleAccount *account;
6478 purple_conversation_write(conv, NULL, _("You closed the connection."), 6704 purple_conversation_write(conv, NULL, _("You closed the connection."),
6479 PURPLE_MESSAGE_SYSTEM, time(NULL)); 6705 PURPLE_MESSAGE_SYSTEM, time(NULL));
6480 } 6706 }
6481 } 6707 }
6482 6708
6483 static void 6709 static void oscar_get_icqxstatusmsg (PurpleBlistNode *node, gpointer ignore)
6484 oscar_get_aim_info_cb(PurpleBlistNode *node, gpointer ignore)
6485 { 6710 {
6486 PurpleBuddy *buddy; 6711 PurpleBuddy *buddy;
6487 PurpleConnection *gc; 6712 PurpleConnection *gc;
6488 6713 PurpleAccount *account;
6714
6715
6489 g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); 6716 g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
6490 6717
6491 buddy = (PurpleBuddy *)node; 6718 buddy = (PurpleBuddy *)node;
6492 gc = purple_account_get_connection(purple_buddy_get_account(buddy)); 6719 gc = purple_account_get_connection(buddy->account);
6493 6720 account = purple_connection_get_account(gc);
6494 aim_locate_getinfoshort(purple_connection_get_protocol_data(gc), 6721 purple_debug_info("oscar", "Manual X-Status Get From %s to %s:\n", purple_buddy_get_name(buddy), account->username);
6495 purple_buddy_get_name(buddy), 0x00000003); 6722
6723 icq_im_xstatus_request(gc->proto_data, purple_buddy_get_name(buddy));
6496 } 6724 }
6497 6725
6498 static GList * 6726 static GList *
6499 oscar_buddy_menu(PurpleBuddy *buddy) { 6727 oscar_buddy_menu(PurpleBuddy *buddy) {
6500 6728
6527 PURPLE_CALLBACK(oscar_buddycb_edit_comment), 6755 PURPLE_CALLBACK(oscar_buddycb_edit_comment),
6528 NULL, NULL); 6756 NULL, NULL);
6529 menu = g_list_prepend(menu, act); 6757 menu = g_list_prepend(menu, act);
6530 } 6758 }
6531 6759
6532 #if 0
6533 if (od->icq) 6760 if (od->icq)
6534 { 6761 {
6535 act = purple_menu_action_new(_("Get Status Msg"), 6762 act = purple_menu_action_new(_("Get X-Status Msg"),
6536 PURPLE_CALLBACK(oscar_get_icqstatusmsg), 6763 PURPLE_CALLBACK(oscar_get_icqxstatusmsg),
6537 NULL, NULL); 6764 NULL, NULL);
6538 menu = g_list_prepend(menu, act); 6765 menu = g_list_prepend(menu, act);
6539 } 6766 }
6540 #endif
6541 6767
6542 if (userinfo && 6768 if (userinfo &&
6543 oscar_util_name_compare(purple_account_get_username(account), bname) && 6769 oscar_util_name_compare(purple_account_get_username(account), bname) &&
6544 PURPLE_BUDDY_IS_ONLINE(buddy)) 6770 PURPLE_BUDDY_IS_ONLINE(buddy))
6545 { 6771 {