Mercurial > pidgin.yaz
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 { |