📄 msg.c
字号:
}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 + -