void Xep0313Manager::HandleHistoryQueryFinished (const QDomElement& iqElem) { const auto& setElem = iqElem.firstChildElement ("query").firstChildElement ("set"); QXmppResultSetReply resultSet; resultSet.parse (setElem); if (!LastId2Jid_.contains (resultSet.last ())) { qWarning () << Q_FUNC_INFO << "unknown `last`" << resultSet.last () << "; clearing all fetched stuff"; LastId2Jid_.clear (); Messages_.clear (); return; } const auto& jid = LastId2Jid_.take (resultSet.last ()); auto messages = Messages_.take (jid); qDebug () << Q_FUNC_INFO << resultSet.first () << resultSet.last () << messages.size (); if (messages.first ().TS_ > messages.last ().TS_) std::reverse (messages.begin (), messages.end ()); emit serverHistoryFetched (jid, resultSet.last (), messages); }
void ServerHistoryManager::handleGotHistory () { auto reply = qobject_cast<QNetworkReply*> (sender ()); reply->deleteLater (); const auto& reqContext = MsgRequestState_.take (reply); const auto& data = reply->readAll (); bool ok = true; const auto& varmap = QJson::Parser {}.parse (data).toMap (); if (!ok) { qWarning () << Q_FUNC_INFO << "cannot parse reply" << data; return; } SrvHistMessages_t messages; for (const auto& var : varmap ["response"].toList ()) { const auto& map = var.toMap (); if (map.isEmpty ()) continue; const auto dir = map ["out"].toInt () ? IMessage::Direction::Out : IMessage::Direction::In; const auto& username = dir == IMessage::Direction::In ? reqContext.Index_.data (CustomHistRole::UserName).toString () : Acc_->GetSelf ()->GetEntryName (); messages.append ({ dir, {}, username, map ["body"].toString (), QDateTime::fromTime_t (map ["date"].toULongLong ()), {} }); } for (int i = 0; i < messages.size (); ++i) messages [i].ID_ = QByteArray::number (reqContext.Offset_ + i); std::reverse (messages.begin (), messages.end ()); emit serverHistoryFetched (reqContext.Index_, QByteArray::number (reqContext.Offset_), messages); }
ServerHistoryWidget::ServerHistoryWidget (QObject *account, QWidget *parent) : QWidget { parent } , Toolbar_ { new QToolBar { this } } , AccObj_ { account } , IHSH_ { qobject_cast<IHaveServerHistory*> (account) } , ContactsFilter_ { new QSortFilterProxyModel { this } } { Ui_.setupUi (this); if (!IHSH_) { qWarning () << Q_FUNC_INFO << "account doesn't implement IHaveServerHistory" << account; return; } new Util::ClearLineEditAddon (Core::Instance ().GetProxy (), Ui_.ContactsFilter_); ContactsFilter_->setFilterCaseSensitivity (Qt::CaseInsensitive); const auto& sortParams = IHSH_->GetSortParams (); ContactsFilter_->setSortRole (sortParams.Role_); ContactsFilter_->setSortCaseSensitivity (Qt::CaseInsensitive); ContactsFilter_->setDynamicSortFilter (true); ContactsFilter_->setSourceModel (IHSH_->GetServerContactsModel ()); Ui_.ContactsView_->setModel (ContactsFilter_); Ui_.ContactsView_->sortByColumn (sortParams.Column_, sortParams.Order_); connect (AccObj_, SIGNAL (serverHistoryFetched (QModelIndex, QByteArray, SrvHistMessages_t)), this, SLOT (handleFetched (QModelIndex, QByteArray, SrvHistMessages_t))); connect (Ui_.ContactsFilter_, SIGNAL (textChanged (QString)), ContactsFilter_, SLOT (setFilterFixedString (QString))); auto prevAct = Toolbar_->addAction (tr ("Previous page"), this, SLOT (navigatePrevious ())); prevAct->setProperty ("ActionIcon", "go-previous"); auto nextAct = Toolbar_->addAction (tr ("Next page"), this, SLOT (navigateNext ())); nextAct->setProperty ("ActionIcon", "go-next"); }
void Xep0313Manager::HandleHistoryQueryFinished (const QDomElement& finElem) { const auto& setElem = finElem.firstChildElement ("set"); QXmppResultSetReply resultSet; resultSet.parse (setElem); const auto& jid = QueryId2Jid_.take (finElem.attribute ("queryid")); auto messages = Messages_.take (jid); qDebug () << Q_FUNC_INFO << resultSet.first () << resultSet.last () << messages.size (); if (!messages.isEmpty () && messages.first ().TS_ > messages.last ().TS_) std::reverse (messages.begin (), messages.end ()); emit serverHistoryFetched (jid, resultSet.last (), messages); }
void GlooxAccount::handleServerHistoryFetched (const QString& jid, const QString& id, SrvHistMessages_t messages) { const auto& index = Xep0313ModelMgr_->Jid2Index (jid); const auto& ourNick = GetOurNick (); const auto jidEntry = ClientConnection_->GetCLEntry (jid); const auto& otherNick = jidEntry ? qobject_cast<ICLEntry*> (jidEntry)->GetHumanReadableID () : jid; for (auto& message : messages) message.Nick_ = message.Dir_ == IMessage::Direction::DIn ? otherNick : ourNick; emit serverHistoryFetched (index, id.toUtf8 (), messages); }