/* * Copyright (C) 2005-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 "AddonClass.h" namespace XBMCAddon { /** *

This is the parent class for the class templates that hold * a callback. A callback is essentially a templatized * functor (functoid?) for a call to a member function.

* *

This class combined with the attending CallbackHandlers should make * sure that the AddonClass isn't in the midst of deallocating when * the callback executes. In this way the Callback class acts as * a weak reference.

*/ class Callback : public AddonClass { protected: AddonClass* addonClassObject; explicit Callback(AddonClass* _object) : addonClassObject(_object) { XBMC_TRACE; } public: virtual void executeCallback() = 0; ~Callback() override; AddonClass* getObject() { XBMC_TRACE; return addonClassObject; } }; struct cb_null_type {}; // stub type template to be partial specialized template class CallbackFunction {}; /** * This is the template to carry a callback to a member function * that returns 'void' (has no return) and takes no parameters. */ template class CallbackFunction : public Callback { public: typedef void (M::*MemberFunction)(); protected: MemberFunction meth; M* obj; public: CallbackFunction(M* object, MemberFunction method) : Callback(object), meth(method), obj(object) { XBMC_TRACE; } ~CallbackFunction() override { XBMC_TRACE; deallocating(); } void executeCallback() override { XBMC_TRACE; ((*obj).*(meth))(); } }; /** * This is the template to carry a callback to a member function * that returns 'void' (has no return) and takes one parameter. */ template class CallbackFunction : public Callback { public: typedef void (M::*MemberFunction)(P1); protected: MemberFunction meth; M* obj; P1 param; public: CallbackFunction(M* object, MemberFunction method, P1 parameter) : Callback(object), meth(method), obj(object), param(parameter) { XBMC_TRACE; } ~CallbackFunction() override { XBMC_TRACE; deallocating(); } void executeCallback() override { XBMC_TRACE; ((*obj).*(meth))(param); } }; /** * This is the template to carry a callback to a member function * that returns 'void' (has no return) and takes one parameter * that can be held in an AddonClass::Ref */ template class CallbackFunction, cb_null_type, cb_null_type, cb_null_type, cb_null_type> : public Callback { public: typedef void (M::*MemberFunction)(P1*); protected: MemberFunction meth; M* obj; AddonClass::Ref param; public: CallbackFunction(M* object, MemberFunction method, P1* parameter) : Callback(object), meth(method), obj(object), param(parameter) { XBMC_TRACE; } ~CallbackFunction() override { XBMC_TRACE; deallocating(); } void executeCallback() override { XBMC_TRACE; ((*obj).*(meth))(param); } }; /** * This is the template to carry a callback to a member function * that returns 'void' (has no return) and takes two parameters. */ template class CallbackFunction : public Callback { public: typedef void (M::*MemberFunction)(P1,P2); protected: MemberFunction meth; M* obj; P1 param1; P2 param2; public: CallbackFunction(M* object, MemberFunction method, P1 parameter, P2 parameter2) : Callback(object), meth(method), obj(object), param1(parameter), param2(parameter2) { XBMC_TRACE; } ~CallbackFunction() override { XBMC_TRACE; deallocating(); } void executeCallback() override { XBMC_TRACE; ((*obj).*(meth))(param1,param2); } }; /** * This is the template to carry a callback to a member function * that returns 'void' (has no return) and takes three parameters. */ template class CallbackFunction : public Callback { public: typedef void (M::*MemberFunction)(P1,P2,P3); protected: MemberFunction meth; M* obj; P1 param1; P2 param2; P3 param3; public: CallbackFunction(M* object, MemberFunction method, P1 parameter, P2 parameter2, P3 parameter3) : Callback(object), meth(method), obj(object), param1(parameter), param2(parameter2), param3(parameter3) { XBMC_TRACE; } ~CallbackFunction() override { XBMC_TRACE; deallocating(); } void executeCallback() override { XBMC_TRACE; ((*obj).*(meth))(param1,param2,param3); } }; }