80ea67fd14bf77d24d389f407dc3f16cde53570f
[quassel.git] / src / contrib / libqxt-2007-10-24 / src / core / qxtfilelock_win.cpp
1 #include "qxtfilelock.h"
2 #include "qxtfilelock_p.h"
3 #include <windows.h>
4 #include <io.h>
5
6 #if 1
7
8 bool QxtFileLock::unlock()
9 {
10     if (file() && file()->isOpen() && isActive())
11     {
12         HANDLE w32FileHandle;
13         OVERLAPPED ov1;
14         DWORD dwflags;
15
16         w32FileHandle = (HANDLE)_get_osfhandle(file()->handle());
17         if (w32FileHandle == INVALID_HANDLE_VALUE)
18             return false;
19
20         memset(&ov1,0, sizeof(ov1));
21         ov1.Offset =  qxt_d().offset;
22
23         if (UnlockFileEx(w32FileHandle, 0, qxt_d().length, 0, &ov1))
24         {
25             qxt_d().isLocked = false;
26             return true;
27         }
28     }
29     return false;
30 }
31
32 bool QxtFileLock::lock ()
33 {
34     if (file() && file()->isOpen() && !isActive())
35     {
36         HANDLE w32FileHandle;
37         OVERLAPPED ov1;
38         DWORD dwflags;
39
40         w32FileHandle = (HANDLE)_get_osfhandle(file()->handle());
41         if (w32FileHandle == INVALID_HANDLE_VALUE)
42             return false;
43
44         switch (qxt_d().mode)
45         {
46         case    ReadLock:
47             dwflags = LOCKFILE_FAIL_IMMEDIATELY;
48             break;
49
50         case    ReadLockWait:
51             dwflags = 0;
52             break;
53
54         case    WriteLock:
55             dwflags = LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY;
56             break;
57
58         case    WriteLockWait:
59             dwflags = LOCKFILE_EXCLUSIVE_LOCK;
60             break;
61
62         default:
63             return (false);
64         }
65
66         memset(&ov1, 0, sizeof(ov1));
67         ov1.Offset =  qxt_d().offset;
68
69         if (LockFileEx(w32FileHandle,dwflags, 0,  qxt_d().length, 0, &ov1))
70         {
71             qxt_d().isLocked = true;
72             return true;
73         }
74     }
75     return false;
76 }
77
78 #else
79 bool QxtFileLock::unlock()
80 {
81     return false;
82 }
83
84 bool QxtFileLock::lock ()
85 {
86     return false;
87 }
88 #endif