From d95abde7a0fd89cb979dae9052e3f0e7cc2be128 Mon Sep 17 00:00:00 2001
From: Thomas Ives <tri@observatorysciences.co.uk>
Date: Mon, 1 Sep 2025 09:11:22 +0100
Subject: [PATCH 2/5] DServer::zmq_event_subscription_changed: Map client idl
 versions...

... to event data versions.

We didn't introduce new AttributeValue data structures with IDLv6, so we
shouldn't being sending an event for each client version selected.
Instead, we should be sending a ZMQ event for each type of data
structure, one that each client can use.
---
 src/server/eventcmds.cpp | 76 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 75 insertions(+), 1 deletion(-)

diff --git a/lib/cpp/src/server/eventcmds.cpp b/lib/cpp/src/server/eventcmds.cpp
index 4f26dd8a8..af96f70b7 100644
--- a/lib/cpp/src/server/eventcmds.cpp
+++ b/lib/cpp/src/server/eventcmds.cpp
@@ -489,6 +489,79 @@ MulticastParameters
     return result;
 }
 
+namespace
+{
+int zmq_client_idl_to_event_data_version(int client_lib_version, const std::string &event_name)
+{
+    TANGO_ASSERT(client_lib_version > 0);
+    TANGO_ASSERT(client_lib_version <= DevVersion);
+
+    auto *tg = Tango::Util::instance(false);
+    EventType event_type;
+    tg->event_name_2_event_type(event_name, event_type);
+
+    // The (event_type, <ret>) pair corresponds to which element on
+    // SuppliedEventData is active when we call ZmqEventSupplier::push_event.
+
+    switch(event_type)
+    {
+    case CHANGE_EVENT:
+        [[fallthrough]];
+    case ARCHIVE_EVENT:
+        [[fallthrough]];
+    case USER_EVENT:
+        [[fallthrough]];
+    case PERIODIC_EVENT:
+        if(client_lib_version >= 5)
+        {
+            // AttributeValue_5
+            return 5;
+        }
+        else if(client_lib_version == 4)
+        {
+            // AttributeValue_4
+            return 4;
+        }
+        else
+        {
+            // AttributeValue_3
+            return 3;
+        }
+    case ATTR_CONF_EVENT:
+        if(client_lib_version >= 5)
+        {
+            // AttributeConfig_5
+            return 5;
+        }
+        else
+        {
+            // AttributeConfig_3
+            return 3;
+        }
+    case ALARM_EVENT:
+        TANGO_ASSERT(client_lib_version >= 6);
+        // AttributeValue_5
+        // TODO(porting to main): Update alarm event handling so that
+        //   this can be 5 (#1531).
+        return 6;
+    case DATA_READY_EVENT:
+        // AttDataReady
+        return 1;
+    case INTERFACE_CHANGE_EVENT:
+        // DevIntrChange
+        return 1;
+    case PIPE_EVENT:
+        // DevPipeData
+        return 1;
+    default:
+        TANGO_ASSERT_ON_DEFAULT(event_type);
+    }
+
+    // unreachable
+    return 0;
+}
+} // namespace
+
 void DServer::store_subscribed_client_info(DeviceImpl &device,
                                            const std::string &object_name,
                                            const std::string &event_name,
@@ -947,7 +1020,8 @@ DevVarLongStringArray *DServer::zmq_event_subscription_change(const Tango::DevVa
         // the command fails.
         if(action == "subscribe")
         {
-            store_subscribed_client_info(*dev, obj_name, event, client_release);
+            int event_data_version = zmq_client_idl_to_event_data_version(client_release, event);
+            store_subscribed_client_info(*dev, obj_name, event, event_data_version);
         }
 
         //
-- 
2.39.5

