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

Merge pull request #5413

Mick Sayson (2):
      refactor(settings): Consolidate friendProp insert logic
      fix(settings): Add mutex locks for consistency
This commit is contained in:
sudden6 2018-10-29 23:05:40 +01:00
commit a1a50b4bed
No known key found for this signature in database
GPG Key ID: 279509B499E032B9
2 changed files with 62 additions and 87 deletions

View File

@ -355,8 +355,7 @@ void Settings::loadPersonal(Profile* profile)
friendLst.reserve(size); friendLst.reserve(size);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
ps.setArrayIndex(i); ps.setArrayIndex(i);
friendProp fp; friendProp fp{ps.value("addr").toString()};
fp.addr = ps.value("addr").toString();
fp.alias = ps.value("alias").toString(); fp.alias = ps.value("alias").toString();
fp.note = ps.value("note").toString(); fp.note = ps.value("note").toString();
fp.autoAcceptDir = ps.value("autoAcceptDir").toString(); fp.autoAcceptDir = ps.value("autoAcceptDir").toString();
@ -371,7 +370,7 @@ void Settings::loadPersonal(Profile* profile)
if (getEnableLogging()) if (getEnableLogging())
fp.activity = ps.value("activity", QDate()).toDate(); fp.activity = ps.value("activity", QDate()).toDate();
friendLst[ToxId(fp.addr).getPublicKey().getKey()] = fp; friendLst.insert(ToxId(fp.addr).getPublicKey().getKey(), fp);
} }
ps.endArray(); ps.endArray();
} }
@ -1251,6 +1250,8 @@ void Settings::setEnableLanDiscovery(bool enabled)
QNetworkProxy Settings::getProxy() const QNetworkProxy Settings::getProxy() const
{ {
QMutexLocker locker{&bigLock};
QNetworkProxy proxy; QNetworkProxy proxy;
switch (Settings::getProxyType()) { switch (Settings::getProxyType()) {
case ProxyType::ptNone: case ProxyType::ptNone:
@ -1400,15 +1401,10 @@ void Settings::setAutoAcceptDir(const ToxPk& id, const QString& dir)
{ {
QMutexLocker locker{&bigLock}; QMutexLocker locker{&bigLock};
auto it = friendLst.find(id.getKey()); auto& frnd = getOrInsertFriendPropRef(id);
if (it == friendLst.end()) {
updateFriendAddress(id.toString());
setAutoAcceptDir(id, dir);
return;
}
if (it->autoAcceptDir != dir) { if (frnd.autoAcceptDir != dir) {
it->autoAcceptDir = dir; frnd.autoAcceptDir = dir;
emit autoAcceptDirChanged(id, dir); emit autoAcceptDirChanged(id, dir);
} }
} }
@ -1428,15 +1424,10 @@ void Settings::setAutoAcceptCall(const ToxPk& id, AutoAcceptCallFlags accept)
{ {
QMutexLocker locker{&bigLock}; QMutexLocker locker{&bigLock};
auto it = friendLst.find(id.getKey()); auto& frnd = getOrInsertFriendPropRef(id);
if (it == friendLst.end()) {
updateFriendAddress(id.toString());
setAutoAcceptCall(id, accept);
return;
}
if (it->autoAcceptCall != accept) { if (frnd.autoAcceptCall != accept) {
it->autoAcceptCall = accept; frnd.autoAcceptCall = accept;
emit autoAcceptCallChanged(id, accept); emit autoAcceptCallChanged(id, accept);
} }
} }
@ -1457,15 +1448,10 @@ void Settings::setAutoGroupInvite(const ToxPk& id, bool accept)
{ {
QMutexLocker locker{&bigLock}; QMutexLocker locker{&bigLock};
auto it = friendLst.find(id.getKey()); auto& frnd = getOrInsertFriendPropRef(id);
if (it == friendLst.end()) {
updateFriendAddress(id.toString());
setAutoGroupInvite(id, accept);
return;
}
if (it->autoGroupInvite != accept) { if (frnd.autoGroupInvite != accept) {
it->autoGroupInvite = accept; frnd.autoGroupInvite = accept;
emit autoGroupInviteChanged(id, accept); emit autoGroupInviteChanged(id, accept);
} }
} }
@ -1485,15 +1471,10 @@ void Settings::setContactNote(const ToxPk& id, const QString& note)
{ {
QMutexLocker locker{&bigLock}; QMutexLocker locker{&bigLock};
auto it = friendLst.find(id.getKey()); auto& frnd = getOrInsertFriendPropRef(id);
if (it == friendLst.end()) {
updateFriendAddress(id.toString());
setContactNote(id, note);
return;
}
if (it->note != note) { if (frnd.note != note) {
it->note = note; frnd.note = note;
emit contactNoteChanged(id, note); emit contactNoteChanged(id, note);
} }
} }
@ -2073,18 +2054,9 @@ void Settings::updateFriendAddress(const QString& newAddr)
{ {
QMutexLocker locker{&bigLock}; QMutexLocker locker{&bigLock};
// TODO: using ToxId here is a hack // TODO: using ToxId here is a hack
QByteArray key = ToxId(newAddr).getPublicKey().getKey(); auto key = ToxId(newAddr).getPublicKey();
auto it = friendLst.find(key); auto& frnd = getOrInsertFriendPropRef(key);
if (it != friendLst.end()) { frnd.addr = newAddr;
it->addr = newAddr;
} else {
friendProp fp;
fp.addr = newAddr;
fp.alias = "";
fp.note = "";
fp.autoAcceptDir = "";
friendLst[key] = fp;
}
} }
QString Settings::getFriendAlias(const ToxPk& id) const QString Settings::getFriendAlias(const ToxPk& id) const
@ -2100,21 +2072,13 @@ QString Settings::getFriendAlias(const ToxPk& id) const
void Settings::setFriendAlias(const ToxPk& id, const QString& alias) void Settings::setFriendAlias(const ToxPk& id, const QString& alias)
{ {
QMutexLocker locker{&bigLock}; QMutexLocker locker{&bigLock};
auto it = friendLst.find(id.getKey()); auto& frnd = getOrInsertFriendPropRef(id);
if (it != friendLst.end()) { frnd.alias = alias;
it->alias = alias;
} else {
friendProp fp;
fp.addr = id.toString();
fp.alias = alias;
fp.note = "";
fp.autoAcceptDir = "";
friendLst[id.getKey()] = fp;
}
} }
int Settings::getFriendCircleID(const ToxPk& id) const int Settings::getFriendCircleID(const ToxPk& id) const
{ {
QMutexLocker locker{&bigLock};
auto it = friendLst.find(id.getKey()); auto it = friendLst.find(id.getKey());
if (it != friendLst.end()) if (it != friendLst.end())
return it->circleID; return it->circleID;
@ -2124,18 +2088,9 @@ int Settings::getFriendCircleID(const ToxPk& id) const
void Settings::setFriendCircleID(const ToxPk& id, int circleID) void Settings::setFriendCircleID(const ToxPk& id, int circleID)
{ {
auto it = friendLst.find(id.getKey()); QMutexLocker locker{&bigLock};
if (it != friendLst.end()) { auto& frnd = getOrInsertFriendPropRef(id);
it->circleID = circleID; frnd.circleID = circleID;
} else {
friendProp fp;
fp.addr = id.toString();
fp.alias = "";
fp.note = "";
fp.autoAcceptDir = "";
fp.circleID = circleID;
friendLst[id.getKey()] = fp;
}
} }
QDate Settings::getFriendActivity(const ToxPk& id) const QDate Settings::getFriendActivity(const ToxPk& id) const
@ -2149,19 +2104,9 @@ QDate Settings::getFriendActivity(const ToxPk& id) const
void Settings::setFriendActivity(const ToxPk& id, const QDate& activity) void Settings::setFriendActivity(const ToxPk& id, const QDate& activity)
{ {
auto it = friendLst.find(id.getKey()); QMutexLocker locker{&bigLock};
if (it != friendLst.end()) { auto& frnd = getOrInsertFriendPropRef(id);
it->activity = activity; frnd.activity = activity;
} else {
friendProp fp;
fp.addr = id.toString();
fp.alias = "";
fp.note = "";
fp.autoAcceptDir = "";
fp.circleID = -1;
fp.activity = activity;
friendLst[id.getKey()] = fp;
}
} }
void Settings::saveFriendSettings(const ToxPk& id) void Settings::saveFriendSettings(const ToxPk& id)
@ -2274,22 +2219,27 @@ void Settings::setShowIdenticons(bool value)
int Settings::getCircleCount() const int Settings::getCircleCount() const
{ {
QMutexLocker locker{&bigLock};
return circleLst.size(); return circleLst.size();
} }
QString Settings::getCircleName(int id) const QString Settings::getCircleName(int id) const
{ {
QMutexLocker locker{&bigLock};
return circleLst[id].name; return circleLst[id].name;
} }
void Settings::setCircleName(int id, const QString& name) void Settings::setCircleName(int id, const QString& name)
{ {
QMutexLocker locker{&bigLock};
circleLst[id].name = name; circleLst[id].name = name;
savePersonal(); savePersonal();
} }
int Settings::addCircle(const QString& name) int Settings::addCircle(const QString& name)
{ {
QMutexLocker locker{&bigLock};
circleProp cp; circleProp cp;
cp.expanded = false; cp.expanded = false;
@ -2305,11 +2255,13 @@ int Settings::addCircle(const QString& name)
bool Settings::getCircleExpanded(int id) const bool Settings::getCircleExpanded(int id) const
{ {
QMutexLocker locker{&bigLock};
return circleLst[id].expanded; return circleLst[id].expanded;
} }
void Settings::setCircleExpanded(int id, bool expanded) void Settings::setCircleExpanded(int id, bool expanded)
{ {
QMutexLocker locker{&bigLock};
circleLst[id].expanded = expanded; circleLst[id].expanded = expanded;
} }
@ -2438,6 +2390,8 @@ bool Settings::getEnableGroupChatsColor() const
*/ */
void Settings::createPersonal(QString basename) void Settings::createPersonal(QString basename)
{ {
QMutexLocker locker{&bigLock};
QString path = getSettingsDirPath() + QDir::separator() + basename + ".ini"; QString path = getSettingsDirPath() + QDir::separator() + basename + ".ini";
qDebug() << "Creating new profile settings in " << path; qDebug() << "Creating new profile settings in " << path;
@ -2457,6 +2411,8 @@ void Settings::createPersonal(QString basename)
*/ */
void Settings::createSettingsDir() void Settings::createSettingsDir()
{ {
QMutexLocker locker{&bigLock};
QString dir = Settings::getSettingsDirPath(); QString dir = Settings::getSettingsDirPath();
QDir directory(dir); QDir directory(dir);
if (!directory.exists() && !directory.mkpath(directory.absolutePath())) if (!directory.exists() && !directory.mkpath(directory.absolutePath()))
@ -2476,3 +2432,15 @@ void Settings::sync()
QMutexLocker locker{&bigLock}; QMutexLocker locker{&bigLock};
qApp->processEvents(); qApp->processEvents();
} }
Settings::friendProp& Settings::getOrInsertFriendPropRef(const ToxPk& id)
{
// No mutex lock, this is a private fn that should only be called by other
// public functions that already locked the mutex
auto it = friendLst.find(id.getKey());
if (it == friendLst.end()) {
it = friendLst.insert(id.getKey(), friendProp{id.toString()});
}
return *it;
}

View File

@ -570,11 +570,14 @@ public:
static uint32_t makeProfileId(const QString& profile); static uint32_t makeProfileId(const QString& profile);
private: private:
struct friendProp;
Settings(); Settings();
~Settings(); ~Settings();
Settings(Settings& settings) = delete; Settings(Settings& settings) = delete;
Settings& operator=(const Settings&) = delete; Settings& operator=(const Settings&) = delete;
void savePersonal(QString profileName, const ToxEncrypt* passkey); void savePersonal(QString profileName, const ToxEncrypt* passkey);
friendProp& getOrInsertFriendPropRef(const ToxPk& id);
public slots: public slots:
void savePersonal(Profile* profile); void savePersonal(Profile* profile);
@ -687,10 +690,14 @@ private:
struct friendProp struct friendProp
{ {
QString alias; friendProp() = delete;
QString addr; friendProp(QString addr)
QString autoAcceptDir; : addr(addr)
QString note; {}
QString alias = "";
QString addr = "";
QString autoAcceptDir = "";
QString note = "";
int circleID = -1; int circleID = -1;
QDate activity = QDate(); QDate activity = QDate();
AutoAcceptCallFlags autoAcceptCall; AutoAcceptCallFlags autoAcceptCall;