fixed bug in getDCIEventList call (issue #1362)
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 12 Dec 2016 20:53:57 +0000 (22:53 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 12 Dec 2016 20:53:57 +0000 (22:53 +0200)
ChangeLog
src/java/client/netxms-client/src/main/java/org/netxms/client/NXCSession.java
src/server/core/dcitem.cpp
src/server/core/dcobject.cpp
src/server/core/dctable.cpp
src/server/core/session.cpp
src/server/core/template.cpp
src/server/include/nms_dcoll.h
src/server/include/nms_objects.h

index 7a17a5f..42a3c6b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -22,7 +22,7 @@
 - Fixed FreeBSD 11 compatibility issues
 - Management console:
        - File manager improvements
-- Fixed issues: #106, #130, #174, #185, #526, #569, #876, #953, #1031, #1043, #1090, #1097, #1156, #1192, #1201, #1205, #1206, #1258, #1285, #1292, #1300, #1312, #1314, #1318, #1320, #1323, #1326, #1329, #1332, #1338, #1348, #1349
+- Fixed issues: #106, #130, #174, #185, #526, #569, #876, #953, #1031, #1043, #1090, #1097, #1156, #1192, #1201, #1205, #1206, #1258, #1285, #1292, #1300, #1312, #1314, #1318, #1320, #1323, #1326, #1329, #1332, #1338, #1348, #1349, #1362
 
 
 *
index 43bb8d6..936531c 100644 (file)
@@ -6308,10 +6308,11 @@ public class NXCSession
    public long[] getDataCollectionEvents(long objectId) throws IOException, NXCException
    {
       final NXCPMessage msg = newMessage(NXCPCodes.CMD_GET_DCI_EVENTS_LIST);
-      msg.setFieldInt32(NXCPCodes.VID_OBJECT_ID, (int) objectId);
+      msg.setFieldInt32(NXCPCodes.VID_OBJECT_ID, (int)objectId);
       sendMessage(msg);
       final NXCPMessage response = waitForRCC(msg.getMessageId());
-      if (response.getFieldAsInt32(NXCPCodes.VID_NUM_EVENTS) == 0) return new long[0];
+      if (response.getFieldAsInt32(NXCPCodes.VID_NUM_EVENTS) == 0) 
+         return new long[0];
       return response.getFieldAsUInt32Array(NXCPCodes.VID_EVENT_LIST);
    }
 
index 774770c..d97a387 100644 (file)
@@ -1570,22 +1570,17 @@ void DCItem::setInstanceFilter(const TCHAR *pszScript)
 /**
  * Get list of used events
  */
-void DCItem::getEventList(UINT32 **ppdwList, UINT32 *pdwSize)
+void DCItem::getEventList(IntegerArray<UINT32> *eventList)
 {
    lock();
-
-   if (getThresholdCount() > 0)
+   if (m_thresholds != NULL)
    {
-      *ppdwList = (UINT32 *)realloc(*ppdwList, sizeof(UINT32) * (*pdwSize + m_thresholds->size() * 2));
-      UINT32 j = *pdwSize;
-      *pdwSize += m_thresholds->size() * 2;
       for(int i = 0; i < m_thresholds->size(); i++)
       {
-         (*ppdwList)[j++] = m_thresholds->get(i)->getEventCode();
-                       (*ppdwList)[j++] = m_thresholds->get(i)->getRearmEventCode();
+         eventList->add(m_thresholds->get(i)->getEventCode());
+         eventList->add(m_thresholds->get(i)->getRearmEventCode());
       }
    }
-
    unlock();
 }
 
index 6fdd096..d30e634 100644 (file)
@@ -742,22 +742,6 @@ void DCObject::deleteFromDatabase()
    QueueSQLRequest(query);
 }
 
-/**
- * Get list of used events
- */
-void DCObject::getEventList(UINT32 **ppdwList, UINT32 *pdwSize)
-{
-       *ppdwList = NULL;
-       *pdwSize = 0;
-}
-
-/**
- * Create management pack record
- */
-void DCObject::createExportRecord(String &str)
-{
-}
-
 /**
  * Load data collection object thresholds from database
  */
index 89d2971..1be25ae 100644 (file)
@@ -1079,3 +1079,20 @@ bool DCTable::hasValue()
       return isAggregateOnCluster();
    return true;
 }
+
+/**
+ * Get list of used events
+ */
+void DCTable::getEventList(IntegerArray<UINT32> *eventList)
+{
+   lock();
+   if (m_thresholds != NULL)
+   {
+      for(int i = 0; i < m_thresholds->size(); i++)
+      {
+         eventList->add(m_thresholds->get(i)->getActivationEvent());
+         eventList->add(m_thresholds->get(i)->getDeactivationEvent());
+      }
+   }
+   unlock();
+}
index f4c9913..123ae55 100644 (file)
@@ -9855,30 +9855,20 @@ void ClientSession::resetComponent(NXCPMessage *pRequest)
 void ClientSession::getDCIEventList(NXCPMessage *request)
 {
    NXCPMessage msg;
-   NetObj *object;
-   UINT32 *pdwEventList, count;
-
    msg.setCode(CMD_REQUEST_COMPLETED);
    msg.setId(request->getId());
 
-   object = FindObjectById(request->getFieldAsUInt32(VID_OBJECT_ID));
+   NetObj *object = FindObjectById(request->getFieldAsUInt32(VID_OBJECT_ID));
    if (object != NULL)
    {
       if (object->checkAccessRights(m_dwUserId, OBJECT_ACCESS_READ))
       {
          if (object->isDataCollectionTarget() || (object->getObjectClass() == OBJECT_TEMPLATE))
          {
-            pdwEventList = ((Template *)object)->getDCIEventsList(&count);
-            if (pdwEventList != NULL)
-            {
-               msg.setField(VID_NUM_EVENTS, count);
-               msg.setFieldFromInt32Array(VID_EVENT_LIST, count, pdwEventList);
-               free(pdwEventList);
-            }
-            else
-            {
-               msg.setField(VID_NUM_EVENTS, (UINT32)0);
-            }
+            IntegerArray<UINT32> *eventList = ((Template *)object)->getDCIEventsList();
+            msg.setField(VID_NUM_EVENTS, (UINT32)eventList->size());
+            msg.setFieldFromInt32Array(VID_EVENT_LIST, eventList);
+            delete eventList;
             msg.setField(VID_RCC, RCC_SUCCESS);
          }
          else
index 41bc455..a2d6d6d 100644 (file)
@@ -1019,35 +1019,30 @@ void Template::queueRemoveFromTarget(UINT32 targetId, bool removeDCI)
 /**
  * Get list of events used by DCIs
  */
-UINT32 *Template::getDCIEventsList(UINT32 *pdwCount)
+IntegerArray<UINT32> *Template::getDCIEventsList()
 {
-   UINT32 i, j, *pdwList;
-
-   pdwList = NULL;
-   *pdwCount = 0;
-
+   IntegerArray<UINT32> *eventList = new IntegerArray<UINT32>(64);
    lockDciAccess(false);
-   for(i = 0; i < (UINT32)m_dcObjects->size(); i++)
+   for(int i = 0; i < m_dcObjects->size(); i++)
    {
-      m_dcObjects->get(i)->getEventList(&pdwList, pdwCount);
+      m_dcObjects->get(i)->getEventList(eventList);
    }
    unlockDciAccess();
 
    // Clean list from duplicates
-   for(i = 0; i < *pdwCount; i++)
+   for(int i = 0; i < eventList->size(); i++)
    {
-      for(j = i + 1; j < *pdwCount; j++)
+      for(int j = i + 1; j < eventList->size(); j++)
       {
-         if (pdwList[i] == pdwList[j])
+         if (eventList->get(i) == eventList->get(j))
          {
-            (*pdwCount)--;
-            memmove(&pdwList[j], &pdwList[j + 1], sizeof(UINT32) * (*pdwCount - j));
+            eventList->remove(j);
             j--;
          }
       }
    }
 
-   return pdwList;
+   return eventList;
 }
 
 /**
index 3dabb2e..5990f97 100644 (file)
@@ -293,8 +293,8 @@ public:
        virtual void deleteExpiredData();
        virtual bool deleteAllData();
 
-   virtual void getEventList(UINT32 **ppdwList, UINT32 *pdwSize);
-   virtual void createExportRecord(String &str);
+   virtual void getEventList(IntegerArray<UINT32> *eventList) = 0;
+   virtual void createExportRecord(String &str) = 0;
 
    NXSL_Value *createNXSLObject();
 
@@ -408,7 +408,7 @@ public:
    virtual void deleteExpiredData();
        virtual bool deleteAllData();
 
-   virtual void getEventList(UINT32 **ppdwList, UINT32 *pdwSize);
+   virtual void getEventList(IntegerArray<UINT32> *eventList);
    virtual void createExportRecord(String &str);
 
        int getThresholdCount() const { return (m_thresholds != NULL) ? m_thresholds->size() : 0; }
@@ -539,9 +539,9 @@ public:
    UINT32 fillMessage(NXCPMessage *msg, UINT32 baseId);
    void createNXMPRecord(String &str, int id);
 
-   UINT32 getId() { return m_id; }
-   UINT32 getActivationEvent() { return m_activationEvent; }
-   UINT32 getDeactivationEvent() { return m_deactivationEvent; }
+   UINT32 getId() const { return m_id; }
+   UINT32 getActivationEvent() const { return m_activationEvent; }
+   UINT32 getDeactivationEvent() const { return m_deactivationEvent; }
 };
 
 /**
@@ -593,6 +593,7 @@ public:
        virtual void deleteExpiredData();
        virtual bool deleteAllData();
 
+   virtual void getEventList(IntegerArray<UINT32> *eventList);
    virtual void createExportRecord(String &str);
 
        void fillLastValueMessage(NXCPMessage *msg);
index 2335cb7..c38a62a 100644 (file)
@@ -749,8 +749,8 @@ public:
    bool unlockDCIList(int sessionId);
    void setDCIModificationFlag() { m_dciListModified = true; }
    void sendItemsToClient(ClientSession *pSession, UINT32 dwRqId);
-   BOOL isLockedBySession(int sessionId) { return m_dciLockStatus == sessionId; }
-   UINT32 *getDCIEventsList(UINT32 *pdwCount);
+   bool isLockedBySession(int sessionId) { return m_dciLockStatus == sessionId; }
+   IntegerArray<UINT32> *getDCIEventsList();
    StringSet *getDCIScriptList();
 
    BOOL applyToTarget(DataCollectionTarget *pNode);