aboutsummaryrefslogtreecommitdiffstats
path: root/src/kvilib/ext/KviConfigurationFile.cpp
diff options
context:
space:
mode:
authorGravatar Szymon Tomasz Stefanek2018-12-13 14:03:42 +0100
committerGravatar GitHub2018-12-13 14:03:42 +0100
commit84fbb9458ddb7c0ecf85df2098fe424005648e27 (patch)
treede7899a0f62e2bbe52f5a8582a80d6564a9b7c46 /src/kvilib/ext/KviConfigurationFile.cpp
parentRemove redundant comments from CMakeLists (diff)
downloadKVIrc-84fbb9458ddb7c0ecf85df2098fe424005648e27.tar.gz
KVIrc-84fbb9458ddb7c0ecf85df2098fe424005648e27.tar.bz2
KVIrc-84fbb9458ddb7c0ecf85df2098fe424005648e27.zip
Save configuration files atomically so corruption is less likely (#2417)
* Save configuration files atomically so corruption is less likely * Save configs only if dirty
Diffstat (limited to 'src/kvilib/ext/KviConfigurationFile.cpp')
-rw-r--r--src/kvilib/ext/KviConfigurationFile.cpp49
1 files changed, 12 insertions, 37 deletions
diff --git a/src/kvilib/ext/KviConfigurationFile.cpp b/src/kvilib/ext/KviConfigurationFile.cpp
index 8b75384a5..27dd54c49 100644
--- a/src/kvilib/ext/KviConfigurationFile.cpp
+++ b/src/kvilib/ext/KviConfigurationFile.cpp
@@ -32,6 +32,7 @@
#include <QColor>
#include <QRect>
+#include <QSaveFile>
KviConfigurationFile::KviConfigurationFile(const QString & filename, FileMode f, bool bLocal8Bit)
{
@@ -335,20 +336,11 @@ bool KviConfigurationFile::load()
return true;
}
-bool KviConfigurationFile::ensureWritable()
+bool KviConfigurationFile::saveIfDirty()
{
- if(m_bReadOnly)
- return false;
-
- KviFile f(m_szFileName);
- if(!f.open(QFile::WriteOnly | QFile::Truncate))
- return false;
- if(f.write("# KVIrc configuration file\n", 27) != 27)
- return false;
- if(!f.flush())
- return false;
- f.close();
- return true;
+ if(!m_bDirty)
+ return true;
+ return save();
}
bool KviConfigurationFile::save()
@@ -409,9 +401,11 @@ bool KviConfigurationFile::save()
if(m_bReadOnly)
return false;
- KviFile f(m_szFileName);
+ QSaveFile f(m_szFileName);
+
if(!f.open(QFile::WriteOnly | QFile::Truncate))
return false;
+
if(f.write("# KVIrc configuration file\n", 27) != 27)
return false;
@@ -454,7 +448,10 @@ bool KviConfigurationFile::save()
}
++it;
}
- f.close();
+
+ if(!f.commit())
+ return false;
+
m_bDirty = false;
return true;
}
@@ -907,25 +904,3 @@ unsigned char KviConfigurationFile::readUCharEntry(const QString & szKey, unsign
unsigned char iVal = (unsigned char)p_str->toUInt(&bOk);
return bOk ? iVal : iDefault;
}
-
-#ifdef COMPILE_ON_WINDOWS
-
-//
-// On windows we need to override new and delete operators
-// to ensure that always the right new/delete pair is called for an object instance
-// This bug is present in all the classes exported by a module that
-// can be instantiated/destroyed from external modules.
-// (this is a well known bug described in Q122675 of MSDN)
-//
-
-void * KviConfigurationFile::operator new(size_t tSize)
-{
- return KviMemory::allocate(tSize);
-}
-
-void KviConfigurationFile::operator delete(void * p)
-{
- KviMemory::free(p);
-}
-
-#endif