better new message handling, subscription with adding new contact, out of roster contacts handling

This commit is contained in:
Blue 2019-06-18 18:08:03 +03:00
parent bb509be29a
commit b2699e0087
11 changed files with 100 additions and 23 deletions

View file

@ -18,7 +18,9 @@ Account::Account(const QString& p_login, const QString& p_server, const QString&
am(new QXmppMamManager()),
contacts(),
maxReconnectTimes(0),
reconnectTimes(0)
reconnectTimes(0),
queuedContacts(),
outOfRosterContacts()
{
config.setUser(p_login);
config.setDomain(p_server);
@ -166,6 +168,12 @@ void Core::Account::setReconnectTimes(unsigned int times)
void Core::Account::onRosterItemAdded(const QString& bareJid)
{
addedAccount(bareJid);
std::map<QString, QString>::const_iterator itr = queuedContacts.find(bareJid);
if (itr != queuedContacts.end()) {
QXmppRosterManager& rm = client.rosterManager();
rm.subscribe(bareJid, itr->second);
queuedContacts.erase(itr);
}
}
void Core::Account::onRosterItemChanged(const QString& bareJid)
@ -447,6 +455,7 @@ bool Core::Account::handleChatMessage(const QXmppMessage& msg, bool outgoing, bo
} else {
cnt = new Contact(jid, name);
contacts.insert(std::make_pair(jid, cnt));
outOfRosterContacts.insert(jid);
cnt->setSubscriptionState(Shared::unknown);
emit addContact(jid, "", QMap<QString, QVariant>({
{"state", Shared::unknown}
@ -785,8 +794,14 @@ void Core::Account::unsubscribeFromContact(const QString& jid, const QString& re
void Core::Account::removeContactRequest(const QString& jid)
{
if (state == Shared::connected) {
QXmppRosterManager& rm = client.rosterManager();
rm.removeItem(jid);
std::set<QString>::const_iterator itr = outOfRosterContacts.find(jid);
if (itr != outOfRosterContacts.end()) {
outOfRosterContacts.erase(itr);
onRosterItemRemoved(jid);
} else {
QXmppRosterManager& rm = client.rosterManager();
rm.removeItem(jid);
}
} else {
qDebug() << "An attempt to remove contact " << jid << " from account " << name << " but the account is not in the connected state, skipping";
}
@ -796,8 +811,14 @@ void Core::Account::removeContactRequest(const QString& jid)
void Core::Account::addContactRequest(const QString& jid, const QString& name, const QSet<QString>& groups)
{
if (state == Shared::connected) {
QXmppRosterManager& rm = client.rosterManager();
rm.addItem(jid, name, groups);
std::map<QString, QString>::const_iterator itr = queuedContacts.find(jid);
if (itr != queuedContacts.end()) {
qDebug() << "An attempt to add contact " << jid << " to account " << name << " but the account is already queued for adding, skipping";
} else {
queuedContacts.insert(std::make_pair(jid, "")); //TODO need to add reason here;
QXmppRosterManager& rm = client.rosterManager();
rm.addItem(jid, name, groups);
}
} else {
qDebug() << "An attempt to add contact " << jid << " to account " << name << " but the account is not in the connected state, skipping";
}

View file

@ -78,6 +78,9 @@ private:
unsigned int maxReconnectTimes;
unsigned int reconnectTimes;
std::map<QString, QString> queuedContacts;
std::set<QString> outOfRosterContacts;
private slots:
void onClientConnected();
void onClientDisconnected();