void Client::updatePresence(LiveRosterItem *i, const Jid &j, const Status &s) { ResourceList::Iterator rit = i->resourceList().find(j.resource()); bool found = (rit == i->resourceList().end()) ? false: true; // unavailable? remove the resource if(!s.isAvailable()) { if(found) { (*rit).setStatus(s); debug(QString("Client: Removing resource from [%1]: name=[%2]\n").arg(i->jid().full()).arg(j.resource())); resourceUnavailable(j, *rit); i->resourceList().remove(rit); i->setLastUnavailableStatus(s); } } // available? add/update the resource else { Resource r; if(!found) { r = Resource(j.resource(), s); i->resourceList() += r; debug(QString("Client: Adding resource to [%1]: name=[%2]\n").arg(i->jid().full()).arg(j.resource())); } else { (*rit).setStatus(s); r = *rit; debug(QString("Client: Updating resource to [%1]: name=[%2]\n").arg(i->jid().full()).arg(j.resource())); } resourceAvailable(j, r); } }
void Client::updateSelfPresence(const Jid &j, const Status &s) { ResourceList::Iterator rit = d->resourceList.find(j.resource()); bool found = (rit == d->resourceList.end()) ? false: true; // unavailable? remove the resource if(!s.isAvailable()) { if(found) { debug(QString("Client: Removing self resource: name=[%1]\n").arg(j.resource())); (*rit).setStatus(s); resourceUnavailable(j, *rit); d->resourceList.remove(rit); } } // available? add/update the resource else { Resource r; if(!found) { r = Resource(j.resource(), s); d->resourceList += r; debug(QString("Client: Adding self resource: name=[%1]\n").arg(j.resource())); } else { (*rit).setStatus(s); r = *rit; debug(QString("Client: Updating self resource: name=[%1]\n").arg(j.resource())); } resourceAvailable(j, r); } }
UserStatus userStatusFor(const Jid& jid, QList<UserListItem*> ul, bool forceEmptyResource) { if (ul.isEmpty()) return UserStatus(); UserStatus u; u.userListItem = ul.first(); if (jid.resource().isEmpty() || forceEmptyResource) { // use priority if (u.userListItem->isAvailable()) { const UserResource &r = *u.userListItem->userResourceList().priority(); u.statusType = r.status().type(); u.status = r.status().status(); u.publicKeyID = r.publicKeyID(); } } else { // use specific UserResourceList::ConstIterator rit = u.userListItem->userResourceList().find(jid.resource()); if (rit != u.userListItem->userResourceList().end()) { u.statusType = (*rit).status().type(); u.status = (*rit).status().status(); u.publicKeyID = (*rit).publicKeyID(); } } if (u.statusType == XMPP::Status::Offline) u.status = u.userListItem->lastUnavailableStatus().status(); return u; }
bool FileWriter::writeMessage(const Message &AMessage, const QString &ASaveMode, bool ADirectionIn) { if (isOpened() && ASaveMode!=ARCHIVE_SAVE_FALSE) { Jid contactJid = AMessage.from(); FGroupchat |= AMessage.type()==Message::GroupChat; if (!FGroupchat || contactJid.hasResource()) { FMessagesCount++; FXmlWriter->writeStartElement(ADirectionIn ? "from" : "to"); int secs = FHeader.start.secsTo(AMessage.dateTime()); if (secs >= 0) FXmlWriter->writeAttribute("secs",QString::number(secs)); else FXmlWriter->writeAttribute("utc",DateTime(AMessage.dateTime()).toX85UTC()); if (FGroupchat) FXmlWriter->writeAttribute("name",contactJid.resource()); if (ASaveMode == ARCHIVE_SAVE_BODY) FXmlWriter->writeTextElement("body",AMessage.body()); else writeElementChilds(AMessage.stanza().element()); FXmlWriter->writeEndElement(); FXmlFile->flush(); checkLimits(); return true; } } return false; }
bool MultiUserChat::isUserPresent(const Jid &AContactJid) const { if (FUsers.contains(AContactJid.resource()) && AContactJid.pBare()==FRoomJid.pBare()) return true; foreach(MultiUser *user, FUsers) if (AContactJid == user->data(MUDR_REAL_JID).toString()) return true; return false; }
void ClientInfo::showClientInfo(const Jid &AStreamJid, const Jid &AContactJid, int AInfoTypes) { if (AStreamJid.isValid() && AContactJid.isValid() && AInfoTypes>0) { ClientInfoDialog *dialog = FClientInfoDialogs.value(AContactJid,NULL); if (!dialog) { QString contactName = AContactJid.uNode(); if (FDiscovery!=NULL && FDiscovery->discoInfo(AStreamJid,AContactJid.bare()).identity.value(0).category=="conference") contactName = AContactJid.resource(); if (contactName.isEmpty()) contactName = FDiscovery!=NULL ? FDiscovery->discoInfo(AStreamJid,AContactJid).identity.value(0).name : AContactJid.domain(); if (FRosterManager) { IRoster *roster = FRosterManager->findRoster(AStreamJid); if (roster) { IRosterItem ritem = roster->findItem(AContactJid); if (!ritem.name.isEmpty()) contactName = ritem.name; } } dialog = new ClientInfoDialog(this,AStreamJid,AContactJid,!contactName.isEmpty() ? contactName : AContactJid.uFull(),AInfoTypes); connect(dialog,SIGNAL(clientInfoDialogClosed(const Jid &)),SLOT(onClientInfoDialogClosed(const Jid &))); FClientInfoDialogs.insert(AContactJid,dialog); dialog->show(); } else { dialog->setInfoTypes(dialog->infoTypes() | AInfoTypes); WidgetManager::showActivateRaiseWindow(dialog); } } }
bool SASLBind::xmppStanzaIn(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder) { if (AXmppStream==FXmppStream && AOrder==XSHO_XMPP_FEATURE && AStanza.id()=="bind") { FXmppStream->removeXmppStanzaHandler(this, XSHO_XMPP_FEATURE); if (AStanza.type() == "result") { Jid streamJid = AStanza.firstElement().firstChild().toElement().text(); if (streamJid.isValid()) { LogDetaile(QString("[SASLBind][%1] XMPP session binded with resource='%2'").arg(FXmppStream->streamJid().bare()).arg(streamJid.resource())); deleteLater(); FXmppStream->setStreamJid(streamJid); emit finished(false); } else { LogError(QString("[SASLBind][%1] Invalid XMPP stream JID in response").arg(FXmppStream->streamJid().bare())); emit error(tr("Invalid XMPP stream JID in SASL bind response")); } } else { ErrorHandler err(AStanza.element()); LogError(QString("[SASLBind] Failed to bind XMPP session: %1").arg(err.message())); emit error(err.message()); } return true; } return false; }
void Client::ppPresence(const Jid &j, const Status &s) { if(s.isAvailable()) debug(QString("Client: %1 is available.\n").arg(j.full())); else debug(QString("Client: %1 is unavailable.\n").arg(j.full())); for(QValueList<GroupChat>::Iterator it = d->groupChatList.begin(); it != d->groupChatList.end(); it++) { GroupChat &i = *it; if(i.j.compare(j, false)) { bool us = (i.j.resource() == j.resource() || j.resource().isEmpty()) ? true: false; debug(QString("for groupchat i=[%1] pres=[%2], [us=%3].\n").arg(i.j.full()).arg(j.full()).arg(us)); switch(i.status) { case GroupChat::Connecting: if(us && s.hasError()) { Jid j = i.j; d->groupChatList.remove(it); groupChatError(j, s.errorCode(), s.errorString()); } else { // don't signal success unless it is a non-error presence if(!s.hasError()) { i.status = GroupChat::Connected; groupChatJoined(i.j); } groupChatPresence(j, s); } break; case GroupChat::Connected: groupChatPresence(j, s); break; case GroupChat::Closing: if(us && !s.isAvailable()) { Jid j = i.j; d->groupChatList.remove(it); groupChatLeft(j); } break; default: break; } return; } } if(s.hasError()) { presenceError(j, s.errorCode(), s.errorString()); return; } // is it me? if(j.compare(jid(), false)) { updateSelfPresence(j, s); } else { // update all relavent roster entries for(LiveRoster::Iterator it = d->roster.begin(); it != d->roster.end(); ++it) { LiveRosterItem &i = *it; if(!i.jid().compare(j, false)) continue; // roster item has its own resource? if(!i.jid().resource().isEmpty()) { if(i.jid().resource() != j.resource()) continue; } updatePresence(&i, j, s); } } }