forked from blue/squawk
Bugfixes, availabilities statuses support
This commit is contained in:
parent
e8eaced6e9
commit
a5d24c0e3a
18 changed files with 374 additions and 131 deletions
|
@ -7,13 +7,16 @@ using namespace Core;
|
|||
Account::Account(const QString& p_login, const QString& p_server, const QString& p_password, const QString& p_name, QObject* parent):
|
||||
QObject(parent),
|
||||
name(p_name),
|
||||
login(p_login),
|
||||
server(p_server),
|
||||
password(p_password),
|
||||
client(),
|
||||
config(),
|
||||
presence(),
|
||||
state(Shared::disconnected),
|
||||
groups()
|
||||
{
|
||||
config.setUser(p_login);
|
||||
config.setDomain(p_server);
|
||||
config.setPassword(p_password);
|
||||
|
||||
QObject::connect(&client, SIGNAL(connected()), this, SLOT(onClientConnected()));
|
||||
QObject::connect(&client, SIGNAL(disconnected()), this, SLOT(onClientDisconnected()));
|
||||
QObject::connect(&client, SIGNAL(presenceReceived(const QXmppPresence&)), this, SLOT(onPresenceReceived(const QXmppPresence&)));
|
||||
|
@ -39,7 +42,7 @@ Shared::ConnectionState Core::Account::getState() const
|
|||
void Core::Account::connect()
|
||||
{
|
||||
if (state == Shared::disconnected) {
|
||||
client.connectToServer(login + "@" + server, password);
|
||||
client.connectToServer(config, presence);
|
||||
state = Shared::connecting;
|
||||
emit connectionStateChanged(state);
|
||||
} else {
|
||||
|
@ -83,17 +86,17 @@ QString Core::Account::getName() const
|
|||
|
||||
QString Core::Account::getLogin() const
|
||||
{
|
||||
return login;
|
||||
return config.user();
|
||||
}
|
||||
|
||||
QString Core::Account::getPassword() const
|
||||
{
|
||||
return password;
|
||||
return config.password();
|
||||
}
|
||||
|
||||
QString Core::Account::getServer() const
|
||||
{
|
||||
return server;
|
||||
return config.domain();
|
||||
}
|
||||
|
||||
void Core::Account::onRosterReceived()
|
||||
|
@ -120,8 +123,16 @@ void Core::Account::onRosterItemChanged(const QString& bareJid)
|
|||
|
||||
|
||||
QStringList res = rm.getResources(bareJid);
|
||||
unsigned int state = re.subscriptionType();
|
||||
if (state == QXmppRosterIq::Item::NotSet) {
|
||||
state = Shared::unknown;
|
||||
}
|
||||
QMap<QString, QVariant> cData({
|
||||
{"name", re.name()},
|
||||
{"state", state}
|
||||
});
|
||||
|
||||
emit changeContact(bareJid, re.name());
|
||||
emit changeContact(bareJid, cData);
|
||||
|
||||
for (std::map<QString, std::set<QString>>::iterator itr = groups.begin(), end = groups.end(); itr != end; ++itr) {
|
||||
std::set<QString>& contacts = itr->second;
|
||||
|
@ -153,7 +164,7 @@ void Core::Account::onRosterItemChanged(const QString& bareJid)
|
|||
emit addGroup(groupName);
|
||||
}
|
||||
cItr->second.insert(bareJid);
|
||||
emit addContact(bareJid, re.name(), groupName);
|
||||
emit addContact(bareJid, groupName, cData);
|
||||
}
|
||||
|
||||
for (QSet<QString>::iterator itr = removeGroups.begin(), end = removeGroups.end(); itr != end; ++itr) {
|
||||
|
@ -191,6 +202,14 @@ void Core::Account::addedAccount(const QString& jid)
|
|||
QXmppRosterManager& rm = client.rosterManager();
|
||||
QXmppRosterIq::Item re = rm.getRosterEntry(jid);
|
||||
QSet<QString> gr = re.groups();
|
||||
unsigned int state = re.subscriptionType();
|
||||
if (state == QXmppRosterIq::Item::NotSet) {
|
||||
state = Shared::unknown;
|
||||
}
|
||||
QMap<QString, QVariant> cData({
|
||||
{"name", re.name()},
|
||||
{"state", state}
|
||||
});
|
||||
int grCount = 0;
|
||||
for (QSet<QString>::const_iterator itr = gr.begin(), end = gr.end(); itr != end; ++itr) {
|
||||
const QString& groupName = *itr;
|
||||
|
@ -200,12 +219,12 @@ void Core::Account::addedAccount(const QString& jid)
|
|||
emit addGroup(groupName);
|
||||
}
|
||||
gItr->second.insert(jid);
|
||||
emit addContact(jid, re.name(), groupName);
|
||||
emit addContact(jid, groupName, cData);
|
||||
grCount++;
|
||||
}
|
||||
|
||||
if (grCount == 0) {
|
||||
emit addContact(jid, re.name(), "");
|
||||
emit addContact(jid, "", cData);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -216,6 +235,16 @@ void Core::Account::onPresenceReceived(const QXmppPresence& presence)
|
|||
QString jid = comps.front();
|
||||
QString resource = comps.back();
|
||||
|
||||
QString myJid = getLogin() + "@" + getServer();
|
||||
|
||||
if (jid == myJid) {
|
||||
if (resource == getResource()) {
|
||||
emit availabilityChanged(presence.availableStatusType());
|
||||
} else {
|
||||
qDebug() << "Received a presence for another resource of my " << name << " account, skipping";
|
||||
}
|
||||
}
|
||||
|
||||
switch (presence.type()) {
|
||||
case QXmppPresence::Error:
|
||||
qDebug() << "An error reported by presence from " << id;
|
||||
|
@ -256,3 +285,48 @@ void Core::Account::onRosterPresenceChanged(const QString& bareJid, const QStrin
|
|||
const QXmppPresence& presence = client.rosterManager().getPresence(bareJid, resource);
|
||||
}
|
||||
|
||||
void Core::Account::setLogin(const QString& p_login)
|
||||
{
|
||||
config.setUser(p_login);
|
||||
}
|
||||
|
||||
void Core::Account::setName(const QString& p_name)
|
||||
{
|
||||
name = p_name;
|
||||
}
|
||||
|
||||
void Core::Account::setPassword(const QString& p_password)
|
||||
{
|
||||
config.setPassword(p_password);
|
||||
}
|
||||
|
||||
void Core::Account::setServer(const QString& p_server)
|
||||
{
|
||||
config.setDomain(p_server);
|
||||
}
|
||||
|
||||
Shared::Availability Core::Account::getAvailability() const
|
||||
{
|
||||
QXmppPresence::AvailableStatusType pres = presence.availableStatusType();
|
||||
return static_cast<Shared::Availability>(pres); //TODO that's a shame! gotta do something about it
|
||||
}
|
||||
|
||||
void Core::Account::setAvailability(Shared::Availability avail)
|
||||
{
|
||||
QXmppPresence::AvailableStatusType pres = static_cast<QXmppPresence::AvailableStatusType>(avail);
|
||||
|
||||
presence.setAvailableStatusType(pres);
|
||||
if (state != Shared::disconnected) { //TODO not sure how to do here - changing state may cause connection or disconnection
|
||||
client.setClientPresence(presence);
|
||||
}
|
||||
}
|
||||
|
||||
QString Core::Account::getResource() const
|
||||
{
|
||||
return config.resource();
|
||||
}
|
||||
|
||||
void Core::Account::setResource(const QString& p_resource)
|
||||
{
|
||||
config.setResource(p_resource);
|
||||
}
|
||||
|
|
|
@ -26,24 +26,33 @@ public:
|
|||
QString getLogin() const;
|
||||
QString getServer() const;
|
||||
QString getPassword() const;
|
||||
QString getResource() const;
|
||||
Shared::Availability getAvailability() const;
|
||||
|
||||
void setName(const QString& p_name);
|
||||
void setLogin(const QString& p_login);
|
||||
void setServer(const QString& p_server);
|
||||
void setPassword(const QString& p_password);
|
||||
void setResource(const QString& p_resource);
|
||||
void setAvailability(Shared::Availability avail);
|
||||
|
||||
signals:
|
||||
void connectionStateChanged(int);
|
||||
void availabilityChanged(int);
|
||||
void addGroup(const QString& name);
|
||||
void removeGroup(const QString& name);
|
||||
void addContact(const QString& jid, const QString& name, const QString& group);
|
||||
void addContact(const QString& jid, const QString& group, const QMap<QString, QVariant>& data);
|
||||
void removeContact(const QString& jid);
|
||||
void removeContact(const QString& jid, const QString& group);
|
||||
void changeContact(const QString& jid, const QString& name);
|
||||
void changeContact(const QString& jid, const QMap<QString, QVariant>& data);
|
||||
void addPresence(const QString& jid, const QString& name, const QMap<QString, QVariant>& data);
|
||||
void removePresence(const QString& jid, const QString& name);
|
||||
|
||||
private:
|
||||
QString name;
|
||||
QString login;
|
||||
QString server;
|
||||
QString password;
|
||||
QXmppClient client;
|
||||
QXmppConfiguration config;
|
||||
QXmppPresence presence;
|
||||
Shared::ConnectionState state;
|
||||
std::map<QString, std::set<QString>> groups;
|
||||
|
||||
|
|
|
@ -74,12 +74,15 @@ void Core::Squawk::addAccount(const QString& login, const QString& server, const
|
|||
amap.insert(std::make_pair(name, acc));
|
||||
|
||||
connect(acc, SIGNAL(connectionStateChanged(int)), this, SLOT(onAccountConnectionStateChanged(int)));
|
||||
connect(acc, SIGNAL(addContact(const QString&, const QString&, const QString&)), this, SLOT(onAccountAddContact(const QString&, const QString&, const QString&)));
|
||||
connect(acc, SIGNAL(availabilityChanged(int)), this, SLOT(onAccountAvailabilityChanged(int)));
|
||||
connect(acc, SIGNAL(addContact(const QString&, const QString&, const QMap<QString, QVariant>&)),
|
||||
this, SLOT(onAccountAddContact(const QString&, const QString&, const QMap<QString, QVariant>&)));
|
||||
connect(acc, SIGNAL(addGroup(const QString&)), this, SLOT(onAccountAddGroup(const QString&)));
|
||||
connect(acc, SIGNAL(removeGroup(const QString&)), this, SLOT(onAccountRemoveGroup(const QString&)));
|
||||
connect(acc, SIGNAL(removeContact(const QString&)), this, SLOT(onAccountRemoveContact(const QString&)));
|
||||
connect(acc, SIGNAL(removeContact(const QString&, const QString&)), this, SLOT(onAccountRemoveContact(const QString&, const QString&)));
|
||||
connect(acc, SIGNAL(changeContact(const QString&, const QString&)), this, SLOT(onAccountChangeContact(const QString&, const QString&)));
|
||||
connect(acc, SIGNAL(changeContact(const QString&, const QMap<QString, QVariant>&)),
|
||||
this, SLOT(onAccountChangeContact(const QString&, const QMap<QString, QVariant>&)));
|
||||
connect(acc, SIGNAL(addPresence(const QString&, const QString&, const QMap<QString, QVariant>&)),
|
||||
this, SLOT(onAccountAddPresence(const QString&, const QString&, const QMap<QString, QVariant>&)));
|
||||
connect(acc, SIGNAL(removePresence(const QString&, const QString&)), this, SLOT(onAccountRemovePresence(const QString&, const QString&)));
|
||||
|
@ -89,11 +92,26 @@ void Core::Squawk::addAccount(const QString& login, const QString& server, const
|
|||
{"server", server},
|
||||
{"name", name},
|
||||
{"password", password},
|
||||
{"state", Shared::disconnected}
|
||||
{"state", Shared::disconnected},
|
||||
{"offline", Shared::offline}
|
||||
};
|
||||
emit newAccount(map);
|
||||
}
|
||||
|
||||
void Core::Squawk::changeState(int p_state)
|
||||
{
|
||||
Shared::Availability avail;
|
||||
if (p_state < Shared::availabilityLowest && p_state > Shared::availabilityHighest) {
|
||||
qDebug("An attempt to set invalid availability to Squawk core, skipping");
|
||||
}
|
||||
avail = static_cast<Shared::Availability>(p_state);
|
||||
state = avail;
|
||||
|
||||
for (std::deque<Account*>::iterator itr = accounts.begin(), end = accounts.end(); itr != end; ++itr) {
|
||||
(*itr)->setAvailability(state);
|
||||
}
|
||||
}
|
||||
|
||||
void Core::Squawk::connectAccount(const QString& account)
|
||||
{
|
||||
AccountsMap::const_iterator itr = amap.find(account);
|
||||
|
@ -121,10 +139,10 @@ void Core::Squawk::onAccountConnectionStateChanged(int state)
|
|||
emit accountConnectionStateChanged(acc->getName(), state);
|
||||
}
|
||||
|
||||
void Core::Squawk::onAccountAddContact(const QString& jid, const QString& name, const QString& group)
|
||||
void Core::Squawk::onAccountAddContact(const QString& jid, const QString& group, const QMap<QString, QVariant>& data)
|
||||
{
|
||||
Account* acc = static_cast<Account*>(sender());
|
||||
emit addContact(acc->getName(), jid, name, group);
|
||||
emit addContact(acc->getName(), jid, group, data);
|
||||
}
|
||||
|
||||
void Core::Squawk::onAccountAddGroup(const QString& name)
|
||||
|
@ -139,10 +157,10 @@ void Core::Squawk::onAccountRemoveGroup(const QString& name)
|
|||
emit removeGroup(acc->getName(), name);
|
||||
}
|
||||
|
||||
void Core::Squawk::onAccountChangeContact(const QString& jid, const QString& name)
|
||||
void Core::Squawk::onAccountChangeContact(const QString& jid, const QMap<QString, QVariant>& data)
|
||||
{
|
||||
Account* acc = static_cast<Account*>(sender());
|
||||
emit changeContact(acc->getName(), jid, name);
|
||||
emit changeContact(acc->getName(), jid, data);
|
||||
}
|
||||
|
||||
void Core::Squawk::onAccountRemoveContact(const QString& jid)
|
||||
|
@ -168,3 +186,9 @@ void Core::Squawk::onAccountRemovePresence(const QString& jid, const QString& na
|
|||
Account* acc = static_cast<Account*>(sender());
|
||||
emit removePresence(acc->getName(), jid, name);
|
||||
}
|
||||
|
||||
void Core::Squawk::onAccountAvailabilityChanged(int state)
|
||||
{
|
||||
Account* acc = static_cast<Account*>(sender());
|
||||
emit accountAvailabilityChanged(acc->getName(), state);
|
||||
}
|
||||
|
|
|
@ -25,14 +25,16 @@ signals:
|
|||
void quit();
|
||||
void newAccount(const QMap<QString, QVariant>&);
|
||||
void accountConnectionStateChanged(const QString&, int);
|
||||
void accountAvailabilityChanged(const QString&, int);
|
||||
void addGroup(const QString& account, const QString& name);
|
||||
void removeGroup(const QString& account, const QString& name);
|
||||
void addContact(const QString& account, const QString& jid, const QString& name, const QString& group);
|
||||
void addContact(const QString& account, const QString& jid, const QString& group, const QMap<QString, QVariant>& data);
|
||||
void removeContact(const QString& account, const QString& jid);
|
||||
void removeContact(const QString& account, const QString& jid, const QString& group);
|
||||
void changeContact(const QString& account, const QString& jid, const QString& name);
|
||||
void changeContact(const QString& account, const QString& jid, const QMap<QString, QVariant>& data);
|
||||
void addPresence(const QString& account, const QString& jid, const QString& name, const QMap<QString, QVariant>& data);
|
||||
void removePresence(const QString& account, const QString& jid, const QString& name);
|
||||
void stateChanged(int state);
|
||||
|
||||
public slots:
|
||||
void start();
|
||||
|
@ -40,6 +42,7 @@ public slots:
|
|||
void newAccountRequest(const QMap<QString, QVariant>& map);
|
||||
void connectAccount(const QString& account);
|
||||
void disconnectAccount(const QString& account);
|
||||
void changeState(int state);
|
||||
|
||||
private:
|
||||
typedef std::deque<Account*> Accounts;
|
||||
|
@ -47,18 +50,20 @@ private:
|
|||
|
||||
Accounts accounts;
|
||||
AccountsMap amap;
|
||||
Shared::Availability state;
|
||||
|
||||
private:
|
||||
void addAccount(const QString& login, const QString& server, const QString& password, const QString& name);
|
||||
|
||||
private slots:
|
||||
void onAccountConnectionStateChanged(int state);
|
||||
void onAccountAvailabilityChanged(int state);
|
||||
void onAccountAddGroup(const QString& name);
|
||||
void onAccountRemoveGroup(const QString& name);
|
||||
void onAccountAddContact(const QString& jid, const QString& name, const QString& group);
|
||||
void onAccountAddContact(const QString& jid, const QString& group, const QMap<QString, QVariant>& data);
|
||||
void onAccountRemoveContact(const QString& jid);
|
||||
void onAccountRemoveContact(const QString& jid, const QString& group);
|
||||
void onAccountChangeContact(const QString& jid, const QString& name);
|
||||
void onAccountChangeContact(const QString& jid, const QMap<QString, QVariant>& data);
|
||||
void onAccountAddPresence(const QString& jid, const QString& name, const QMap<QString, QVariant>& data);
|
||||
void onAccountRemovePresence(const QString& jid, const QString& name);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue