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

📄 message.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -