diff Framework/Layers/LayerSourceBase.cpp @ 90:64e60018943f wasm

fix and observer refactoring
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 29 May 2017 11:04:18 +0200
parents f244018a4e4b
children 81f73efd81a1
line wrap: on
line diff
--- a/Framework/Layers/LayerSourceBase.cpp	Fri May 26 18:27:59 2017 +0200
+++ b/Framework/Layers/LayerSourceBase.cpp	Mon May 29 11:04:18 2017 +0200
@@ -25,56 +25,69 @@
 
 namespace OrthancStone
 {
+  namespace
+  {
+    class LayerReadyFunctor : public boost::noncopyable
+    {
+    private:
+      std::auto_ptr<ILayerRenderer>  layer_;
+      const Slice&                   slice_;
+      
+    public:
+      LayerReadyFunctor(ILayerRenderer* layer,
+                        const Slice& slice) :
+        layer_(layer),
+        slice_(slice)
+      {
+      }
+
+      void operator() (ILayerSource::IObserver& observer,
+                       const ILayerSource& source)
+      {
+        observer.NotifyLayerReady(layer_, source, slice_);
+      }
+    };
+  }
+
+  void LayerSourceBase::NotifyGeometryReady()
+  {
+    observers_.Apply(*this, &IObserver::NotifyGeometryReady);
+  }
+    
+  void LayerSourceBase::NotifyGeometryError()
+  {
+    observers_.Apply(*this, &IObserver::NotifyGeometryError);
+  }  
+    
   void LayerSourceBase::NotifyContentChange()
   {
-    if (observer_ != NULL)
-    {
-      observer_->NotifyContentChange(*this);
-    }
+    observers_.Apply(*this, &IObserver::NotifyContentChange);
   }
 
   void LayerSourceBase::NotifySliceChange(const Slice& slice)
   {
-    if (observer_ != NULL)
-    {
-      observer_->NotifySliceChange(*this, slice);
-    }
+    observers_.Apply(*this, &IObserver::NotifySliceChange, slice);
   }
 
   void LayerSourceBase::NotifyLayerReady(ILayerRenderer* layer,
                                          const Slice& slice)
   {
-    std::auto_ptr<ILayerRenderer> tmp(layer);
-    
     if (layer == NULL)
     {
       throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
     }
-    
-    if (observer_ != NULL)
-    {
-      observer_->NotifyLayerReady(tmp.release(), *this, slice);
-    }
+
+    LayerReadyFunctor functor(layer, slice);
+    observers_.Notify(this, functor);
   }
 
   void LayerSourceBase::NotifyLayerError(const SliceGeometry& slice)
   {
-    if (observer_ != NULL)
-    {
-      observer_->NotifyLayerError(*this, slice);
-    }
+    observers_.Apply(*this, &IObserver::NotifyLayerError, slice);
   }
 
-  void LayerSourceBase::SetObserver(IObserver& observer)
+  void LayerSourceBase::Register(IObserver& observer)
   {
-    if (observer_ == NULL)
-    {
-      observer_ = &observer;
-    }
-    else
-    {
-      // Cannot add more than one observer
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
-    }
+    observers_.Register(observer);
   }
 }