summaryrefslogtreecommitdiffstats
path: root/src/libs/kdtools
diff options
context:
space:
mode:
authorTim Jenssen <tim.jenssen@nokia.com>2012-05-07 14:00:36 +0200
committerTim Jenssen <tim.jenssen@nokia.com>2012-05-07 15:32:29 +0200
commitf1f4d8e043b17d4c5e25bffce53134293d968aed (patch)
treefd300c1affd9bc172b1e3a45b9e50db34c347cf7 /src/libs/kdtools
parent856d3bb01ae91e41770c4e5a1ae74ffcfdfed594 (diff)
add killProcess method
- only implemented under windows where it could be needed for update - even the delete file method moves files to temp which can not be removed, it is much safer to kill the process Change-Id: Ide043657d5f74186da02cb18a87072b18910c964 Reviewed-by: Oliver Wolff <oliver.wolff@nokia.com> Reviewed-by: Karsten Heimrich <karsten.heimrich@nokia.com>
Diffstat (limited to 'src/libs/kdtools')
-rw-r--r--src/libs/kdtools/kdsysinfo.h1
-rw-r--r--src/libs/kdtools/kdsysinfo_mac.cpp8
-rw-r--r--src/libs/kdtools/kdsysinfo_win.cpp39
-rw-r--r--src/libs/kdtools/kdsysinfo_x11.cpp8
4 files changed, 56 insertions, 0 deletions
diff --git a/src/libs/kdtools/kdsysinfo.h b/src/libs/kdtools/kdsysinfo.h
index be1b76fca..bab32979a 100644
--- a/src/libs/kdtools/kdsysinfo.h
+++ b/src/libs/kdtools/kdsysinfo.h
@@ -70,6 +70,7 @@ struct ProcessInfo
quint64 installedMemory();
QList<VolumeInfo> mountedVolumes();
QList<ProcessInfo> runningProcesses();
+bool killProcess(const ProcessInfo &process, int msecs = 30000);
bool pathIsOnLocalDevice(const QString &path);
} // namespace KDUpdater
diff --git a/src/libs/kdtools/kdsysinfo_mac.cpp b/src/libs/kdtools/kdsysinfo_mac.cpp
index 6ec6b6760..e81b88495 100644
--- a/src/libs/kdtools/kdsysinfo_mac.cpp
+++ b/src/libs/kdtools/kdsysinfo_mac.cpp
@@ -138,4 +138,12 @@ bool pathIsOnLocalDevice(const QString &path)
return true;
}
+bool killProcess(const ProcessInfo &process, int msecs)
+{
+ Q_UNUSED(process);
+ Q_UNUSED(msecs);
+
+ return true;
+}
+
} // namespace KDUpdater
diff --git a/src/libs/kdtools/kdsysinfo_win.cpp b/src/libs/kdtools/kdsysinfo_win.cpp
index 92d87d680..3e99e3925 100644
--- a/src/libs/kdtools/kdsysinfo_win.cpp
+++ b/src/libs/kdtools/kdsysinfo_win.cpp
@@ -210,6 +210,45 @@ QList<ProcessInfo> runningProcesses()
return param.processes;
}
+bool CALLBACK TerminateAppEnum(HWND hwnd, LPARAM lParam)
+{
+ DWORD dwID;
+ GetWindowThreadProcessId(hwnd, &dwID);
+
+ if (dwID == (DWORD)lParam)
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+
+ return true;
+}
+
+bool killProcess(const ProcessInfo &process, int msecs)
+{
+ DWORD dwTimeout = msecs;
+ if (msecs == -1)
+ dwTimeout = INFINITE;
+
+ // If we can't open the process with PROCESS_TERMINATE rights,
+ // then we give up immediately.
+ HANDLE hProc = OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE, FALSE, process.id);
+
+ if (hProc == 0)
+ return false;
+
+ // TerminateAppEnum() posts WM_CLOSE to all windows whose PID
+ // matches your process's.
+ EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)process.id);
+
+ // Wait on the handle. If it signals, great. If it times out,
+ // then you kill it.
+ bool returnValue = false;
+ if (WaitForSingleObject(hProc, dwTimeout) != WAIT_OBJECT_0)
+ returnValue = TerminateProcess(hProc, 0);
+
+ CloseHandle(hProc) ;
+
+ return returnValue;
+}
+
// REPARSE_DATA_BUFFER structure from msdn help: http://msdn.microsoft.com/en-us/library/ff552012.aspx
typedef struct _REPARSE_DATA_BUFFER {
ULONG ReparseTag;
diff --git a/src/libs/kdtools/kdsysinfo_x11.cpp b/src/libs/kdtools/kdsysinfo_x11.cpp
index 1a93afb15..5a816dc18 100644
--- a/src/libs/kdtools/kdsysinfo_x11.cpp
+++ b/src/libs/kdtools/kdsysinfo_x11.cpp
@@ -122,4 +122,12 @@ bool pathIsOnLocalDevice(const QString &path)
return true;
}
+bool killProcess(const ProcessInfo &process, int msecs)
+{
+ Q_UNUSED(process);
+ Q_UNUSED(msecs);
+
+ return true;
+}
+
} // namespace KDUpdater