亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jabber.c

?? Linux下的多協議即時通訊程序源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* * purple - Jabber Protocol Plugin * * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * */#include "internal.h"#include "account.h"#include "accountopt.h"#include "blist.h"#include "cmds.h"#include "connection.h"#include "conversation.h"#include "debug.h"#include "dnssrv.h"#include "message.h"#include "notify.h"#include "pluginpref.h"#include "proxy.h"#include "prpl.h"#include "request.h"#include "server.h"#include "util.h"#include "version.h"#include "xmlnode.h"#include "auth.h"#include "buddy.h"#include "chat.h"#include "disco.h"#include "google.h"#include "iq.h"#include "jutil.h"#include "message.h"#include "parser.h"#include "presence.h"#include "jabber.h"#include "roster.h"#include "si.h"#include "xdata.h"#define JABBER_CONNECT_STEPS (js->gsc ? 8 : 5)static PurplePlugin *my_protocol = NULL;static void jabber_stream_init(JabberStream *js){	char *open_stream;	open_stream = g_strdup_printf("<stream:stream to='%s' "				          "xmlns='jabber:client' "						  "xmlns:stream='http://etherx.jabber.org/streams' "						  "version='1.0'>",						  js->user->domain);	/* setup the parser fresh for each stream */	jabber_parser_setup(js);	jabber_send_raw(js, open_stream, -1);	js->reinit = FALSE;	g_free(open_stream);}static voidjabber_session_initialized_cb(JabberStream *js, xmlnode *packet, gpointer data){	const char *type = xmlnode_get_attrib(packet, "type");	if(type && !strcmp(type, "result")) {		jabber_stream_set_state(js, JABBER_STREAM_CONNECTED);	} else {		purple_connection_error(js->gc, _("Error initializing session"));	}}static void jabber_session_init(JabberStream *js){	JabberIq *iq = jabber_iq_new(js, JABBER_IQ_SET);	xmlnode *session;	jabber_iq_set_callback(iq, jabber_session_initialized_cb, NULL);	session = xmlnode_new_child(iq->node, "session");	xmlnode_set_namespace(session, "urn:ietf:params:xml:ns:xmpp-session");	jabber_iq_send(iq);}static void jabber_bind_result_cb(JabberStream *js, xmlnode *packet,		gpointer data){	const char *type = xmlnode_get_attrib(packet, "type");	xmlnode *bind;	if(type && !strcmp(type, "result") &&			(bind = xmlnode_get_child_with_namespace(packet, "bind", "urn:ietf:params:xml:ns:xmpp-bind"))) {		xmlnode *jid;		char *full_jid;		if((jid = xmlnode_get_child(bind, "jid")) && (full_jid = xmlnode_get_data(jid))) {			JabberBuddy *my_jb = NULL;			jabber_id_free(js->user);			if(!(js->user = jabber_id_new(full_jid))) {				purple_connection_error(js->gc, _("Invalid response from server."));			}			if((my_jb = jabber_buddy_find(js, full_jid, TRUE)))				my_jb->subscription |= JABBER_SUB_BOTH;			g_free(full_jid);		}	} else {		char *msg = jabber_parse_error(js, packet);		purple_connection_error(js->gc, msg);		g_free(msg);	}	jabber_session_init(js);}static void jabber_stream_features_parse(JabberStream *js, xmlnode *packet){	if(xmlnode_get_child(packet, "starttls")) {		if(jabber_process_starttls(js, packet))			return;	}	if(js->registration) {		jabber_register_start(js);	} else if(xmlnode_get_child(packet, "mechanisms")) {		jabber_auth_start(js, packet);	} else if(xmlnode_get_child(packet, "bind")) {		xmlnode *bind, *resource;		JabberIq *iq = jabber_iq_new(js, JABBER_IQ_SET);		bind = xmlnode_new_child(iq->node, "bind");		xmlnode_set_namespace(bind, "urn:ietf:params:xml:ns:xmpp-bind");		resource = xmlnode_new_child(bind, "resource");		xmlnode_insert_data(resource, js->user->resource, -1);		jabber_iq_set_callback(iq, jabber_bind_result_cb, NULL);		jabber_iq_send(iq);	} else /* if(xmlnode_get_child_with_namespace(packet, "auth")) */ {		/* If we get an empty stream:features packet, or we explicitly get		 * an auth feature with namespace http://jabber.org/features/iq-auth		 * we should revert back to iq:auth authentication, even though we're		 * connecting to an XMPP server.  */		js->auth_type = JABBER_AUTH_IQ_AUTH;		jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);	}}static void jabber_stream_handle_error(JabberStream *js, xmlnode *packet){	char *msg = jabber_parse_error(js, packet);	purple_connection_error(js->gc, msg);	g_free(msg);}static void tls_init(JabberStream *js);void jabber_process_packet(JabberStream *js, xmlnode *packet){	const char *xmlns;	purple_signal_emit(my_protocol, "jabber-receiving-xmlnode", js->gc, &packet);	/* if the signal leaves us with a null packet, we're done */	if(NULL == packet)		return;	xmlns = xmlnode_get_namespace(packet);	if(!strcmp(packet->name, "iq")) {		jabber_iq_parse(js, packet);	} else if(!strcmp(packet->name, "presence")) {		jabber_presence_parse(js, packet);	} else if(!strcmp(packet->name, "message")) {		jabber_message_parse(js, packet);	} else if(!strcmp(packet->name, "stream:features")) {		jabber_stream_features_parse(js, packet);	} else if (!strcmp(packet->name, "features") &&		   !strcmp(xmlns, "http://etherx.jabber.org/streams")) {		jabber_stream_features_parse(js, packet);	} else if(!strcmp(packet->name, "stream:error") ||			 (!strcmp(packet->name, "error") &&				!strcmp(xmlns, "http://etherx.jabber.org/streams")))	{		jabber_stream_handle_error(js, packet);	} else if(!strcmp(packet->name, "challenge")) {		if(js->state == JABBER_STREAM_AUTHENTICATING)			jabber_auth_handle_challenge(js, packet);	} else if(!strcmp(packet->name, "success")) {		if(js->state == JABBER_STREAM_AUTHENTICATING)			jabber_auth_handle_success(js, packet);	} else if(!strcmp(packet->name, "failure")) {		if(js->state == JABBER_STREAM_AUTHENTICATING)			jabber_auth_handle_failure(js, packet);	} else if(!strcmp(packet->name, "proceed")) {		if(js->state == JABBER_STREAM_AUTHENTICATING && !js->gsc)			tls_init(js);	} else {		purple_debug(PURPLE_DEBUG_WARNING, "jabber", "Unknown packet: %s\n",				packet->name);	}}static int jabber_do_send(JabberStream *js, const char *data, int len){	int ret;	if (js->gsc)		ret = purple_ssl_write(js->gsc, data, len);	else		ret = write(js->fd, data, len);	return ret;}static void jabber_send_cb(gpointer data, gint source, PurpleInputCondition cond){	JabberStream *js = data;	int ret, writelen;	writelen = purple_circ_buffer_get_max_read(js->write_buffer);	if (writelen == 0) {		purple_input_remove(js->writeh);		js->writeh = 0;		return;	}	ret = jabber_do_send(js, js->write_buffer->outptr, writelen);	if (ret < 0 && errno == EAGAIN)		return;	else if (ret <= 0) {		purple_connection_error(js->gc, _("Write error"));		return;	}	purple_circ_buffer_mark_read(js->write_buffer, ret);}void jabber_send_raw(JabberStream *js, const char *data, int len){	int ret;	/* because printing a tab to debug every minute gets old */	if(strcmp(data, "\t"))		purple_debug(PURPLE_DEBUG_MISC, "jabber", "Sending%s: %s\n",				js->gsc ? " (ssl)" : "", data);	/* If we've got a security layer, we need to encode the data,	 * splitting it on the maximum buffer length negotiated */		purple_signal_emit(my_protocol, "jabber-sending-text", js->gc, &data);	if (data == NULL)		return;	#ifdef HAVE_CYRUS_SASL	if (js->sasl_maxbuf>0) {		int pos;		if (!js->gsc && js->fd<0)			return;		pos = 0;		if (len == -1)			len = strlen(data);		while (pos < len) {			int towrite;			const char *out;			unsigned olen;			if ((len - pos) < js->sasl_maxbuf)				towrite = len - pos;			else				towrite = js->sasl_maxbuf;			sasl_encode(js->sasl, &data[pos], towrite, &out, &olen);			pos += towrite;			if (js->writeh == 0)				ret = jabber_do_send(js, out, olen);			else {				ret = -1;				errno = EAGAIN;			}			if (ret < 0 && errno != EAGAIN)				purple_connection_error(js->gc, _("Write error"));			else if (ret < olen) {				if (ret < 0)					ret = 0;				if (js->writeh == 0)					js->writeh = purple_input_add(						js->gsc ? js->gsc->fd : js->fd,						PURPLE_INPUT_WRITE,						jabber_send_cb, js);				purple_circ_buffer_append(js->write_buffer,					out + ret, olen - ret);			}		}		return;	}#endif	if (len == -1)		len = strlen(data);	if (js->writeh == 0)		ret = jabber_do_send(js, data, len);	else {		ret = -1;		errno = EAGAIN;	}	if (ret < 0 && errno != EAGAIN)		purple_connection_error(js->gc, _("Write error"));	else if (ret < len) {		if (ret < 0)			ret = 0;		if (js->writeh == 0)			js->writeh = purple_input_add(				js->gsc ? js->gsc->fd : js->fd,				PURPLE_INPUT_WRITE, jabber_send_cb, js);		purple_circ_buffer_append(js->write_buffer,			data + ret, len - ret);	}	return;}int jabber_prpl_send_raw(PurpleConnection *gc, const char *buf, int len){	JabberStream *js = (JabberStream*)gc->proto_data;	jabber_send_raw(js, buf, len);	return len;}void jabber_send(JabberStream *js, xmlnode *packet){	char *txt;	int len;	purple_signal_emit(my_protocol, "jabber-sending-xmlnode", js->gc, &packet);	/* if we get NULL back, we're done processing */	if(NULL == packet)		return;	txt = xmlnode_to_str(packet, &len);	jabber_send_raw(js, txt, len);	g_free(txt);}void jabber_keepalive(PurpleConnection *gc){	jabber_send_raw(gc->proto_data, "\t", -1);}static voidjabber_recv_cb_ssl(gpointer data, PurpleSslConnection *gsc,		PurpleInputCondition cond){	PurpleConnection *gc = data;	JabberStream *js = gc->proto_data;	int len;	static char buf[4096];	/* TODO: It should be possible to make this check unnecessary */	if(!PURPLE_CONNECTION_IS_VALID(gc)) {		purple_ssl_close(gsc);		return;	}	while((len = purple_ssl_read(gsc, buf, sizeof(buf) - 1)) > 0) {		buf[len] = '\0';		purple_debug(PURPLE_DEBUG_INFO, "jabber", "Recv (ssl)(%d): %s\n", len, buf);		jabber_parser_process(js, buf, len);		if(js->reinit)			jabber_stream_init(js);	}	if(errno == EAGAIN)		return;	else		purple_connection_error(gc, _("Read Error"));}static voidjabber_recv_cb(gpointer data, gint source, PurpleInputCondition condition){	PurpleConnection *gc = data;	JabberStream *js = gc->proto_data;	int len;	static char buf[4096];	if(!PURPLE_CONNECTION_IS_VALID(gc))		return;	if((len = read(js->fd, buf, sizeof(buf) - 1)) > 0) {#ifdef HAVE_CYRUS_SASL		if (js->sasl_maxbuf>0) {			const char *out;			unsigned int olen;			sasl_decode(js->sasl, buf, len, &out, &olen);			if (olen>0) {				purple_debug(PURPLE_DEBUG_INFO, "jabber", "RecvSASL (%u): %s\n", olen, out);				jabber_parser_process(js,out,olen);				if(js->reinit)					jabber_stream_init(js);			}			return;		}#endif		buf[len] = '\0';		purple_debug(PURPLE_DEBUG_INFO, "jabber", "Recv (%d): %s\n", len, buf);		jabber_parser_process(js, buf, len);		if(js->reinit)			jabber_stream_init(js);	} else if(errno == EAGAIN) {		return;	} else {		purple_connection_error(gc, _("Read Error"));	}}static voidjabber_login_callback_ssl(gpointer data, PurpleSslConnection *gsc,		PurpleInputCondition cond){	PurpleConnection *gc = data;	JabberStream *js;	/* TODO: It should be possible to make this check unnecessary */	if(!PURPLE_CONNECTION_IS_VALID(gc)) {		purple_ssl_close(gsc);		return;	}		js = gc->proto_data;	if(js->state == JABBER_STREAM_CONNECTING)		jabber_send_raw(js, "<?xml version='1.0' ?>", -1);	jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING);	purple_ssl_input_add(gsc, jabber_recv_cb_ssl, gc);}static voidjabber_login_callback(gpointer data, gint source, const gchar *error){	PurpleConnection *gc = data;	JabberStream *js = gc->proto_data;	if (source < 0) {		gchar *tmp;		tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"),				error);		purple_connection_error(gc, tmp);		g_free(tmp);		return;	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩午夜激情视频| 综合电影一区二区三区 | 免费在线成人网| 中文字幕一区二区三区在线不卡| 777xxx欧美| 欧洲一区二区三区免费视频| 国产乱国产乱300精品| 日韩中文欧美在线| 色94色欧美sute亚洲线路一ni| 喷白浆一区二区| 一区二区三区在线影院| 亚洲国产精品传媒在线观看| 日韩一级大片在线观看| 色香蕉成人二区免费| voyeur盗摄精品| 粉嫩绯色av一区二区在线观看 | 国产日韩影视精品| 2021久久国产精品不只是精品| 欧美日韩一区 二区 三区 久久精品| 91香蕉视频污| 91亚洲国产成人精品一区二三| 国产成人福利片| 国产成人精品免费一区二区| 51午夜精品国产| 欧美日韩黄色影视| 欧美日韩aaa| 欧美一卡二卡在线| 欧美一级生活片| 精品国产免费人成电影在线观看四季| 日韩一级在线观看| 久久综合九色综合97婷婷女人| 2024国产精品| 中文字幕欧美国产| 亚洲人成电影网站色mp4| 亚洲综合小说图片| 日本在线不卡一区| 日本韩国视频一区二区| 欧美日韩国产成人在线免费| 成人激情免费网站| 97久久超碰精品国产| 国产日韩欧美在线一区| 国产精品乱码妇女bbbb| 亚洲伊人伊色伊影伊综合网| 视频一区在线视频| 国产a区久久久| 欧美少妇xxx| 久久蜜桃av一区精品变态类天堂 | 国产在线视频一区二区| 国产大陆亚洲精品国产| 99久久精品免费观看| 在线日韩av片| 欧美一区二区三区日韩| 久久久不卡影院| 一区二区三区高清| 国模冰冰炮一区二区| 一道本成人在线| 久久夜色精品国产噜噜av| 国产精品看片你懂得| 青青国产91久久久久久| av不卡免费电影| 日韩欧美一区二区三区在线| 久久91精品国产91久久小草| 91久久精品一区二区| 久久午夜免费电影| 亚洲风情在线资源站| 不卡的av在线| 国产清纯白嫩初高生在线观看91 | 中文字幕欧美区| 老汉av免费一区二区三区| 日本久久一区二区| 国产精品天美传媒| 韩国在线一区二区| 91精品国产综合久久香蕉的特点 | 久久av资源网| 在线播放一区二区三区| 亚洲一区二区三区美女| 精品国产区一区| 久久激情综合网| 91麻豆精品国产自产在线| 亚洲欧美日韩小说| 91视频你懂的| 亚洲色图视频网| 色婷婷综合中文久久一本| 日韩一区在线播放| aaa欧美大片| 亚洲欧美激情一区二区| 99这里只有精品| 亚洲欧美日韩中文字幕一区二区三区| 成人性生交大片免费看在线播放 | 麻豆精品一区二区| 欧美一二三四区在线| 蜜臀99久久精品久久久久久软件| 3d动漫精品啪啪一区二区竹菊| 五月天视频一区| 在线免费av一区| 136国产福利精品导航| 99久久精品国产精品久久| 国产在线视频一区二区三区| 国产午夜精品一区二区三区嫩草 | 国产一区三区三区| 国产女主播一区| 一本一本久久a久久精品综合麻豆| 亚洲免费在线观看视频| 欧美日韩成人综合| 久久99精品国产| 国产精品久久久久国产精品日日| 91丨porny丨最新| 日韩国产一区二| 国产精品丝袜一区| 一本色道综合亚洲| 久久精品国产99| 亚洲欧美欧美一区二区三区| 欧美剧情片在线观看| 国产成a人亚洲精| 一区二区三国产精华液| 中文字幕在线一区二区三区| 国产.精品.日韩.另类.中文.在线.播放 | 国产精品69毛片高清亚洲| 日韩一区有码在线| 欧美一区二区福利在线| www.日韩在线| 免费观看在线色综合| 1024国产精品| 精品日韩99亚洲| 日本乱人伦aⅴ精品| 国产精品69久久久久水密桃| 亚洲综合丝袜美腿| 国产日产欧美一区二区三区| 欧美日韩精品一区视频| 9人人澡人人爽人人精品| 美女网站一区二区| 一级做a爱片久久| 国产精品的网站| 久久久久久影视| 欧美大片一区二区三区| 欧美三级三级三级| 91女人视频在线观看| 国产精品一级在线| 一本色道**综合亚洲精品蜜桃冫| 免费看欧美女人艹b| 一区二区三区四区视频精品免费| 亚洲一区在线看| 亚洲你懂的在线视频| 国产精品国产三级国产| 久久精品视频免费| 久久在线免费观看| 日韩欧美中文字幕制服| 欧美日韩aaaaaa| 91精品国产综合久久小美女| 欧美日韩日日摸| 欧美日韩精品三区| 7777精品伊人久久久大香线蕉最新版| 在线观看亚洲精品视频| 欧美性色综合网| 欧美电影在哪看比较好| 欧美精品乱码久久久久久按摩| 欧美日韩国产综合草草| 制服丝袜亚洲播放| 日韩一二三区视频| 精品国产乱码91久久久久久网站| 日韩免费观看高清完整版在线观看| 日韩一级成人av| 久久久久久久久久久99999| 国产午夜精品一区二区三区视频 | 一区二区国产盗摄色噜噜| 一区二区三区四区蜜桃| 亚洲小说欧美激情另类| 日韩电影免费一区| 黄色精品一二区| 99精品久久99久久久久| 欧美在线观看视频一区二区三区| 4438x亚洲最大成人网| www亚洲一区| 亚洲丝袜精品丝袜在线| 亚洲成人免费影院| 国产在线不卡视频| 色婷婷综合五月| 精品国产乱码久久久久久蜜臀| 久久久高清一区二区三区| 一区二区三区**美女毛片| 精品在线你懂的| 在线观看不卡视频| 久久久久久99精品| 亚洲一级电影视频| 国产成人精品一区二区三区网站观看| 91色视频在线| 国产精品美女久久久久aⅴ国产馆| 亚洲欧美色图小说| 狠狠色丁香久久婷婷综| 国产欧美日韩在线看| 偷偷要91色婷婷| av电影天堂一区二区在线| 日韩一区二区三区视频在线| 亚洲色图19p| 丁香五精品蜜臀久久久久99网站| 欧美日韩综合在线| 亚洲男人的天堂在线观看| 国产一区二区三区免费看| 91精品欧美一区二区三区综合在 | 国产v综合v亚洲欧|