/* Copyright (C) 2019 * * This file is part of the osdev components suite * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2, or (at your option) any * later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #include "serverstate.h" using namespace osdev::components::mqtt; const std::string ServerState::s_identifier("ServerState"); std::atomic ServerState::s_nextServerStateCallbackHandle(1); ServerState::ServerState(const IStateCallback* stateCallbackIf) : sig_serverStateChanged() , m_stateCallbackIf(stateCallbackIf) , m_serverStateCallbackMap() , m_state(StateEnum::Unknown) { } ServerState::~ServerState() { try { this->clearAllStateChangeCallbacks(); } catch (...) { } } StateChangeCallbackHandle ServerState::registerStateChangeCallback(const IStateCallback::SlotStateChange& cb) { const auto handle = s_nextServerStateCallbackHandle++; m_serverStateCallbackMap.emplace(std::piecewise_construct, std::make_tuple(handle), std::make_tuple(sig_serverStateChanged.connect(cb))); return handle; } void ServerState::unregisterStateChangeCallback(StateChangeCallbackHandle handle) { m_serverStateCallbackMap.erase(handle); } void ServerState::clearAllStateChangeCallbacks() { this->emitStateChanged(StateEnum::Unregister); m_serverStateCallbackMap.clear(); } void ServerState::emitStateChanged(StateEnum newState) { m_state = newState; ///< store state, to allow clients to retrieve the last received state. if (nullptr != m_stateCallbackIf) { sig_serverStateChanged(m_stateCallbackIf, newState); } } StateEnum ServerState::state() const { return m_state; } std::string ServerState::stateCallbackClientId() const { static const std::string nullId = "null"; return (nullptr == m_stateCallbackIf) ? nullId : m_stateCallbackIf->clientId(); }