Some more improvements to LockedFile class.

This commit is contained in:
LoRd_MuldeR 2015-11-26 23:15:31 +01:00
parent 8e64da1ea7
commit 96401c1f27
2 changed files with 27 additions and 13 deletions

View File

@ -34,8 +34,8 @@
#define VER_LAMEXP_MINOR_HI 1
#define VER_LAMEXP_MINOR_LO 3
#define VER_LAMEXP_TYPE RC
#define VER_LAMEXP_PATCH 5
#define VER_LAMEXP_BUILD 1848
#define VER_LAMEXP_PATCH 6
#define VER_LAMEXP_BUILD 1850
#define VER_LAMEXP_CONFG 1818
///////////////////////////////////////////////////////////////////////////////

View File

@ -59,13 +59,33 @@
#define VALID_HANDLE(H) (((H) != NULL) && ((H) != INVALID_HANDLE_VALUE))
static bool PROTECT_HANDLE(const HANDLE &h, const bool &lock)
{
if (SetHandleInformation(h, HANDLE_FLAG_PROTECT_FROM_CLOSE, (lock ? HANDLE_FLAG_PROTECT_FROM_CLOSE : 0U)))
{
return true;
}
return false;
}
static void CLOSE_HANDLE(HANDLE &h)
{
if(VALID_HANDLE(h))
{
PROTECT_HANDLE(h, false);
CloseHandle(h);
h = NULL;
}
h = NULL;
}
static void CLOSE_FILE(int &fd)
{
if (fd >= 0)
{
PROTECT_HANDLE((HANDLE)_get_osfhandle(fd), false);
_close(fd);
}
fd = -1;
}
///////////////////////////////////////////////////////////////////////////////
@ -126,7 +146,7 @@ static __forceinline void doLockFile(HANDLE &fileHandle, const QString &filePath
const HANDLE hTemp = CreateFileW(MUTILS_WCHR(QDir::toNativeSeparators(filePath)), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
if(VALID_HANDLE(hTemp))
{
fileHandle = hTemp;
PROTECT_HANDLE(fileHandle = hTemp, true);
break; /*file opened successfully*/
}
if(i == 0)
@ -305,11 +325,7 @@ LockedFile::LockedFile(const QString &filePath, const bool bOwnsFile)
LockedFile::~LockedFile(void)
{
if(m_fileDescriptor >= 0)
{
_close(m_fileDescriptor);
m_fileDescriptor = -1;
}
CLOSE_FILE(m_fileDescriptor);
if(m_bOwnsFile)
{
doRemoveFile(m_filePath);
@ -320,12 +336,10 @@ const QString LockedFile::filePath(void)
{
if (m_fileDescriptor >= 0)
{
const QString path = MUtils::OS::get_file_path(m_fileDescriptor);
if (!path.isEmpty())
if (GetFileType((HANDLE)_get_osfhandle(m_fileDescriptor)) == FILE_TYPE_UNKNOWN)
{
return path;
MUTILS_THROW_FMT("Failed to validate file handle!");
}
MUTILS_THROW_FMT("Failed to determine file path!");
}
return m_filePath;
}