From afe4852aa59a467938584b04764864cc0dae3312 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Wed, 27 Apr 2022 17:54:20 +0200
Subject: [PATCH] Let the MemoryListener use the respective topic when
 subscribing a memory ID

---
 .../armem/client/MemoryNameSystem.cpp         |  5 ++++-
 .../armem/client/util/MemoryListener.cpp      | 20 ++++++++++++++++++-
 .../armem/client/util/MemoryListener.h        | 16 ++++++++++++++-
 3 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
index 813981444..94946cafe 100644
--- a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
+++ b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
@@ -20,6 +20,7 @@ namespace armarx::armem::client
 
 
     MemoryNameSystem::MemoryNameSystem(mns::MemoryNameSystemInterfacePrx mns, ManagedIceObject* component) :
+        util::MemoryListener(component),
         mns(mns), component(component)
     {
     }
@@ -28,7 +29,7 @@ namespace armarx::armem::client
     void MemoryNameSystem::initialize(mns::MemoryNameSystemInterfacePrx mns, ManagedIceObject* component)
     {
         this->mns = mns;
-        this->component = component;
+        setComponent(component);
     }
 
 
@@ -402,8 +403,10 @@ namespace armarx::armem::client
         this->mns = mns;
     }
 
+
     void MemoryNameSystem::setComponent(ManagedIceObject* component)
     {
+        util::MemoryListener::setComponent(component);
         this->component = component;
     }
 
diff --git a/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp b/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp
index a4aa21483..c8a7c6c68 100644
--- a/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp
+++ b/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp
@@ -5,6 +5,7 @@
 #include <ArmarXCore/core/exceptions/LocalException.h>
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h>
+#include <ArmarXCore/core/ManagedIceObject.h>
 
 #include <RobotAPI/libraries/armem/core/ice_conversions.h>
 #include <RobotAPI/libraries/armem/core/error.h>
@@ -13,8 +14,21 @@
 namespace armarx::armem::client::util
 {
 
-    MemoryListener::MemoryListener()
+    std::string MemoryListener::MakeMemoryTopicName(const MemoryID& memoryID)
     {
+        return "MemoryUpdates." + memoryID.memoryName;
+    }
+
+
+    MemoryListener::MemoryListener(ManagedIceObject* component) :
+        component(component)
+    {
+    }
+
+
+    void MemoryListener::setComponent(ManagedIceObject* component)
+    {
+        this->component = component;
     }
 
 
@@ -109,6 +123,10 @@ namespace armarx::armem::client::util
     MemoryListener::subscribe(const MemoryID& id, Callback callback)
     {
         callbacks[id].push_back(callback);
+        if (component)
+        {
+            component->usingTopic(MakeMemoryTopicName(id));
+        }
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/client/util/MemoryListener.h b/source/RobotAPI/libraries/armem/client/util/MemoryListener.h
index 2d530097c..ceb765e60 100644
--- a/source/RobotAPI/libraries/armem/client/util/MemoryListener.h
+++ b/source/RobotAPI/libraries/armem/client/util/MemoryListener.h
@@ -11,6 +11,12 @@
 #include <RobotAPI/libraries/armem/core/MemoryID.h>
 
 
+
+namespace armarx
+{
+    class ManagedIceObject;
+}
+
 namespace armarx::armem::client::util
 {
 
@@ -20,6 +26,7 @@ namespace armarx::armem::client::util
      */
     class MemoryListener
     {
+    public:
 
         using Callback = std::function<void(const MemoryID& subscriptionID, const std::vector<MemoryID>& updatedSnapshotIDs)>;
         using CallbackUpdatedOnly = std::function<void(const std::vector<MemoryID>& updatedSnapshotIDs)>;
@@ -29,11 +36,14 @@ namespace armarx::armem::client::util
         template <class CalleeT>
         using MemberCallbackUpdatedOnly = void(CalleeT::*)(const std::vector<MemoryID>& updatedSnapshotIDs);
 
+        static std::string MakeMemoryTopicName(const MemoryID& memoryID);
+
 
     public:
 
-        MemoryListener();
+        MemoryListener(ManagedIceObject* component = nullptr);
 
+        void setComponent(ManagedIceObject* component);
 
         void subscribe(const MemoryID& subscriptionID, Callback Callback);
         void subscribe(const MemoryID& subscriptionID, CallbackUpdatedOnly Callback);
@@ -73,6 +83,10 @@ namespace armarx::armem::client::util
 
         std::unordered_map<MemoryID, std::vector<Callback>> callbacks;
 
+    private:
+
+        armarx::ManagedIceObject* component;
+
     };
 
 }
-- 
GitLab