mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
Refactor OfflineMsgEngine, fix potential segfault
(@apprb take note please)
This commit is contained in:
parent
eff76fd491
commit
11d4ec2599
@ -23,19 +23,16 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
const int OfflineMsgEngine::offlineTimeout = 2000;
|
const int OfflineMsgEngine::offlineTimeout = 2000;
|
||||||
QSet<OfflineMsgEngine*> OfflineMsgEngine::engines;
|
|
||||||
QMutex OfflineMsgEngine::globalMutex;
|
QMutex OfflineMsgEngine::globalMutex;
|
||||||
|
|
||||||
OfflineMsgEngine::OfflineMsgEngine(Friend *frnd) :
|
OfflineMsgEngine::OfflineMsgEngine(Friend *frnd) :
|
||||||
mutex(QMutex::Recursive),
|
mutex(QMutex::Recursive),
|
||||||
f(frnd)
|
f(frnd)
|
||||||
{
|
{
|
||||||
engines.insert(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OfflineMsgEngine::~OfflineMsgEngine()
|
OfflineMsgEngine::~OfflineMsgEngine()
|
||||||
{
|
{
|
||||||
engines.remove(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OfflineMsgEngine::dischargeReceipt(int receipt)
|
void OfflineMsgEngine::dischargeReceipt(int receipt)
|
||||||
@ -106,16 +103,3 @@ void OfflineMsgEngine::removeAllReciepts()
|
|||||||
receipts.clear();
|
receipts.clear();
|
||||||
undeliveredMsgs.clear();
|
undeliveredMsgs.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OfflineMsgEngine::processAllMsgs()
|
|
||||||
{
|
|
||||||
if (globalMutex.tryLock())
|
|
||||||
{
|
|
||||||
for (auto &it : engines)
|
|
||||||
{
|
|
||||||
it->deliverOfflineMsgs();
|
|
||||||
}
|
|
||||||
|
|
||||||
globalMutex.unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -32,6 +32,7 @@ class OfflineMsgEngine : public QObject
|
|||||||
public:
|
public:
|
||||||
OfflineMsgEngine(Friend *);
|
OfflineMsgEngine(Friend *);
|
||||||
virtual ~OfflineMsgEngine();
|
virtual ~OfflineMsgEngine();
|
||||||
|
static QMutex globalMutex;
|
||||||
|
|
||||||
void dischargeReceipt(int receipt);
|
void dischargeReceipt(int receipt);
|
||||||
void registerReceipt(int receipt, int messageID, MessageActionPtr msg, const QDateTime ×tamp = QDateTime::currentDateTime());
|
void registerReceipt(int receipt, int messageID, MessageActionPtr msg, const QDateTime ×tamp = QDateTime::currentDateTime());
|
||||||
@ -39,7 +40,6 @@ public:
|
|||||||
public slots:
|
public slots:
|
||||||
void deliverOfflineMsgs();
|
void deliverOfflineMsgs();
|
||||||
void removeAllReciepts();
|
void removeAllReciepts();
|
||||||
static void processAllMsgs();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct MsgPtr {
|
struct MsgPtr {
|
||||||
@ -53,9 +53,7 @@ private:
|
|||||||
QHash<int, int> receipts;
|
QHash<int, int> receipts;
|
||||||
QMap<int, MsgPtr> undeliveredMsgs;
|
QMap<int, MsgPtr> undeliveredMsgs;
|
||||||
|
|
||||||
static QSet<OfflineMsgEngine*> engines;
|
|
||||||
static const int offlineTimeout;
|
static const int offlineTimeout;
|
||||||
static QMutex globalMutex;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // OFFLINEMSGENGINE_H
|
#endif // OFFLINEMSGENGINE_H
|
||||||
|
@ -105,6 +105,7 @@ ChatForm::~ChatForm()
|
|||||||
{
|
{
|
||||||
delete netcam;
|
delete netcam;
|
||||||
delete callConfirm;
|
delete callConfirm;
|
||||||
|
delete offlineEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatForm::setStatusMessage(QString newMessage)
|
void ChatForm::setStatusMessage(QString newMessage)
|
||||||
|
@ -225,7 +225,7 @@ void Widget::init()
|
|||||||
connect(addFriendForm, SIGNAL(friendRequested(QString, QString)), this, SIGNAL(friendRequested(QString, QString)));
|
connect(addFriendForm, SIGNAL(friendRequested(QString, QString)), this, SIGNAL(friendRequested(QString, QString)));
|
||||||
connect(timer, &QTimer::timeout, this, &Widget::onUserAwayCheck);
|
connect(timer, &QTimer::timeout, this, &Widget::onUserAwayCheck);
|
||||||
connect(timer, &QTimer::timeout, this, &Widget::onEventIconTick);
|
connect(timer, &QTimer::timeout, this, &Widget::onEventIconTick);
|
||||||
connect(offlineMsgTimer, &QTimer::timeout, &OfflineMsgEngine::processAllMsgs);
|
connect(offlineMsgTimer, &QTimer::timeout, this, &Widget::processOfflineMsgs);
|
||||||
|
|
||||||
addFriendForm->show(*ui);
|
addFriendForm->show(*ui);
|
||||||
|
|
||||||
@ -1125,6 +1125,20 @@ void Widget::onSplitterMoved(int pos, int index)
|
|||||||
saveSplitterGeometry();
|
saveSplitterGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Widget::processOfflineMsgs()
|
||||||
|
{
|
||||||
|
if (OfflineMsgEngine::globalMutex.tryLock())
|
||||||
|
{
|
||||||
|
QList<Friend*> frnds = FriendList::getAllFriends();
|
||||||
|
for (Friend *f : frnds)
|
||||||
|
{
|
||||||
|
f->getChatForm()->getOfflineMsgEngine()->deliverOfflineMsgs();
|
||||||
|
}
|
||||||
|
|
||||||
|
OfflineMsgEngine::globalMutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Widget::clearAllReceipts()
|
void Widget::clearAllReceipts()
|
||||||
{
|
{
|
||||||
QList<Friend*> frnds = FriendList::getAllFriends();
|
QList<Friend*> frnds = FriendList::getAllFriends();
|
||||||
|
@ -132,6 +132,7 @@ private slots:
|
|||||||
void onEventIconTick();
|
void onEventIconTick();
|
||||||
void onSetShowSystemTray(bool newValue);
|
void onSetShowSystemTray(bool newValue);
|
||||||
void onSplitterMoved(int pos, int index);
|
void onSplitterMoved(int pos, int index);
|
||||||
|
void processOfflineMsgs();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void init();
|
void init();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user