diff --git a/module-services/service-db/ServiceDBCommon.cpp b/module-services/service-db/ServiceDBCommon.cpp index c5cb3605d..16b5e3bac 100644 --- a/module-services/service-db/ServiceDBCommon.cpp +++ b/module-services/service-db/ServiceDBCommon.cpp @@ -67,6 +67,9 @@ sys::ReturnCodes ServiceDBCommon::DeinitHandler() void ServiceDBCommon::ProcessCloseReason(sys::CloseReason closeReason) { if (closeReason == sys::CloseReason::FactoryReset) { + for (auto &dbAgent : databaseAgents) { + dbAgent->unRegisterMessages(); + } factoryReset(); } sendCloseReadyMessage(this); diff --git a/module-services/service-db/agents/settings/SettingsAgent.cpp b/module-services/service-db/agents/settings/SettingsAgent.cpp index e96f9a351..add52011f 100644 --- a/module-services/service-db/agents/settings/SettingsAgent.cpp +++ b/module-services/service-db/agents/settings/SettingsAgent.cpp @@ -67,6 +67,14 @@ void SettingsAgent::registerMessages() std::bind(&SettingsAgent::handleUnregisterOnVariableChange, this, _1)); } +void SettingsAgent::unRegisterMessages() +{ + parentService->disconnect(typeid(settings::Messages::GetVariable)); + parentService->disconnect(typeid(settings::Messages::SetVariable)); + parentService->disconnect(typeid(settings::Messages::RegisterOnVariableChange)); + parentService->disconnect(typeid(settings::Messages::UnregisterOnVariableChange)); +} + auto SettingsAgent::getDbInitString() -> const std::string { return {}; diff --git a/module-services/service-db/agents/settings/SettingsAgent.hpp b/module-services/service-db/agents/settings/SettingsAgent.hpp index 28926735c..b4eb321fc 100644 --- a/module-services/service-db/agents/settings/SettingsAgent.hpp +++ b/module-services/service-db/agents/settings/SettingsAgent.hpp @@ -32,6 +32,7 @@ class SettingsAgent : public DatabaseAgent void initDb() override; void deinitDb() override; void registerMessages() override; + void unRegisterMessages() override; auto getAgentName() -> const std::string override; auto getDbFilePath() -> const std::string override; diff --git a/module-services/service-db/include/service-db/DatabaseAgent.hpp b/module-services/service-db/include/service-db/DatabaseAgent.hpp index 6e9c5c3d7..416f30ce9 100644 --- a/module-services/service-db/include/service-db/DatabaseAgent.hpp +++ b/module-services/service-db/include/service-db/DatabaseAgent.hpp @@ -24,6 +24,7 @@ class DatabaseAgent virtual void initDb() = 0; virtual void deinitDb() = 0; virtual void registerMessages() = 0; + virtual void unRegisterMessages() = 0; [[nodiscard]] virtual auto getAgentName() -> const std::string = 0; bool storeIntoFile(const std::filesystem::path &file) { diff --git a/module-services/service-desktop/ServiceDesktop.cpp b/module-services/service-desktop/ServiceDesktop.cpp index 70bb927be..56e646f3e 100644 --- a/module-services/service-desktop/ServiceDesktop.cpp +++ b/module-services/service-desktop/ServiceDesktop.cpp @@ -224,7 +224,7 @@ sys::ReturnCodes ServiceDesktop::InitHandler() sys::ReturnCodes ServiceDesktop::DeinitHandler() { - LOG_ERROR(".. deinit .."); + LOG_DEBUG(".. deinit .."); if (initialized) { settings->deinit(); desktopWorker->deinit(); @@ -234,7 +234,7 @@ sys::ReturnCodes ServiceDesktop::DeinitHandler() void ServiceDesktop::ProcessCloseReason(sys::CloseReason closeReason) { - LOG_ERROR(".. close with reason .."); + LOG_DEBUG(".. close with reason .."); DeinitHandler(); sendCloseReadyMessage(this); } diff --git a/module-sys/SystemManager/SystemManagerCommon.cpp b/module-sys/SystemManager/SystemManagerCommon.cpp index f63f0c26c..b7ff7598c 100644 --- a/module-sys/SystemManager/SystemManagerCommon.cpp +++ b/module-sys/SystemManager/SystemManagerCommon.cpp @@ -147,12 +147,10 @@ namespace sys LOG_INFO(" ---> REBOOT <--- "); powerManager->Reboot(); break; - case State::ShutdownReady: { + case State::ShutdownReady: LOG_INFO(" ---> SHUTDOWN <--- "); powerManager->PowerOff(); - } - - break; + break; case State::RebootToUpdate: LOG_INFO(" ---> REBOOT TO UPDATER <--- "); powerManager->RebootToUpdate(updateReason); diff --git a/products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp b/products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp index 71d099583..2a195af57 100644 --- a/products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp +++ b/products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp @@ -53,4 +53,12 @@ namespace service LOG_DEBUG("Switch to power Mode %s", c_str(mode)); return sys::ReturnCodes::Success; } + + void ServiceFileIndexer::ProcessCloseReason(sys::CloseReason closeReason) + { + if (closeReason == sys::CloseReason::FactoryReset) { + mStartupIndexer.reset(); + } + sendCloseReadyMessage(this); + } } // namespace service diff --git a/products/PurePhone/services/service-fileindexer/StartupIndexer.cpp b/products/PurePhone/services/service-fileindexer/StartupIndexer.cpp index a7fec3e06..1fd567797 100644 --- a/products/PurePhone/services/service-fileindexer/StartupIndexer.cpp +++ b/products/PurePhone/services/service-fileindexer/StartupIndexer.cpp @@ -51,6 +51,9 @@ namespace service::detail // On timer timeout auto StartupIndexer::onTimerTimeout(std::shared_ptr svc) -> void { + if (mForceStop) { + return; + } if (!mStarted) { mIdxTimer.restart(std::chrono::milliseconds{timer_indexing_delay}); mStarted = true; @@ -89,23 +92,42 @@ namespace service::detail LOG_INFO("Initial startup indexer - Started..."); mTopDirIterator = std::begin(start_dirs); setupTimers(svc, svc_name); + mForceStop = false; } else { LOG_INFO("Initial startup indexer - Not needed..."); } } - // Create lock file + void StartupIndexer::reset() + { + mForceStop = true; + mIdxTimer.stop(); + removeLockFile(); + } + auto StartupIndexer::createLockFile() -> bool { std::ofstream ofs(lock_file_name); ofs << time(nullptr); return ofs.good(); } - // Check if lock file exists + auto StartupIndexer::hasLockFile() -> bool { std::error_code ec; return fs::is_regular_file(lock_file_name, ec); } + + auto StartupIndexer::removeLockFile() -> bool + { + if (hasLockFile()) { + std::error_code ec; + if (!remove(lock_file_name, ec)) { + LOG_ERROR("Failed to remove lock file, error: %d", ec.value()); + return false; + } + } + return true; + } } // namespace service::detail diff --git a/products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp b/products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp index 875b5eab1..bdde92b61 100644 --- a/products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp +++ b/products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp @@ -23,6 +23,7 @@ namespace service sys::ReturnCodes InitHandler() override; sys::ReturnCodes DeinitHandler() override; sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override; + void ProcessCloseReason(sys::CloseReason closeReason) override; private: detail::InotifyHandler mInotifyHandler; diff --git a/products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp b/products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp index 4338d7e66..79d9e74bb 100644 --- a/products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp +++ b/products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp @@ -18,6 +18,7 @@ namespace service::detail StartupIndexer(const StartupIndexer &) = delete; StartupIndexer &operator=(StartupIndexer) = delete; auto start(std::shared_ptr svc, std::string_view svc_name) -> void; + void reset(); private: // Process single entry @@ -31,11 +32,14 @@ namespace service::detail static auto createLockFile() -> bool; // Check if lock file exists static auto hasLockFile() -> bool; + // remove lock file exists + static auto removeLockFile() -> bool; private: std::vector::const_iterator mTopDirIterator; std::filesystem::recursive_directory_iterator mSubDirIterator; sys::TimerHandle mIdxTimer; bool mStarted{}; + bool mForceStop{}; }; } // namespace service::detail