/** * The Service class holds information about a single service, which was read from a xxx_service.xml file. * $Id$ * $HeadURL$ * $Author$ * Created by Hannes Baeuerle, SLSE, 2016-02-15 */ #include "service.h" #include #include "service_process.h" int ServiceManagement::Service::idCounter = 0; ServiceManagement::Service::Service(const QString &name, const QString &exe, const QString &dir, const QString &abbr, const QStringList &groups, bool isInDevMode, const int prio) : QObject() , m_name(name) , m_executable(exe) , m_directory(dir) , m_abbreviation(abbr) , m_groups(groups) , m_isInDevMode(isInDevMode) , m_id(idCounter ++) , m_licenceDonator(nullptr) , m_prio(prio) , m_logger(getLogger("Service")) {} int ServiceManagement::Service::id() const { return m_id; } const QString &ServiceManagement::Service::name() const { return m_name; } const int &ServiceManagement::Service::prio() const { return m_prio; } const QString &ServiceManagement::Service::abbreviation() const { return m_abbreviation; } const QStringList &ServiceManagement::Service::groups() const { return m_groups; } bool ServiceManagement::Service::devMode() const { return m_isInDevMode; } std::shared_ptr ServiceManagement::Service::licenceDonator() { return m_licenceDonator; } ServiceManagement::ServiceProcess *ServiceManagement::Service::toServiceProcess(const GroupRequest &groupData) { ServiceProcess *result = new ServiceProcess(groupData, this); result->setProgram(m_directory + QLatin1Char('/') + m_executable); result->setWorkingDirectory(m_directory); connect(result, &ServiceProcess::newServiceInformation, this, &Service::newServiceInfo); connect(result, &ServiceProcess::destroyed, this, &Service::onServiceProcessDestroyed); m_procs.append(result); return result; } ServiceManagement::ServiceProcess *ServiceManagement::Service::procFromPid(qint64 pid) { for (ServiceProcess *currentProc : qAsConst(m_procs)) { if (currentProc->usablePid() == pid) return currentProc; } return nullptr; } ServiceManagement::ServiceProcess *ServiceManagement::Service::procFromServiceProcId(int32_t id) { for (ServiceProcess *currentProc : qAsConst(m_procs)) { if (currentProc->serviceProcessId() == id) return currentProc; } return nullptr; } void ServiceManagement::Service::stopAllProcs() { for (ServiceProcess *currentProc : qAsConst(m_procs)) currentProc->terminate(); } void ServiceManagement::Service::waitForStopped() { for (ServiceProcess *currentProc : qAsConst(m_procs)) currentProc->waitForFinished(5000); } void ServiceManagement::Service::onServiceProcessDestroyed(QObject *obj) { DEBUG_LOG(m_logger) << "onServiceProcessDestroyed: " << obj; ServiceProcess *sp = static_cast(obj); for (int i = 0; i < m_procs.size(); ++i) { if (m_procs.at(i) == sp) { DEBUG_LOG(m_logger) << "Found... - removing"; m_procs.remove(i); break; } } } const QVector &ServiceManagement::Service::allProcs() const { return m_procs; }