1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00
qTox/src/core.h

326 lines
15 KiB
C
Raw Normal View History

2014-06-25 04:11:11 +08:00
/*
Copyright (C) 2013 by Maxim Biro <nurupo.contributions@gmail.com>
This file is part of Tox Qt GUI.
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 COPYING file for more details.
*/
#ifndef CORE_HPP
#define CORE_HPP
2014-06-26 04:43:28 +08:00
#include <cstdint>
2014-06-25 04:11:11 +08:00
#include <QObject>
#include <QMutex>
2014-06-25 04:11:11 +08:00
#include <tox/tox.h>
2014-09-11 21:44:34 +08:00
#include "corestructs.h"
#include "coreav.h"
#include "coredefines.h"
2014-06-26 04:43:28 +08:00
2014-09-11 21:44:34 +08:00
template <typename T> class QList;
class Camera;
class QTimer;
class QString;
2014-09-21 18:30:10 +08:00
class CString;
2014-10-15 20:46:01 +08:00
class VideoSource;
#ifdef QTOX_FILTER_AUDIO
class AudioFilterer;
#endif
2014-06-25 04:11:11 +08:00
class Core : public QObject
{
Q_OBJECT
public:
enum PasswordType {ptMain = 0, ptHistory, ptCounter};
2014-10-09 13:30:33 +08:00
explicit Core(Camera* cam, QThread* coreThread, QString initialLoadPath);
2014-09-11 21:44:34 +08:00
static Core* getInstance(); ///< Returns the global widget's Core instance
2014-06-25 04:11:11 +08:00
~Core();
static const QString TOX_EXT;
2014-10-09 13:30:33 +08:00
static const QString CONFIG_FILE_NAME;
static QString sanitize(QString name);
2014-12-29 01:26:35 +08:00
static QList<CString> splitMessage(const QString &message, int maxLen);
2014-06-25 04:11:11 +08:00
2014-11-04 00:44:01 +08:00
static QByteArray getSaltFromFile(QString filename);
QString getPeerName(const ToxID& id) const;
int getGroupNumberPeers(int groupId) const; ///< Return the number of peers in the group chat on success, or -1 on failure
QString getGroupPeerName(int groupId, int peerId) const; ///< Get the name of a peer of a group
2014-11-23 23:55:49 +08:00
ToxID getGroupPeerToxID(int groupId, int peerId) const; ///< Get the ToxID of a peer of a group
QList<QString> getGroupPeerNames(int groupId) const; ///< Get the names of the peers of a group
QString getFriendAddress(int friendNumber) const; ///< Get the full address if known, or Tox ID of a friend
QString getFriendUsername(int friendNumber) const; ///< Get the username of a friend
bool hasFriendWithAddress(const QString &addr) const; ///< Check if we have a friend by address
bool hasFriendWithPublicKey(const QString &pubkey) const; ///< Check if we have a friend by public key
int joinGroupchat(int32_t friendNumber, uint8_t type, const uint8_t* pubkey,uint16_t length) const; ///< Accept a groupchat invite
void quitGroupChat(int groupId) const; ///< Quit a groupchat
2014-06-25 04:11:11 +08:00
QString getIDString() const; ///< Get the 12 first characters of our Tox ID
QString getUsername() const; ///< Returns our username, or an empty string on failure
QString getStatusMessage() const; ///< Returns our status message, or an empty string on failure
ToxID getSelfId() const; ///< Returns our Tox ID
2015-02-20 07:47:13 +08:00
QPair<QByteArray, QByteArray> getKeypair() const; ///< Returns our public and private keys
2014-07-04 01:38:30 +08:00
VideoSource* getVideoSourceFromCall(int callNumber); ///< Get a call's video source
bool anyActiveCalls(); ///< true is any calls are currently active (note: a call about to start is not yet active)
bool isPasswordSet(PasswordType passtype);
bool isReady(); ///< Most of the API shouldn't be used until Core is ready, call start() first
2014-10-15 09:04:53 +08:00
void resetCallSources(); ///< Forces to regenerate each call's audio sources
2014-06-25 04:11:11 +08:00
public slots:
void start(); ///< Initializes the core, must be called before anything else
void process(); ///< Processes toxcore events and ensure we stay connected, called by its own timer
void bootstrapDht(); ///< Connects us to the Tox network
2014-06-25 04:11:11 +08:00
2015-01-24 22:31:11 +08:00
void saveConfiguration();
void saveConfiguration(const QString& path);
void switchConfiguration(const QString& profile); ///< Load a different profile and restart the core
2015-01-24 22:31:11 +08:00
2014-06-25 04:11:11 +08:00
void acceptFriendRequest(const QString& userId);
void requestFriendship(const QString& friendAddress, const QString& message);
void groupInviteFriend(int friendId, int groupId);
void createGroup(uint8_t type = TOX_GROUPCHAT_TYPE_AV);
2014-06-25 04:11:11 +08:00
void removeFriend(int friendId, bool fake = false);
void removeGroup(int groupId, bool fake = false);
2014-06-25 04:11:11 +08:00
2014-07-01 06:36:48 +08:00
void setStatus(Status status);
void setUsername(const QString& username);
void setStatusMessage(const QString& message);
2014-09-24 22:51:16 +08:00
void setAvatar(uint8_t format, const QByteArray& data);
2014-11-06 08:22:50 +08:00
int sendMessage(int friendId, const QString& message);
2014-06-26 04:43:28 +08:00
void sendGroupMessage(int groupId, const QString& message);
2014-11-01 21:00:43 +08:00
void sendGroupAction(int groupId, const QString& message);
2014-11-06 08:22:50 +08:00
void changeGroupTitle(int groupId, const QString& title);
int sendAction(int friendId, const QString& action);
2014-06-25 04:11:11 +08:00
void sendTyping(int friendId, bool typing);
2014-06-26 04:43:28 +08:00
2014-07-01 19:33:59 +08:00
void sendFile(int32_t friendId, QString Filename, QString FilePath, long long filesize);
void cancelFileSend(int friendId, int fileNum);
void cancelFileRecv(int friendId, int fileNum);
void rejectFileRecvRequest(int friendId, int fileNum);
void acceptFileRecvRequest(int friendId, int fileNum, QString path);
void pauseResumeFileSend(int friendId, int fileNum);
void pauseResumeFileRecv(int friendId, int fileNum);
2014-06-25 04:11:11 +08:00
void answerCall(int callId);
void rejectCall(int callId);
void hangupCall(int callId);
2014-06-30 05:38:48 +08:00
void startCall(int friendId, bool video=false);
2014-06-27 09:06:56 +08:00
void cancelCall(int callId, int friendId);
2014-06-25 04:11:11 +08:00
2014-08-19 23:20:20 +08:00
void micMuteToggle(int callId);
2014-10-28 20:50:30 +08:00
void volMuteToggle(int callId);
2014-08-19 23:20:20 +08:00
2014-11-16 00:10:04 +08:00
void setNospam(uint32_t nospam);
static void joinGroupCall(int groupId); ///< Starts a call in an existing AV groupchat. Call from the GUI thread.
static void leaveGroupCall(int groupId); ///< Will not leave the group, just stop the call. Call from the GUI thread.
2014-11-13 20:11:23 +08:00
static void disableGroupCallMic(int groupId);
static void disableGroupCallVol(int groupId);
static void enableGroupCallMic(int groupId);
static void enableGroupCallVol(int groupId);
static bool isGroupCallMicEnabled(int groupId);
static bool isGroupCallVolEnabled(int groupId);
2014-11-13 20:11:23 +08:00
void setPassword(QString& password, PasswordType passtype, uint8_t* salt = nullptr);
void useOtherPassword(PasswordType type);
void clearPassword(PasswordType passtype);
QByteArray encryptData(const QByteArray& data, PasswordType passtype);
QByteArray decryptData(const QByteArray& data, PasswordType passtype);
2014-06-25 04:11:11 +08:00
signals:
void connected();
void disconnected();
void blockingClearContacts();
2014-06-25 04:11:11 +08:00
void friendRequestReceived(const QString& userId, const QString& message);
void friendMessageReceived(int friendId, const QString& message, bool isAction);
2014-06-25 04:11:11 +08:00
void friendAdded(int friendId, const QString& userId);
void friendStatusChanged(int friendId, Status status);
void friendStatusMessageChanged(int friendId, const QString& message);
void friendUsernameChanged(int friendId, const QString& username);
void friendTypingChanged(int friendId, bool isTyping);
2014-09-24 23:28:38 +08:00
void friendAvatarChanged(int friendId, const QPixmap& pic);
2014-09-27 03:23:20 +08:00
void friendAvatarRemoved(int friendId);
2014-06-25 04:11:11 +08:00
void friendRemoved(int friendId);
void friendLastSeenChanged(int friendId, const QDateTime& dateTime);
2014-06-30 05:38:48 +08:00
void emptyGroupCreated(int groupnumber);
void groupInviteReceived(int friendnumber, uint8_t type, QByteArray publicKey);
2014-11-23 23:55:49 +08:00
void groupMessageReceived(int groupnumber, int peernumber, const QString& message, bool isAction);
2014-06-25 04:11:11 +08:00
void groupNamelistChanged(int groupnumber, int peernumber, uint8_t change);
2014-11-06 08:22:50 +08:00
void groupTitleChanged(int groupnumber, const QString& author, const QString& title);
2014-06-25 04:11:11 +08:00
void usernameSet(const QString& username);
void statusMessageSet(const QString& message);
void statusSet(Status status);
2014-10-18 09:15:26 +08:00
void idSet(const QString& id);
2014-09-24 22:51:16 +08:00
void selfAvatarChanged(const QPixmap& pic);
2014-06-25 04:11:11 +08:00
void messageSentResult(int friendId, const QString& message, int messageId);
void groupSentResult(int groupId, const QString& message, int result);
2014-11-06 08:22:50 +08:00
void actionSentResult(int friendId, const QString& action, int success);
2014-06-25 04:11:11 +08:00
2014-11-01 22:19:11 +08:00
void receiptRecieved(int friedId, int receipt);
void failedToAddFriend(const QString& userId, const QString& errorInfo = QString());
2014-06-25 04:11:11 +08:00
void failedToRemoveFriend(int friendId);
void failedToSetUsername(const QString& username);
void failedToSetStatusMessage(const QString& message);
void failedToSetStatus(Status status);
void failedToSetTyping(bool typing);
void failedToStart();
2014-10-06 04:49:44 +08:00
void badProxy();
2014-06-25 04:11:11 +08:00
void fileSendStarted(ToxFile file);
void fileReceiveRequested(ToxFile file);
void fileTransferAccepted(ToxFile file);
2014-11-17 23:05:14 +08:00
void fileTransferCancelled(ToxFile file);
void fileTransferFinished(ToxFile file);
void fileUploadFinished(const QString& path);
void fileDownloadFinished(const QString& path);
2014-11-17 23:05:14 +08:00
void fileTransferPaused(ToxFile file);
void fileTransferInfo(ToxFile file);
void fileTransferRemotePausedUnpaused(ToxFile file, bool paused);
void fileTransferBrokenUnbroken(ToxFile file, bool broken);
2014-09-24 00:52:06 +08:00
void fileSendFailed(int FriendId, const QString& fname);
void avInvite(int friendId, int callIndex, bool video);
void avStart(int friendId, int callIndex, bool video);
void avCancel(int friendId, int callIndex);
void avEnd(int friendId, int callIndex);
void avRinging(int friendId, int callIndex, bool video);
void avStarting(int friendId, int callIndex, bool video);
void avEnding(int friendId, int callIndex);
2014-06-27 09:06:56 +08:00
void avRequestTimeout(int friendId, int callIndex);
2014-06-28 03:59:25 +08:00
void avPeerTimeout(int friendId, int callIndex);
void avMediaChange(int friendId, int callIndex, bool videoEnabled);
2014-10-25 17:29:25 +08:00
void avCallFailed(int friendId);
2014-11-02 19:47:42 +08:00
void avRejected(int friendId, int callIndex);
void videoFrameReceived(vpx_image* frame);
private:
static void onFriendRequest(Tox* tox, const uint8_t* cUserId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
2014-07-03 15:22:12 +08:00
static void onFriendMessage(Tox* tox, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onFriendNameChange(Tox* tox, int friendId, const uint8_t* cName, uint16_t cNameSize, void* core);
static void onFriendTypingChange(Tox* tox, int friendId, uint8_t isTyping, void* core);
2014-07-03 15:22:12 +08:00
static void onStatusMessageChanged(Tox* tox, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onUserStatusChanged(Tox* tox, int friendId, uint8_t userstatus, void* core);
static void onConnectionStatusChanged(Tox* tox, int friendId, uint8_t status, void* core);
2014-07-03 15:22:12 +08:00
static void onAction(Tox* tox, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
2014-10-30 16:40:47 +08:00
static void onGroupAction(Tox* tox, int groupnumber, int peernumber, const uint8_t * action, uint16_t length, void* core);
static void onGroupInvite(Tox *tox, int friendnumber, uint8_t type, const uint8_t *data, uint16_t length,void *userdata);
2014-07-03 15:22:12 +08:00
static void onGroupMessage(Tox *tox, int groupnumber, int friendgroupnumber, const uint8_t * message, uint16_t length, void *userdata);
static void onGroupNamelistChange(Tox *tox, int groupnumber, int peernumber, uint8_t change, void *userdata);
2014-11-06 08:22:50 +08:00
static void onGroupTitleChange(Tox*, int groupnumber, int peernumber, const uint8_t* title, uint8_t len, void* _core);
static void onFileSendRequestCallback(Tox *tox, int32_t friendnumber, uint8_t filenumber, uint64_t filesize,
2014-07-03 15:22:12 +08:00
const uint8_t *filename, uint16_t filename_length, void *userdata);
static void onFileControlCallback(Tox *tox, int32_t friendnumber, uint8_t receive_send, uint8_t filenumber,
2014-07-03 15:22:12 +08:00
uint8_t control_type, const uint8_t *data, uint16_t length, void *core);
static void onFileDataCallback(Tox *tox, int32_t friendnumber, uint8_t filenumber, const uint8_t *data, uint16_t length, void *userdata);
2014-09-24 22:51:16 +08:00
static void onAvatarInfoCallback(Tox* tox, int32_t friendnumber, uint8_t format, uint8_t *hash, void *userdata);
static void onAvatarDataCallback(Tox* tox, int32_t friendnumber, uint8_t format, uint8_t *hash, uint8_t *data, uint32_t datalen, void *userdata);
2014-11-01 22:19:11 +08:00
static void onReadReceiptCallback(Tox *tox, int32_t friendnumber, uint32_t receipt, void *core);
static void onAvInvite(void* toxav, int32_t call_index, void* core);
static void onAvStart(void* toxav, int32_t call_index, void* core);
static void onAvCancel(void* toxav, int32_t call_index, void* core);
static void onAvReject(void* toxav, int32_t call_index, void* core);
static void onAvEnd(void* toxav, int32_t call_index, void* core);
static void onAvRinging(void* toxav, int32_t call_index, void* core);
static void onAvRequestTimeout(void* toxav, int32_t call_index, void* core);
static void onAvPeerTimeout(void* toxav, int32_t call_index, void* core);
static void onAvMediaChange(void *toxav, int32_t call_index, void* core);
2014-06-27 07:17:10 +08:00
2014-11-13 19:18:04 +08:00
static void sendGroupCallAudio(int groupId, ToxAv* toxav);
2014-06-30 05:38:48 +08:00
static void prepareCall(int friendId, int callId, ToxAv *toxav, bool videoEnabled);
static void cleanupCall(int callId);
2014-11-18 06:17:54 +08:00
static void playCallAudio(void *toxav, int32_t callId, const int16_t *data, uint16_t samples, void *user_data); // Callback
2014-07-09 15:55:25 +08:00
static void sendCallAudio(int callId, ToxAv* toxav);
static void playAudioBuffer(ALuint alSource, const int16_t *data, int samples, unsigned channels, int sampleRate);
2014-11-18 06:17:54 +08:00
static void playCallVideo(void *toxav, int32_t callId, const vpx_image_t* img, void *user_data);
2014-06-30 20:49:42 +08:00
void sendCallVideo(int callId);
bool checkConnection();
bool loadConfiguration(QString path); // Returns false for a critical error, true otherwise
bool loadEncryptedSave(QByteArray& data);
void checkEncryptedHistory();
void make_tox();
void loadFriends();
2014-08-28 21:46:11 +08:00
static void sendAllFileData(Core* core, ToxFile* file);
static void removeFileFromQueue(bool sendQueue, int friendId, int fileId);
void checkLastOnline(int friendId);
2014-12-06 10:58:44 +08:00
void deadifyTox();
private slots:
void onFileTransferFinished(ToxFile file);
private:
Tox* tox;
ToxAv* toxav;
2014-10-09 13:30:33 +08:00
QTimer *toxTimer, *fileTimer; //, *saveTimer;
2014-06-30 20:49:42 +08:00
Camera* camera;
2014-10-09 13:30:33 +08:00
QString loadPath; // meaningless after start() is called
QList<DhtServer> dhtServerList;
int dhtServerId;
static QList<ToxFile> fileSendQueue, fileRecvQueue;
static ToxCall calls[TOXAV_MAX_CALLS];
#ifdef QTOX_FILTER_AUDIO
static AudioFilterer * filterer[TOXAV_MAX_CALLS];
#endif
2014-11-13 19:18:04 +08:00
static QHash<int, ToxGroupCall> groupCalls; // Maps group IDs to ToxGroupCalls
2014-11-09 20:32:19 +08:00
QMutex fileSendMutex, messageSendMutex;
bool ready;
uint8_t* pwsaltedkeys[PasswordType::ptCounter] = {nullptr}; // use the pw's hash as the "pw"
// Hack for reloading current profile if switching to an encrypted one fails.
// Testing the passwords before killing the current profile is perfectly doable,
// however it would require major refactoring;
// the Core class as a whole also requires major refactoring (especially to support multiple IDs at once),
// so I'm punting on this until then, when it would get fixed anyways
uint8_t* backupkeys[PasswordType::ptCounter] = {nullptr};
QString* backupProfile = nullptr;
void saveCurrentInformation();
QString loadOldInformation();
2014-07-12 18:50:40 +08:00
static const int videobufsize;
static uint8_t* videobuf;
2014-08-30 20:40:41 +08:00
static QThread *coreThread;
friend class Audio; ///< Audio can access our calls directly to reduce latency
2014-06-25 04:11:11 +08:00
};
#endif // CORE_HPP