diff options
| -rw-r--r-- | rbutil/rbutilqt/base/utils.cpp | 54 | ||||
| -rw-r--r-- | rbutil/rbutilqt/base/utils.h | 2 |
2 files changed, 34 insertions, 22 deletions
diff --git a/rbutil/rbutilqt/base/utils.cpp b/rbutil/rbutilqt/base/utils.cpp index 6bd9e23..f58d8c3 100644 --- a/rbutil/rbutilqt/base/utils.cpp +++ b/rbutil/rbutilqt/base/utils.cpp @@ -670,13 +670,13 @@ QStringList Utils::mountpoints(enum MountpointsFilter type) /** Check if a process with a given name is running - * @param names list of names to check - * @return list of detected processes. + * @param names list of names to filter on. All processes if empty list. + * @return list of processname, process ID pairs. */ -QStringList Utils::findRunningProcess(QStringList names) +QMap<QString, QList<int> > Utils::findRunningProcess(QStringList names) { - QStringList processlist; - QStringList found; + QMap<QString, QList<int> > processlist; + QMap<QString, QList<int> > found; #if defined(Q_OS_WIN32) HANDLE hdl; PROCESSENTRY32 entry; @@ -694,14 +694,16 @@ QStringList Utils::findRunningProcess(QStringList names) return found; } - processlist.append(QString::fromWCharArray(entry.szExeFile)); do { + int pid = entry.th32ProcessID; // FIXME: DWORD vs int! + QString name = QString::fromWCharArray(entry.szExeFile); + if(processlist.find(name) == processlist.end()) { + processlist.insert(name, QList<int>()); + } + processlist[name].append(pid); entry.dwSize = sizeof(PROCESSENTRY32); entry.szExeFile[0] = '\0'; result = Process32Next(hdl, &entry); - if(result) { - processlist.append(QString::fromWCharArray(entry.szExeFile)); - } } while(result); CloseHandle(hdl); #endif @@ -726,28 +728,38 @@ QStringList Utils::findRunningProcess(QStringList names) if(isprint(buf[i])) break; } // avoid adding duplicates. - QString process = QString::fromUtf8(&buf[i]); - if(!processlist.contains(process)) { - processlist.append(process); + QString name = QString::fromUtf8(&buf[i]); + if(processlist.find(name) == processlist.end()) { + processlist.insert(name, QList<int>()); } - + processlist[name].append(pid); } } } while(err == noErr); #endif - // check for given names in list of processes - for(int i = 0; i < names.size(); ++i) { +#if defined(Q_OS_LINUX) + // not implemented for Linux! +#endif + // Filter for names (unless empty) + if(names.size() > 0) { + for(int i = 0; i < names.size(); ++i) { + QStringList k(processlist.keys()); #if defined(Q_OS_WIN32) - // the process name might be truncated. Allow the extension to be partial. - int index = processlist.indexOf(QRegExp(names.at(i) + "(\\.(e(x(e?)?)?)?)?")); + // the process name might be truncated. Allow the extension to be partial. + int index = k.indexOf(QRegExp(names.at(i) + "(\\.(e(x(e?)?)?)?)?", + Qt::CaseInsensitive)); #else - int index = processlist.indexOf(names.at(i)); + int index = k.indexOf(names.at(i)); #endif - if(index != -1) { - found.append(processlist.at(index)); + if(index != -1) { + found.insert(k[index], processlist[k[index]]); + } } } - LOG_INFO() << "Found listed processes running:" << found; + else { + found = processlist; + } + LOG_INFO() << "Looking for processes" << names << "found" << found; return found; } diff --git a/rbutil/rbutilqt/base/utils.h b/rbutil/rbutilqt/base/utils.h index bc45ebd..7dfd797 100644 --- a/rbutil/rbutilqt/base/utils.h +++ b/rbutil/rbutilqt/base/utils.h @@ -54,7 +54,7 @@ public: static QStringList mountpoints(enum MountpointsFilter type = MountpointsAll); static QString resolveDevicename(QString path); static QString resolveMountPoint(QString device); - static QStringList findRunningProcess(QStringList names); + static QMap<QString, QList<int> > findRunningProcess(QStringList names); static bool ejectDevice(QString device); }; |