#define VER_LAMEXP_MINOR_HI 1
#define VER_LAMEXP_MINOR_LO 3
#define VER_LAMEXP_TYPE RC
-#define VER_LAMEXP_PATCH 3
-#define VER_LAMEXP_BUILD 1834
+#define VER_LAMEXP_PATCH 4
+#define VER_LAMEXP_BUILD 1840
#define VER_LAMEXP_CONFG 1818
///////////////////////////////////////////////////////////////////////////////
QByteArray FileHash::computeHash(QFile &file)
{
- QByteArray hash = QByteArray::fromHex(g_blnk);
+ QByteArray hash = QByteArray::fromHex(g_blnk).toHex();
if(file.isOpen() && file.reset())
{
MUtils::Hash::Keccak keccak;
-
const QByteArray data = file.readAll();
- const QByteArray seed = QByteArray::fromHex(g_seed);
- const QByteArray salt = QByteArray::fromHex(g_salt);
-
- if(keccak.init(MUtils::Hash::Keccak::hb384))
+ if (data.size() >= 16)
{
- bool ok = true;
- ok = ok && keccak.addData(seed);
- ok = ok && keccak.addData(data);
- ok = ok && keccak.addData(salt);
- if(ok)
+ const QByteArray seed = QByteArray::fromHex(g_seed);
+ const QByteArray salt = QByteArray::fromHex(g_salt);
+ if (keccak.init(MUtils::Hash::Keccak::hb384))
{
- const QByteArray digest = keccak.finalize();
- if(!digest.isEmpty()) hash = digest.toHex();
+ bool ok = true;
+ ok = ok && keccak.addData(seed);
+ ok = ok && keccak.addData(data);
+ ok = ok && keccak.addData(salt);
+ if (ok)
+ {
+ const QByteArray digest = keccak.finalize();
+ if (!digest.isEmpty()) hash = digest.toHex();
+ }
}
}
}
static __forceinline void doLockFile(HANDLE &fileHandle, const QString &filePath, QFile *const outFile)
{
+ bool success = false;
+ fileHandle = INVALID_HANDLE_VALUE;
+
+ //Try to open the file!
for(int i = 0; i < 64; i++)
{
- fileHandle = CreateFileW(MUTILS_WCHR(QDir::toNativeSeparators(filePath)), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
- if(VALID_HANDLE(fileHandle))
+ const HANDLE hTemp = CreateFileW(MUTILS_WCHR(QDir::toNativeSeparators(filePath)), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
+ if(VALID_HANDLE(hTemp))
{
- break;
+ fileHandle = hTemp;
+ break; /*file opened successfully*/
}
if(i == 0)
{
- qWarning("Failed to lock file on first attemp, retrying...");
+ qWarning("Failed to open file on first attemp, retrying...");
}
- Sleep(25);
+ Sleep(1);
}
+ //Now try to actually lock the file!
+ if (VALID_HANDLE(fileHandle))
+ {
+ for (int i = 0; i < 64; i++)
+ {
+ LARGE_INTEGER fileSize;
+ if (GetFileSizeEx(fileHandle, &fileSize))
+ {
+ OVERLAPPED overlapped = { 0U, 0U, 0U, 0U, 0U };
+ if (LockFileEx(fileHandle, LOCKFILE_FAIL_IMMEDIATELY, 0, fileSize.LowPart, fileSize.HighPart, &overlapped))
+ {
+ success = true;
+ break; /*file locked successfully*/
+ }
+ Sleep(1);
+ }
+ if (i == 0)
+ {
+ qWarning("Failed to lock file on first attemp, retrying...");
+ }
+ }
+ }
+
//Locked successfully?
- if(!VALID_HANDLE(fileHandle))
+ if(!success)
{
+ CLOSE_HANDLE(fileHandle);
if(outFile)
{
QFile::remove(QFileInfo(*outFile).canonicalFilePath());
}
//Opened successfully
- if(!checkFile.isOpen())
+ if((!checkFile.isOpen()) || checkFile.peek(1).isEmpty())
{
QFile::remove(filePath);
MUTILS_THROW_FMT("File '%s' could not be read!", MUTILS_UTF8(QFileInfo(filePath).fileName()));
}
}
-const QString &LockedFile::filePath()
+const QString LockedFile::filePath(void)
{
+ if (m_fileDescriptor >= 0)
+ {
+ const QString path = MUtils::OS::get_file_path(m_fileDescriptor);
+ if (!path.isEmpty())
+ {
+ return path;
+ }
+ MUTILS_THROW_FMT("Failed to determine file path!");
+ }
return m_filePath;
}