--- /dev/null
+#include "qxtfilelock.h"
+#include "qxtfilelock_p.h"
+#include <windows.h>
+#include <io.h>
+
+#if 1
+
+bool QxtFileLock::unlock()
+{
+ if (file() && file()->isOpen() && isActive())
+ {
+ HANDLE w32FileHandle;
+ OVERLAPPED ov1;
+ DWORD dwflags;
+
+ w32FileHandle = (HANDLE)_get_osfhandle(file()->handle());
+ if (w32FileHandle == INVALID_HANDLE_VALUE)
+ return false;
+
+ memset(&ov1,0, sizeof(ov1));
+ ov1.Offset = qxt_d().offset;
+
+ if (UnlockFileEx(w32FileHandle, 0, qxt_d().length, 0, &ov1))
+ {
+ qxt_d().isLocked = false;
+ return true;
+ }
+ }
+ return false;
+}
+
+bool QxtFileLock::lock ()
+{
+ if (file() && file()->isOpen() && !isActive())
+ {
+ HANDLE w32FileHandle;
+ OVERLAPPED ov1;
+ DWORD dwflags;
+
+ w32FileHandle = (HANDLE)_get_osfhandle(file()->handle());
+ if (w32FileHandle == INVALID_HANDLE_VALUE)
+ return false;
+
+ switch (qxt_d().mode)
+ {
+ case ReadLock:
+ dwflags = LOCKFILE_FAIL_IMMEDIATELY;
+ break;
+
+ case ReadLockWait:
+ dwflags = 0;
+ break;
+
+ case WriteLock:
+ dwflags = LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY;
+ break;
+
+ case WriteLockWait:
+ dwflags = LOCKFILE_EXCLUSIVE_LOCK;
+ break;
+
+ default:
+ return (false);
+ }
+
+ memset(&ov1, 0, sizeof(ov1));
+ ov1.Offset = qxt_d().offset;
+
+ if (LockFileEx(w32FileHandle,dwflags, 0, qxt_d().length, 0, &ov1))
+ {
+ qxt_d().isLocked = true;
+ return true;
+ }
+ }
+ return false;
+}
+
+#else
+bool QxtFileLock::unlock()
+{
+ return false;
+}
+
+bool QxtFileLock::lock ()
+{
+ return false;
+}
+#endif