⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oscar.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		}	}	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 + -