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 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 tst_QXmppResultSet::testReply() { QFETCH(QByteArray, xml); QFETCH(int, count); QFETCH(int, index); QFETCH(QString, first); QFETCH(QString, last); QXmppResultSetReply iq; parsePacket(iq, xml); QCOMPARE(iq.count(), count); QCOMPARE(iq.index(), index); QCOMPARE(iq.first(), first); QCOMPARE(iq.first().isNull(), first.isNull()); QCOMPARE(iq.last(), last); QCOMPARE(iq.last().isNull(), last.isNull()); serializePacket(iq, xml); }
void rsmFilter(QDjangoQuerySet<T1> &qs, const QXmppResultSetQuery &rsmQuery, QList<T2> &results, QXmppResultSetReply &rsmReply) { // if count was requested, stop here if (rsmQuery.max() == 0) { rsmReply.setCount(qs.count()); return; } rsmReply.setCount(qs.size()); T1 result; if (rsmQuery.before().isNull()) { // page forwards bool rsmAfterReached = rsmQuery.after().isEmpty(); for (int i = 0; i < qs.size(); ++i) { if (rsmQuery.max() >= 0 && results.size() >= rsmQuery.max()) break; // fetch from database if (!qs.at(i, &result)) break; const QString uid = result.pk().toString(); // if an "after" was specified, check it was reached if (!rsmAfterReached) { if (uid == rsmQuery.after()) rsmAfterReached = true; continue; } if (results.isEmpty()) { rsmReply.setFirst(uid); rsmReply.setIndex(i); } rsmReply.setLast(uid); results << result; } } else { // page backwards bool rsmBeforeReached = rsmQuery.before().isEmpty(); for (int i = qs.size() - 1; i >= 0; --i) { if (rsmQuery.max() >= 0 && results.size() >= rsmQuery.max()) break; // fetch from database if (!qs.at(i, &result)) break; const QString uid = result.pk().toString(); // if a "before" was specified, check it was reached if (!rsmBeforeReached) { if (uid == rsmQuery.before()) rsmBeforeReached = true; continue; } if (results.isEmpty()) rsmReply.setLast(uid); rsmReply.setFirst(uid); rsmReply.setIndex(i); results.prepend(result); } } }