1
0
forked from blue/squawk
squawk/core/account.h

204 lines
8.3 KiB
C
Raw Normal View History

/*
* 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/>.
*/
2019-03-29 14:54:34 +00:00
#ifndef CORE_ACCOUNT_H
#define CORE_ACCOUNT_H
#include <QObject>
#include <QCryptographicHash>
#include <QFile>
#include <QMimeDatabase>
#include <QStandardPaths>
#include <QDir>
2019-04-03 21:23:51 +00:00
#include <map>
2019-04-06 10:14:32 +00:00
#include <set>
2019-03-29 14:54:34 +00:00
2019-06-28 15:15:30 +00:00
#include <QXmppRosterManager.h>
#include <QXmppCarbonManager.h>
#include <QXmppMamManager.h>
#include <QXmppMucManager.h>
2019-06-28 15:15:30 +00:00
#include <QXmppClient.h>
#include <QXmppBookmarkManager.h>
#include <QXmppBookmarkSet.h>
#include <QXmppVCardIq.h>
#include <QXmppVCardManager.h>
#include "../global.h"
#include "contact.h"
2019-08-21 09:35:07 +00:00
#include "conference.h"
2019-03-29 14:54:34 +00:00
namespace Core
{
class Account : public QObject
{
Q_OBJECT
2019-03-29 14:54:34 +00:00
public:
2019-03-30 20:13:13 +00:00
Account(const QString& p_login, const QString& p_server, const QString& p_password, const QString& p_name, QObject* parent = 0);
2019-03-29 14:54:34 +00:00
~Account();
void connect();
void disconnect();
void reconnect();
Shared::ConnectionState getState() const;
QString getName() const;
QString getLogin() const;
QString getServer() const;
QString getPassword() const;
QString getResource() const;
QString getAvatarPath() 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);
2019-04-09 22:01:25 +00:00
QString getFullJid() const;
void sendMessage(const Shared::Message& data);
2019-04-21 19:17:04 +00:00
void requestArchive(const QString& jid, int count, const QString& before);
void setReconnectTimes(unsigned int times);
void subscribeToContact(const QString& jid, const QString& reason);
void unsubscribeFromContact(const QString& jid, const QString& reason);
2019-06-14 16:36:04 +00:00
void removeContactRequest(const QString& jid);
void addContactRequest(const QString& jid, const QString& name, const QSet<QString>& groups);
void addContactToGroupRequest(const QString& jid, const QString& groupName);
void removeContactFromGroupRequest(const QString& jid, const QString& groupName);
void renameContactRequest(const QString& jid, const QString& newName);
void setRoomJoined(const QString& jid, bool joined);
void setRoomAutoJoin(const QString& jid, bool joined);
void removeRoomRequest(const QString& jid);
2019-09-04 16:38:52 +00:00
void addRoomRequest(const QString& jid, const QString& nick, const QString& password, bool autoJoin);
signals:
void changed(const QMap<QString, QVariant>& data);
void connectionStateChanged(int);
void availabilityChanged(int);
2019-04-03 21:23:51 +00:00
void addGroup(const QString& name);
void removeGroup(const QString& name);
void addRoom(const QString& jid, const QMap<QString, QVariant>& data);
void changeRoom(const QString& jid, const QMap<QString, QVariant>& data);
void removeRoom(const QString& jid);
void addContact(const QString& jid, const QString& group, const QMap<QString, QVariant>& data);
2019-04-06 10:14:32 +00:00
void removeContact(const QString& jid);
void removeContact(const QString& jid, const QString& group);
void changeContact(const QString& jid, const QMap<QString, QVariant>& data);
2019-04-07 14:02:41 +00:00
void addPresence(const QString& jid, const QString& name, const QMap<QString, QVariant>& data);
void removePresence(const QString& jid, const QString& name);
void message(const Shared::Message& data);
void responseArchive(const QString& jid, const std::list<Shared::Message>& list);
void error(const QString& text);
void addRoomParticipant(const QString& jid, const QString& nickName, const QMap<QString, QVariant>& data);
void changeRoomParticipant(const QString& jid, const QString& nickName, const QMap<QString, QVariant>& data);
void removeRoomParticipant(const QString& jid, const QString& nickName);
2019-03-29 14:54:34 +00:00
private:
2019-03-30 20:13:13 +00:00
QString name;
2019-04-13 20:38:20 +00:00
std::map<QString, QString> achiveQueries;
2019-03-29 14:54:34 +00:00
QXmppClient client;
QXmppConfiguration config;
QXmppPresence presence;
Shared::ConnectionState state;
2019-04-06 10:14:32 +00:00
std::map<QString, std::set<QString>> groups;
2019-04-12 15:22:10 +00:00
QXmppCarbonManager* cm;
2019-04-13 20:38:20 +00:00
QXmppMamManager* am;
QXmppMucManager* mm;
QXmppBookmarkManager* bm;
std::map<QString, Contact*> contacts;
2019-08-21 09:35:07 +00:00
std::map<QString, Conference*> conferences;
unsigned int maxReconnectTimes;
unsigned int reconnectTimes;
std::map<QString, QString> queuedContacts;
std::set<QString> outOfRosterContacts;
std::set<QString> pendingVCardRequests;
QString avatarHash;
QString avatarType;
bool ownVCardRequestInProgress;
private slots:
void onClientConnected();
2019-04-02 15:46:18 +00:00
void onClientDisconnected();
void onClientError(QXmppClient::Error err);
2019-04-19 09:12:12 +00:00
2019-04-03 21:23:51 +00:00
void onRosterReceived();
2019-04-07 14:02:41 +00:00
void onRosterItemAdded(const QString& bareJid);
void onRosterItemChanged(const QString& bareJid);
void onRosterItemRemoved(const QString& bareJid);
void onRosterPresenceChanged(const QString& bareJid, const QString& resource);
2019-04-19 09:12:12 +00:00
2019-04-07 14:02:41 +00:00
void onPresenceReceived(const QXmppPresence& presence);
2019-04-09 15:04:08 +00:00
void onMessageReceived(const QXmppMessage& message);
2019-04-19 09:12:12 +00:00
2019-04-12 15:22:10 +00:00
void onCarbonMessageReceived(const QXmppMessage& message);
void onCarbonMessageSent(const QXmppMessage& message);
2019-04-19 09:12:12 +00:00
2019-04-13 20:38:20 +00:00
void onMamMessageReceived(const QString& bareJid, const QXmppMessage& message);
void onMamResultsReceived(const QString &queryId, const QXmppResultSetReply &resultSetReply, bool complete);
2019-04-19 09:12:12 +00:00
void onMucRoomAdded(QXmppMucRoom* room);
2019-08-21 09:35:07 +00:00
void onMucJoinedChanged(bool joined);
void onMucAutoJoinChanged(bool autoJoin);
void onMucNickNameChanged(const QString& nickName);
void onMucSubjectChanged(const QString& subject);
void onMucAddParticipant(const QString& nickName, const QMap<QString, QVariant>& data);
void onMucChangeParticipant(const QString& nickName, const QMap<QString, QVariant>& data);
void onMucRemoveParticipant(const QString& nickName);
void bookmarksReceived(const QXmppBookmarkSet& bookmarks);
2019-04-19 09:12:12 +00:00
void onContactGroupAdded(const QString& group);
void onContactGroupRemoved(const QString& group);
void onContactNameChanged(const QString& name);
void onContactSubscriptionStateChanged(Shared::SubscriptionState state);
void onContactHistoryResponse(const std::list<Shared::Message>& list);
void onContactNeedHistory(const QString& before, const QString& after, const QDateTime& at);
void onContactAvatarChanged(Shared::Avatar, const QString& path);
2019-06-28 15:15:30 +00:00
void onMamLog(QXmppLogger::MessageType type, const QString &msg);
void onVCardReceived(const QXmppVCardIq& card);
void onOwnVCardReceived(const QXmppVCardIq& card);
2019-04-06 10:14:32 +00:00
private:
void addedAccount(const QString &bareJid);
void handleNewContact(Contact* contact);
2019-08-21 09:35:07 +00:00
void handleNewRosterItem(RosterItem* contact);
void handleNewConference(Conference* contact);
2019-04-13 20:38:20 +00:00
bool handleChatMessage(const QXmppMessage& msg, bool outgoing = false, bool forwarded = false, bool guessing = false);
2019-08-28 11:40:55 +00:00
bool handleGroupMessage(const QXmppMessage& msg, bool outgoing = false, bool forwarded = false, bool guessing = false);
2019-09-04 16:38:52 +00:00
void addNewRoom(const QString& jid, const QString& nick, const QString& roomName, bool autoJoin);
2019-04-19 09:12:12 +00:00
void addToGroup(const QString& jid, const QString& group);
void removeFromGroup(const QString& jid, const QString& group);
void initializeMessage(Shared::Message& target, const QXmppMessage& source, bool outgoing = false, bool forwarded = false, bool guessing = false) const;
2019-04-19 09:12:12 +00:00
Shared::SubscriptionState castSubscriptionState(QXmppRosterIq::Item::SubscriptionType qs) const;
2019-06-28 15:15:30 +00:00
void logMessage(const QXmppMessage& msg, const QString& reason = "Message wasn't handled: ");
void storeConferences();
void clearConferences();
2019-03-29 14:54:34 +00:00
};
}
2019-03-29 14:54:34 +00:00
#endif // CORE_ACCOUNT_H