diff --git a/Patronum/src/IPService.h b/Patronum/src/IPService.h index 511a7ed..5577bbc 100644 --- a/Patronum/src/IPService.h +++ b/Patronum/src/IPService.h @@ -49,8 +49,9 @@ public: /** * @brief onStart This method invoked when service is started successful. + * @return true if service started successful */ - virtual void onStart() = 0; + virtual bool onStart() = 0; /** * @brief onStop This method invoked when service receive stop command from the terminal. diff --git a/Patronum/src/PController.cpp b/Patronum/src/PController.cpp index bb88d1a..7afd865 100644 --- a/Patronum/src/PController.cpp +++ b/Patronum/src/PController.cpp @@ -94,6 +94,10 @@ bool Controller::sendStop() { if (!d_ptr) return false; + if (!d_ptr->connectToHost(false)) { + return false; + } + return d_ptr->stop(); } diff --git a/Patronum/src/PServiceBase.cpp b/Patronum/src/PServiceBase.cpp index fef9470..52330c4 100644 --- a/Patronum/src/PServiceBase.cpp +++ b/Patronum/src/PServiceBase.cpp @@ -179,17 +179,22 @@ int ServiceBase::exec() { if (fStart || fDaemon) { if (fDaemon) { + if (controller()->sendStop()) { + std::this_thread::sleep_for (std::chrono::milliseconds(500)); + } + if (!d_ptr->startDeamon()) return Patronum::PatronumError::UnsupportedPlatform; return 0; } QTimer::singleShot(0, nullptr, [this]() { - controller()->sendStop(); - std::this_thread::sleep_for (std::chrono::milliseconds(500)); + if (controller()->sendStop()) { + std::this_thread::sleep_for (std::chrono::milliseconds(500)); + } if (!d_ptr->start()) { - QCoreApplication::exit(SocketIsBusy); + QCoreApplication::exit(FailedToStart); } }); diff --git a/Patronum/src/PServiceBase.h b/Patronum/src/PServiceBase.h index 5345049..c437946 100644 --- a/Patronum/src/PServiceBase.h +++ b/Patronum/src/PServiceBase.h @@ -77,7 +77,7 @@ protected: /** * @brief onStart Called when get start command from terminal. Override this method work correctly work of service. */ - void onStart() override = 0; + bool onStart() override = 0; /** * @brief onStop Called when get stop command from terminal. The default implementation of this method invoke a quit method of QCoreApplication. diff --git a/Patronum/src/Patronum_global.cpp b/Patronum/src/Patronum_global.cpp index 1fe7ac1..804be3e 100644 --- a/Patronum/src/Patronum_global.cpp +++ b/Patronum/src/Patronum_global.cpp @@ -29,8 +29,8 @@ QString errorToString(PatronumError error) { case Patronum::PatronumError::TimeOutError: return QObject::tr("Timeout error. service unavailable or not started."); - case Patronum::PatronumError::SocketIsBusy: - return QObject::tr("The Socket file alredy created or application do not have a permision to the /var/tmp location."); + case Patronum::PatronumError::FailedToStart: + return QObject::tr("Failed to start service"); case Patronum::PatronumError::UnsupportedPlatform: return QObject::tr("The service not supportded using platform."); diff --git a/Patronum/src/Private/controllerprivate.cpp b/Patronum/src/Private/controllerprivate.cpp index b0da2ae..7cbe476 100644 --- a/Patronum/src/Private/controllerprivate.cpp +++ b/Patronum/src/Private/controllerprivate.cpp @@ -84,15 +84,18 @@ bool ControllerPrivate::isConnected() const { return _socket->isValid(); } -bool ControllerPrivate::connectToHost() const { +bool ControllerPrivate::connectToHost(bool echo) const { if (isConnected()) { return true; } if (!_socket->connectToTarget()) { - QuasarAppUtils::Params::log("Connect to service fail !", - QuasarAppUtils::Debug); - _controller->handleError(PatronumError::ServiceUnavailable); + + if (echo) { + QuasarAppUtils::Params::log("Connect to service fail !", + QuasarAppUtils::Debug); + _controller->handleError(PatronumError::ServiceUnavailable); + } return false; diff --git a/Patronum/src/Private/controllerprivate.h b/Patronum/src/Private/controllerprivate.h index 9442b1d..9bc6778 100644 --- a/Patronum/src/Private/controllerprivate.h +++ b/Patronum/src/Private/controllerprivate.h @@ -30,7 +30,7 @@ public: QList features() const; bool isConnected() const; - bool connectToHost() const; + bool connectToHost(bool echo = true) const; signals: void sigListFeatures(QList); diff --git a/Patronum/src/Private/serviceprivate.cpp b/Patronum/src/Private/serviceprivate.cpp index c830754..d54ca58 100644 --- a/Patronum/src/Private/serviceprivate.cpp +++ b/Patronum/src/Private/serviceprivate.cpp @@ -120,15 +120,7 @@ bool ServicePrivate::start() { return false; }; - QFile pidFile(PCommon::instance()->getPidfile()); - if (pidFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - pidFile.write(QByteArray::number(QCoreApplication::applicationPid())); - pidFile.close(); - } - - _service->onStart(); - - return true; + return _service->onStart(); } bool ServicePrivate::startDeamon() { @@ -146,12 +138,21 @@ bool ServicePrivate::startDeamon() { proc.setProcessEnvironment(QProcessEnvironment::systemEnvironment()); proc.setProcessChannelMode(QProcess::SeparateChannels); - if (!proc.startDetached()) { + qint64 pid; + if (!proc.startDetached(&pid)) { QuasarAppUtils::Params::log("fail to start detached process: " + proc.errorString(), QuasarAppUtils::Error); return false; } + QFile pidFile(PCommon::instance()->getPidfile()); + if (!pidFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + return false; + } + + pidFile.write(QByteArray::number(pid)); + pidFile.close(); + QuasarAppUtils::Params::log("The service started successful", QuasarAppUtils::Info); return true; diff --git a/Tests/defaultservice.cpp b/Tests/defaultservice.cpp index 34ef097..ae56a33 100644 --- a/Tests/defaultservice.cpp +++ b/Tests/defaultservice.cpp @@ -12,8 +12,9 @@ DefaultService::DefaultService(): setCore(new QCoreApplication(argc, arg)); } -void DefaultService::onStart() { +bool DefaultService::onStart() { QuasarAppUtils::Params::log("Server started!", QuasarAppUtils::Info); + return true; } bool DefaultService::handleReceive(const Patronum::Feature &data) { diff --git a/Tests/defaultservice.h b/Tests/defaultservice.h index 38e6ac7..4dfdf7e 100644 --- a/Tests/defaultservice.h +++ b/Tests/defaultservice.h @@ -10,7 +10,7 @@ public: // QtServiceBase interface protected: - void onStart() override; + bool onStart() override; // IService interface public: