QList<QPair<QString, QVariant>> EntryBase::GetVCardRepresentation () const { Account_->GetClientConnection ()->FetchVCard (GetJID ()); QList<QPair<QString, QVariant>> result { { tr ("Photo"), QImage::fromData (VCardIq_.photo ()) }, { "JID", VCardIq_.from () }, { tr ("Real name"), VCardIq_.fullName () }, { tr ("Birthday"), VCardIq_.birthday () }, { "URL", VCardIq_.url () }, { tr ("About"), VCardIq_.description () } }; for (const auto& phone : VCardIq_.phones ()) { if (phone.number ().isEmpty ()) continue; QStringList attrs; if (phone.type () & QXmppVCardPhone::Preferred) attrs << tr ("preferred"); if (phone.type () & QXmppVCardPhone::Home) attrs << tr ("home"); if (phone.type () & QXmppVCardPhone::Work) attrs << tr ("work"); if (phone.type () & QXmppVCardPhone::Cell) attrs << tr ("cell"); result.append ({ tr ("Phone"), attrs.isEmpty () ? phone.number () : phone.number () + " (" + attrs.join (", ") + ")" }); } for (const auto& email : VCardIq_.emails ()) { if (email.address ().isEmpty ()) continue; QStringList attrs; if (email.type () == QXmppVCardEmail::Preferred) attrs << tr ("preferred"); if (email.type () == QXmppVCardEmail::Home) attrs << tr ("home"); if (email.type () == QXmppVCardEmail::Work) attrs << tr ("work"); if (email.type () == QXmppVCardEmail::X400) attrs << "X400"; result.append ({ "Email", attrs.isEmpty () ? email.address () : email.address () + " (" + attrs.join (", ") + ")" }); } for (const auto& address : VCardIq_.addresses ()) { if ((address.country () + address.locality () + address.postcode () + address.region () + address.street ()).isEmpty ()) continue; QStringList attrs; if (address.type () & QXmppVCardAddress::Home) attrs << tr ("home"); if (address.type () & QXmppVCardAddress::Work) attrs << tr ("work"); if (address.type () & QXmppVCardAddress::Postal) attrs << tr ("postal"); if (address.type () & QXmppVCardAddress::Preferred) attrs << tr ("preferred"); QString str; QStringList fields; auto addField = [&fields] (const QString& label, const QString& val) { if (!val.isEmpty ()) fields << label.arg (val); }; addField (tr ("Country: %1"), address.country ()); addField (tr ("Region: %1"), address.region ()); addField (tr ("Locality: %1", "User's locality"), address.locality ()); addField (tr ("Street: %1"), address.street ()); addField (tr ("Postal code: %1"), address.postcode ()); result.append ({ tr ("Address"), fields }); } #if QXMPP_VERSION >= 0x000800 const auto& orgInfo = VCardIq_.organization (); result.append ({ tr ("Organization"), orgInfo.organization () }); result.append ({ tr ("Organization unit"), orgInfo.unit () }); result.append ({ tr ("Job title"), orgInfo.title () }); result.append ({ tr ("Job role"), orgInfo.role () }); #endif return result; }
void EntryBase::SetStatus (const EntryStatus& status, const QString& variant, const QXmppPresence& presence) { const bool existed = CurrentStatus_.contains (variant); const bool wasOffline = existed ? CurrentStatus_ [variant].State_ == SOffline : false; if (existed && status == CurrentStatus_ [variant] && presence.priority () == Variant2ClientInfo_.value (variant).value ("priority")) return; CurrentStatus_ [variant] = status; const QStringList& vars = Variants (); if ((!existed || wasOffline) && !vars.isEmpty ()) { const QString& highest = vars.first (); if (Location_.contains ({})) Location_ [highest] = Location_.take ({}); if (Variant2Audio_.contains ({})) Variant2Audio_ [highest] = Variant2Audio_.take ({}); if (Variant2Mood_.contains ({})) Variant2Mood_ [highest] = Variant2Mood_.take ({}); if (Variant2Activity_.contains ({})) Variant2Activity_ [highest] = Variant2Activity_.take ({}); } if ((!existed || wasOffline) && status.State_ != SOffline) { auto conn = Account_->GetClientConnection (); if (conn->GetInfoReqPolicyManager ()->IsRequestAllowed (InfoRequest::Version, this)) { if (!variant.isEmpty ()) conn->FetchVersion (GetJID () + '/' + variant); else conn->FetchVersion (GetJID ()); } } if (status.State_ != SOffline) { if (const int p = presence.priority ()) Variant2ClientInfo_ [variant] ["priority"] = p; } else { Variant2Version_.remove (variant); Variant2ClientInfo_.remove (variant); Variant2VerString_.remove (variant); Variant2Identities_.remove (variant); Variant2Audio_.remove (variant); Variant2Mood_.remove (variant); Variant2Activity_.remove (variant); Variant2SecsDiff_.remove (variant); } emit statusChanged (status, variant); if (!existed || (existed && status.State_ == SOffline) || wasOffline) emit availableVariantsChanged (vars); GlooxMessage *message = 0; if (GetEntryType () == EntryType::PrivateChat) message = new GlooxMessage (IMessage::Type::StatusMessage, IMessage::Direction::In, qobject_cast<RoomCLEntry*> (GetParentCLEntryObject ())-> GetRoomHandler ()->GetRoomJID (), GetEntryName (), Account_->GetClientConnection ().get ()); else message = new GlooxMessage (IMessage::Type::StatusMessage, IMessage::Direction::In, GetJID (), variant, Account_->GetClientConnection ().get ()); message->SetMessageSubType (IMessage::SubType::ParticipantStatusChange); GlooxProtocol *proto = qobject_cast<GlooxProtocol*> (Account_->GetParentProtocol ()); IProxyObject *proxy = qobject_cast<IProxyObject*> (proto->GetProxyObject ()); const QString& state = proxy->StateToString (status.State_); const QString& nick = GetEntryName () + '/' + variant; message->setProperty ("Azoth/Nick", nick); message->setProperty ("Azoth/TargetState", state); message->setProperty ("Azoth/StatusText", status.StatusString_); QString msg = tr ("%1 is now %2 (%3)") .arg (nick) .arg (state) .arg (status.StatusString_); message->SetBody (msg); HandleMessage (message); }
void EntryBase::handleDetectNick () { QPointer<EntryBase> ptr (this); Account_->GetClientConnection ()->FetchVCard (GetJID (), [ptr] (const QXmppVCardIq& iq) { if (ptr) ptr->SetNickFromVCard (iq); }); }
void EntryBase::SetStatus (const EntryStatus& status, const QString& variant, const QXmppPresence& presence) { const bool existed = CurrentStatus_.contains (variant); const bool wasOffline = existed ? CurrentStatus_ [variant].State_ == SOffline : false; if (existed && status == CurrentStatus_ [variant] && presence.priority () == Variant2ClientInfo_.value (variant).value ("priority")) return; CurrentStatus_ [variant] = status; const QStringList& vars = Variants (); if ((!existed || wasOffline) && !vars.isEmpty ()) { const QString& highest = vars.first (); if (Location_.contains (QString ())) Location_ [highest] = Location_.take (QString ()); if (Variant2ClientInfo_.contains (QString ())) { const auto& info = Variant2ClientInfo_ [QString ()]; QStringList toCopy; toCopy << "user_tune" << "user_mood" << "user_activity"; Q_FOREACH (const QString& key, toCopy) if (info.contains (key)) Variant2ClientInfo_ [highest] [key] = info [key]; } } if ((!existed || wasOffline) && status.State_ != SOffline) { const QString& jid = variant.isEmpty () ? GetJID () : GetJID () + '/' + variant; if (VersionReqsEnabled_) Account_->GetClientConnection ()->FetchVersion (jid); } if (status.State_ != SOffline) { if (const int p = presence.priority ()) Variant2ClientInfo_ [variant] ["priority"] = p; } else { Variant2Version_.remove (variant); Variant2ClientInfo_.remove (variant); } emit statusChanged (status, variant); if (!existed || (existed && status.State_ == SOffline) || wasOffline) emit availableVariantsChanged (vars); GlooxMessage *message = 0; if (GetEntryType () == ETPrivateChat) message = new GlooxMessage (IMessage::MTStatusMessage, IMessage::DIn, qobject_cast<RoomCLEntry*> (GetParentCLEntry ())-> GetRoomHandler ()->GetRoomJID (), GetEntryName (), Account_->GetClientConnection ().get ()); else message = new GlooxMessage (IMessage::MTStatusMessage, IMessage::DIn, GetJID (), variant, Account_->GetClientConnection ().get ()); message->SetMessageSubType (IMessage::MSTParticipantStatusChange); GlooxProtocol *proto = qobject_cast<GlooxProtocol*> (Account_->GetParentProtocol ()); IProxyObject *proxy = qobject_cast<IProxyObject*> (proto->GetProxyObject ()); const QString& state = proxy->StateToString (status.State_); const QString& nick = GetEntryName () + '/' + variant; message->setProperty ("Azoth/Nick", nick); message->setProperty ("Azoth/TargetState", state); message->setProperty ("Azoth/StatusText", status.StatusString_); QString msg = tr ("%1 is now %2 (%3)") .arg (nick) .arg (state) .arg (status.StatusString_); message->SetBody (msg); HandleMessage (message); }
void EntryBase::HandlePEPEvent (QString variant, PEPEventBase *event) { const QStringList& vars = Variants (); if (!vars.isEmpty () && (!vars.contains (variant) || variant.isEmpty ())) variant = vars.first (); if (UserActivity *activity = dynamic_cast<UserActivity*> (event)) { if (activity->GetGeneral () == UserActivity::GeneralEmpty) Variant2ClientInfo_ [variant].remove ("user_activity"); else { QMap<QString, QVariant> activityMap; activityMap ["general"] = activity->GetGeneralStr (); activityMap ["specific"] = activity->GetSpecificStr (); activityMap ["text"] = activity->GetText (); Variant2ClientInfo_ [variant] ["user_activity"] = activityMap; } emit activityChanged (variant); return; } if (UserMood *mood = dynamic_cast<UserMood*> (event)) { if (mood->GetMood () == UserMood::MoodEmpty) Variant2ClientInfo_ [variant].remove ("user_mood"); else { QMap<QString, QVariant> moodMap; moodMap ["mood"] = mood->GetMoodStr (); moodMap ["text"] = mood->GetText (); Variant2ClientInfo_ [variant] ["user_mood"] = moodMap; } emit moodChanged (variant); return; } if (UserTune *tune = dynamic_cast<UserTune*> (event)) { if (tune->IsNull ()) Variant2ClientInfo_ [variant].remove ("user_tune"); else { QMap<QString, QVariant> tuneMap; tuneMap ["artist"] = tune->GetArtist (); tuneMap ["source"] = tune->GetSource (); tuneMap ["title"] = tune->GetTitle (); tuneMap ["track"] = tune->GetTrack (); tuneMap ["URI"] = tune->GetURI (); tuneMap ["length"] = tune->GetLength (); tuneMap ["rating"] = tune->GetRating (); Variant2ClientInfo_ [variant] ["user_tune"] = tuneMap; } emit tuneChanged (variant); return; } if (UserLocation *location = dynamic_cast<UserLocation*> (event)) { Location_ [variant] = location->GetInfo (); emit locationChanged (variant, this); emit locationChanged (variant); return; } if (PEPMicroblog *microblog = dynamic_cast<PEPMicroblog*> (event)) { emit gotNewPost (*microblog); return; } if (dynamic_cast<UserAvatarData*> (event) || dynamic_cast<UserAvatarMetadata*> (event)) return; qWarning () << Q_FUNC_INFO << "unhandled PEP event from" << GetJID () << "resource" << variant; }
void GlooxCLEntry::handleGWEdit () { auto dia = new GWOptionsDialog (Account_->GetClientConnection ()->GetClient (), GetJID ()); dia->setAttribute (Qt::WA_DeleteOnClose); dia->show (); }
QString RoomParticipantEntry::GetRealJID () const { return RoomHandler_->GetRoom ()-> participantPresence (GetJID ()).mucItem ().jid (); }