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

📄 notification.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	g_free(buf);	memset(sendbuf, 0, sizeof(sendbuf));	for (i = 0; i < 16; i++)	{		g_snprintf(buf2, sizeof(buf2), "%02x", digest[i]);		strcat(sendbuf, buf2);	}	if (session->passport_info.file != NULL)	{		g_unlink(session->passport_info.file);		g_free(session->passport_info.file);	}	if ((fd = purple_mkstemp(&session->passport_info.file, FALSE)) == NULL)	{		purple_debug_error("msn",						 "Error opening temp passport file: %s\n",						 strerror(errno));	}	else	{#ifdef _WIN32		fputs("<!-- saved from url=(0013)about:internet -->\n", fd);#endif		fputs("<html>\n"			  "<head>\n"			  "<noscript>\n"			  "<meta http-equiv=\"Refresh\" content=\"0; "			  "url=http://www.hotmail.com\">\n"			  "</noscript>\n"			  "</head>\n\n",			  fd);		fprintf(fd, "<body onload=\"document.pform.submit(); \">\n");		fprintf(fd, "<form name=\"pform\" action=\"%s\" method=\"POST\">\n\n",				url);		fprintf(fd, "<input type=\"hidden\" name=\"mode\" value=\"ttl\">\n");		fprintf(fd, "<input type=\"hidden\" name=\"login\" value=\"%s\">\n",				purple_account_get_username(account));		fprintf(fd, "<input type=\"hidden\" name=\"username\" value=\"%s\">\n",				purple_account_get_username(account));		if (session->passport_info.sid != NULL)			fprintf(fd, "<input type=\"hidden\" name=\"sid\" value=\"%s\">\n",					session->passport_info.sid);		if (session->passport_info.kv != NULL)			fprintf(fd, "<input type=\"hidden\" name=\"kv\" value=\"%s\">\n",					session->passport_info.kv);		fprintf(fd, "<input type=\"hidden\" name=\"id\" value=\"2\">\n");		fprintf(fd, "<input type=\"hidden\" name=\"sl\" value=\"%ld\">\n",				time(NULL) - session->passport_info.sl);		fprintf(fd, "<input type=\"hidden\" name=\"rru\" value=\"%s\">\n",				rru);		if (session->passport_info.mspauth != NULL)			fprintf(fd, "<input type=\"hidden\" name=\"auth\" value=\"%s\">\n",					session->passport_info.mspauth);		fprintf(fd, "<input type=\"hidden\" name=\"creds\" value=\"%s\">\n",				sendbuf); /* TODO Digest me (huh? -- ChipX86) */		fprintf(fd, "<input type=\"hidden\" name=\"svc\" value=\"mail\">\n");		fprintf(fd, "<input type=\"hidden\" name=\"js\" value=\"yes\">\n");		fprintf(fd, "</form></body>\n");		fprintf(fd, "</html>\n");		if (fclose(fd))		{			purple_debug_error("msn",							 "Error closing temp passport file: %s\n",							 strerror(errno));			g_unlink(session->passport_info.file);			g_free(session->passport_info.file);			session->passport_info.file = NULL;		}#ifdef _WIN32		else		{			/*			 * Renaming file with .html extension, so that the			 * win32 open_url will work.			 */			char *tmp;			if ((tmp =				g_strdup_printf("%s.html",					session->passport_info.file)) != NULL)			{				if (g_rename(session->passport_info.file,							tmp) == 0)				{					g_free(session->passport_info.file);					session->passport_info.file = tmp;				}				else					g_free(tmp);			}		}#endif	}}/************************************************************************** * Switchboards **************************************************************************/static voidrng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){	MsnSession *session;	MsnSwitchBoard *swboard;	const char *session_id;	char *host;	int port;	session = cmdproc->session;	session_id = cmd->params[0];	msn_parse_socket(cmd->params[1], &host, &port);	if (session->http_method)		port = 80;	swboard = msn_switchboard_new(session);	msn_switchboard_set_invited(swboard, TRUE);	msn_switchboard_set_session_id(swboard, cmd->params[0]);	msn_switchboard_set_auth_key(swboard, cmd->params[3]);	swboard->im_user = g_strdup(cmd->params[4]);	/* msn_switchboard_add_user(swboard, cmd->params[4]); */	if (!msn_switchboard_connect(swboard, host, port))		msn_switchboard_destroy(swboard);	g_free(host);}static voidxfr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd){	char *host;	int port;	if (strcmp(cmd->params[1], "SB") && strcmp(cmd->params[1], "NS"))	{		/* Maybe we can have a generic bad command error. */		purple_debug_error("msn", "Bad XFR command (%s)\n", cmd->params[1]);		return;	}	msn_parse_socket(cmd->params[2], &host, &port);	if (!strcmp(cmd->params[1], "SB"))	{		purple_debug_error("msn", "This shouldn't be handled here.\n");	}	else if (!strcmp(cmd->params[1], "NS"))	{		MsnSession *session;		session = cmdproc->session;		msn_session_set_login_step(session, MSN_LOGIN_STEP_TRANSFER);		msn_notification_connect(session->notification, host, port);	}	g_free(host);}/************************************************************************** * Message Types **************************************************************************/static voidprofile_msg(MsnCmdProc *cmdproc, MsnMessage *msg){	MsnSession *session;	const char *value;	session = cmdproc->session;	if (strcmp(msg->remote_user, "Hotmail"))		/* This isn't an official message. */		return;	if ((value = msn_message_get_attr(msg, "kv")) != NULL)	{		g_free(session->passport_info.kv);		session->passport_info.kv = g_strdup(value);	}	if ((value = msn_message_get_attr(msg, "sid")) != NULL)	{		g_free(session->passport_info.sid);		session->passport_info.sid = g_strdup(value);	}	if ((value = msn_message_get_attr(msg, "MSPAuth")) != NULL)	{		g_free(session->passport_info.mspauth);		session->passport_info.mspauth = g_strdup(value);	}	if ((value = msn_message_get_attr(msg, "ClientIP")) != NULL)	{		g_free(session->passport_info.client_ip);		session->passport_info.client_ip = g_strdup(value);	}	if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL)		session->passport_info.client_port = ntohs(atoi(value));	if ((value = msn_message_get_attr(msg, "LoginTime")) != NULL)		session->passport_info.sl = atol(value);}static voidinitial_email_msg(MsnCmdProc *cmdproc, MsnMessage *msg){	MsnSession *session;	PurpleConnection *gc;	GHashTable *table;	const char *unread;	session = cmdproc->session;	gc = session->account->gc;	if (strcmp(msg->remote_user, "Hotmail"))		/* This isn't an official message. */		return;	if (session->passport_info.file == NULL)	{		MsnTransaction *trans;		trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX");		msn_transaction_queue_cmd(trans, msg->cmd);		msn_cmdproc_send_trans(cmdproc, trans);		return;	}	if (!purple_account_get_check_mail(session->account))		return;	table = msn_message_get_hashtable_from_body(msg);	unread = g_hash_table_lookup(table, "Inbox-Unread");	if (unread != NULL)	{		int count = atoi(unread);		if (count > 0)		{			const char *passport;			const char *url;			passport = msn_user_get_passport(session->user);			url = session->passport_info.file;			purple_notify_emails(gc, atoi(unread), FALSE, NULL, NULL,							   &passport, &url, NULL, NULL);		}	}	g_hash_table_destroy(table);}static voidemail_msg(MsnCmdProc *cmdproc, MsnMessage *msg){	MsnSession *session;	PurpleConnection *gc;	GHashTable *table;	char *from, *subject, *tmp;	session = cmdproc->session;	gc = session->account->gc;	if (strcmp(msg->remote_user, "Hotmail"))		/* This isn't an official message. */		return;	if (session->passport_info.file == NULL)	{		MsnTransaction *trans;		trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX");		msn_transaction_queue_cmd(trans, msg->cmd);		msn_cmdproc_send_trans(cmdproc, trans);		return;	}	if (!purple_account_get_check_mail(session->account))		return;	table = msn_message_get_hashtable_from_body(msg);	from = subject = NULL;	tmp = g_hash_table_lookup(table, "From");	if (tmp != NULL)		from = purple_mime_decode_field(tmp);	tmp = g_hash_table_lookup(table, "Subject");	if (tmp != NULL)		subject = purple_mime_decode_field(tmp);	purple_notify_email(gc,					  (subject != NULL ? subject : ""),					  (from != NULL ?  from : ""),					  msn_user_get_passport(session->user),					  session->passport_info.file, NULL, NULL);	g_free(from);	g_free(subject);	g_hash_table_destroy(table);}static voidsystem_msg(MsnCmdProc *cmdproc, MsnMessage *msg){	GHashTable *table;	const char *type_s;	if (strcmp(msg->remote_user, "Hotmail"))		/* This isn't an official message. */		return;	table = msn_message_get_hashtable_from_body(msg);	if ((type_s = g_hash_table_lookup(table, "Type")) != NULL)	{		int type = atoi(type_s);		char buf[MSN_BUF_LEN];		int minutes;		switch (type)		{			case 1:				minutes = atoi(g_hash_table_lookup(table, "Arg1"));				g_snprintf(buf, sizeof(buf), dngettext(PACKAGE, 							"The MSN server will shut down for maintenance "							"in %d minute. You will automatically be "							"signed out at that time.  Please finish any "							"conversations in progress.\n\nAfter the "							"maintenance has been completed, you will be "							"able to successfully sign in.",							"The MSN server will shut down for maintenance "							"in %d minutes. You will automatically be "							"signed out at that time.  Please finish any "							"conversations in progress.\n\nAfter the "							"maintenance has been completed, you will be "							"able to successfully sign in.", minutes),						minutes);			default:				break;		}		if (*buf != '\0')			purple_notify_info(cmdproc->session->account->gc, NULL, buf, NULL);	}	g_hash_table_destroy(table);}voidmsn_notification_add_buddy(MsnNotification *notification, const char *list,						   const char *who, const char *store_name,						   int group_id){	MsnCmdProc *cmdproc;	cmdproc = notification->servconn->cmdproc;	if (group_id < 0 && !strcmp(list, "FL"))		group_id = 0;	if (group_id >= 0)	{		msn_cmdproc_send(cmdproc, "ADD", "%s %s %s %d",						 list, who, store_name, group_id);	}	else	{		msn_cmdproc_send(cmdproc, "ADD", "%s %s %s", list, who, store_name);	}}voidmsn_notification_rem_buddy(MsnNotification *notification, const char *list,						   const char *who, int group_id){	MsnCmdProc *cmdproc;	cmdproc = notification->servconn->cmdproc;	if (group_id >= 0)	{		msn_cmdproc_send(cmdproc, "REM", "%s %s %d", list, who, group_id);	}	else	{		msn_cmdproc_send(cmdproc, "REM", "%s %s", list, who);	}}/************************************************************************** * Init **************************************************************************/voidmsn_notification_init(void){	/* TODO: check prp, blp */	cbs_table = msn_table_new();	/* Synchronous */	msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL);	msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd);	msn_table_add_cmd(cbs_table, "ADD", "ADD", add_cmd);	msn_table_add_cmd(cbs_table, "ADD", "ILN", iln_cmd);	msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd);	msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd);	msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd);	msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd);	msn_table_add_cmd(cbs_table, "CVR", "CVR", cvr_cmd);	msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd);	msn_table_add_cmd(cbs_table, "REA", "REA", rea_cmd);	msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd);	/* msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd); */	msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL);	msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd);	msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd);	msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd);	msn_table_add_cmd(cbs_table, "XFR", "XFR", xfr_cmd);	/* Asynchronous */	msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd);	msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd);	msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd);	msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd);	msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd);	msn_table_add_cmd(cbs_table, NULL, "ADD", add_cmd);	msn_table_add_cmd(cbs_table, NULL, "QRY", NULL);	msn_table_add_cmd(cbs_table, NULL, "QNG", qng_cmd);	msn_table_add_cmd(cbs_table, NULL, "FLN", fln_cmd);	msn_table_add_cmd(cbs_table, NULL, "NLN", nln_cmd);	msn_table_add_cmd(cbs_table, NULL, "ILN", iln_cmd);	msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd);	msn_table_add_cmd(cbs_table, NULL, "RNG", rng_cmd);	msn_table_add_cmd(cbs_table, NULL, "URL", url_cmd);	msn_table_add_cmd(cbs_table, "fallback", "XFR", xfr_cmd);	msn_table_add_error(cbs_table, "ADD", add_error);	msn_table_add_error(cbs_table, "REG", reg_error);	msn_table_add_error(cbs_table, "RMG", rmg_error);	/* msn_table_add_error(cbs_table, "REA", rea_error); */	msn_table_add_error(cbs_table, "USR", usr_error);	msn_table_add_msg_type(cbs_table,						   "text/x-msmsgsprofile",						   profile_msg);	msn_table_add_msg_type(cbs_table,						   "text/x-msmsgsinitialemailnotification",						   initial_email_msg);	msn_table_add_msg_type(cbs_table,						   "text/x-msmsgsemailnotification",						   email_msg);	msn_table_add_msg_type(cbs_table,						   "application/x-msmsgssystemmessage",						   system_msg);}voidmsn_notification_end(void){	msn_table_destroy(cbs_table);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -