📄 msn.c
字号:
gc->proto_data = session; gc->flags |= GAIM_CONNECTION_HTML | GAIM_CONNECTION_FORMATTING_WBFO | GAIM_CONNECTION_NO_BGCOLOR | GAIM_CONNECTION_NO_FONTSIZE | GAIM_CONNECTION_NO_URLDESC; gaim_connection_update_progress(gc, _("Connecting"), 0, MSN_CONNECT_STEPS); /* Hmm, I don't like this. */ username = msn_normalize(account, gaim_account_get_username(account)); if (strcmp(username, gaim_account_get_username(account))) gaim_account_set_username(account, username); msn_session_connect(session);}static voidmsn_close(GaimConnection *gc){ MsnSession *session; session = gc->proto_data; g_return_if_fail(session != NULL); if (session->http_method) msn_http_session_uninit(session); msn_session_destroy(session); gc->proto_data = NULL;}static intmsn_send_im(GaimConnection *gc, const char *who, const char *message, GaimConvImFlags flags){ GaimAccount *account; account = gaim_connection_get_account(gc); if (g_ascii_strcasecmp(who, gaim_account_get_username(account))) { MsnSession *session; MsnSwitchBoard *swboard; MsnMessage *msg; char *msgformat; char *msgtext; session = gc->proto_data; swboard = msn_session_get_swboard(session, who); msn_import_html(message, &msgformat, &msgtext); msg = msn_message_new_plain(msgtext); msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat); g_free(msgformat); g_free(msgtext); swboard = msn_session_get_swboard(session, who); if (!g_queue_is_empty(swboard->im_queue) || !swboard->user_joined) { msn_switchboard_queue_msg(swboard, msg); } else { msn_switchboard_send_msg(swboard, msg); } msn_message_destroy(msg); } else { /* * In MSN, you can't send messages to yourself, so * we'll fake like we received it ;) */ serv_got_typing_stopped(gc, who); serv_got_im(gc, who, message, flags, time(NULL)); } return 1;}static intmsn_send_typing(GaimConnection *gc, const char *who, int typing){ GaimAccount *account; MsnSession *session; MsnSwitchBoard *swboard; MsnMessage *msg; account = gaim_connection_get_account(gc); session = gc->proto_data; if (!typing) return 0; if (!g_ascii_strcasecmp(who, gaim_account_get_username(account))) { /* We'll just fake it, since we're sending to ourself. */ serv_got_typing(gc, who, MSN_TYPING_RECV_TIMEOUT, GAIM_TYPING); return MSN_TYPING_SEND_TIMEOUT; } swboard = msn_session_find_swboard(session, who); if (swboard == NULL) return 0; if (!swboard->user_joined) return 0; msg = msn_message_new(); msn_message_set_content_type(msg, "text/x-msmsgscontrol"); msn_message_set_flag(msg, 'U'); msn_message_set_attr(msg, "TypingUser", gaim_account_get_username(account)); msn_message_set_bin_data(msg, "\r\n", 2); msn_switchboard_send_msg(swboard, msg); msn_message_destroy(msg); return MSN_TYPING_SEND_TIMEOUT;}static voidmsn_set_away(GaimConnection *gc, const char *state, const char *msg){ MsnSession *session; int status; session = gc->proto_data; if (gc->away != NULL) { g_free(gc->away); gc->away = NULL; } if (msg != NULL) { gc->away = g_strdup(""); status = MSN_AWAY; } else if (state) { gc->away = g_strdup(""); if (!strcmp(state, _("Away From Computer"))) status = MSN_AWAY; else if (!strcmp(state, _("Be Right Back"))) status = MSN_BRB; else if (!strcmp(state, _("Busy"))) status = MSN_BUSY; else if (!strcmp(state, _("On The Phone"))) status = MSN_PHONE; else if (!strcmp(state, _("Out To Lunch"))) status = MSN_LUNCH; else if (!strcmp(state, _("Hidden"))) status = MSN_HIDDEN; else { g_free(gc->away); gc->away = NULL; status = MSN_ONLINE; } } else if (gc->is_idle) status = MSN_IDLE; else status = MSN_ONLINE; msn_change_status(session, status);}static voidmsn_set_idle(GaimConnection *gc, int idle){ MsnSession *session; session = gc->proto_data; if (gc->away != NULL) return; msn_change_status(session, (idle ? MSN_IDLE : MSN_ONLINE));}static 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);}static voidmsn_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *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) { fake_userlist_add_buddy(session->sync_userlist, who, MSN_LIST_FL, group ? group->name : NULL); return; }#if 0 if (group != NULL && group->name != NULL) gaim_debug_info("msn", "msn_add_buddy: %s, %s\n", who, group->name); else gaim_debug_info("msn", "msn_add_buddy: %s\n", who);#endif#if 0 /* Which is the max? */ if (session->fl_users_count >= 150) { gaim_debug_info("msn", "Too many buddies\n"); /* Buddy list full */ /* TODO: gaim 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(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *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(GaimConnection *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(GaimConnection *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(GaimConnection *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);}voidmsn_rem_deny(GaimConnection *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_BL, NULL); if (user != NULL && user->list_op & MSN_LIST_RL_OP) msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL);}static voidmsn_set_permit_deny(GaimConnection *gc){ GaimAccount *account; MsnSession *session; MsnCmdProc *cmdproc; account = gaim_connection_get_account(gc); session = gc->proto_data; cmdproc = session->notification->cmdproc; if (account->perm_deny == GAIM_PRIVACY_ALLOW_ALL || account->perm_deny == GAIM_PRIVACY_DENY_USERS) { msn_cmdproc_send(cmdproc, "BLP", "%s", "AL"); } else { msn_cmdproc_send(cmdproc, "BLP", "%s", "BL"); }}static voidmsn_chat_invite(GaimConnection *gc, int id, const char *msg, const char *who){ MsnSession *session; MsnSwitchBoard *swboard; MsnCmdProc *cmdproc; session = gc->proto_data; swboard = msn_session_find_switch_with_id(session, id); g_return_if_fail(swboard != NULL); cmdproc = swboard->servconn->cmdproc; msn_cmdproc_send(cmdproc, "CAL", "%s", who);}static voidmsn_chat_leave(GaimConnection *gc, int id){ MsnSession *session; MsnSwitchBoard *swboard; MsnCmdProc *cmdproc; session = gc->proto_data; swboard = msn_session_find_switch_with_id(session, id); g_return_if_fail(swboard != NULL); cmdproc = swboard->servconn->cmdproc; msn_cmdproc_send_quick(cmdproc, "OUT", NULL, NULL); msn_switchboard_destroy(swboard); /* serv_got_chat_left(gc, id); */}static intmsn_chat_send(GaimConnection *gc, int id, const char *message){ GaimAccount *account; MsnSession *session; MsnSwitchBoard *swboard; MsnMessage *msg; char *msgformat; char *msgtext; account = gaim_connection_get_account(gc); session = gc->proto_data; swboard = msn_session_find_switch_with_id(session, id); if (swboard == NULL) return -EINVAL; if (swboard->ready) { msn_import_html(message, &msgformat, &msgtext); msg = msn_message_new_plain(msgtext); msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat); msn_switchboard_send_msg(swboard, msg); msn_message_destroy(msg); g_free(msgformat); g_free(msgtext); serv_got_chat_in(gc, id, gaim_account_get_username(account), 0, message, time(NULL)); } return 0;}static voidmsn_keepalive(GaimConnection *gc){ MsnSession *session; MsnCmdProc *cmdproc; session = gc->proto_data; cmdproc = session->notification->cmdproc; if (!session->http_method) msn_cmdproc_send_quick(cmdproc, "PNG", NULL, NULL);}static voidmsn_group_buddy(GaimConnection *gc, const char *who, const char *old_group_name, const char *new_group_name){ MsnSession *session; MsnUserList *userlist; session = gc->proto_data; userlist = session->userlist; msn_userlist_move_buddy(userlist, who, old_group_name, new_group_name);}static voidmsn_rename_group(GaimConnection *gc, const char *old_name, GaimGroup *group, GList *moved_buddies){ MsnSession *session; MsnCmdProc *cmdproc; int old_gid; const char *enc_new_group_name; session = gc->proto_data; cmdproc = session->notification->cmdproc; enc_new_group_name = gaim_url_encode(group->name); old_gid = msn_userlist_find_group_id(session->userlist, old_name); if (old_gid >= 0) { msn_cmdproc_send(cmdproc, "REG", "%d %s 0", old_gid, enc_new_group_name); } else { msn_cmdproc_send(cmdproc, "ADG", "%s 0", enc_new_group_name); }}static voidmsn_convo_closed(GaimConnection *gc, const char *who){ MsnSession *session; MsnSwitchBoard *swboard; MsnCmdProc *cmdproc; session = gc->proto_data; swboard = msn_session_find_swboard(session, who); /* * Don't perform an assertion here. It swboard is NULL, then the * switchboard was either closed by the other party, or the person * is talking to himself. */ if (swboard == NULL) return; cmdproc = swboard->servconn->cmdproc; if (swboard->current_users == 1) { /* This must happen on both IM's and Chat's, right? */ GaimAccount *account; account = gaim_connection_get_account(gc); msn_cmdproc_send_quick(cmdproc, "BYE", "%s", gaim_account_get_username(account)); msn_switchboard_destroy(swboard); }}static voidmsn_set_buddy_icon(GaimConnection *gc, const char *filename){ MsnSession *session; MsnUser *user; session = gc->proto_data; user = session->user; msn_user_set_buddy_icon(user, filename); msn_change_status(session, session->state);}static voidmsn_remove_group(GaimConnection *gc, GaimGroup *group){ MsnSession *session; MsnCmdProc *cmdproc; int group_id; session = gc->proto_data; cmdproc = session->notification->cmdproc; if ((group_id = msn_userlist_find_group_id(session->userlist, group->name)) >= 0) { msn_cmdproc_send(cmdproc, "RMG", "%d", group_id); }}static char *msn_tooltip_info_text(MsnGetInfoData *info_data){ GString *s; GString *name; GaimBuddy *b; const char *p; s = g_string_sized_new(80); /* wild guess */ /* Try to not display the MSN screen name as an email address */ p = strrchr(info_data->name, '@'); if (p) { name = g_string_new_len(info_data->name, p - info_data->name); g_string_append_printf(name, "@%s", p + 1); } else { /* This should never happen */ name = g_string_new(info_data->name); } g_string_printf(s, "<span style=\"font-size: larger\"><b>%s</b></span><br>", name->str); g_string_free(name, TRUE); b = gaim_find_buddy(gaim_connection_get_account(info_data->gc), info_data->name); if (b) { MsnUser *user; char *statustext = msn_tooltip_text(b); if (b->alias && b->alias[0]) { char *aliastext = g_markup_escape_text(b->alias, -1); g_string_append_printf(s, _("<b>Alias:</b> %s<br>"), aliastext); g_free(aliastext); } if (b->server_alias)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -