1
0
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:
Dubslow 2015-02-12 23:27:49 -06:00
parent eff76fd491
commit 11d4ec2599
5 changed files with 18 additions and 20 deletions

View File

@ -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();
}
}

View File

@ -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 &timestamp = QDateTime::currentDateTime()); void registerReceipt(int receipt, int messageID, MessageActionPtr msg, const QDateTime &timestamp = 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

View File

@ -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)

View File

@ -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();

View File

@ -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();