KDECore
klockfile_win.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "klockfile.h"
00021 #include "kcomponentdata.h"
00022 #include "kdebug.h"
00023
00024 #include <windows.h>
00025
00031 class KLockFile::Private
00032 {
00033 public:
00034 Private(const KComponentData &c)
00035 : componentData(c)
00036 {
00037 }
00038
00039 QString file;
00040 bool isLocked;
00041 int staleTime;
00042 KComponentData componentData;
00043 HANDLE h;
00044 };
00045
00046 KLockFile::KLockFile(const QString &file, const KComponentData &componentData)
00047 : d(new Private(componentData))
00048 {
00049 d->file = file;
00050 d->isLocked = false;
00051 d->staleTime = 0;
00052 }
00053
00054 KLockFile::~KLockFile()
00055 {
00056 unlock();
00057 delete d;
00058 }
00059
00060 int
00061 KLockFile::staleTime() const
00062 {
00063 return d->staleTime;
00064 }
00065
00066
00067 void
00068 KLockFile::setStaleTime(int _staleTime)
00069 {
00070 d->staleTime = _staleTime;
00071 }
00072
00073 KLockFile::LockResult
00074 KLockFile::lock(LockFlags options)
00075 {
00076 if (d->isLocked)
00077 return LockOK;
00078
00079 LockResult result;
00080
00081 d->h = CreateFileW(
00082 (WCHAR *)d->file.utf16(),
00083 GENERIC_READ | GENERIC_WRITE,
00084 0,
00085 0,
00086 CREATE_ALWAYS,
00087 FILE_ATTRIBUTE_NORMAL,
00088 0
00089 );
00090 if (!d->h)
00091 result = LockError;
00092
00093 else if (GetLastError() == NO_ERROR)
00094 {
00095
00096 result = LockOK;
00097 }
00098 else if (GetLastError() == ERROR_ALREADY_EXISTS)
00099 {
00100
00101
00102
00103 result = LockOK;
00104 }
00105 else if (GetLastError() == ERROR_SHARING_VIOLATION)
00106 {
00107 CloseHandle(d->h);
00108 d->h = 0;
00109
00110 result = LockFail;
00111 }
00112 else {
00113
00114 result = LockError;
00115 }
00116
00117 if (result == LockOK)
00118 d->isLocked = true;
00119 return result;
00120 }
00121
00122 bool
00123 KLockFile::isLocked() const
00124 {
00125 return d->isLocked;
00126 }
00127
00128 void
00129 KLockFile::unlock()
00130 {
00131 if (d->isLocked)
00132 {
00133
00134 CloseHandle(d->h);
00135 DeleteFileW((WCHAR *)d->file.utf16());
00136 d->h = 0;
00137 d->isLocked = false;
00138 }
00139 }
00140
00141 bool
00142 KLockFile::getLockInfo(int &pid, QString &hostname, QString &appname)
00143 {
00144 return false;
00145 }