Fix locking file after double save as.

(grafted from 4828cd4acfa596166fe4c8a32f505045b86cab9c)

--HG--
branch : develop
This commit is contained in:
Roman Telezhynskyi 2019-07-04 17:13:33 +03:00
parent 13650f20a4
commit 2ac4267dd3
9 changed files with 40 additions and 21 deletions

View File

@ -53,6 +53,7 @@
- Regression in method DialogTool::GetNodeName. - Regression in method DialogTool::GetNodeName.
- Fix visualization for tool Point from arc and tangent. - Fix visualization for tool Point from arc and tangent.
- Changing settings for move and rotate tools through property browser does not take in count previous change for label point and Show label option. - Changing settings for move and rotate tools through property browser does not take in count previous change for label point and Show label option.
- Fix locking file after double save as.
# Version 0.6.1 October 23, 2018 # Version 0.6.1 October 23, 2018
- [#885] Regression. Broken support for multi size measurements. - [#885] Regression. Broken support for multi size measurements.

View File

@ -39,7 +39,6 @@
#include "../ifc/xml/vvitconverter.h" #include "../ifc/xml/vvitconverter.h"
#include "../ifc/xml/vvstconverter.h" #include "../ifc/xml/vvstconverter.h"
#include "../ifc/xml/vpatternconverter.h" #include "../ifc/xml/vpatternconverter.h"
#include "../vmisc/vlockguard.h"
#include "../vmisc/vsysexits.h" #include "../vmisc/vsysexits.h"
#include "../vmisc/qxtcsvmodel.h" #include "../vmisc/qxtcsvmodel.h"
#include "../vmisc/dialogs/dialogexporttocsv.h" #include "../vmisc/dialogs/dialogexporttocsv.h"
@ -843,7 +842,7 @@ bool TMainWindow::FileSaveAs()
fileName += QChar('.') + suffix; fileName += QChar('.') + suffix;
} }
if (QFileInfo::exists(fileName)) if (QFileInfo::exists(fileName) && curFile != fileName)
{ {
// Temporary try to lock the file before saving // Temporary try to lock the file before saving
VLockGuard<char> tmp(fileName); VLockGuard<char> tmp(fileName);
@ -884,6 +883,10 @@ bool TMainWindow::FileSaveAs()
UpdatePadlock(false); UpdatePadlock(false);
UpdateWindowTitle(); UpdateWindowTitle();
if (curFile == fileName && not lock.isNull())
{
lock->Unlock();
}
VlpCreateLock(lock, fileName); VlpCreateLock(lock, fileName);
if (not lock->IsLocked()) if (not lock->IsLocked())
{ {

View File

@ -141,7 +141,7 @@ private:
QComboBox *gradationSizes; QComboBox *gradationSizes;
QComboBox *comboBoxUnits; QComboBox *comboBoxUnits;
int formulaBaseHeight; int formulaBaseHeight;
std::shared_ptr<VLockGuard<char>> lock; QSharedPointer<VLockGuard<char>> lock;
QSharedPointer<VTableSearch> search; QSharedPointer<VTableSearch> search;
QLabel *labelGradationHeights; QLabel *labelGradationHeights;
QLabel *labelGradationSizes; QLabel *labelGradationSizes;

View File

@ -518,7 +518,7 @@ void VApplication::BeginLogging()
{ {
if (lockLog->GetProtected()->open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) if (lockLog->GetProtected()->open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
{ {
out.reset(new QTextStream(lockLog->GetProtected().get())); out.reset(new QTextStream(lockLog->GetProtected().data()));
qInstallMessageHandler(noisyFailureMsgHandler); qInstallMessageHandler(noisyFailureMsgHandler);
qCDebug(vApp, "Log file %s was locked.", qUtf8Printable(LogPath())); qCDebug(vApp, "Log file %s was locked.", qUtf8Printable(LogPath()));
} }

View File

@ -90,7 +90,7 @@ private:
VTranslateVars *trVars; VTranslateVars *trVars;
QTimer *autoSaveTimer; QTimer *autoSaveTimer;
std::shared_ptr<VLockGuard<QFile>> lockLog; QSharedPointer<VLockGuard<QFile>> lockLog;
std::shared_ptr<QTextStream> out; std::shared_ptr<QTextStream> out;
QString LogDirPath()const; QString LogDirPath()const;

View File

@ -2830,7 +2830,7 @@ bool MainWindow::on_actionSaveAs_triggered()
fileName += QLatin1String(".val"); fileName += QLatin1String(".val");
} }
if (f.exists()) if (f.exists() && qApp->GetPatternPath() != fileName)
{ {
// Temporary try to lock the file before saving // Temporary try to lock the file before saving
// Also help to rewite current read-only pattern // Also help to rewite current read-only pattern
@ -2880,6 +2880,10 @@ bool MainWindow::on_actionSaveAs_triggered()
patternReadOnly = false; patternReadOnly = false;
qCDebug(vMainWindow, "Locking file"); qCDebug(vMainWindow, "Locking file");
if (qApp->GetPatternPath() == fileName && not lock.isNull())
{
lock->Unlock();
}
VlpCreateLock(lock, fileName); VlpCreateLock(lock, fileName);
if (lock->IsLocked()) if (lock->IsLocked())

View File

@ -271,7 +271,7 @@ private:
VToolOptionsPropertyBrowser *toolOptions; VToolOptionsPropertyBrowser *toolOptions;
VWidgetGroups *groupsWidget; VWidgetGroups *groupsWidget;
VWidgetDetails *detailsWidget; VWidgetDetails *detailsWidget;
std::shared_ptr<VLockGuard<char>> lock; QSharedPointer<VLockGuard<char>> lock;
QList<QToolButton*> toolButtonPointerList; QList<QToolButton*> toolButtonPointerList;

View File

@ -32,12 +32,12 @@
#include <QString> #include <QString>
#include <stdint.h> #include <stdint.h>
#include <memory>
#include "../vmisc/diagnostic.h" #include "../vmisc/diagnostic.h"
#include <QFileInfo> #include <QFileInfo>
#include <QLockFile> #include <QLockFile>
#include <QSharedPointer>
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
#include <windows.h> #include <windows.h>
#endif #endif
@ -61,18 +61,19 @@ public:
template <typename Alloc, typename Delete> template <typename Alloc, typename Delete>
VLockGuard(const QString& lockName, Alloc a, Delete d, int stale = 0, int timeout=0); VLockGuard(const QString& lockName, Alloc a, Delete d, int stale = 0, int timeout=0);
const std::shared_ptr<Guarded> &GetProtected() const; const QSharedPointer<Guarded> &GetProtected() const;
int GetLockError() const; int GetLockError() const;
bool IsLocked() const; bool IsLocked() const;
void Unlock();
QString GetLockFile() const; QString GetLockFile() const;
private: private:
Q_DISABLE_COPY(VLockGuard<Guarded>) Q_DISABLE_COPY(VLockGuard<Guarded>)
std::shared_ptr<Guarded> holder; QSharedPointer<Guarded> holder;
int lockError; int lockError;
QString lockFile; QString lockFile;
std::shared_ptr<QLockFile> lock; QSharedPointer<QLockFile> lock;
// cppcheck-suppress functionStatic // cppcheck-suppress functionStatic
bool TryLock(const QString &lockName, int stale, int timeout); bool TryLock(const QString &lockName, int stale, int timeout);
@ -115,23 +116,33 @@ VLockGuard<Guarded>::VLockGuard(const QString& lockName, Alloc a, Delete d, int
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template <typename Guarded> template <typename Guarded>
const std::shared_ptr<Guarded> &VLockGuard<Guarded>::GetProtected() const inline const QSharedPointer<Guarded> &VLockGuard<Guarded>::GetProtected() const
{ {
return holder; return holder;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template <typename Guarded> template <typename Guarded>
int VLockGuard<Guarded>::GetLockError() const inline int VLockGuard<Guarded>::GetLockError() const
{ {
return lockError; return lockError;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template <typename Guarded> template <typename Guarded>
bool VLockGuard<Guarded>::IsLocked() const inline bool VLockGuard<Guarded>::IsLocked() const
{ {
return holder != nullptr; return not holder.isNull();
}
//---------------------------------------------------------------------------------------------------------------------
template<typename Guarded>
inline void VLockGuard<Guarded>::Unlock()
{
if (IsLocked())
{
lock->unlock();
}
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -187,20 +198,20 @@ QT_WARNING_PUSH
QT_WARNING_DISABLE_INTEL(1418) QT_WARNING_DISABLE_INTEL(1418)
template <typename Guarded> template <typename Guarded>
void VlpCreateLock(std::shared_ptr<VLockGuard<Guarded>>& r, const QString& lockName, int stale = 0, int timeout = 0) void VlpCreateLock(QSharedPointer<VLockGuard<Guarded>>& r, const QString& lockName, int stale = 0, int timeout = 0)
{ {
r.reset(new VLockGuard<Guarded>(lockName, stale, timeout)); r.reset(new VLockGuard<Guarded>(lockName, stale, timeout));
} }
template <typename Guarded, typename Alloc> template <typename Guarded, typename Alloc>
void VlpCreateLock(std::shared_ptr<VLockGuard<Guarded>>& r, const QString& lockName, Alloc a, int stale = 0, void VlpCreateLock(QSharedPointer<VLockGuard<Guarded>>& r, const QString& lockName, Alloc a, int stale = 0,
int timeout = 0) int timeout = 0)
{ {
r.reset(new VLockGuard<Guarded>(lockName, a, stale, timeout)); r.reset(new VLockGuard<Guarded>(lockName, a, stale, timeout));
} }
template <typename Guarded, typename Alloc, typename Del> template <typename Guarded, typename Alloc, typename Del>
void VlpCreateLock(std::shared_ptr<VLockGuard<Guarded>>& r, const QString& lockName, Alloc a, Del d, int stale = 0, void VlpCreateLock(QSharedPointer<VLockGuard<Guarded>>& r, const QString& lockName, Alloc a, Del d, int stale = 0,
int timeout = 0) int timeout = 0)
{ {
r.reset(new VLockGuard<Guarded>(lockName, a, d, stale, timeout)); r.reset(new VLockGuard<Guarded>(lockName, a, d, stale, timeout));

View File

@ -42,7 +42,7 @@ TST_VLockGuard::TST_VLockGuard(QObject *parent)
void TST_VLockGuard::TryLock() const void TST_VLockGuard::TryLock() const
{ {
QString fileName(QCoreApplication::applicationDirPath() + "/lockFile.txt"); QString fileName(QCoreApplication::applicationDirPath() + "/lockFile.txt");
std::shared_ptr<VLockGuard<char>> lock; QSharedPointer<VLockGuard<char>> lock;
VlpCreateLock(lock, fileName); VlpCreateLock(lock, fileName);
fileName = lock->GetLockFile(); fileName = lock->GetLockFile();