diff Framework/Messages/IObservable.h @ 302:4a79193ffb58 am-callable-and-promise

support for custom messages + no leaks in unit-tests
author am@osimis.io
date Tue, 18 Sep 2018 18:04:53 +0200
parents b4abaeb783b1
children b66d13708f40
line wrap: on
line diff
--- a/Framework/Messages/IObservable.h	Tue Sep 18 15:34:28 2018 +0200
+++ b/Framework/Messages/IObservable.h	Tue Sep 18 18:04:53 2018 +0200
@@ -27,13 +27,16 @@
 #include <iostream>
 #include <map>
 
+
 #include "MessageBroker.h"
 #include "MessageType.h"
 #include "ICallable.h"
 #include "IObserver.h"
+#include "MessageForwarder.h"
 
 namespace OrthancStone {
 
+
   class IObservable : public boost::noncopyable
   {
   protected:
@@ -42,6 +45,9 @@
     typedef std::map<int, std::set<ICallable*> >   Callables;
     Callables                         callables_;
 
+    typedef std::set<IMessageForwarder*>      Forwarders;
+    Forwarders                        forwarders_;
+
   public:
 
     IObservable(MessageBroker& broker)
@@ -50,6 +56,7 @@
     }
     virtual ~IObservable()
     {
+      // delete all callables (this will also unregister them from the broker)
       for (Callables::const_iterator it = callables_.begin();
            it != callables_.end(); ++it)
       {
@@ -59,6 +66,13 @@
           delete *it2;
         }
       }
+
+      // unregister the forwarders but don't delete them (they'll be deleted by the observable they are observing as any other callable)
+      for (Forwarders::iterator it = forwarders_.begin();
+           it != forwarders_.end(); ++it)
+      {
+        broker_.Unregister(dynamic_cast<IObserver&>(**it));
+      }
     }
 
     void RegisterObserverCallback(ICallable* callable)
@@ -85,6 +99,11 @@
       }
     }
 
+    void RegisterForwarder(IMessageForwarder* forwarder)
+    {
+      forwarders_.insert(forwarder);
+    }
+
   };
 
 }