workaround for ejabberd history fetching
This commit is contained in:
parent
eba33bea8a
commit
9834fc33e8
@ -263,7 +263,7 @@ void Core::Account::handleNewContact(Core::Contact* contact)
|
|||||||
QObject::connect(contact, SIGNAL(nameChanged(const QString&)), this, SLOT(onContactNameChanged(const QString&)));
|
QObject::connect(contact, SIGNAL(nameChanged(const QString&)), this, SLOT(onContactNameChanged(const QString&)));
|
||||||
QObject::connect(contact, SIGNAL(subscriptionStateChanged(Shared::SubscriptionState)),
|
QObject::connect(contact, SIGNAL(subscriptionStateChanged(Shared::SubscriptionState)),
|
||||||
this, SLOT(onContactSubscriptionStateChanged(Shared::SubscriptionState)));
|
this, SLOT(onContactSubscriptionStateChanged(Shared::SubscriptionState)));
|
||||||
QObject::connect(contact, SIGNAL(needHistory(const QString&, const QString&)), this, SLOT(onContactNeedHistory(const QString&, const QString&)));
|
QObject::connect(contact, SIGNAL(needHistory(const QString&, const QString&, const QDateTime&)), this, SLOT(onContactNeedHistory(const QString&, const QString&, const QDateTime&)));
|
||||||
QObject::connect(contact, SIGNAL(historyResponse(const std::list<Shared::Message>&)), this, SLOT(onContactHistoryResponse(const std::list<Shared::Message>&)));
|
QObject::connect(contact, SIGNAL(historyResponse(const std::list<Shared::Message>&)), this, SLOT(onContactHistoryResponse(const std::list<Shared::Message>&)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,8 +519,6 @@ void Core::Account::onMamMessageReceived(const QString& queryId, const QXmppMess
|
|||||||
QString jid = itr->second;
|
QString jid = itr->second;
|
||||||
std::map<QString, Contact*>::const_iterator citr = contacts.find(jid);
|
std::map<QString, Contact*>::const_iterator citr = contacts.find(jid);
|
||||||
|
|
||||||
logMessage(msg, "MAM MESSAGE:");
|
|
||||||
|
|
||||||
if (citr != contacts.end()) {
|
if (citr != contacts.end()) {
|
||||||
Contact* cnt = citr->second;
|
Contact* cnt = citr->second;
|
||||||
if (msg.id().size() > 0 && msg.body().size() > 0) {
|
if (msg.id().size() > 0 && msg.body().size() > 0) {
|
||||||
@ -564,7 +562,7 @@ void Core::Account::requestArchive(const QString& jid, int count, const QString&
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Account::onContactNeedHistory(const QString& before, const QString& after)
|
void Core::Account::onContactNeedHistory(const QString& before, const QString& after, const QDateTime& at)
|
||||||
{
|
{
|
||||||
Contact* contact = static_cast<Contact*>(sender());
|
Contact* contact = static_cast<Contact*>(sender());
|
||||||
QXmppResultSetQuery query;
|
QXmppResultSetQuery query;
|
||||||
@ -572,13 +570,18 @@ void Core::Account::onContactNeedHistory(const QString& before, const QString& a
|
|||||||
if (before.size() > 0) {
|
if (before.size() > 0) {
|
||||||
query.setBefore(before);
|
query.setBefore(before);
|
||||||
}
|
}
|
||||||
if (after.size() > 0) {
|
QDateTime start;
|
||||||
query.setAfter(after);
|
if (after.size() > 0) { //there is some strange behavior of ejabberd server returning empty result set
|
||||||
|
if (at.isValid()) { //there can be some useful information about it here https://github.com/processone/ejabberd/issues/2924
|
||||||
|
start = at;
|
||||||
|
} else {
|
||||||
|
query.setAfter(after);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "Remote query from" << after << ", to" << before;
|
qDebug() << "Remote query from" << after << ", to" << before;
|
||||||
|
|
||||||
QString q = am->retrieveArchivedMessages("", "", contact->jid, QDateTime(), QDateTime(), query);
|
QString q = am->retrieveArchivedMessages("", "", contact->jid, start, QDateTime(), query);
|
||||||
achiveQueries.insert(std::make_pair(q, contact->jid));
|
achiveQueries.insert(std::make_pair(q, contact->jid));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,15 +591,6 @@ void Core::Account::onMamResultsReceived(const QString& queryId, const QXmppResu
|
|||||||
std::map<QString, QString>::const_iterator itr = achiveQueries.find(queryId);
|
std::map<QString, QString>::const_iterator itr = achiveQueries.find(queryId);
|
||||||
QString jid = itr->second;
|
QString jid = itr->second;
|
||||||
|
|
||||||
|
|
||||||
qDebug() << "MAM RESULTS:";
|
|
||||||
qDebug() << "complete:" << complete;
|
|
||||||
qDebug() << "count:" << resultSetReply.count();
|
|
||||||
qDebug() << "first:" << resultSetReply.first();
|
|
||||||
qDebug() << "last:" << resultSetReply.last();
|
|
||||||
qDebug() << "index:" << resultSetReply.index();
|
|
||||||
qDebug() << "isNull:" << resultSetReply.isNull();
|
|
||||||
|
|
||||||
achiveQueries.erase(itr);
|
achiveQueries.erase(itr);
|
||||||
std::map<QString, Contact*>::const_iterator citr = contacts.find(jid);
|
std::map<QString, Contact*>::const_iterator citr = contacts.find(jid);
|
||||||
if (citr != contacts.end()) {
|
if (citr != contacts.end()) {
|
||||||
|
@ -106,7 +106,7 @@ private slots:
|
|||||||
void onContactNameChanged(const QString& name);
|
void onContactNameChanged(const QString& name);
|
||||||
void onContactSubscriptionStateChanged(Shared::SubscriptionState state);
|
void onContactSubscriptionStateChanged(Shared::SubscriptionState state);
|
||||||
void onContactHistoryResponse(const std::list<Shared::Message>& list);
|
void onContactHistoryResponse(const std::list<Shared::Message>& list);
|
||||||
void onContactNeedHistory(const QString& before, const QString& after);
|
void onContactNeedHistory(const QString& before, const QString& after, const QDateTime& at);
|
||||||
|
|
||||||
void onMamLog(QXmppLogger::MessageType type, const QString &msg);
|
void onMamLog(QXmppLogger::MessageType type, const QString &msg);
|
||||||
|
|
||||||
|
@ -156,12 +156,14 @@ void Core::Contact::performRequest(int count, const QString& before)
|
|||||||
emit needHistory(before, "");
|
emit needHistory(before, "");
|
||||||
break;
|
break;
|
||||||
case chunk:
|
case chunk:
|
||||||
case beginning:
|
case beginning: {
|
||||||
if (count != -1) {
|
if (count != -1) {
|
||||||
requestCache.emplace_back(requestedCount, before);
|
requestCache.emplace_back(requestedCount, before);
|
||||||
requestedCount = -1;
|
requestedCount = -1;
|
||||||
}
|
}
|
||||||
emit needHistory("", archive->newestId());
|
Shared::Message msg = archive->newest();
|
||||||
|
emit needHistory("", msg.getId(), msg.getTime());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case end:
|
case end:
|
||||||
if (count != -1) {
|
if (count != -1) {
|
||||||
@ -180,6 +182,10 @@ void Core::Contact::performRequest(int count, const QString& before)
|
|||||||
requestCache.emplace_back(requestedCount, before);
|
requestCache.emplace_back(requestedCount, before);
|
||||||
requestedCount = -1;
|
requestedCount = -1;
|
||||||
emit needHistory(archive->oldestId(), "");
|
emit needHistory(archive->oldestId(), "");
|
||||||
|
} catch (Archive::Empty e) {
|
||||||
|
requestCache.emplace_back(requestedCount, before);
|
||||||
|
requestedCount = -1;
|
||||||
|
emit needHistory(archive->oldestId(), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found) {
|
if (found) {
|
||||||
@ -204,6 +210,8 @@ void Core::Contact::performRequest(int count, const QString& before)
|
|||||||
responseCache.insert(responseCache.begin(), arc.begin(), arc.end());
|
responseCache.insert(responseCache.begin(), arc.begin(), arc.end());
|
||||||
} catch (Archive::NotFound e) {
|
} catch (Archive::NotFound e) {
|
||||||
qDebug("requesting id hasn't been found in archive, skipping");
|
qDebug("requesting id hasn't been found in archive, skipping");
|
||||||
|
} catch (Archive::Empty e) {
|
||||||
|
qDebug("requesting id hasn't been found in archive, skipping");
|
||||||
}
|
}
|
||||||
nextRequest();
|
nextRequest();
|
||||||
break;
|
break;
|
||||||
@ -301,6 +309,8 @@ void Core::Contact::flushMessagesToArchive(bool finished, const QString& firstId
|
|||||||
found = true;
|
found = true;
|
||||||
} catch (Archive::NotFound e) {
|
} catch (Archive::NotFound e) {
|
||||||
|
|
||||||
|
} catch (Archive::Empty e) {
|
||||||
|
|
||||||
}
|
}
|
||||||
if (!found || requestedCount > responseCache.size()) {
|
if (!found || requestedCount > responseCache.size()) {
|
||||||
if (archiveState == complete) {
|
if (archiveState == complete) {
|
||||||
|
@ -62,7 +62,7 @@ signals:
|
|||||||
void nameChanged(const QString& name);
|
void nameChanged(const QString& name);
|
||||||
void subscriptionStateChanged(Shared::SubscriptionState state);
|
void subscriptionStateChanged(Shared::SubscriptionState state);
|
||||||
void historyResponse(const std::list<Shared::Message>& messages);
|
void historyResponse(const std::list<Shared::Message>& messages);
|
||||||
void needHistory(const QString& before, const QString& after);
|
void needHistory(const QString& before, const QString& after, const QDateTime& afterTime = QDateTime());
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const QString jid;
|
const QString jid;
|
||||||
|
Loading…
Reference in New Issue
Block a user