diff --git a/src/Kaidan.h b/src/Kaidan.h index 6d5a744..9f548d7 100644 --- a/src/Kaidan.h +++ b/src/Kaidan.h @@ -1,451 +1,449 @@ /* * Kaidan - A user-friendly XMPP client for every device! * * Copyright (C) 2016-2020 Kaidan developers and contributors * (see the LICENSE file for a full list of copyright authors) * * Kaidan 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. * * In addition, as a special exception, the author of Kaidan gives * permission to link the code of its release with the OpenSSL * project's "OpenSSL" library (or with modified versions of it that * use the same license as the "OpenSSL" library), and distribute the * linked executables. You must obey the GNU General Public License in * all respects for all of the code used other than "OpenSSL". If you * modify this file, you may extend this exception to your version of * the file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. * * Kaidan 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 Kaidan. If not, see . */ #ifndef KAIDAN_H #define KAIDAN_H // Qt #include #include #include // Kaidan #include "ClientWorker.h" #include "RegistrationDataFormModel.h" #include "Globals.h" class QGuiApplication; class Database; class QXmppClient; class QXmppStanza; /** * @class Kaidan Kaidan's Back-End Class * * @brief This class will initiate the complete back-end, including the @see Database * connection, viewing models (@see MessageModel, @see RosterModel), etc. * * This class will run in the main thread, the XMPP connection and the database managers * run in other threads. */ class Kaidan : public QObject { Q_OBJECT Q_PROPERTY(RosterModel* rosterModel READ getRosterModel CONSTANT) Q_PROPERTY(MessageModel* messageModel READ getMessageModel CONSTANT) Q_PROPERTY(AvatarFileStorage* avatarStorage READ getAvatarStorage NOTIFY avatarStorageChanged) Q_PROPERTY(PresenceCache* presenceCache READ getPresenceCache CONSTANT) Q_PROPERTY(TransferCache* transferCache READ getTransferCache CONSTANT) Q_PROPERTY(ServerFeaturesCache* serverFeaturesCache READ serverFeaturesCache CONSTANT) Q_PROPERTY(QSettings* settings READ getSettings CONSTANT) Q_PROPERTY(quint8 connectionState READ getConnectionState NOTIFY connectionStateChanged) Q_PROPERTY(quint8 connectionError READ getConnectionError NOTIFY connectionErrorChanged) Q_PROPERTY(QString jid READ getJid WRITE setJid NOTIFY jidChanged) Q_PROPERTY(QString jidResourcePrefix READ getJidResourcePrefix WRITE setJidResourcePrefix NOTIFY jidResourcePrefixChanged) Q_PROPERTY(QString password READ getPassword WRITE setPassword NOTIFY passwordChanged) public: static Kaidan *instance(); Kaidan(QGuiApplication *app, bool enableLogging = true, QObject *parent = nullptr); ~Kaidan(); /** * Starts connecting (called from QML when ready). */ Q_INVOKABLE void start(); /** * Connects to the XMPP server. * * The username and password are retrieved from the the settings file. */ Q_INVOKABLE void mainConnect(); /** * Connects to the server and requests a data form for account registration. */ Q_INVOKABLE void requestRegistrationForm(); /** * Disconnects from the XMPP server. * * This disconnects the client from the server. * When disconnected, the connectionStateChanged signal is emitted. */ Q_INVOKABLE void mainDisconnect(); /** * Returns the current ConnectionState */ Q_INVOKABLE quint8 getConnectionState() const { return (quint8) connectionState; } /** * Returns the last connection error. */ Q_INVOKABLE quint8 getConnectionError() const; /** * Set own JID used for connection * * To really change the JID of the current connection, you'll need to * reconnect. */ void setJid(const QString &jid); /** * Get the current JID */ QString getJid() const { return creds.jid; } /** * Sets the prefix of the JID's resource part. * * The remaining part of the resource is set randomly. */ void setJidResourcePrefix(const QString &jidResourcePrefix); /** * Provides the prefix of the JID's resource part. */ QString getJidResourcePrefix() const { return creds.jidResourcePrefix; } /** * Set the password for next connection */ void setPassword(const QString &password); /** * Get the currently used password */ QString getPassword() const { return creds.password; } RosterModel* getRosterModel() const { return m_caches->rosterModel; } MessageModel* getMessageModel() const { return m_caches->msgModel; } AvatarFileStorage* getAvatarStorage() const { return m_caches->avatarStorage; } PresenceCache* getPresenceCache() const { return m_caches->presCache; } TransferCache* getTransferCache() const { return m_caches->transferCache; } ServerFeaturesCache *serverFeaturesCache() const { return m_caches->serverFeaturesCache; } QSettings* getSettings() const { return m_caches->settings; } ClientWorker *getClient() const; RosterDb *rosterDb() const; MessageDb *messageDb() const; /** * Adds XMPP URI to open as soon as possible */ void addOpenUri(const QString &uri); /** * Connects to the server by the parsed credentials (bare JID and password) from a given XMPP URI (e.g. from scanning a QR code) like "xmpp:user@example.org?login;password=abc" * * @return true if the login worked */ Q_INVOKABLE bool logInByUri(const QString &uri); signals: void avatarStorageChanged(); /** * Emitted, when the client's connection state has changed (e.g. when * successfully connected or when disconnected) */ void connectionStateChanged(); /** * Emitted when the client failed to connect. */ void connectionErrorChanged(ClientWorker::ConnectionError error); /** * Emitted when the JID was changed */ void jidChanged(); /** * Emitted when the prefix of the JID's resource part changed. */ void jidResourcePrefixChanged(); /** * Emitted when the used password for logging in has changed */ void passwordChanged(); /** * Emitted when there are no (correct) credentials and new are needed * * The client will be in disconnected state, when this is emitted. */ void newCredentialsNeeded(); /** * Emitted when an authenticated connection to the server is established with new credentials for the first time. * * The client will be in connected state, when this is emitted. */ void loggedInWithNewCredentials(); /** * Show passive notification */ void passiveNotificationRequested(QString text); /** * Emitted, whan a subscription request was received */ void subscriptionRequestReceived(QString from, QString msg); /** * Incoming subscription request was accepted or declined by the user */ void subscriptionRequestAnswered(QString jid, bool accepted); /** * Request vCard of any JID * * Is required when the avatar (or other information) of a JID are * requested and the JID is not in the roster. */ void vCardRequested(const QString &jid); /** * XMPP URI received * * Is called when Kaidan was used to open an XMPP URI (i.e. 'xmpp:kaidan@muc.kaidan.im?join') */ void xmppUriReceived(QString uri); /** * The upload progress of a file upload has changed */ void uploadProgressMade(QString msgId, quint64 sent, quint64 total); /** * Send a text message to any JID * * Currently only contacts are displayed on the RosterPage (there is no * way to view a list of all chats -> for contacts and non-contacts), so * you should only send messages to JIDs from your roster, otherwise you * won't be able to see the message history. */ void sendMessage(QString jid, QString message, bool isSpoiler, QString spoilerHint); /** * Correct the last message * * To get/check the last message id, use `kaidan.messageModel.lastMessageId(jid)` */ void correctMessage(QString toJid, QString msgId, QString message); /** * Upload and send file */ void sendFile(const QString &jid, const QUrl &fileUrl, const QString &body); /** * Add a contact to your roster * * @param nick A simple nick name for the new contact, which should be * used to display in the roster. */ void addContact(QString jid, QString nick, QString msg); /** * Remove a contact from your roster * * Only the JID is needed. */ void removeContact(QString jid); /** * Change a contact's name */ void renameContact(const QString &jid, const QString &newContactName); /** * Downloads an attached media file of a message * * @param msgId The message * @param url the media url from the message */ void downloadMedia(QString msgId, QString url); /** * Changes the user's display name. * * @param displayName new name that is shown to contacts */ void changeDisplayName(const QString &displayName); /** * Changes the user's password on the server * * @param newPassword The new password */ void changePassword(const QString &newPassword); /** * Emitted, when changing the password has succeeded. */ void passwordChangeSucceeded(); /** * Emitted, when changing the password has failed. */ void passwordChangeFailed(); /** * Emitted, when a contact was muted/unmuted. */ void notificationsMutedChanged(const QString& jid); /** * Deletes the account data from the client and server. */ void deleteAccountFromClientAndServer(); /** * Deletes the account data from the configuration file and database. */ void deleteAccountFromClient(); void registrationFormReceived(DataFormModel *dataFormModel); void sendRegistrationForm(); void registrationSucceeded(); void registrationFailed(quint8 error, const QString &errrorMessage); public slots: /** * Set current connection state */ void setConnectionState(QXmppClient::State state); /** * Sets a new connection error. */ void setConnectionError(ClientWorker::ConnectionError error); /** * Deletes the username and password from the settings file. */ void deleteCredentials(); /** * Receives messages from another instance of the application */ void receiveMessage(quint32, const QByteArray &msg) { // currently we only send XMPP URIs addOpenUri(msg); } /** * Returns whether notifications are enabled for the given contact. */ bool notificationsMuted(const QString& jid); /** * Sets the notifications to muted/unmuted. * * @param muted true if notifications should be muted. * @param jid contains the current chatpartner's jid. */ void setNotificationsMuted(const QString& jid, bool muted); private: - void connectDatabases(); - /** * Notifies if no valid login URI was found. */ void notifyForInvalidLoginUri(); Database *m_database; QThread *m_dbThrd; MessageDb *m_msgDb; RosterDb *m_rosterDb; QThread *m_cltThrd; ClientWorker::Caches *m_caches; ClientWorker *m_client; ClientWorker::Credentials creds; QString openUriCache; ConnectionState connectionState = ConnectionState::StateDisconnected; ClientWorker::ConnectionError connectionError = ClientWorker::NoError; static Kaidan *s_instance; }; #endif