From b1fc481ab88e0c771e93e42cb112ee680079891c Mon Sep 17 00:00:00 2001 From: Mikael Bourhis Date: Wed, 3 Feb 2021 14:37:47 +0100 Subject: [PATCH] Python wrapper: add some quality improvements --- .../eventHandlers/commandTermHandler.hpp | 26 ++++++++++++++++-- pyiec61850/eventHandlers/gooseHandler.hpp | 27 +++++++++++++++++-- .../reportControlBlockHandler.hpp | 24 ++++++++++++++++- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/pyiec61850/eventHandlers/commandTermHandler.hpp b/pyiec61850/eventHandlers/commandTermHandler.hpp index 2595f15e..2c91e338 100644 --- a/pyiec61850/eventHandlers/commandTermHandler.hpp +++ b/pyiec61850/eventHandlers/commandTermHandler.hpp @@ -26,8 +26,21 @@ class CommandTermHandler: public EventHandler { */ class CommandTermSubscriber: public EventSubscriber { public: + CommandTermSubscriber(): EventSubscriber() + { + m_libiec61850_control_object_client = nullptr; + } + + virtual ~CommandTermSubscriber() {} + + virtual void subscribe() + { + // preconditions + if (nullptr == m_libiec61850_control_object_client) { + fprintf(stderr, "CommandTermSubscriber::subscribe() failed: 'control object client' is null\n"); + return; + } - virtual void subscribe() { // install the libiec61850 callback: // the 'function pointer' is the 'static' method of this class ControlObjectClient_setCommandTerminationHandler( @@ -41,6 +54,12 @@ class CommandTermSubscriber: public EventSubscriber { { PyThreadStateLock PyThreadLock; + // Preconditions + if (nullptr == connection) { + fprintf(stderr, "CommandTermSubscriber::triggerCommandTermHandler() failed: input object is null\n"); + return; + } + // TODO: search the appropriate 'EventSubscriber' object if (m_last_created_event_subscriber) { EventHandler *l_event_handler_p = m_last_created_event_subscriber->getEventHandler(); @@ -49,9 +68,12 @@ class CommandTermSubscriber: public EventSubscriber { l_event_handler_p->trigger(); } else { - printf("The EventHandler is undefined\n"); + fprintf(stderr, "CommandTermSubscriber::triggerCommandTermHandler() failed: EventHandler is undefined\n"); } } + else { + fprintf(stderr, "CommandTermSubscriber::triggerCommandTermHandler() failed: subscriber is not registered\n"); + } } // Setters diff --git a/pyiec61850/eventHandlers/gooseHandler.hpp b/pyiec61850/eventHandlers/gooseHandler.hpp index a01d3a6a..f0b4f1d2 100644 --- a/pyiec61850/eventHandlers/gooseHandler.hpp +++ b/pyiec61850/eventHandlers/gooseHandler.hpp @@ -22,8 +22,22 @@ class GooseHandler: public EventHandler { class GooseSubscriberForPython: public EventSubscriber { public: + GooseSubscriberForPython(): EventSubscriber() + { + m_libiec61850_goose_subscriber = nullptr; + } + + virtual ~GooseSubscriberForPython() {} + + + virtual void subscribe() + { + // preconditions + if (nullptr == m_libiec61850_goose_subscriber) { + fprintf(stderr, "GooseSubscriberForPython::subscribe() failed: 'GOOSE subscriber' is null\n"); + return; + } - virtual void subscribe() { // install the libiec61850 callback: // the 'function pointer' is the 'static' method of this class GooseSubscriber_setListener(m_libiec61850_goose_subscriber, @@ -36,6 +50,12 @@ class GooseSubscriberForPython: public EventSubscriber { { PyThreadStateLock PyThreadLock; + // Preconditions + if (nullptr == subscriber) { + fprintf(stderr, "GooseSubscriberForPython::triggerGooseHandler() failed: input object is null\n"); + return; + } + // TODO: search the appropriate 'EventSubscriber' object if (m_last_created_event_subscriber) { EventHandler *l_event_handler_p = m_last_created_event_subscriber->getEventHandler(); @@ -44,9 +64,12 @@ class GooseSubscriberForPython: public EventSubscriber { l_event_handler_p->trigger(); } else { - printf("The EventHandler is undefined\n"); + fprintf(stderr, "GooseSubscriberForPython::triggerGooseHandler() failed: EventHandler is undefined\n"); } } + else { + fprintf(stderr, "GooseSubscriberForPython::triggerGooseHandler() failed: subscriber is not registered\n"); + } } // Setters diff --git a/pyiec61850/eventHandlers/reportControlBlockHandler.hpp b/pyiec61850/eventHandlers/reportControlBlockHandler.hpp index ad798c1d..13d71e9d 100644 --- a/pyiec61850/eventHandlers/reportControlBlockHandler.hpp +++ b/pyiec61850/eventHandlers/reportControlBlockHandler.hpp @@ -22,8 +22,21 @@ class RCBHandler: public EventHandler { class RCBSubscriber: public EventSubscriber { public: + RCBSubscriber(): EventSubscriber() + { + m_ied_connection = nullptr; + } + + virtual ~RCBSubscriber() {} + virtual void subscribe() { + // preconditions + if (nullptr == m_ied_connection) { + fprintf(stderr, "RCBSubscriber::subscribe() failed: 'IedConnection' is null\n"); + return; + } + // install the libiec61850 callback: // the 'function pointer' is the 'static' method of this class IedConnection_installReportHandler(m_ied_connection, @@ -38,6 +51,12 @@ class RCBSubscriber: public EventSubscriber { { PyThreadStateLock PyThreadLock; + // Preconditions + if (nullptr == report) { + fprintf(stderr, "RCBSubscriber::triggerRCBHandler() failed: input object is null\n"); + return; + } + // TODO: search the appropriate 'EventSubscriber' object if (m_last_created_event_subscriber) { EventHandler *l_event_handler_p = m_last_created_event_subscriber->getEventHandler(); @@ -46,9 +65,12 @@ class RCBSubscriber: public EventSubscriber { l_event_handler_p->trigger(); } else { - printf("The EventHandler is undefined\n"); + fprintf(stderr, "RCBSubscriber::triggerRCBHandler() failed: EventHandler is undefined\n"); } } + else { + fprintf(stderr, "RCBSubscriber::triggerRCBHandler() failed: subscriber is not registered\n"); + } } // Setters