📄 oscar.c
字号:
} } if ((bi != NULL) && (bi->ipaddr != 0)) { tmp = g_strdup_printf("%hhu.%hhu.%hhu.%hhu", (bi->ipaddr & 0xff000000) >> 24, (bi->ipaddr & 0x00ff0000) >> 16, (bi->ipaddr & 0x0000ff00) >> 8, (bi->ipaddr & 0x000000ff)); oscar_user_info_add_pair(user_info, _("IP Address"), tmp); g_free(tmp); } if ((userinfo != NULL) && (userinfo->warnlevel != 0)) { tmp = g_strdup_printf("%d", (int)(userinfo->warnlevel/10.0 + .5)); oscar_user_info_add_pair(user_info, _("Warning Level"), tmp); g_free(tmp); } if ((b != NULL) && (b->name != NULL) && (g != NULL) && (g->name != NULL)) { tmp = aim_ssi_getcomment(od->ssi.local, g->name, b->name); if (tmp != NULL) { char *tmp2 = g_markup_escape_text(tmp, strlen(tmp)); g_free(tmp); oscar_user_info_convert_and_add_pair(account, user_info, _("Buddy Comment"), tmp2); g_free(tmp2); } }}static char *extract_name(const char *name) { char *tmp, *x; int i, j; if (!name) return NULL; x = strchr(name, '-'); if (!x) return NULL; x = strchr(x + 1, '-'); if (!x) return NULL; tmp = g_strdup(++x); for (i = 0, j = 0; x[i]; i++) { char hex[3]; if (x[i] != '%') { tmp[j++] = x[i]; continue; } strncpy(hex, x + ++i, 2); hex[2] = 0; i++; tmp[j++] = strtol(hex, NULL, 16); } tmp[j] = 0; return tmp;}static struct chat_connection *find_oscar_chat(PurpleConnection *gc, int id){ OscarData *od = (OscarData *)gc->proto_data; GSList *cur; struct chat_connection *cc; for (cur = od->oscar_chats; cur != NULL; cur = cur->next) { cc = (struct chat_connection *)cur->data; if (cc->id == id) return cc; } return NULL;}static struct chat_connection *find_oscar_chat_by_conn(PurpleConnection *gc, FlapConnection *conn){ OscarData *od = (OscarData *)gc->proto_data; GSList *cur; struct chat_connection *cc; for (cur = od->oscar_chats; cur != NULL; cur = cur->next) { cc = (struct chat_connection *)cur->data; if (cc->conn == conn) return cc; } return NULL;}static struct chat_connection *find_oscar_chat_by_conv(PurpleConnection *gc, PurpleConversation *conv){ OscarData *od = (OscarData *)gc->proto_data; GSList *cur; struct chat_connection *cc; for (cur = od->oscar_chats; cur != NULL; cur = cur->next) { cc = (struct chat_connection *)cur->data; if (cc->conv == conv) return cc; } return NULL;}voidoscar_chat_destroy(struct chat_connection *cc){ g_free(cc->name); g_free(cc->show); g_free(cc);}static voidoscar_chat_kill(PurpleConnection *gc, struct chat_connection *cc){ OscarData *od = (OscarData *)gc->proto_data; /* Notify the conversation window that we've left the chat */ serv_got_chat_left(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(cc->conv))); /* Destroy the chat_connection */ od->oscar_chats = g_slist_remove(od->oscar_chats, cc); flap_connection_schedule_destroy(cc->conn, OSCAR_DISCONNECT_DONE, NULL); oscar_chat_destroy(cc);}/** * This is the callback function anytime purple_proxy_connect() * establishes a new TCP connection with an oscar host. Depending * on the type of host, we do a few different things here. */static voidconnection_established_cb(gpointer data, gint source, const gchar *error_message){ PurpleConnection *gc; OscarData *od; PurpleAccount *account; FlapConnection *conn; conn = data; od = conn->od; gc = od->gc; account = purple_connection_get_account(gc); conn->connect_data = NULL; conn->fd = source; if (source < 0) { purple_debug_error("oscar", "unable to connect FLAP server " "of type 0x%04hx\n", conn->type); if (conn->type == SNAC_FAMILY_AUTH) { gchar *msg; msg = g_strdup_printf(_("Could not connect to authentication server:\n%s"), error_message); purple_connection_error(gc, msg); g_free(msg); } else if (conn->type == SNAC_FAMILY_LOCATE) { gchar *msg; msg = g_strdup_printf(_("Could not connect to BOS server:\n%s"), error_message); purple_connection_error(gc, msg); g_free(msg); } else { /* Maybe we should call this for BOS connections, too? */ flap_connection_schedule_destroy(conn, OSCAR_DISCONNECT_COULD_NOT_CONNECT, error_message); } return; } purple_debug_info("oscar", "connected to FLAP server of type 0x%04hx\n", conn->type); conn->watcher_incoming = purple_input_add(conn->fd, PURPLE_INPUT_READ, flap_connection_recv_cb, conn); if (conn->cookie == NULL) { if (!aim_sn_is_icq(purple_account_get_username(account))) /* * We don't send this when authenticating an ICQ account * because for some reason ICQ is still using the * assy/insecure authentication procedure. */ flap_connection_send_version(od, conn); } else { flap_connection_send_version_with_cookie(od, conn, conn->cookielen, conn->cookie); g_free(conn->cookie); conn->cookie = NULL; } if (conn->type == SNAC_FAMILY_AUTH) { aim_request_login(od, conn, purple_account_get_username(account)); purple_debug_info("oscar", "Screen name sent, waiting for response\n"); purple_connection_update_progress(gc, _("Screen name sent"), 1, OSCAR_CONNECT_STEPS); ck[1] = 0x65; } else if (conn->type == SNAC_FAMILY_LOCATE) { purple_connection_update_progress(gc, _("Connection established, cookie sent"), 4, OSCAR_CONNECT_STEPS); ck[4] = 0x61; } else if (conn->type == SNAC_FAMILY_CHAT) { od->oscar_chats = g_slist_prepend(od->oscar_chats, conn->new_conn_data); conn->new_conn_data = NULL; }}static voidflap_connection_established_bos(OscarData *od, FlapConnection *conn){ PurpleConnection *gc = od->gc; aim_srv_reqpersonalinfo(od, conn); purple_debug_info("oscar", "ssi: requesting rights and list\n"); aim_ssi_reqrights(od); aim_ssi_reqdata(od); if (od->getblisttimer > 0) purple_timeout_remove(od->getblisttimer); od->getblisttimer = purple_timeout_add(30000, purple_ssi_rerequestdata, od); aim_locate_reqrights(od); aim_buddylist_reqrights(od, conn); aim_im_reqparams(od); aim_bos_reqrights(od, conn); /* TODO: Don't call this with ssi */ purple_connection_update_progress(gc, _("Finalizing connection"), 5, OSCAR_CONNECT_STEPS);}static voidflap_connection_established_admin(OscarData *od, FlapConnection *conn){ aim_clientready(od, conn); purple_debug_info("oscar", "connected to admin\n"); if (od->chpass) { purple_debug_info("oscar", "changing password\n"); aim_admin_changepasswd(od, conn, od->newp, od->oldp); g_free(od->oldp); od->oldp = NULL; g_free(od->newp); od->newp = NULL; od->chpass = FALSE; } if (od->setnick) { purple_debug_info("oscar", "formatting screen name\n"); aim_admin_setnick(od, conn, od->newsn); g_free(od->newsn); od->newsn = NULL; od->setnick = FALSE; } if (od->conf) { purple_debug_info("oscar", "confirming account\n"); aim_admin_reqconfirm(od, conn); od->conf = FALSE; } if (od->reqemail) { purple_debug_info("oscar", "requesting e-mail address\n"); aim_admin_getinfo(od, conn, 0x0011); od->reqemail = FALSE; } if (od->setemail) { purple_debug_info("oscar", "setting e-mail address\n"); aim_admin_setemail(od, conn, od->email); g_free(od->email); od->email = NULL; od->setemail = FALSE; }}static voidflap_connection_established_chat(OscarData *od, FlapConnection *conn){ PurpleConnection *gc = od->gc; struct chat_connection *chatcon; static int id = 1; aim_clientready(od, conn); chatcon = find_oscar_chat_by_conn(gc, conn); chatcon->id = id; chatcon->conv = serv_got_joined_chat(gc, id++, chatcon->show);}static voidflap_connection_established_chatnav(OscarData *od, FlapConnection *conn){ aim_clientready(od, conn); aim_chatnav_reqrights(od, conn);}static voidflap_connection_established_alert(OscarData *od, FlapConnection *conn){ aim_email_sendcookies(od); aim_email_activate(od); aim_clientready(od, conn);}static voidflap_connection_established_bart(OscarData *od, FlapConnection *conn){ PurpleConnection *gc = od->gc; aim_clientready(od, conn); od->iconconnecting = FALSE; if (od->icontimer == 0) od->icontimer = purple_timeout_add(100, purple_icon_timerfunc, gc);}static intflap_connection_established(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...){ purple_debug_info("oscar", "FLAP connection of type 0x%04hx is " "now fully connected\n", conn->type); if (conn->type == SNAC_FAMILY_LOCATE) flap_connection_established_bos(od, conn); else if (conn->type == SNAC_FAMILY_ADMIN) flap_connection_established_admin(od, conn); else if (conn->type == SNAC_FAMILY_CHAT) flap_connection_established_chat(od, conn); else if (conn->type == SNAC_FAMILY_CHATNAV) flap_connection_established_chatnav(od, conn); else if (conn->type == SNAC_FAMILY_ALERT) flap_connection_established_alert(od, conn); else if (conn->type == SNAC_FAMILY_BART) flap_connection_established_bart(od, conn); return 1;}voidoscar_login(PurpleAccount *account){ PurpleConnection *gc; OscarData *od; FlapConnection *newconn; gc = purple_account_get_connection(account); od = gc->proto_data = oscar_data_new(); od->gc = gc; oscar_data_addhandler(od, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, purple_connerr, 0); oscar_data_addhandler(od, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, flap_connection_established, 0); oscar_data_addhandler(od, SNAC_FAMILY_ADMIN, 0x0003, purple_info_change, 0); oscar_data_addhandler(od, SNAC_FAMILY_ADMIN, 0x0005, purple_info_change, 0); oscar_data_addhandler(od, SNAC_FAMILY_ADMIN, 0x0007, purple_account_confirm, 0); oscar_data_addhandler(od, SNAC_FAMILY_ALERT, 0x0001, purple_parse_genericerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_ALERT, SNAC_SUBTYPE_ALERT_MAILSTATUS, purple_email_parseupdate, 0); oscar_data_addhandler(od, SNAC_FAMILY_AUTH, 0x0003, purple_parse_auth_resp, 0); oscar_data_addhandler(od, SNAC_FAMILY_AUTH, 0x0007, purple_parse_login, 0); oscar_data_addhandler(od, SNAC_FAMILY_AUTH, SNAC_SUBTYPE_AUTH_SECURID_REQUEST, purple_parse_auth_securid_request, 0); oscar_data_addhandler(od, SNAC_FAMILY_BART, SNAC_SUBTYPE_BART_ERROR, purple_icon_error, 0); oscar_data_addhandler(od, SNAC_FAMILY_BART, SNAC_SUBTYPE_BART_RESPONSE, purple_icon_parseicon, 0); oscar_data_addhandler(od, SNAC_FAMILY_BOS, 0x0001, purple_parse_genericerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_BOS, 0x0003, purple_bosrights, 0); oscar_data_addhandler(od, SNAC_FAMILY_BUDDY, 0x0001, purple_parse_genericerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_BUDDY, SNAC_SUBTYPE_BUDDY_RIGHTSINFO, purple_parse_buddyrights, 0); oscar_data_addhandler(od, SNAC_FAMILY_BUDDY, SNAC_SUBTYPE_BUDDY_ONCOMING, purple_parse_oncoming, 0); oscar_data_addhandler(od, SNAC_FAMILY_BUDDY, SNAC_SUBTYPE_BUDDY_OFFGOING, purple_parse_offgoing, 0); oscar_data_addhandler(od, SNAC_FAMILY_CHAT, 0x0001, purple_parse_genericerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_CHAT, SNAC_SUBTYPE_CHAT_USERJOIN, purple_conv_chat_join, 0); oscar_data_addhandler(od, SNAC_FAMILY_CHAT, SNAC_SUBTYPE_CHAT_USERLEAVE, purple_conv_chat_leave, 0); oscar_data_addhandler(od, SNAC_FAMILY_CHAT, SNAC_SUBTYPE_CHAT_ROOMINFOUPDATE, purple_conv_chat_info_update, 0); oscar_data_addhandler(od, SNAC_FAMILY_CHAT, SNAC_SUBTYPE_CHAT_INCOMINGMSG, purple_conv_chat_incoming_msg, 0); oscar_data_addhandler(od, SNAC_FAMILY_CHATNAV, 0x0001, purple_parse_genericerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_CHATNAV, SNAC_SUBTYPE_CHATNAV_INFO, purple_chatnav_info, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_ERROR, purple_ssi_parseerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RIGHTSINFO, purple_ssi_parserights, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_LIST, purple_ssi_parselist, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_SRVACK, purple_ssi_parseack, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_ADD, purple_ssi_parseadd, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTH, purple_ssi_authgiven, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTHREQ, purple_ssi_authrequest, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTHREP, purple_ssi_authreply, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_ADDED, purple_ssi_gotadded, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICBM, 0x0005, purple_icbm_param_info, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_INCOMING, purple_parse_incoming_im, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_MISSEDCALL, purple_parse_misses, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_CLIENTAUTORESP, purple_parse_clientauto, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_ERROR, purple_parse_msgerr, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_MTN, purple_parse_mtn, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICBM, SNAC_SUBTYPE_ICBM_ACK, purple_parse_msgack, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_OFFLINEMSG, purple_offlinemsg, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_OFFLINEMSGCOMPLETE, purple_offlinemsgdone, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_ALIAS, purple_icqalias, 0); oscar_data_addhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_INFO, purple_icqinfo, 0); 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -