From 73a60837afb1a0ddf03ac500665c28853d95dca8 Mon Sep 17 00:00:00 2001
From: Alasdair Campbell <alcoheca@gmail.com>
Date: Tue, 9 Oct 2012 10:14:39 +0100
Subject: [PATCH 08/24] platinum: allow some statevariables to reset to
 default value after sending completed (needed for
 ContainerUpdateIDs usage)

---
 lib/libUPnP/Platinum/Source/Core/PltService.cpp       | 11 +++++++++--
 lib/libUPnP/Platinum/Source/Core/PltService.h         |  3 ++-
 lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp | 16 ++++++++++++++--
 lib/libUPnP/Platinum/Source/Core/PltStateVariable.h   | 10 +++++++++-
 4 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/lib/libUPnP/Platinum/Source/Core/PltService.cpp b/lib/libUPnP/Platinum/Source/Core/PltService.cpp
index b1fec51..b86fb23 100644
--- a/lib/libUPnP/Platinum/Source/Core/PltService.cpp
+++ b/lib/libUPnP/Platinum/Source/Core/PltService.cpp
@@ -459,14 +459,14 @@ PLT_Service::IsSubscribable()
 |   PLT_Service::SetStateVariable
 +---------------------------------------------------------------------*/
 NPT_Result
-PLT_Service::SetStateVariable(const char* name, const char* value)
+PLT_Service::SetStateVariable(const char* name, const char* value, const bool clearonsend /*=false*/)
 {
     PLT_StateVariable* stateVariable = NULL;
     NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
     if (stateVariable == NULL)
         return NPT_FAILURE;
 
-    return stateVariable->SetValue(value);
+    return stateVariable->SetValue(value, clearonsend);
 }
 
 /*----------------------------------------------------------------------
@@ -835,6 +835,13 @@ PLT_Service::NotifyChanged()
         m_Subscribers.Erase(sub_iter++);
     }
 
+    // some state variables must be cleared immediatly after sending
+    iter = vars_ready.GetFirstItem();
+    while (iter) {
+      PLT_StateVariable* var = *iter;
+      var->OnSendCompleted();
+      ++iter;
+    }
     return NPT_SUCCESS;
 }
 
diff --git a/lib/libUPnP/Platinum/Source/Core/PltService.h b/lib/libUPnP/Platinum/Source/Core/PltService.h
index 84959f2..0401ea2 100644
--- a/lib/libUPnP/Platinum/Source/Core/PltService.h
+++ b/lib/libUPnP/Platinum/Source/Core/PltService.h
@@ -216,8 +216,9 @@ public:
      when necessary.
      @param name state variable name
      @param value new State Variable value.
+     @param clearonsend whether the State Variable should clear immediatly in ::OnSendingCompleted
      */
-    NPT_Result SetStateVariable(const char* name, const char* value);
+    NPT_Result SetStateVariable(const char* name, const char* value, const bool clearonsend = false);
     
     /**
      Certain state variables notifications must not be sent faster than a certain 
diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
index c3eb7cc..d38392e 100644
--- a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
+++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.cpp
@@ -49,7 +49,8 @@ PLT_StateVariable::PLT_StateVariable(PLT_Service* service) :
     m_Service(service), 
     m_AllowedValueRange(NULL),
     m_IsSendingEvents(false),
-    m_IsSendingEventsIndirectly(true)
+    m_IsSendingEventsIndirectly(true),
+    m_ShouldClearOnSend(false)
 {
 }
 
@@ -146,7 +147,7 @@ PLT_StateVariable::SetRate(NPT_TimeInterval rate)
 |   PLT_StateVariable::SetValue
 +---------------------------------------------------------------------*/
 NPT_Result
-PLT_StateVariable::SetValue(const char* value)
+PLT_StateVariable::SetValue(const char* value, const bool clearonsend /*=false*/)
 {
     if (value == NULL) {
         return NPT_FAILURE;
@@ -160,6 +161,7 @@ PLT_StateVariable::SetValue(const char* value)
         }
 
         m_Value = value;
+        m_ShouldClearOnSend = clearonsend;
         m_Service->AddChanged(this); 
     }
 
@@ -184,6 +186,16 @@ PLT_StateVariable::IsReadyToPublish()
 }
 
 /*----------------------------------------------------------------------
+|   PLT_StateVariable::OnSendCompleted
++---------------------------------------------------------------------*/
+void
+PLT_StateVariable::OnSendCompleted()
+{
+  if(m_ShouldClearOnSend)
+      m_Value = m_DefaultValue;
+}
+
+/*----------------------------------------------------------------------
 |   PLT_StateVariable::ValidateValue
 +---------------------------------------------------------------------*/
 NPT_Result
diff --git a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h
index 46ec9e9..465e95c 100644
--- a/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h
+++ b/lib/libUPnP/Platinum/Source/Core/PltStateVariable.h
@@ -115,8 +115,9 @@ public:
      it is an allowed value. Once the value is validated, it is marked for eventing by
      calling the PLT_Service AddChanged function.
      @param value new state variable value. Can be a comma separated list of values.
+     @param clearonsend whether the statevariable should be cleared immediatly after sending
      */
-    NPT_Result SetValue(const char* value);
+    NPT_Result SetValue(const char* value, const bool clearonsend = false);
     
     /**
      Validate the new value of the state variable.
@@ -173,6 +174,12 @@ protected:
     bool IsReadyToPublish();
     
     /**
+     * If this statevariable should clear after sending to all subscribers, clears the value without
+     * eventing the change
+     */
+    void OnSendCompleted();
+
+    /**
      Serialize the state variable into xml.
      */
 	NPT_Result Serialize(NPT_XmlElementNode& node);
@@ -189,6 +196,7 @@ protected:
     NPT_String              m_DefaultValue;
     bool                    m_IsSendingEvents;
     bool                    m_IsSendingEventsIndirectly;
+    bool                    m_ShouldClearOnSend;
     NPT_TimeInterval        m_Rate;
     NPT_TimeStamp           m_LastEvent;
     NPT_Array<NPT_String*>  m_AllowedValues;
-- 
1.7.11.msysgit.0

