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() ); } } }
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; }