~aleteoryx/muditaos

1666429e07d466e5600a86dab91a9795bbacafb4 — Alek Rudnik 4 years ago 16142fa
[EGD-7584] Fix OS factory reset

There was an issue that we were deleting files which were still open.
Added removed of FI .indexed file.
M module-services/service-db/ServiceDBCommon.cpp => module-services/service-db/ServiceDBCommon.cpp +3 -0
@@ 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);

M module-services/service-db/agents/settings/SettingsAgent.cpp => module-services/service-db/agents/settings/SettingsAgent.cpp +8 -0
@@ 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 {};

M module-services/service-db/agents/settings/SettingsAgent.hpp => module-services/service-db/agents/settings/SettingsAgent.hpp +1 -0
@@ 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;


M module-services/service-db/include/service-db/DatabaseAgent.hpp => module-services/service-db/include/service-db/DatabaseAgent.hpp +1 -0
@@ 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)
    {

M module-services/service-desktop/ServiceDesktop.cpp => module-services/service-desktop/ServiceDesktop.cpp +2 -2
@@ 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);
}

M module-sys/SystemManager/SystemManagerCommon.cpp => module-sys/SystemManager/SystemManagerCommon.cpp +2 -4
@@ 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);

M products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp => products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp +8 -0
@@ 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

M products/PurePhone/services/service-fileindexer/StartupIndexer.cpp => products/PurePhone/services/service-fileindexer/StartupIndexer.cpp +24 -2
@@ 51,6 51,9 @@ namespace service::detail
    // On timer timeout
    auto StartupIndexer::onTimerTimeout(std::shared_ptr<sys::Service> 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

M products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp => products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp +1 -0
@@ 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;

M products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp => products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp +4 -0
@@ 18,6 18,7 @@ namespace service::detail
        StartupIndexer(const StartupIndexer &) = delete;
        StartupIndexer &operator=(StartupIndexer) = delete;
        auto start(std::shared_ptr<sys::Service> 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<std::string>::const_iterator mTopDirIterator;
        std::filesystem::recursive_directory_iterator mSubDirIterator;
        sys::TimerHandle mIdxTimer;
        bool mStarted{};
        bool mForceStop{};
    };
} // namespace service::detail