]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Allow event providers to know when a listener subs or unsubs.
authorPeter Powell <petpow@saberuk.com>
Sat, 19 Oct 2019 16:26:30 +0000 (17:26 +0100)
committerPeter Powell <petpow@saberuk.com>
Mon, 21 Oct 2019 11:06:37 +0000 (12:06 +0100)
include/event.h

index b00e44e3847cc04b9526703a6345d0f3b5720bdd..806b55309cfd6bbd82392a5fab5d4e5e391f65fa 100644 (file)
@@ -57,7 +57,23 @@ class Events::ModuleEventProvider : public ServiceProvider, private dynamic_refe
         */
        const SubscriberList& GetSubscribers() const { return prov->subscribers; }
 
-       friend class ModuleEventListener;
+       /** Subscribes a listener to this event.
+        * @param subscriber The listener to subscribe.
+        */
+       void Subscribe(ModuleEventListener* subscriber)
+       {
+               subscribers.insert(subscriber);
+               OnSubscribe(subscriber);
+       }
+
+       /** Unsubscribes a listener from this event.
+        * @param subscriber The listener to unsubscribe.
+        */
+       void Unsubscribe(ModuleEventListener* subscriber)
+       {
+               subscribers.erase(subscriber);
+               OnUnsubscribe(subscriber);
+       }
 
  private:
        void OnCapture() CXX11_OVERRIDE
@@ -67,6 +83,16 @@ class Events::ModuleEventProvider : public ServiceProvider, private dynamic_refe
                        subscribers.clear();
        }
 
+       /** Called when a listener subscribes to this event.
+        * @param subscriber The listener which subscribed.
+        */
+       virtual void OnSubscribe(ModuleEventListener* subscriber) { }
+
+       /** Called when a listener unsubscribes from this event.
+        * @param subscriber The listener which unsubscribed.
+        */
+       virtual void OnUnsubscribe(ModuleEventListener* subscriber) { }
+
        /** Reference to the active provider for this event. In case multiple event providers
         * exist for the same event, only one of them contains the list of subscribers.
         * To handle the case when we are not the ones with the list, we get it from the provider
@@ -95,7 +121,7 @@ class Events::ModuleEventListener : private dynamic_reference_base::CaptureHook
         */
        void OnCapture() CXX11_OVERRIDE
        {
-               prov->subscribers.insert(this);
+               prov->Subscribe(this);
        }
 
  public:
@@ -119,7 +145,7 @@ class Events::ModuleEventListener : private dynamic_reference_base::CaptureHook
        ~ModuleEventListener()
        {
                if (prov)
-                       prov->subscribers.erase(this);
+                       prov->Unsubscribe(this);
        }
 
        /** Retrieves the module which created this listener. */