We now have a current svn snapshot of libqxt in our contrib dir, and
[quassel.git] / src / contrib / libqxt-2007-10-24 / src / core / qxtfilelock_win.cpp
diff --git a/src/contrib/libqxt-2007-10-24/src/core/qxtfilelock_win.cpp b/src/contrib/libqxt-2007-10-24/src/core/qxtfilelock_win.cpp
new file mode 100644 (file)
index 0000000..80ea67f
--- /dev/null
@@ -0,0 +1,88 @@
+#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