Skip to content

src/watcher/messaging_watcher.cpp

Namespaces

Name
sgns
sgns::watcher

Source code

#include "messaging_watcher.hpp"
#include <boost/thread.hpp>
#include <iostream>

namespace sgns::watcher {

    // Static vector to hold all watcher instances
    std::vector<std::shared_ptr<MessagingWatcher>> MessagingWatcher::m_watchers;

    MessagingWatcher::MessagingWatcher(MessageCallback callback)
        : messageCallback(std::move(callback)), running(false) {
    }

    void MessagingWatcher::startWatching() {
        std::lock_guard<std::mutex> lock(running_mutex);
        if (running) return;

        running = true;
        watcherThread = boost::thread(&MessagingWatcher::watch, this);
    }

    void MessagingWatcher::stopWatching() {
        {
            std::lock_guard<std::mutex> lock(running_mutex);
            running = false;
        }

        if (watcherThread.joinable()) {
            watcherThread.join();
        }
    }

    void MessagingWatcher::addWatcher(const std::shared_ptr<MessagingWatcher> &newWatcher) {
        m_watchers.push_back(newWatcher);
    }

    void MessagingWatcher::startAll() {
        for (const auto &watcher : m_watchers) {
            watcher->startWatching();
        }
    }

    void MessagingWatcher::stopAll() {
        for (const auto &watcher : m_watchers) {
            watcher->stopWatching();
        }
    }

    void MessagingWatcher::watch() {
        while (running) {
            // Placeholder: This function should be implemented by derived classes
            // Here, it will simply sleep for 1 second, but derived classes should provide a real implementation.
            boost::this_thread::sleep_for(boost::chrono::seconds(1));
        }
    }

    bool MessagingWatcher::isRunning() const {
        std::lock_guard<std::mutex> const lock(running_mutex);
        return running;
    }


}  // namespace sgns::watcher

Updated on 2026-03-04 at 13:10:45 -0800