/* * Copyright (C) 2016-2018 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later * See LICENSES/README.md for more information. */ #pragma once #include "threads/CriticalSection.h" #include namespace detail { template class ISubscription { public: virtual void HandleEvent(const Event& event) = 0; virtual void Cancel() = 0; virtual bool IsOwnedBy(void* obj) = 0; virtual ~ISubscription() = default; }; template class CSubscription : public ISubscription { public: typedef void (Owner::*Fn)(const Event&); CSubscription(Owner* owner, Fn fn); void HandleEvent(const Event& event) override; void Cancel() override; bool IsOwnedBy(void *obj) override; private: Owner* m_owner; Fn m_eventHandler; CCriticalSection m_criticalSection; }; template CSubscription::CSubscription(Owner* owner, Fn fn) : m_owner(owner), m_eventHandler(fn) {} template bool CSubscription::IsOwnedBy(void* obj) { std::unique_lock lock(m_criticalSection); return obj != nullptr && obj == m_owner; } template void CSubscription::Cancel() { std::unique_lock lock(m_criticalSection); m_owner = nullptr; } template void CSubscription::HandleEvent(const Event& event) { std::unique_lock lock(m_criticalSection); if (m_owner) (m_owner->*m_eventHandler)(event); } }