📄 message.c
字号:
jm->chat_state = JM_STATE_PAUSED; jm->typing_style |= JM_TS_JEP_0085; } else if(!strcmp(child->name, "inactive")) { jm->chat_state = JM_STATE_INACTIVE; jm->typing_style |= JM_TS_JEP_0085; } else if(!strcmp(child->name, "gone")) { jm->chat_state = JM_STATE_GONE; jm->typing_style |= JM_TS_JEP_0085; } else if(!strcmp(child->name, "error")) { const char *code = xmlnode_get_attrib(child, "code"); char *code_txt = NULL; char *text = xmlnode_get_data(child); if(code) code_txt = g_strdup_printf(_(" (Code %s)"), code); if(!jm->error) jm->error = g_strdup_printf("%s%s", text ? text : "", code_txt ? code_txt : ""); g_free(code_txt); g_free(text); } else if(!strcmp(child->name, "x")) { const char *xmlns = xmlnode_get_namespace(child); if(xmlns && !strcmp(xmlns, "jabber:x:event")) { if(xmlnode_get_child(child, "composing")) { if(jm->chat_state == JM_STATE_ACTIVE) jm->chat_state = JM_STATE_COMPOSING; jm->typing_style |= JM_TS_JEP_0022; } } else if(xmlns && !strcmp(xmlns, "jabber:x:delay")) { const char *timestamp = xmlnode_get_attrib(child, "stamp"); jm->delayed = TRUE; if(timestamp) jm->sent = purple_str_to_time(timestamp, TRUE, NULL, NULL, NULL); } else if(xmlns && !strcmp(xmlns, "jabber:x:conference") && jm->type != JABBER_MESSAGE_GROUPCHAT_INVITE && jm->type != JABBER_MESSAGE_ERROR) { const char *jid = xmlnode_get_attrib(child, "jid"); if(jid) { jm->type = JABBER_MESSAGE_GROUPCHAT_INVITE; g_free(jm->to); jm->to = g_strdup(jid); } } else if(xmlns && !strcmp(xmlns, "http://jabber.org/protocol/muc#user") && jm->type != JABBER_MESSAGE_ERROR) { xmlnode *invite = xmlnode_get_child(child, "invite"); if(invite) { xmlnode *reason, *password; const char *jid = xmlnode_get_attrib(invite, "from"); g_free(jm->to); jm->to = jm->from; jm->from = g_strdup(jid); if((reason = xmlnode_get_child(invite, "reason"))) { g_free(jm->body); jm->body = xmlnode_get_data(reason); } if((password = xmlnode_get_child(child, "password"))) jm->password = xmlnode_get_data(password); jm->type = JABBER_MESSAGE_GROUPCHAT_INVITE; } } else { jm->etc = g_list_append(jm->etc, child); } } } switch(jm->type) { case JABBER_MESSAGE_NORMAL: case JABBER_MESSAGE_CHAT: handle_chat(jm); break; case JABBER_MESSAGE_HEADLINE: handle_headline(jm); break; case JABBER_MESSAGE_GROUPCHAT: handle_groupchat(jm); break; case JABBER_MESSAGE_GROUPCHAT_INVITE: handle_groupchat_invite(jm); break; case JABBER_MESSAGE_ERROR: handle_error(jm); break; case JABBER_MESSAGE_OTHER: purple_debug(PURPLE_DEBUG_INFO, "jabber", "Received message of unknown type: %s\n", type); break; } jabber_message_free(jm);}void jabber_message_send(JabberMessage *jm){ xmlnode *message, *child; const char *type = NULL; message = xmlnode_new("message"); switch(jm->type) { case JABBER_MESSAGE_NORMAL: type = "normal"; break; case JABBER_MESSAGE_CHAT: case JABBER_MESSAGE_GROUPCHAT_INVITE: type = "chat"; break; case JABBER_MESSAGE_HEADLINE: type = "headline"; break; case JABBER_MESSAGE_GROUPCHAT: type = "groupchat"; break; case JABBER_MESSAGE_ERROR: type = "error"; break; case JABBER_MESSAGE_OTHER: type = NULL; break; } if(type) xmlnode_set_attrib(message, "type", type); if (jm->id) xmlnode_set_attrib(message, "id", jm->id); xmlnode_set_attrib(message, "to", jm->to); if(jm->thread_id) { child = xmlnode_new_child(message, "thread"); xmlnode_insert_data(child, jm->thread_id, -1); } if(JM_TS_JEP_0022 == (jm->typing_style & JM_TS_JEP_0022)) { child = xmlnode_new_child(message, "x"); xmlnode_set_namespace(child, "jabber:x:event"); if(jm->chat_state == JM_STATE_COMPOSING || jm->body) xmlnode_new_child(child, "composing"); } if(JM_TS_JEP_0085 == (jm->typing_style & JM_TS_JEP_0085)) { child = NULL; switch(jm->chat_state) { case JM_STATE_ACTIVE: child = xmlnode_new_child(message, "active"); break; case JM_STATE_COMPOSING: child = xmlnode_new_child(message, "composing"); break; case JM_STATE_PAUSED: child = xmlnode_new_child(message, "paused"); break; case JM_STATE_INACTIVE: child = xmlnode_new_child(message, "inactive"); break; case JM_STATE_GONE: child = xmlnode_new_child(message, "gone"); break; } if(child) xmlnode_set_namespace(child, "http://jabber.org/protocol/chatstates"); } if(jm->subject) { child = xmlnode_new_child(message, "subject"); xmlnode_insert_data(child, jm->subject, -1); } if(jm->body) { child = xmlnode_new_child(message, "body"); xmlnode_insert_data(child, jm->body, -1); } if(jm->xhtml) { child = xmlnode_from_str(jm->xhtml, -1); if(child) { xmlnode_insert_child(message, child); } else { purple_debug(PURPLE_DEBUG_ERROR, "jabber", "XHTML translation/validation failed, returning: %s\n", jm->xhtml); } } jabber_send(jm->js, message); xmlnode_free(message);}int jabber_message_send_im(PurpleConnection *gc, const char *who, const char *msg, PurpleMessageFlags flags){ JabberMessage *jm; JabberBuddy *jb; JabberBuddyResource *jbr; char *buf; char *xhtml; char *resource; if(!who || !msg) return 0; resource = jabber_get_resource(who); jb = jabber_buddy_find(gc->proto_data, who, TRUE); jbr = jabber_buddy_find_resource(jb, resource); g_free(resource); jm = g_new0(JabberMessage, 1); jm->js = gc->proto_data; jm->type = JABBER_MESSAGE_CHAT; jm->chat_state = JM_STATE_ACTIVE; jm->to = g_strdup(who); jm->id = jabber_get_next_id(jm->js); jm->chat_state = JM_STATE_ACTIVE; if(jbr) { if(jbr->thread_id) jm->thread_id = jbr->thread_id; if(jbr->chat_states != JABBER_CHAT_STATES_UNSUPPORTED) { jm->typing_style |= JM_TS_JEP_0085; /* if(JABBER_CHAT_STATES_UNKNOWN == jbr->chat_states) jbr->chat_states = JABBER_CHAT_STATES_UNSUPPORTED; */ } if(jbr->chat_states != JABBER_CHAT_STATES_SUPPORTED) jm->typing_style |= JM_TS_JEP_0022; } buf = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", msg); purple_markup_html_to_xhtml(buf, &xhtml, &jm->body); g_free(buf); if(!jbr || jbr->capabilities & JABBER_CAP_XHTML) jm->xhtml = xhtml; else g_free(xhtml); jabber_message_send(jm); jabber_message_free(jm); return 1;}int jabber_message_send_chat(PurpleConnection *gc, int id, const char *msg, PurpleMessageFlags flags){ JabberChat *chat; JabberMessage *jm; JabberStream *js; char *buf; if(!msg || !gc) return 0; js = gc->proto_data; chat = jabber_chat_find_by_id(js, id); if(!chat) return 0; jm = g_new0(JabberMessage, 1); jm->js = gc->proto_data; jm->type = JABBER_MESSAGE_GROUPCHAT; jm->to = g_strdup_printf("%s@%s", chat->room, chat->server); jm->id = jabber_get_next_id(jm->js); buf = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", msg); purple_markup_html_to_xhtml(buf, &jm->xhtml, &jm->body); g_free(buf); if(!chat->xhtml) { g_free(jm->xhtml); jm->xhtml = NULL; } jabber_message_send(jm); jabber_message_free(jm); return 1;}unsigned int jabber_send_typing(PurpleConnection *gc, const char *who, PurpleTypingState state){ JabberMessage *jm; JabberBuddy *jb; JabberBuddyResource *jbr; char *resource = jabber_get_resource(who); jb = jabber_buddy_find(gc->proto_data, who, TRUE); jbr = jabber_buddy_find_resource(jb, resource); g_free(resource); if(!jbr || !((jbr->capabilities & JABBER_CAP_COMPOSING) || (jbr->chat_states != JABBER_CHAT_STATES_UNSUPPORTED))) return 0; /* TODO: figure out threading */ jm = g_new0(JabberMessage, 1); jm->js = gc->proto_data; jm->type = JABBER_MESSAGE_CHAT; jm->to = g_strdup(who); jm->id = jabber_get_next_id(jm->js); if(PURPLE_TYPING == state) jm->chat_state = JM_STATE_COMPOSING; else if(PURPLE_TYPED == state) jm->chat_state = JM_STATE_PAUSED; else jm->chat_state = JM_STATE_ACTIVE; if(jbr->chat_states != JABBER_CHAT_STATES_UNSUPPORTED) { jm->typing_style |= JM_TS_JEP_0085; /* if(JABBER_CHAT_STATES_UNKNOWN == jbr->chat_states) jbr->chat_states = JABBER_CHAT_STATES_UNSUPPORTED; */ } if(jbr->chat_states != JABBER_CHAT_STATES_SUPPORTED) jm->typing_style |= JM_TS_JEP_0022; jabber_message_send(jm); jabber_message_free(jm); return 0;}void jabber_message_conv_closed(JabberStream *js, const char *who){ JabberMessage *jm = g_new0(JabberMessage, 1); jm->js = js; jm->type = JABBER_MESSAGE_CHAT; jm->to = g_strdup(who); jm->id = jabber_get_next_id(jm->js); jm->typing_style = JM_TS_JEP_0085; jm->chat_state = JM_STATE_GONE; jabber_message_send(jm); jabber_message_free(jm);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -