first thought about forms, discovering contact pep support

This commit is contained in:
Blue 2022-08-26 01:49:49 +03:00
parent c50cd1140e
commit 7b2b7ee5d5
Signed by untrusted user: blue
GPG Key ID: 9B203B252A63EE38
11 changed files with 230 additions and 9 deletions

View File

@ -623,12 +623,13 @@ void Core::Account::onDiscoveryInfoReceived(const QXmppDiscoveryIq& info)
bool pepSupported = false; bool pepSupported = false;
for (const QXmppDiscoveryIq::Identity& identity : identities) { for (const QXmppDiscoveryIq::Identity& identity : identities) {
QString type = identity.type(); QString type = identity.type();
qDebug() << " " << identity.category() << type; QString category = identity.category();
if (type == "pep") { qDebug() << " " << category << type;
if (type == "pep" && category == "pubsub") {
pepSupported = true; pepSupported = true;
} }
} }
rh->setPepSupport(pepSupported); rh->setPepSupport(pepSupported ? Shared::Support::supported : Shared::Support::unsupported);
} else { } else {
qDebug() << "Received info for account" << name << "about" << from; qDebug() << "Received info for account" << name << "about" << from;
QString node = info.queryNode(); QString node = info.queryNode();
@ -651,6 +652,22 @@ void Core::Account::onDiscoveryInfoReceived(const QXmppDiscoveryIq& info)
qDebug() << " " << feat; qDebug() << " " << feat;
} }
emit infoDiscovered(from, node, identities, features); emit infoDiscovered(from, node, identities, features);
} else {
Contact* cont = rh->getContact(from);
if (cont != nullptr) {
qDebug() << "Received info for account" << name << "about" << from;
QList<QXmppDiscoveryIq::Identity> identities = info.identities();
bool pepSupported = false;
for (const QXmppDiscoveryIq::Identity& identity : identities) {
QString type = identity.type();
QString category = identity.category();
qDebug() << " " << category << type;
if (type == "pep" && category == "pubsub") {
pepSupported = true;
}
}
cont->setPepSupport(pepSupported ? Shared::Support::supported : Shared::Support::unsupported);
}
} }
} }
} }

View File

@ -22,7 +22,8 @@
Core::Contact::Contact(const QString& pJid, const QString& account, QObject* parent): Core::Contact::Contact(const QString& pJid, const QString& account, QObject* parent):
RosterItem(pJid, account, parent), RosterItem(pJid, account, parent),
groups(), groups(),
subscriptionState(Shared::SubscriptionState::unknown) subscriptionState(Shared::SubscriptionState::unknown),
pep(Shared::Support::unknown)
{ {
} }
@ -98,3 +99,15 @@ void Core::Contact::handlePresence(const QXmppPresence& pres)
} }
} }
} }
void Core::Contact::setPepSupport(Shared::Support support) {
if (pep != support) {
pep = support;
}
}
Shared::Support Core::Contact::getPepSupport() const {
return pep;}

View File

@ -21,8 +21,11 @@
#include <QObject> #include <QObject>
#include <QSet> #include <QSet>
#include "rosteritem.h" #include "rosteritem.h"
#include <shared/enums.h>
namespace Core { namespace Core {
class Contact : public RosterItem class Contact : public RosterItem
@ -38,6 +41,9 @@ public:
void setSubscriptionState(Shared::SubscriptionState state); void setSubscriptionState(Shared::SubscriptionState state);
Shared::SubscriptionState getSubscriptionState() const; Shared::SubscriptionState getSubscriptionState() const;
void setPepSupport(Shared::Support support);
Shared::Support getPepSupport() const;
void handlePresence(const QXmppPresence & pres) override; void handlePresence(const QXmppPresence & pres) override;
signals: signals:
@ -48,6 +54,7 @@ signals:
private: private:
QSet<QString> groups; QSet<QString> groups;
Shared::SubscriptionState subscriptionState; Shared::SubscriptionState subscriptionState;
Shared::Support pep;
}; };
} }

View File

@ -27,7 +27,7 @@ Core::RosterHandler::RosterHandler(Core::Account* account):
groups(), groups(),
queuedContacts(), queuedContacts(),
outOfRosterContacts(), outOfRosterContacts(),
pepSupport(false) pepSupport(Shared::Support::unknown)
{ {
connect(acc->rm, &QXmppRosterManager::rosterReceived, this, &RosterHandler::onRosterReceived); connect(acc->rm, &QXmppRosterManager::rosterReceived, this, &RosterHandler::onRosterReceived);
connect(acc->rm, &QXmppRosterManager::itemAdded, this, &RosterHandler::onRosterItemAdded); connect(acc->rm, &QXmppRosterManager::itemAdded, this, &RosterHandler::onRosterItemAdded);
@ -111,6 +111,10 @@ void Core::RosterHandler::addedAccount(const QString& jid)
if (grCount == 0) { if (grCount == 0) {
emit acc->addContact(jid, "", cData); emit acc->addContact(jid, "", cData);
} }
if (pepSupport == Shared::Support::supported) {
acc->dm->requestInfo(jid);
//acc->dm->requestItems(jid);
}
handleNewContact(contact); handleNewContact(contact);
} }
} }
@ -588,13 +592,21 @@ void Core::RosterHandler::handleOffline()
pair.second->clearArchiveRequests(); pair.second->clearArchiveRequests();
pair.second->downgradeDatabaseState(); pair.second->downgradeDatabaseState();
} }
setPepSupport(false); setPepSupport(Shared::Support::unknown);
} }
void Core::RosterHandler::setPepSupport(bool support) void Core::RosterHandler::setPepSupport(Shared::Support support)
{ {
if (pepSupport != support) { if (pepSupport != support) {
pepSupport = support; pepSupport = support;
if (pepSupport == Shared::Support::supported) {
for (const std::pair<const QString, Contact*>& pair : contacts) {
if (pair.second->getPepSupport() == Shared::Support::unknown) {
acc->dm->requestInfo(pair.first);
}
}
}
} }
} }

View File

@ -32,6 +32,7 @@
#include <QXmppMucManager.h> #include <QXmppMucManager.h>
#include <QXmppRosterIq.h> #include <QXmppRosterIq.h>
#include <shared/enums.h>
#include <shared/message.h> #include <shared/message.h>
#include <core/contact.h> #include <core/contact.h>
#include <core/conference.h> #include <core/conference.h>
@ -64,7 +65,7 @@ public:
void storeConferences(); void storeConferences();
void clearConferences(); void clearConferences();
void setPepSupport(bool support); void setPepSupport(Shared::Support support);
private slots: private slots:
void onRosterReceived(); void onRosterReceived();
@ -108,7 +109,7 @@ private:
std::map<QString, std::set<QString>> groups; std::map<QString, std::set<QString>> groups;
std::map<QString, QString> queuedContacts; std::map<QString, QString> queuedContacts;
std::set<QString> outOfRosterContacts; std::set<QString> outOfRosterContacts;
bool pepSupport; Shared::Support pepSupport;
}; };
} }

View File

@ -22,4 +22,8 @@ target_sources(squawk PRIVATE
clientinfo.cpp clientinfo.cpp
identity.h identity.h
identity.cpp identity.cpp
form.h
form.cpp
field.h
field.cpp
) )

View File

@ -117,5 +117,12 @@ Q_ENUM_NS(AccountPassword)
static const AccountPassword AccountPasswordHighest = AccountPassword::kwallet; static const AccountPassword AccountPasswordHighest = AccountPassword::kwallet;
static const AccountPassword AccountPasswordLowest = AccountPassword::plain; static const AccountPassword AccountPasswordLowest = AccountPassword::plain;
enum class Support {
unknown,
supported,
unsupported
};
Q_ENUM_NS(Support)
} }
#endif // SHARED_ENUMS_H #endif // SHARED_ENUMS_H

28
shared/field.cpp Normal file
View File

@ -0,0 +1,28 @@
// Squawk messenger.
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "field.h"
Shared::Field::Field(Shared::Field::Type fieldTtype):
type(fieldTtype),
key(),
label(),
description(),
required(false),
options(),
value()
{
}

61
shared/field.h Normal file
View File

@ -0,0 +1,61 @@
// Squawk messenger.
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef SHARED_FIELD_H
#define SHARED_FIELD_H
#include <list>
#include <QString>
#include <QVariant>
namespace Shared {
/**
* @todo write docs
*/
class Field
{
public:
enum class Type {
boolean,
fixed,
hidden,
jidMultiple,
jidSingle,
listMultiple,
listSingle,
textMultiple,
textPrivate,
textSingle
};
Field(Type fieldType);
public:
const Type type;
QString key;
QString label;
QString description;
bool required;
std::list<std::pair<QString, QString>> options;
QVariant value;
};
}
#endif // SHARED_FIELD_H

23
shared/form.cpp Normal file
View File

@ -0,0 +1,23 @@
// Squawk messenger.
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "form.h"
Shared::Form::Form(Shared::Form::Type formType):
type(formType),
title(),
instructions(),
fields() {}

48
shared/form.h Normal file
View File

@ -0,0 +1,48 @@
// Squawk messenger.
// Copyright (C) 2019 Yury Gubich <blue@macaw.me>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef SHARED_FORM_H
#define SHARED_FORM_H
#include <list>
#include <shared/field.h>
namespace Shared {
class Form
{
public:
enum class Type {
none,
form,
submit,
cancel,
result
};
Form(Type formType);
public:
const Type type;
QString title;
QString instructions;
std::list<Field> fields;
};
}
#endif // SHARED_FORM_H