diff Framework/Messages/IObservable.h @ 299:3897f9f28cfa am-callable-and-promise

backup work in progress: updated messaging framework with ICallable
author am@osimis.io
date Fri, 14 Sep 2018 16:44:01 +0200
parents 5bd4161bf11b
children b4abaeb783b1
line wrap: on
line diff
--- a/Framework/Messages/IObservable.h	Mon Sep 10 12:22:26 2018 +0200
+++ b/Framework/Messages/IObservable.h	Fri Sep 14 16:44:01 2018 +0200
@@ -25,9 +25,11 @@
 #include <assert.h>
 #include <algorithm>
 #include <iostream>
+#include <map>
 
 #include "MessageBroker.h"
 #include "MessageType.h"
+#include "ICallable.h"
 #include "IObserver.h"
 
 namespace OrthancStone {
@@ -48,7 +50,8 @@
   protected:
     MessageBroker&                     broker_;
 
-    std::set<IObserver*>              observers_;
+    typedef std::map<int, std::set<ICallable*> >   Callables;
+    Callables                         callables_;
     std::set<MessageType>             emittableMessages_;
 
   public:
@@ -59,6 +62,22 @@
     }
     virtual ~IObservable()
     {
+      for (Callables::const_iterator it = callables_.begin();
+           it != callables_.end(); ++it)
+      {
+        for (std::set<ICallable*>::const_iterator
+               it2 = it->second.begin(); it2 != it->second.end(); ++it2)
+        {
+          delete *it2;
+        }
+      }
+    }
+
+    void RegisterObserverCallback(ICallable* callable)
+    {
+      MessageType messageType = callable->GetMessageType();
+
+      callables_[messageType].insert(callable);
     }
 
     void EmitMessage(const IMessage& message)
@@ -68,25 +87,24 @@
         throw MessageNotDeclaredException(message.GetType());
       }
 
-      broker_.EmitMessage(*this, observers_, message);
-    }
+      Callables::const_iterator found = callables_.find(message.GetType());
 
-    void RegisterObserver(IObserver& observer)
-    {
-      CheckObserverDeclaredAllObservableMessages(observer);
-      observers_.insert(&observer);
+      if (found != callables_.end())
+      {
+        for (std::set<ICallable*>::const_iterator
+               it = found->second.begin(); it != found->second.end(); ++it)
+        {
+          if (broker_.IsActive((*it)->GetObserver()))
+          {
+            (*it)->Apply(message);
+          }
+        }
+      }
     }
-
-    void UnregisterObserver(IObserver& observer)
-    {
-      observers_.erase(&observer);
-    }
-
     const std::set<MessageType>& GetEmittableMessages() const
     {
       return emittableMessages_;
     }
-
   protected:
 
     void DeclareEmittableMessage(MessageType messageType)
@@ -94,18 +112,6 @@
       emittableMessages_.insert(messageType);
     }
 
-    void CheckObserverDeclaredAllObservableMessages(IObserver& observer)
-    {
-      for (std::set<MessageType>::const_iterator it = emittableMessages_.begin(); it != emittableMessages_.end(); it++)
-      {
-        // the observer must have "declared" all observable messages
-        if (observer.GetHandledMessages().find(*it) == observer.GetHandledMessages().end()
-            && observer.GetIgnoredMessages().find(*it) == observer.GetIgnoredMessages().end())
-        {
-          throw MessageNotDeclaredException(*it);
-        }
-      }
-    }
   };
 
 }