forked from blue/squawk
some better cleanup and restore state on connect disconnect, workaround for that wired undefined condition error on every other reconnection
This commit is contained in:
parent
87426ee20f
commit
0dcfc5eedc
@ -25,7 +25,7 @@ using namespace Core;
|
|||||||
Account::Account(const QString& p_login, const QString& p_server, const QString& p_password, const QString& p_name, NetworkAccess* p_net, QObject* parent):
|
Account::Account(const QString& p_login, const QString& p_server, const QString& p_password, const QString& p_name, NetworkAccess* p_net, QObject* parent):
|
||||||
QObject(parent),
|
QObject(parent),
|
||||||
name(p_name),
|
name(p_name),
|
||||||
achiveQueries(),
|
archiveQueries(),
|
||||||
client(),
|
client(),
|
||||||
config(),
|
config(),
|
||||||
presence(),
|
presence(),
|
||||||
@ -137,7 +137,7 @@ Account::Account(const QString& p_login, const QString& p_server, const QString&
|
|||||||
}
|
}
|
||||||
|
|
||||||
reconnectTimer->setSingleShot(true);
|
reconnectTimer->setSingleShot(true);
|
||||||
QObject::connect(reconnectTimer, &QTimer::timeout, this, &Account::connect);
|
QObject::connect(reconnectTimer, &QTimer::timeout, this, &Account::onReconnectTimer);
|
||||||
|
|
||||||
// QXmppLogger* logger = new QXmppLogger(this);
|
// QXmppLogger* logger = new QXmppLogger(this);
|
||||||
// logger->setLoggingType(QXmppLogger::SignalLogging);
|
// logger->setLoggingType(QXmppLogger::SignalLogging);
|
||||||
@ -178,6 +178,10 @@ Shared::ConnectionState Core::Account::getState() const
|
|||||||
|
|
||||||
void Core::Account::connect()
|
void Core::Account::connect()
|
||||||
{
|
{
|
||||||
|
if (reconnectScheduled) {
|
||||||
|
reconnectScheduled = false;
|
||||||
|
reconnectTimer->stop();
|
||||||
|
}
|
||||||
if (state == Shared::ConnectionState::disconnected) {
|
if (state == Shared::ConnectionState::disconnected) {
|
||||||
qDebug() << presence.availableStatusType();
|
qDebug() << presence.availableStatusType();
|
||||||
client.connectToServer(config, presence);
|
client.connectToServer(config, presence);
|
||||||
@ -186,6 +190,14 @@ void Core::Account::connect()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Core::Account::onReconnectTimer()
|
||||||
|
{
|
||||||
|
if (reconnectScheduled) {
|
||||||
|
reconnectScheduled = false;
|
||||||
|
connect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Core::Account::disconnect()
|
void Core::Account::disconnect()
|
||||||
{
|
{
|
||||||
if (reconnectScheduled) {
|
if (reconnectScheduled) {
|
||||||
@ -193,7 +205,7 @@ void Core::Account::disconnect()
|
|||||||
reconnectTimer->stop();
|
reconnectTimer->stop();
|
||||||
}
|
}
|
||||||
if (state != Shared::ConnectionState::disconnected) {
|
if (state != Shared::ConnectionState::disconnected) {
|
||||||
rh->clearConferences();
|
//rh->clearConferences();
|
||||||
client.disconnectFromServer();
|
client.disconnectFromServer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -397,8 +409,8 @@ void Core::Account::sendMessage(const Shared::Message& data, const QString& path
|
|||||||
void Core::Account::onMamMessageReceived(const QString& queryId, const QXmppMessage& msg)
|
void Core::Account::onMamMessageReceived(const QString& queryId, const QXmppMessage& msg)
|
||||||
{
|
{
|
||||||
if (msg.id().size() > 0 && (msg.body().size() > 0 || msg.outOfBandUrl().size() > 0)) {
|
if (msg.id().size() > 0 && (msg.body().size() > 0 || msg.outOfBandUrl().size() > 0)) {
|
||||||
std::map<QString, QString>::const_iterator itr = achiveQueries.find(queryId);
|
std::map<QString, QString>::const_iterator itr = archiveQueries.find(queryId);
|
||||||
if (itr != achiveQueries.end()) {
|
if (itr != archiveQueries.end()) {
|
||||||
QString jid = itr->second;
|
QString jid = itr->second;
|
||||||
RosterItem* item = rh->getRosterItem(jid);
|
RosterItem* item = rh->getRosterItem(jid);
|
||||||
|
|
||||||
@ -469,15 +481,15 @@ void Core::Account::onContactNeedHistory(const QString& before, const QString& a
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString q = am->retrieveArchivedMessages(to, "", with, start, QDateTime(), query);
|
QString q = am->retrieveArchivedMessages(to, "", with, start, QDateTime(), query);
|
||||||
achiveQueries.insert(std::make_pair(q, contact->jid));
|
archiveQueries.insert(std::make_pair(q, contact->jid));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Account::onMamResultsReceived(const QString& queryId, const QXmppResultSetReply& resultSetReply, bool complete)
|
void Core::Account::onMamResultsReceived(const QString& queryId, const QXmppResultSetReply& resultSetReply, bool complete)
|
||||||
{
|
{
|
||||||
std::map<QString, QString>::const_iterator itr = achiveQueries.find(queryId);
|
std::map<QString, QString>::const_iterator itr = archiveQueries.find(queryId);
|
||||||
if (itr != achiveQueries.end()) {
|
if (itr != archiveQueries.end()) {
|
||||||
QString jid = itr->second;
|
QString jid = itr->second;
|
||||||
achiveQueries.erase(itr);
|
archiveQueries.erase(itr);
|
||||||
|
|
||||||
RosterItem* ri = rh->getRosterItem(jid);
|
RosterItem* ri = rh->getRosterItem(jid);
|
||||||
|
|
||||||
@ -570,6 +582,8 @@ void Core::Account::onClientError(QXmppClient::Error err)
|
|||||||
break;
|
break;
|
||||||
case QXmppStanza::Error::UndefinedCondition:
|
case QXmppStanza::Error::UndefinedCondition:
|
||||||
errorText = "Undefined condition";
|
errorText = "Undefined condition";
|
||||||
|
reconnectScheduled = true;
|
||||||
|
reconnectTimer->start(500); //let's reconnect here just for now, it seems to be something broken in QXMPP
|
||||||
break;
|
break;
|
||||||
case QXmppStanza::Error::UnexpectedRequest:
|
case QXmppStanza::Error::UnexpectedRequest:
|
||||||
errorText = "Unexpected request";
|
errorText = "Unexpected request";
|
||||||
@ -882,7 +896,13 @@ void Core::Account::onDiscoveryInfoReceived(const QXmppDiscoveryIq& info)
|
|||||||
|
|
||||||
void Core::Account::cancelHistoryRequests()
|
void Core::Account::cancelHistoryRequests()
|
||||||
{
|
{
|
||||||
rh->cancelHistoryRequests();
|
rh->handleOffline();
|
||||||
achiveQueries.clear();
|
archiveQueries.clear();
|
||||||
|
pendingVCardRequests.clear();
|
||||||
|
Shared::VCard vCard; //just to show, that there is now more pending request
|
||||||
|
for (const QString& jid : pendingVCardRequests) {
|
||||||
|
emit receivedVCard(jid, vCard); //need to show it better in the future, like with an error
|
||||||
|
}
|
||||||
|
ownVCardRequestInProgress = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ signals:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QString name;
|
QString name;
|
||||||
std::map<QString, QString> achiveQueries;
|
std::map<QString, QString> archiveQueries;
|
||||||
QXmppClient client;
|
QXmppClient client;
|
||||||
QXmppConfiguration config;
|
QXmppConfiguration config;
|
||||||
QXmppPresence presence;
|
QXmppPresence presence;
|
||||||
@ -186,6 +186,7 @@ private slots:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void cancelHistoryRequests();
|
void cancelHistoryRequests();
|
||||||
|
void onReconnectTimer();
|
||||||
};
|
};
|
||||||
|
|
||||||
void initializeVCard(Shared::VCard& vCard, const QXmppVCardIq& card);
|
void initializeVCard(Shared::VCard& vCard, const QXmppVCardIq& card);
|
||||||
|
@ -421,7 +421,11 @@ void Core::RosterHandler::bookmarksReceived(const QXmppBookmarkSet& bookmarks)
|
|||||||
if (cItr == conferences.end()) {
|
if (cItr == conferences.end()) {
|
||||||
addNewRoom(jid, c.nickName(), c.name(), c.autoJoin());
|
addNewRoom(jid, c.nickName(), c.name(), c.autoJoin());
|
||||||
} else {
|
} else {
|
||||||
qDebug() << "Received a bookmark to a MUC " << jid << " which is already booked by another bookmark, skipping";
|
if (c.autoJoin()) {
|
||||||
|
cItr->second->setJoined(true);
|
||||||
|
} else {
|
||||||
|
cItr->second->setAutoJoin(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -572,12 +576,14 @@ void Core::RosterHandler::onContactAvatarChanged(Shared::Avatar type, const QStr
|
|||||||
emit acc->changeContact(item->jid, cData);
|
emit acc->changeContact(item->jid, cData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::RosterHandler::cancelHistoryRequests()
|
void Core::RosterHandler::handleOffline()
|
||||||
{
|
{
|
||||||
for (const std::pair<const QString, Conference*>& pair : conferences) {
|
for (const std::pair<const QString, Conference*>& pair : conferences) {
|
||||||
pair.second->clearArchiveRequests();
|
pair.second->clearArchiveRequests();
|
||||||
|
pair.second->downgradeDatabaseState();
|
||||||
}
|
}
|
||||||
for (const std::pair<const QString, Contact*>& pair : contacts) {
|
for (const std::pair<const QString, Contact*>& pair : contacts) {
|
||||||
pair.second->clearArchiveRequests();
|
pair.second->clearArchiveRequests();
|
||||||
|
pair.second->downgradeDatabaseState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ public:
|
|||||||
|
|
||||||
void removeRoomRequest(const QString& jid);
|
void removeRoomRequest(const QString& jid);
|
||||||
void addRoomRequest(const QString& jid, const QString& nick, const QString& password, bool autoJoin);
|
void addRoomRequest(const QString& jid, const QString& nick, const QString& password, bool autoJoin);
|
||||||
void cancelHistoryRequests();
|
void handleOffline();
|
||||||
|
|
||||||
Core::Contact* getContact(const QString& jid);
|
Core::Contact* getContact(const QString& jid);
|
||||||
Core::Conference* getConference(const QString& jid);
|
Core::Conference* getConference(const QString& jid);
|
||||||
|
@ -523,8 +523,25 @@ void Core::RosterItem::clearArchiveRequests()
|
|||||||
syncronizing = false;
|
syncronizing = false;
|
||||||
requestedCount = 0;
|
requestedCount = 0;
|
||||||
requestedBefore = "";
|
requestedBefore = "";
|
||||||
|
for (const std::pair<int, QString>& pair : requestCache) {
|
||||||
|
if (pair.first != -1) {
|
||||||
|
emit historyResponse(responseCache); //just to notify those who still waits with whatever happened to be left in caches yet
|
||||||
|
}
|
||||||
|
responseCache.clear();
|
||||||
|
}
|
||||||
hisoryCache.clear();
|
hisoryCache.clear();
|
||||||
responseCache.clear();
|
responseCache.clear(); //in case the cycle never runned
|
||||||
appendCache.clear();
|
appendCache.clear();
|
||||||
requestCache.clear();
|
requestCache.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Core::RosterItem::downgradeDatabaseState()
|
||||||
|
{
|
||||||
|
if (archiveState == ArchiveState::complete) {
|
||||||
|
archiveState = ArchiveState::beginning;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (archiveState == ArchiveState::end) {
|
||||||
|
archiveState = ArchiveState::chunk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -76,6 +76,7 @@ public:
|
|||||||
|
|
||||||
bool changeMessage(const QString& id, const QMap<QString, QVariant>& data);
|
bool changeMessage(const QString& id, const QMap<QString, QVariant>& data);
|
||||||
void clearArchiveRequests();
|
void clearArchiveRequests();
|
||||||
|
void downgradeDatabaseState();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void nameChanged(const QString& name);
|
void nameChanged(const QString& name);
|
||||||
|
Loading…
Reference in New Issue
Block a user