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

📄 slp.c

📁 msn message protocol stack
💻 C
📖 第 1 页 / 共 2 页
字号:
		g_free(nonce);	}	else if (!strcmp(type, "application/x-msnmsgr-transrespbody"))	{#if 0		char *ip_addrs;		char *temp;		char *nonce;		int port;		nonce = get_token(content, "Nonce: {", "}\r\n");		ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n");		temp = get_token(content, "IPv4Internal-Port: ", "\r\n");		if (temp != NULL)			port = atoi(temp);		else			port = -1;		g_free(temp);		if (ip_addrs == NULL)			return;		if (port > 0)			got_transresp(slpcall, nonce, ip_addrs, port);		g_free(nonce);		g_free(ip_addrs);#endif	}}static voidgot_ok(MsnSlpCall *slpcall,	   const char *type, const char *content){	g_return_if_fail(slpcall != NULL);	g_return_if_fail(type    != NULL);	if (!strcmp(type, "application/x-msnmsgr-sessionreqbody"))	{#if 0		if (slpcall->type == MSN_SLPCALL_DC)		{			/* First let's try a DirectConnection. */			MsnSlpLink *slplink;			MsnSlpMessage *slpmsg;			char *header;			char *content;			char *branch;			slplink = slpcall->slplink;			branch = rand_guid();			content = g_strdup_printf(				"Bridges: TRUDPv1 TCPv1\r\n"				"NetID: 0\r\n"				"Conn-Type: Direct-Connect\r\n"				"UPnPNat: false\r\n"				"ICF: false\r\n"			);			header = g_strdup_printf("INVITE MSNMSGR:%s MSNSLP/1.0",									 slplink->remote_user);			slpmsg = msn_slp_sipmsg_new(slpcall, 0, header, branch,										"application/x-msnmsgr-transreqbody",										content);#ifdef DEBUG_SLP			slpmsg->info = "SLP INVITE";			slpmsg->text_body = TRUE;#endif			msn_slplink_send_slpmsg(slplink, slpmsg);			g_free(header);			g_free(content);			g_free(branch);		}		else		{			msn_slp_call_session_init(slpcall);		}#else		msn_slp_call_session_init(slpcall);#endif	}	else if (!strcmp(type, "application/x-msnmsgr-transreqbody"))	{		/* Do we get this? */		gaim_debug_info("msn", "OK with transreqbody\n");	}	else if (!strcmp(type, "application/x-msnmsgr-transrespbody"))	{#if 0		char *ip_addrs;		char *temp;		char *nonce;		int port;		nonce = get_token(content, "Nonce: {", "}\r\n");		ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n");		temp = get_token(content, "IPv4Internal-Port: ", "\r\n");		if (temp != NULL)			port = atoi(temp);		else			port = -1;		g_free(temp);		if (ip_addrs == NULL)			return;		if (port > 0)			got_transresp(slpcall, nonce, ip_addrs, port);		g_free(nonce);		g_free(ip_addrs);#endif	}}MsnSlpCall *msn_slp_sip_recv(MsnSlpLink *slplink, const char *body, gsize len){	MsnSlpCall *slpcall;	if (!strncmp(body, "INVITE", strlen("INVITE")))	{		char *branch;		char *content;		char *content_type;		slpcall = msn_slp_call_new(slplink);		/* From: <msnmsgr:buddy@hotmail.com> */#if 0		slpcall->remote_user = get_token(body, "From: <msnmsgr:", ">\r\n");#endif		branch = get_token(body, ";branch={", "}");		slpcall->id = get_token(body, "Call-ID: {", "}");#if 0		long content_len = -1;		temp = get_token(body, "Content-Length: ", "\r\n");		if (temp != NULL)			content_len = atoi(temp);		g_free(temp);#endif		content_type = get_token(body, "Content-Type: ", "\r\n");		content = get_token(body, "\r\n\r\n", NULL);		got_invite(slpcall, branch, content_type, content);		g_free(content_type);		g_free(content);	}	else if (!strncmp(body, "MSNSLP/1.0 ", strlen("MSNSLP/1.0 ")))	{		char *content;		char *content_type;		/* Make sure this is "OK" */		const char *status = body + strlen("MSNSLP/1.0 ");		char *call_id;		call_id = get_token(body, "Call-ID: {", "}");		slpcall = msn_slplink_find_slp_call(slplink, call_id);		g_free(call_id);		g_return_val_if_fail(slpcall != NULL, NULL);		if (strncmp(status, "200 OK", 6))		{			/* It's not valid. Kill this off. */			char temp[32];			const char *c;			/* Eww */			if ((c = strchr(status, '\r')) || (c = strchr(status, '\n')) ||				(c = strchr(status, '\0')))			{				size_t offset =  c - status;				if (offset >= sizeof(temp))					offset = sizeof(temp) - 1;		      				strncpy(temp, status, offset);				temp[offset] = '\0';			}			gaim_debug_error("msn", "Received non-OK result: %s\n", temp);			slpcall->wasted = TRUE;			/* msn_slp_call_destroy(slpcall); */			return slpcall;		}		content_type = get_token(body, "Content-Type: ", "\r\n");		content = get_token(body, "\r\n\r\n", NULL);		got_ok(slpcall, content_type, content);		g_free(content_type);		g_free(content);	}	else if (!strncmp(body, "BYE", strlen("BYE")))	{		char *call_id;		call_id = get_token(body, "Call-ID: {", "}");		slpcall = msn_slplink_find_slp_call(slplink, call_id);		g_free(call_id);		if (slpcall != NULL)			slpcall->wasted = TRUE;		/* msn_slp_call_destroy(slpcall); */	}	else		slpcall = NULL;	return slpcall;}/************************************************************************** * Msg Callbacks **************************************************************************/voidmsn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg){	MsnSession *session;	MsnSlpLink *slplink;	session = cmdproc->servconn->session;	slplink = msn_session_get_slplink(session, msg->remote_user);	msn_slplink_process_msg(slplink, msg);}voidgot_emoticon(MsnSlpCall *slpcall,			 const char *data, long long size){	gaim_debug_info("msn", "Got smiley: %s\n", slpcall->data_info);#if 0	GaimConversation *conv;	GaimConnection *gc = slpsession->swboard->servconn->session->account->gc;	serv_got_smiley(gc, info, data, size);#endif}voidmsn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg){	MsnSession *session;	MsnSlpLink *slplink;	MsnObject *obj;	char **tokens;	char *smile;	const char *who;	session = cmdproc->servconn->session;	tokens = g_strsplit(msg->body, "\t", 2);	smile = tokens[0];	obj = msn_object_new_from_string(gaim_url_decode(tokens[1]));	who = msn_object_get_creator(obj);	slplink = msn_session_get_slplink(session, who);	msn_slplink_request_object(slplink, smile, got_emoticon, obj);	g_strfreev(tokens);}static gbooleanbuddy_icon_cached(GaimConnection *gc, MsnObject *obj){	GaimAccount *account;	GaimBuddy *buddy;	GSList *sl;	const char *old;	const char *new;	g_return_val_if_fail(obj != NULL, FALSE);	account = gaim_connection_get_account(gc);	sl = gaim_find_buddies(account, msn_object_get_creator(obj));	if (sl == NULL)		return FALSE;	buddy = (GaimBuddy *)sl->data;	old = gaim_blist_node_get_string((GaimBlistNode *)buddy, "icon_checksum");	new = msn_object_get_sha1c(obj);	if (new == NULL)		return FALSE;	if (old != NULL && !strcmp(old, new))		return TRUE;	return FALSE;}voidmsn_release_buddy_icon_request(MsnUserList *userlist){	MsnUser *user;	while (userlist->buddy_icon_window > 0)	{		GQueue *queue;		GaimAccount *account;		const char *username;		queue = userlist->buddy_icon_requests;		if (g_queue_is_empty(userlist->buddy_icon_requests))			break;		user = g_queue_pop_head(queue);		account  = userlist->session->account;		username = user->passport;		msn_request_user_display(user);		userlist->buddy_icon_window--;	}}voidmsn_queue_buddy_icon_request(MsnUser *user){	GaimAccount *account;	MsnObject *obj;	GQueue *queue;	account = user->userlist->session->account;	obj = msn_user_get_object(user);	if (obj == NULL)	{		/* It seems the user has not set a msnobject */		GSList *sl;		/* TODO: I think we need better buddy icon core functions. */		gaim_buddy_icons_set_for_user(account, user->passport, NULL, -1);		sl = gaim_find_buddies(account, user->passport);		for (; sl != NULL; sl = sl->next)		{			GaimBuddy *buddy = (GaimBuddy *)sl->data;			gaim_blist_node_remove_setting((GaimBlistNode*)buddy, "icon_checksum");		}		return;	}	if (!buddy_icon_cached(account->gc, obj))	{		MsnUserList *userlist;		userlist = user->userlist;		queue = userlist->buddy_icon_requests;		g_queue_push_tail(queue, user);		if (userlist->buddy_icon_window > 0)			msn_release_buddy_icon_request(userlist);	}}voidgot_user_display(MsnSlpCall *slpcall,				 const char *data, long long size){	const char *info;	GaimAccount *account;	GSList *sl;	info = slpcall->data_info;	gaim_debug_info("msn", "Got User Display: %s\n", info);	account = slpcall->slplink->session->account;	/* TODO: I think we need better buddy icon core functions. */	gaim_buddy_icons_set_for_user(account, slpcall->slplink->remote_user,								  (void *)data, size);	sl = gaim_find_buddies(account, slpcall->slplink->remote_user);	for (; sl != NULL; sl = sl->next)	{		GaimBuddy *buddy = (GaimBuddy *)sl->data;		gaim_blist_node_set_string((GaimBlistNode*)buddy, "icon_checksum", info);	}	slpcall->slplink->session->userlist->buddy_icon_window++;	msn_release_buddy_icon_request(slpcall->slplink->session->userlist);}voidmsn_request_user_display(MsnUser *user){	GaimAccount *account;	MsnSession *session;	MsnSlpLink *slplink;	MsnObject *obj;	const char *info;	session = user->userlist->session;	account = session->account;	slplink = msn_session_get_slplink(session, user->passport);	obj = msn_user_get_object(user);	info = msn_object_get_sha1c(obj);	if (g_ascii_strcasecmp(user->passport,						   gaim_account_get_username(account)))	{		msn_slplink_request_object(slplink, info, got_user_display, obj);	}	else	{		MsnObject *my_obj = NULL;		const char *filename = NULL;		gchar *data = NULL;		gsize len = 0;		const char *my_info = NULL;		GSList *sl;		gaim_debug_info("msn", "Requesting our own user display\n");		my_obj = msn_user_get_object(session->user);		if (my_obj != NULL)		{			filename = msn_object_get_real_location(my_obj);			my_info = msn_object_get_sha1c(my_obj);		}		if (filename != NULL)			g_file_get_contents(filename, &data, &len, NULL);		/* TODO: I think we need better buddy icon core functions. */		gaim_buddy_icons_set_for_user(account, user->passport, (void *)data, len);				sl = gaim_find_buddies(account, user->passport);		for (; sl != NULL; sl = sl->next)		{			GaimBuddy *buddy = (GaimBuddy *)sl->data;			gaim_blist_node_set_string((GaimBlistNode*)buddy, "icon_checksum", info);		}		session->userlist->buddy_icon_window++;		msn_release_buddy_icon_request(session->userlist);	}}

⌨️ 快捷键说明

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