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

📄 msg.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}char *msn_message_gen_payload(MsnMessage *msg, size_t *ret_size){	GList *l;	char *n, *base, *end;	int len;	size_t body_len;	const void *body;	g_return_val_if_fail(msg != NULL, NULL);	len = MSN_BUF_LEN;	base = n = end = g_malloc(len + 1);	end += len;	/* Standard header. */	if (msg->charset == NULL)	{		g_snprintf(n, len,				   "MIME-Version: 1.0\r\n"				   "Content-Type: %s\r\n",				   msg->content_type);	}	else	{		g_snprintf(n, len,				   "MIME-Version: 1.0\r\n"				   "Content-Type: %s; charset=%s\r\n",				   msg->content_type, msg->charset);	}	n += strlen(n);	for (l = msg->attr_list; l != NULL; l = l->next)	{		const char *key;		const char *value;		key = l->data;		value = msn_message_get_attr(msg, key);		g_snprintf(n, end - n, "%s: %s\r\n", key, value);		n += strlen(n);	}	n += g_strlcpy(n, "\r\n", end - n);	body = msn_message_get_bin_data(msg, &body_len);	if (msg->msnslp_message)	{		MsnSlpHeader header;		MsnSlpFooter footer;		header.session_id = GUINT32_TO_LE(msg->msnslp_header.session_id);		header.id         = GUINT32_TO_LE(msg->msnslp_header.id);		header.offset     = GUINT64_TO_LE(msg->msnslp_header.offset);		header.total_size = GUINT64_TO_LE(msg->msnslp_header.total_size);		header.length     = GUINT32_TO_LE(msg->msnslp_header.length);		header.flags      = GUINT32_TO_LE(msg->msnslp_header.flags);		header.ack_id     = GUINT32_TO_LE(msg->msnslp_header.ack_id);		header.ack_sub_id = GUINT32_TO_LE(msg->msnslp_header.ack_sub_id);		header.ack_size   = GUINT64_TO_LE(msg->msnslp_header.ack_size);		memcpy(n, &header, 48);		n += 48;		if (body != NULL)		{			memcpy(n, body, body_len);			n += body_len;		}		footer.value = GUINT32_TO_BE(msg->msnslp_footer.value);		memcpy(n, &footer, 4);		n += 4;	}	else	{		if (body != NULL)		{			memcpy(n, body, body_len);			n += body_len;		}	}	if (ret_size != NULL)	{		*ret_size = n - base;		if (*ret_size > 1664)			*ret_size = 1664;	}	return base;}voidmsn_message_set_flag(MsnMessage *msg, char flag){	g_return_if_fail(msg != NULL);	g_return_if_fail(flag != 0);	msg->flag = flag;}charmsn_message_get_flag(const MsnMessage *msg){	g_return_val_if_fail(msg != NULL, 0);	return msg->flag;}voidmsn_message_set_bin_data(MsnMessage *msg, const void *data, size_t len){	g_return_if_fail(msg != NULL);	/* There is no need to waste memory on data we cannot send anyway */	if (len > 1664)		len = 1664;	if (msg->body != NULL)		g_free(msg->body);	if (data != NULL && len > 0)	{		msg->body = g_malloc0(len + 1);		memcpy(msg->body, data, len);		msg->body_len = len;	}	else	{		msg->body = NULL;		msg->body_len = 0;	}}const void *msn_message_get_bin_data(const MsnMessage *msg, size_t *len){	g_return_val_if_fail(msg != NULL, NULL);	if (len)		*len = msg->body_len;	return msg->body;}voidmsn_message_set_content_type(MsnMessage *msg, const char *type){	g_return_if_fail(msg != NULL);	if (msg->content_type != NULL)		g_free(msg->content_type);	msg->content_type = (type != NULL) ? g_strdup(type) : NULL;}const char *msn_message_get_content_type(const MsnMessage *msg){	g_return_val_if_fail(msg != NULL, NULL);	return msg->content_type;}voidmsn_message_set_charset(MsnMessage *msg, const char *charset){	g_return_if_fail(msg != NULL);	if (msg->charset != NULL)		g_free(msg->charset);	msg->charset = (charset != NULL) ? g_strdup(charset) : NULL;}const char *msn_message_get_charset(const MsnMessage *msg){	g_return_val_if_fail(msg != NULL, NULL);	return msg->charset;}voidmsn_message_set_attr(MsnMessage *msg, const char *attr, const char *value){	const char *temp;	char *new_attr;	g_return_if_fail(msg != NULL);	g_return_if_fail(attr != NULL);	temp = msn_message_get_attr(msg, attr);	if (value == NULL)	{		if (temp != NULL)		{			GList *l;			for (l = msg->attr_list; l != NULL; l = l->next)			{				if (!g_ascii_strcasecmp(l->data, attr))				{					msg->attr_list = g_list_remove(msg->attr_list, l->data);					break;				}			}			g_hash_table_remove(msg->attr_table, attr);		}		return;	}	new_attr = g_strdup(attr);	g_hash_table_insert(msg->attr_table, new_attr, g_strdup(value));	if (temp == NULL)		msg->attr_list = g_list_append(msg->attr_list, new_attr);}const char *msn_message_get_attr(const MsnMessage *msg, const char *attr){	g_return_val_if_fail(msg != NULL, NULL);	g_return_val_if_fail(attr != NULL, NULL);	return g_hash_table_lookup(msg->attr_table, attr);}GHashTable *msn_message_get_hashtable_from_body(const MsnMessage *msg){	GHashTable *table;	size_t body_len;	const char *body;	char **elems, **cur, **tokens, *body_str;	g_return_val_if_fail(msg != NULL, NULL);	table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);	body = msn_message_get_bin_data(msg, &body_len);	g_return_val_if_fail(body != NULL, NULL);	body_str = g_strndup(body, body_len);	elems = g_strsplit(body_str, "\r\n", 0);	g_free(body_str);	for (cur = elems; *cur != NULL; cur++)	{		if (**cur == '\0')			break;		tokens = g_strsplit(*cur, ": ", 2);		if (tokens[0] != NULL && tokens[1] != NULL)			g_hash_table_insert(table, tokens[0], tokens[1]);		g_free(tokens);	}	g_strfreev(elems);	return table;}char *msn_message_to_string(MsnMessage *msg){	size_t body_len;	const char *body;	g_return_val_if_fail(msg != NULL, NULL);	g_return_val_if_fail(msg->type == MSN_MSG_TEXT, NULL);	body = msn_message_get_bin_data(msg, &body_len);	return g_strndup(body, body_len);}voidmsn_message_show_readable(MsnMessage *msg, const char *info,						  gboolean text_body){	GString *str;	size_t body_len;	const char *body;	GList *l;	g_return_if_fail(msg != NULL);	str = g_string_new(NULL);	/* Standard header. */	if (msg->charset == NULL)	{		g_string_append_printf(str,				   "MIME-Version: 1.0\r\n"				   "Content-Type: %s\r\n",				   msg->content_type);	}	else	{		g_string_append_printf(str,				   "MIME-Version: 1.0\r\n"				   "Content-Type: %s; charset=%s\r\n",				   msg->content_type, msg->charset);	}	for (l = msg->attr_list; l; l = l->next)	{		char *key;		const char *value;		key = l->data;		value = msn_message_get_attr(msg, key);		g_string_append_printf(str, "%s: %s\r\n", key, value);	}	g_string_append(str, "\r\n");	body = msn_message_get_bin_data(msg, &body_len);	if (msg->msnslp_message)	{		g_string_append_printf(str, "Session ID: %u\r\n", msg->msnslp_header.session_id);		g_string_append_printf(str, "ID:         %u\r\n", msg->msnslp_header.id);		g_string_append_printf(str, "Offset:     %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.offset);		g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.total_size);		g_string_append_printf(str, "Length:     %u\r\n", msg->msnslp_header.length);		g_string_append_printf(str, "Flags:      0x%x\r\n", msg->msnslp_header.flags);		g_string_append_printf(str, "ACK ID:     %u\r\n", msg->msnslp_header.ack_id);		g_string_append_printf(str, "SUB ID:     %u\r\n", msg->msnslp_header.ack_sub_id);		g_string_append_printf(str, "ACK Size:   %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.ack_size);#ifdef MSN_DEBUG_SLP_VERBOSE		if (body != NULL)		{			if (text_body)			{				g_string_append_len(str, body, body_len);				if (body[body_len - 1] == '\0')				{					str->len--;					g_string_append(str, " 0x00");				}				g_string_append(str, "\r\n");			}			else			{				int i;				for (i = 0; i < msg->body_len; i++)				{					g_string_append_printf(str, "%.2hhX ", body[i]);					if ((i % 16) == 15)						g_string_append(str, "\r\n");				}				g_string_append(str, "\r\n");			}		}#endif		g_string_append_printf(str, "Footer:     %u\r\n", msg->msnslp_footer.value);	}	else	{		if (body != NULL)		{			g_string_append_len(str, body, body_len);			g_string_append(str, "\r\n");		}	}	purple_debug_info("msn", "Message %s:\n{%s}\n", info, str->str);	g_string_free(str, TRUE);}

⌨️ 快捷键说明

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