Exemplo n.º 1
0
void tlen::event(const QDomNode &n) {
	kdebugf();
	QString nodeName=n.nodeName();
	QDomElement element = n.toElement();
	if(nodeName=="s" && element.hasAttribute("i")) {
		ping->start( 50000 );
		sid = element.attribute("i");
		if(tlenLogin())
 			state = tlen::Connected;
		else
			socket->close(); // TODO: Dont close connection and repeat login, after n times disconnect, signal
	}
	else if(nodeName=="iq") {
		if(element.hasAttribute( "type" ) && element.attribute("type") == "result") {
			// tcfg
			if(element.hasAttribute("id") && element.attribute("id")==sid) {
				tcfgRequest();
				rosterRequest();
			}
			if(element.hasAttribute("from") && element.attribute("from")=="tuba" && element.hasAttribute("id")){
				// <iq from="tuba" type="result" to="jid" id="tr">
				// <query xmlns="jabber:iq:register">
				// <item></item></query></iq>
				if(element.attribute("id")=="tr") {
					QDomElement query = element.elementsByTagName("query").item(0).toElement();
					//if (query.hasAttribute("xmlns") && element.attribute("xmlns")=="jabber:iq:register")
					emit pubdirReceived(query.childNodes());
					return;
				}
				if(element.attribute("id")=="tw") {
					//if (query.hasAttribute("xmlns") && element.attribute("xmlns")=="jabber:iq:register")
					// TODO implement unsuccess if timeout
					emit pubdirUpdated(true);
					return;
				}
			}
			if(element.hasAttribute("id") && element.attribute("id")=="GetRoster") {
				emit clearRosterView();
			}
			if(element.hasAttribute("from") && element.attribute("from") == "tcfg") {
				tcfgReceived(element);
				return;
			}

			if(n.hasChildNodes()) {
				QDomNodeList el=n.childNodes();
				for(int i=0;i<el.count();++i)
					emit eventReceived(el.item(i));
			}

			if(0) {
				emit tlenLoggedIn();
			}

		}
		else if(element.hasAttribute("type") && element.attribute("type") == "set") {
			if(n.hasChildNodes()) {
				QDomNodeList el=n.childNodes();
				for(int i=0;i<el.count();++i)
					emit eventReceived(el.item(i));
			}
		}
	}
	else if(nodeName=="query") {
		QDomElement e=n.toElement();
		QDomNodeList nl=n.childNodes();
		for(int i=0;i<nl.count();++i)
			event(nl.item(i));
	}
	else if(nodeName=="item") {
		QDomElement e=n.toElement();
		QString jid=decode(e.attribute("jid"));
		QString subscription=e.attribute("subscription");
		QString name=NULL, group=NULL;

		if(subscription=="remove") {
			emit removeItem(jid);
			return;
		}

		if(e.hasAttribute("ask"))
			subscription=e.attribute("ask");

		if(e.hasAttribute("name"))
			name=e.attribute("name");
		else
			name=jid;

		if( n.hasChildNodes() ) {
			QDomNodeList nl=n.childNodes();
			for(int i=0;i<nl.count();++i) {
				group=nl.item(i).firstChild().toText().data();
			}
		}

		if(group.isEmpty())
			group=tr("Contacts");

		group=decode(group.toUtf8());
		name=decode(name.toUtf8());

		emit itemReceived(jid, name, subscription, group);

	}
	else if(nodeName=="presence") {
		QDomElement e=n.toElement();
		QString from=decode(e.attribute("from"));

		if(e.hasAttribute("type") && e.attribute("type")=="subscribe") {
			emit authorizationAsk(from);
		}
		else if( e.hasAttribute("type") && e.attribute("type")=="subscribed" )
			return;
		else if(e.hasAttribute("type") && (e.attribute("type")=="unsubscribe" || e.attribute("type")=="unsubscribed"))
			return;
		else {
			QString status="none";
			QString descr="";

			if(e.hasAttribute("type"))
				status=e.attribute("type");

			QDomNodeList l=n.childNodes();

			for(int i=0; i<l.count(); ++i) {
				if(l.item(i).nodeName()=="show" && status=="none")
					status=l.item(i).firstChild().toText().data();
				if(l.item(i).nodeName()=="status")
					descr=l.item(i).firstChild().toText().data();
				if(l.item(i).nodeName()=="avatar")
				{
					// TODO store jid,type,md5 on list/qmultimap, check md5 - avatar changed
					QDomElement avatar = l.item(i).toElement().elementsByTagName("a").item(0).toElement();
					if (avatar.hasAttribute("type") && avatar.hasAttribute("md5"))
					{
						emit avatarReceived(decode(from), avatar.attribute("type"), avatar.attribute("md5"));
						qDebug() << "Avatar " << from << "type:" <<avatar.attribute("type") << "md5:" << avatar.attribute("md5");
					}
				}
			}

			descr=decode(descr.toUtf8());

			emit presenceChanged(from,status,descr);
		}
	}
	else if(nodeName=="message") {
		QDomElement e=n.toElement();
		if(e.hasAttribute("type") && e.attribute("type")=="chat")
			emit chatMsgReceived(n);
	}
	else if(nodeName=="m") {
		QDomElement e=n.toElement();
		if(e.hasAttribute("tp")) {
			emit chatNotify(decode(e.attribute("f")), e.attribute("tp"));
		}
	}
	else if(nodeName=="n") {
		//<n f='Rainer+Wiesenfarth+%[email protected]%3E' s='Re%3A+qt+and+mysql,+odbc'/> - new mail
	}
	else if(nodeName=="avatar") {
		// search for token
		QDomElement e=n.toElement();
		QDomNodeList l=n.childNodes();
		for(int i=0; i<l.count(); ++i)
			if(l.item(i).nodeName()=="token")
				token=l.item(i).firstChild().toText().data();
	}
	else if(nodeName=="f") {
		QDomElement e=n.toElement();
		if(e.attribute("e")=="1") {
			//fileIncomingDialog *dlg=new fileIncomingDialog(n);
			//connect(dlg, SIGNAL(receive(QString,QString,bool)), this, SLOT(receiveFile(QString,QString,bool)));
			//dlg->show();
		}
		else if(e.attribute("e")=="5") {
			//if( fileTransferDialog *dlg = fTransferMap.value( QString("%1-%2").arg( e.attribute("f") ).arg( e.attribute("i") ) ) )
			//	dlg->fileThread()->transferingAccepted();
		}
		else if(e.attribute("e")=="6") {
			//fileTransferDialog *dlg=new fileTransferDialog( e.attribute("i").toInt(), e.attribute("f"), e.attribute("a"), (quint16)e.attribute("p").toInt(), TRUE);
			//fTransferMap.insert(QString("%1-%2").arg( e.attribute("f") ).arg( e.attribute("i") ), dlg);
			//dlg->show();
		}
		else if(e.attribute("e")=="7") {
			//if( fileTransferDialog *dlg = fTransferMap.value( QString("%1-%2").arg( e.attribute("f") ).arg( e.attribute("i") ) ) )
			//	dlg->fileThread()->switchToSocketMode( e.attribute("a"), (quint16)e.attribute("p").toInt() );
		}
	}
}
Exemplo n.º 2
0
bool Presence::stanzaReadWrite(int AHandlerId, const Jid &AStreamJid, Stanza &AStanza, bool &AAccept)
{
	if (AHandlerId == FSHIPresence)
	{
		int show;
		int priority;
		QString status;
		QString errCond;
		if (AStanza.type().isEmpty())
		{
			QString showText = AStanza.firstElement("show").text();
			if (showText.isEmpty())
				show = Online;
			else if (showText == "chat")
				show = Chat;
			else if (showText == "away")
				show = Away;
			else if (showText == "dnd")
				show = DoNotDisturb;
			else if (showText == "xa")
				show = ExtendedAway;
			else
				show = Online;    //Костыль под кривые клиенты и транспорты

			status = AStanza.firstElement("status").text();
			priority = AStanza.firstElement("priority").text().toInt();
		}
		else if (AStanza.type() == "unavailable")
		{
			show = Offline;
			status = AStanza.firstElement("status").text();
			priority = 0;
		}
		else if (AStanza.type() == "error")
		{
			ErrorHandler err(AStanza.element());
			show = Error;
			status = err.message();
			errCond = err.condition();
			priority = 0;
		}
		else
			return false;

		if (AStreamJid != AStanza.from())
		{
			Jid fromJid = AStanza.from();

			IPresenceItem &pitem = FItems[fromJid];
			IPresenceItem before = pitem;

			pitem.isValid = true;
			pitem.itemJid = fromJid;
			pitem.show = show;
			pitem.priority = priority;
			pitem.status = status;
			pitem.errCondition = errCond;

			if (pitem != before)
				emit itemReceived(pitem, before);

			if (show == Offline)
				FItems.remove(fromJid);
		}
		else if (show!=IPresence::Offline && (FShow != show || FStatus != status || FPriority != priority))
		{
			LogDetaile(QString("[Presence][%1] Self presence changed by server, show=%2, status='%3'").arg(streamJid().bare()).arg(show).arg(status));
			FShow = show;
			FStatus = status;
			FPriority = priority;
			FErrCondition = errCond;
			emit changed(show,status,priority);
		}
		AAccept = true;
	}
	return false;
}