From b35a5661455407f26b5bac8ac97e819d2e919ee3 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 23 Mar 2019 16:13:16 +0100 Subject: [PATCH] - IEC 61850 server: fixed problem in report module --- src/iec61850/client/client_report_control.c | 8 ++++++ src/iec61850/inc/iec61850_client.h | 27 +++++++++++++++++++ src/iec61850/server/mms_mapping/control.c | 3 --- src/iec61850/server/mms_mapping/mms_mapping.c | 2 ++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/iec61850/client/client_report_control.c b/src/iec61850/client/client_report_control.c index 27361986..f2cc5c7f 100644 --- a/src/iec61850/client/client_report_control.c +++ b/src/iec61850/client/client_report_control.c @@ -324,6 +324,12 @@ ClientReportControlBlock_setPurgeBuf(ClientReportControlBlock self, bool purgeBu MmsValue_setBoolean(self->purgeBuf, purgeBuf); } +bool +ClientReportControlBlock_hasResvTms(ClientReportControlBlock self) +{ + return (self->resvTms != NULL); +} + int16_t ClientReportControlBlock_getResvTms(ClientReportControlBlock self) { @@ -670,6 +676,8 @@ IedConnection_getRCBValues(IedConnection self, IedClientError* error, const char *error = iedConnection_mapDataAccessErrorToIedError( MmsValue_getDataAccessError(rcb)); + MmsValue_delete(rcb); + return NULL; } diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index de29ff9c..dd87c470 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -1555,9 +1555,21 @@ ClientReportControlBlock_setDataSetReference(ClientReportControlBlock self, cons LIB61850_API uint32_t ClientReportControlBlock_getConfRev(ClientReportControlBlock self); +/** + * \brief Gets the OptFlds parameter of the RCB (decides what information to include in a report) + * + * \param self the RCB instance + * \return bit field representing the optional fields of a report (uses flags from \ref REPORT_OPTIONS) + */ LIB61850_API int ClientReportControlBlock_getOptFlds(ClientReportControlBlock self); +/** + * \brief Set the OptFlds parameter of the RCB (decides what information to include in a report) + * + * \param self the RCB instance + * \param optFlds bit field representing the optional fields of a report (use flags from \ref REPORT_OPTIONS) + */ LIB61850_API void ClientReportControlBlock_setOptFlds(ClientReportControlBlock self, int optFlds); @@ -1591,9 +1603,24 @@ ClientReportControlBlock_setGI(ClientReportControlBlock self, bool gi); LIB61850_API bool ClientReportControlBlock_getPurgeBuf(ClientReportControlBlock self); +/** + * \brief Set the "PurgeBuf" attribute value (only BRCB) + * + * When set to true the report buffer will be cleared. + * + * \param purgeBuf attribute value + */ LIB61850_API void ClientReportControlBlock_setPurgeBuf(ClientReportControlBlock self, bool purgeBuf); +/** + * \brief Check if optional attribute "ResvTms" is present in BRCB + * + * \return true when present, false otherwise + */ +LIB61850_API bool +ClientReportControlBlock_hasResvTms(ClientReportControlBlock self); + LIB61850_API int16_t ClientReportControlBlock_getResvTms(ClientReportControlBlock self); diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 442cc8e5..9a4548ea 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -417,9 +417,6 @@ ControlObject_destroy(ControlObject* self) if (self->mmsValue != NULL) MmsValue_delete(self->mmsValue); - if (self->sbo != NULL) - MmsValue_delete(self->sbo); - if (self->emptyString != NULL) MmsValue_delete(self->emptyString); diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 570066f7..4112962b 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -2338,6 +2338,8 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo char* elementName = MmsMapping_getNextNameElement(reportName); + ReportControl_readAccess(rc, elementName); + MmsValue* value = NULL; if (elementName != NULL)