📄 msn.c
字号:
types = g_list_append(types, status); status = purple_status_type_new_full(PURPLE_STATUS_AWAY, "brb", _("Be Right Back"), FALSE, TRUE, FALSE); types = g_list_append(types, status); status = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE, "busy", _("Busy"), FALSE, TRUE, FALSE); types = g_list_append(types, status); status = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE, "phone", _("On the Phone"), FALSE, TRUE, FALSE); types = g_list_append(types, status); status = purple_status_type_new_full(PURPLE_STATUS_AWAY, "lunch", _("Out to Lunch"), FALSE, TRUE, FALSE); types = g_list_append(types, status); status = purple_status_type_new_full(PURPLE_STATUS_INVISIBLE, NULL, NULL, FALSE, TRUE, FALSE); types = g_list_append(types, status); status = purple_status_type_new_full(PURPLE_STATUS_OFFLINE, NULL, NULL, FALSE, TRUE, FALSE); types = g_list_append(types, status); status = purple_status_type_new_full(PURPLE_STATUS_MOBILE, "mobile", NULL, FALSE, FALSE, TRUE); types = g_list_append(types, status); return types;}static GList *msn_actions(PurplePlugin *plugin, gpointer context){ PurpleConnection *gc = (PurpleConnection *)context; PurpleAccount *account; const char *user; GList *m = NULL; PurplePluginAction *act; act = purple_plugin_action_new(_("Set Friendly Name..."), msn_show_set_friendly_name); m = g_list_append(m, act); m = g_list_append(m, NULL); act = purple_plugin_action_new(_("Set Home Phone Number..."), msn_show_set_home_phone); m = g_list_append(m, act); act = purple_plugin_action_new(_("Set Work Phone Number..."), msn_show_set_work_phone); m = g_list_append(m, act); act = purple_plugin_action_new(_("Set Mobile Phone Number..."), msn_show_set_mobile_phone); m = g_list_append(m, act); m = g_list_append(m, NULL);#if 0 act = purple_plugin_action_new(_("Enable/Disable Mobile Devices..."), msn_show_set_mobile_support); m = g_list_append(m, act);#endif act = purple_plugin_action_new(_("Allow/Disallow Mobile Pages..."), msn_show_set_mobile_pages); m = g_list_append(m, act); account = purple_connection_get_account(gc); user = msn_normalize(account, purple_account_get_username(account)); if ((strstr(user, "@hotmail.") != NULL) || (strstr(user, "@msn.com") != NULL)) { m = g_list_append(m, NULL); act = purple_plugin_action_new(_("Open Hotmail Inbox"), msn_show_hotmail_inbox); m = g_list_append(m, act); } return m;}static GList *msn_buddy_menu(PurpleBuddy *buddy){ MsnUser *user; GList *m = NULL; PurpleMenuAction *act; g_return_val_if_fail(buddy != NULL, NULL); user = buddy->proto_data; if (user != NULL) { if (user->mobile) { act = purple_menu_action_new(_("Send to Mobile"), PURPLE_CALLBACK(show_send_to_mobile_cb), NULL, NULL); m = g_list_append(m, act); } } if (g_ascii_strcasecmp(buddy->name, purple_account_get_username(buddy->account))) { act = purple_menu_action_new(_("Initiate _Chat"), PURPLE_CALLBACK(initiate_chat_cb), NULL, NULL); m = g_list_append(m, act); } return m;}static GList *msn_blist_node_menu(PurpleBlistNode *node){ if(PURPLE_BLIST_NODE_IS_BUDDY(node)) { return msn_buddy_menu((PurpleBuddy *) node); } else { return NULL; }}static voidmsn_login(PurpleAccount *account){ PurpleConnection *gc; MsnSession *session; const char *username; const char *host; gboolean http_method = FALSE; int port; gc = purple_account_get_connection(account); if (!purple_ssl_is_supported()) { gc->wants_to_die = TRUE; purple_connection_error(gc, _("SSL support is needed for MSN. Please install a supported " "SSL library.")); return; } http_method = purple_account_get_bool(account, "http_method", FALSE); host = purple_account_get_string(account, "server", MSN_SERVER); port = purple_account_get_int(account, "port", MSN_PORT); session = msn_session_new(account); gc->proto_data = session; gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_FORMATTING_WBFO | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_FONTSIZE | PURPLE_CONNECTION_NO_URLDESC; msn_session_set_login_step(session, MSN_LOGIN_STEP_START); /* Hmm, I don't like this. */ /* XXX shx: Me neither */ username = msn_normalize(account, purple_account_get_username(account)); if (strcmp(username, purple_account_get_username(account))) purple_account_set_username(account, username); if (!msn_session_connect(session, host, port, http_method)) purple_connection_error(gc, _("Failed to connect to server."));}static voidmsn_close(PurpleConnection *gc){ MsnSession *session; session = gc->proto_data; g_return_if_fail(session != NULL); msn_session_destroy(session); gc->proto_data = NULL;}static gbooleanmsn_send_me_im(gpointer data){ MsnIMData *imdata = data; serv_got_im(imdata->gc, imdata->who, imdata->msg, imdata->flags, imdata->when); g_free(imdata->msg); g_free(imdata); return FALSE;}static intmsn_send_im(PurpleConnection *gc, const char *who, const char *message, PurpleMessageFlags flags){ PurpleAccount *account; PurpleBuddy *buddy = purple_find_buddy(gc->account, who); MsnMessage *msg; char *msgformat; char *msgtext; account = purple_connection_get_account(gc); if (buddy) { PurplePresence *p = purple_buddy_get_presence(buddy); if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) { char *text = purple_markup_strip_html(message); send_to_mobile(gc, who, text); g_free(text); return 1; } } msn_import_html(message, &msgformat, &msgtext); if (strlen(msgtext) + strlen(msgformat) + strlen(VERSION) > 1564) { g_free(msgformat); g_free(msgtext); return -E2BIG; } msg = msn_message_new_plain(msgtext); msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat); g_free(msgformat); g_free(msgtext); if (g_ascii_strcasecmp(who, purple_account_get_username(account))) { MsnSession *session; MsnSwitchBoard *swboard; session = gc->proto_data; swboard = msn_session_get_swboard(session, who, MSN_SB_FLAG_IM); msn_switchboard_send_msg(swboard, msg, TRUE); } else { char *body_str, *body_enc, *pre, *post; const char *format; MsnIMData *imdata = g_new0(MsnIMData, 1); /* * In MSN, you can't send messages to yourself, so * we'll fake like we received it ;) */ body_str = msn_message_to_string(msg); body_enc = g_markup_escape_text(body_str, -1); g_free(body_str); format = msn_message_get_attr(msg, "X-MMS-IM-Format"); msn_parse_format(format, &pre, &post); body_str = g_strdup_printf("%s%s%s", pre ? pre : "", body_enc ? body_enc : "", post ? post : ""); g_free(body_enc); g_free(pre); g_free(post); serv_got_typing_stopped(gc, who); imdata->gc = gc; imdata->who = who; imdata->msg = body_str; imdata->flags = flags; imdata->when = time(NULL); g_idle_add(msn_send_me_im, imdata); } msn_message_destroy(msg); return 1;}static unsigned intmsn_send_typing(PurpleConnection *gc, const char *who, PurpleTypingState state){ PurpleAccount *account; MsnSession *session; MsnSwitchBoard *swboard; MsnMessage *msg; account = purple_connection_get_account(gc); session = gc->proto_data; /* * TODO: I feel like this should be "if (state != PURPLE_TYPING)" * but this is how it was before, and I don't want to break * anything. --KingAnt */ if (state == PURPLE_NOT_TYPING) return 0; if (!g_ascii_strcasecmp(who, purple_account_get_username(account))) { /* We'll just fake it, since we're sending to ourself. */ serv_got_typing(gc, who, MSN_TYPING_RECV_TIMEOUT, PURPLE_TYPING); return MSN_TYPING_SEND_TIMEOUT; } swboard = msn_session_find_swboard(session, who); if (swboard == NULL || !msn_switchboard_can_send(swboard)) return 0; swboard->flag |= MSN_SB_FLAG_IM; msg = msn_message_new(MSN_MSG_TYPING); msn_message_set_content_type(msg, "text/x-msmsgscontrol"); msn_message_set_flag(msg, 'U'); msn_message_set_attr(msg, "TypingUser", purple_account_get_username(account)); msn_message_set_bin_data(msg, "\r\n", 2); msn_switchboard_send_msg(swboard, msg, FALSE); msn_message_destroy(msg); return MSN_TYPING_SEND_TIMEOUT;}static voidmsn_set_status(PurpleAccount *account, PurpleStatus *status){ PurpleConnection *gc; MsnSession *session; gc = purple_account_get_connection(account); if (gc != NULL) { session = gc->proto_data; msn_change_status(session); }}static voidmsn_set_idle(PurpleConnection *gc, int idle){ MsnSession *session; session = gc->proto_data; msn_change_status(session);}#if 0static voidfake_userlist_add_buddy(MsnUserList *userlist, const char *who, int list_id, const char *group_name){ MsnUser *user; static int group_id_c = 1; int group_id; group_id = -1; if (group_name != NULL) { MsnGroup *group; group = msn_group_new(userlist, group_id_c, group_name); group_id = group_id_c++; } user = msn_userlist_find_user(userlist, who); if (user == NULL) { user = msn_user_new(userlist, who, NULL); msn_userlist_add_user(userlist, user); } else if (user->list_op & (1 << list_id)) { if (list_id == MSN_LIST_FL) { if (group_id >= 0) if (g_list_find(user->group_ids, GINT_TO_POINTER(group_id))) return; } else return; } if (group_id >= 0) { user->group_ids = g_list_append(user->group_ids, GINT_TO_POINTER(group_id)); } user->list_op |= (1 << list_id);}#endifstatic voidmsn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group){ MsnSession *session; MsnUserList *userlist; const char *who; session = gc->proto_data; userlist = session->userlist; who = msn_normalize(gc->account, buddy->name); if (!session->logged_in) {#if 0 fake_userlist_add_buddy(session->sync_userlist, who, MSN_LIST_FL, group ? group->name : NULL);#else purple_debug_error("msn", "msn_add_buddy called before connected\n");#endif return; }#if 0 if (group != NULL && group->name != NULL) purple_debug_info("msn", "msn_add_buddy: %s, %s\n", who, group->name); else purple_debug_info("msn", "msn_add_buddy: %s\n", who);#endif#if 0 /* Which is the max? */ if (session->fl_users_count >= 150) { purple_debug_info("msn", "Too many buddies\n"); /* Buddy list full */ /* TODO: purple should be notified of this */ return; }#endif /* XXX - Would group ever be NULL here? I don't think so... * shx: Yes it should; MSN handles non-grouped buddies, and this is only * internal. */ msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, group ? group->name : NULL);}static voidmsn_rem_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group){ MsnSession *session; MsnUserList *userlist; session = gc->proto_data; userlist = session->userlist; if (!session->logged_in) return; /* XXX - Does buddy->name need to be msn_normalize'd here? --KingAnt */ msn_userlist_rem_buddy(userlist, buddy->name, MSN_LIST_FL, group->name);}static voidmsn_add_permit(PurpleConnection *gc, const char *who){ MsnSession *session; MsnUserList *userlist; MsnUser *user; session = gc->proto_data; userlist = session->userlist; user = msn_userlist_find_user(userlist, who); if (!session->logged_in) return; if (user != NULL && user->list_op & MSN_LIST_BL_OP) msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL); msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL);}static voidmsn_add_deny(PurpleConnection *gc, const char *who){ MsnSession *session; MsnUserList *userlist; MsnUser *user; session = gc->proto_data; userlist = session->userlist; user = msn_userlist_find_user(userlist, who); if (!session->logged_in) return; if (user != NULL && user->list_op & MSN_LIST_AL_OP) msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL); msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL);}static voidmsn_rem_permit(PurpleConnection *gc, const char *who){ MsnSession *session; MsnUserList *userlist; MsnUser *user; session = gc->proto_data; userlist = session->userlist; if (!session->logged_in) return; user = msn_userlist_find_user(userlist, who); msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL); if (user != NULL && user->list_op & MSN_LIST_RL_OP) msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL);}static voidmsn_rem_deny(PurpleConnection *gc, const char *who){ MsnSession *session; MsnUserList *userlist; MsnUser *user; session = gc->proto_data; userlist = session->userlist; if (!session->logged_in) return; user = msn_userlist_find_user(userlist, who);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -