object parent and child lists refactored (issue #92)
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 26 Jun 2016 15:42:49 +0000 (18:42 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 26 Jun 2016 15:42:49 +0000 (18:42 +0300)
32 files changed:
ChangeLog
src/server/core/accesspoint.cpp
src/server/core/agent.cpp
src/server/core/agent_policy.cpp
src/server/core/ap_config.cpp
src/server/core/bizservice.cpp
src/server/core/bizsvcroot.cpp
src/server/core/cluster.cpp
src/server/core/condition.cpp
src/server/core/container.cpp
src/server/core/correlate.cpp
src/server/core/dashboard.cpp
src/server/core/dctarget.cpp
src/server/core/interface.cpp
src/server/core/mobile.cpp
src/server/core/netmap.cpp
src/server/core/netobj.cpp
src/server/core/netsrv.cpp
src/server/core/node.cpp
src/server/core/nodelink.cpp
src/server/core/nxsl_classes.cpp
src/server/core/objects.cpp
src/server/core/rootobj.cpp
src/server/core/slmcheck.cpp
src/server/core/snmptrap.cpp
src/server/core/subnet.cpp
src/server/core/svccontainer.cpp
src/server/core/syslogd.cpp
src/server/core/template.cpp
src/server/core/uniroot.cpp
src/server/core/vpnconn.cpp
src/server/include/nms_objects.h

index 17e8533..e100aba 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,7 +12,7 @@
        - New editors for Agent Config Policy and Log Parser Policy. 
        - DCI summary tables with empty menu path not shown in object context menu
        - Fixed possible deadlock when executing server script
-- Fixed issues: #906, #1039, #1096, #1187, #1191, #1230, #1237, #1239
+- Fixed issues: #92, #906, #1039, #1096, #1187, #1191, #1230, #1237, #1239
 
 
 *
index 83645e4..8a7c0d0 100644 (file)
@@ -396,21 +396,21 @@ void AccessPoint::updateState(AccessPointState state)
    if (state == AP_DOWN)
       m_prevState = m_state;
    m_state = state;
-   if (m_iStatus != STATUS_UNMANAGED)
+   if (m_status != STATUS_UNMANAGED)
    {
       switch(state)
       {
          case AP_ADOPTED:
-            m_iStatus = STATUS_NORMAL;
+            m_status = STATUS_NORMAL;
             break;
          case AP_UNADOPTED:
-            m_iStatus = STATUS_MAJOR;
+            m_status = STATUS_MAJOR;
             break;
          case AP_DOWN:
-            m_iStatus = STATUS_CRITICAL;
+            m_status = STATUS_CRITICAL;
             break;
          default:
-            m_iStatus = STATUS_UNKNOWN;
+            m_status = STATUS_UNKNOWN;
             break;
       }
    }
@@ -435,7 +435,7 @@ void AccessPoint::statusPoll(ClientSession *session, UINT32 rqId, Queue *eventQu
    m_pollRequestor = session;
 
    sendPollerMsg(rqId, _T("   Starting status poll on access point %s\r\n"), m_name);
-   sendPollerMsg(rqId, _T("      Current access point status is %s\r\n"), GetStatusAsText(m_iStatus, true));
+   sendPollerMsg(rqId, _T("      Current access point status is %s\r\n"), GetStatusAsText(m_status, true));
 
    AccessPointState state = controller->getAccessPointState(this, snmpTransport);
    if ((state == AP_UNKNOWN) && m_ipAddress.isValid())
@@ -530,7 +530,7 @@ void AccessPoint::statusPoll(ClientSession *session, UINT32 rqId, Queue *eventQu
 
    updateState(state);
 
-   sendPollerMsg(rqId, _T("      Access point status after poll is %s\r\n"), GetStatusAsText(m_iStatus, true));
+   sendPollerMsg(rqId, _T("      Access point status after poll is %s\r\n"), GetStatusAsText(m_status, true));
        sendPollerMsg(rqId, _T("   Finished status poll on access point %s\r\n"), m_name);
 }
 
index 053e76f..df6548a 100644 (file)
@@ -52,7 +52,7 @@ void AgentConnectionEx::onTrap(NXCPMessage *pMsg)
       pNode = FindNodeByIP(0, getIpAddr().getAddressV4());
    if (pNode != NULL)
    {
-      if (pNode->Status() != STATUS_UNMANAGED)
+      if (pNode->getStatus() != STATUS_UNMANAGED)
       {
                   // Check for duplicate traps - only accept traps with ID
                   // higher than last received
index 36216cb..e7a95a0 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2009 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@
  */
 void PolicyGroup::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
 
 /**
@@ -98,13 +98,13 @@ BOOL AgentPolicy::savePolicyCommonProperties(DB_HANDLE hdb)
    // Update node bindings
    _sntprintf(query, 256, _T("DELETE FROM ap_bindings WHERE policy_id=%d"), m_id);
    DBQuery(hdb, query);
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   lockChildList(FALSE);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      _sntprintf(query, 256, _T("INSERT INTO ap_bindings (policy_id,node_id) VALUES (%d,%d)"), m_id, m_pChildList[i]->getId());
+      _sntprintf(query, 256, _T("INSERT INTO ap_bindings (policy_id,node_id) VALUES (%d,%d)"), m_id, m_childList->get(i)->getId());
       DBQuery(hdb, query);
    }
-   UnlockChildList();
+   unlockChildList();
 
        return success;
 }
index 8a391d6..cc19752 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2010 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
index 2fb0c4b..dbfaf0b 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2011 NetXMS Team
+** Copyright (C) 2003-2016 Raden Solutions
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -216,20 +216,21 @@ void BusinessService::poll(ClientSession *pSession, UINT32 dwRqId, PollerInfo *p
        m_lastPollTime = time(NULL);
 
        // Loop through the kids and execute their either scripts or thresholds
-   LockChildList(FALSE);
-       for (UINT32 i = 0; i < m_dwChildCount; i++)
+   lockChildList(false);
+       for (int i = 0; i < m_childList->size(); i++)
        {
-               if (m_pChildList[i]->getObjectClass() == OBJECT_SLMCHECK)
-                       ((SlmCheck *)m_pChildList[i])->execute();
-               else if (m_pChildList[i]->getObjectClass() == OBJECT_NODELINK)
-                       ((NodeLink*)m_pChildList[i])->execute();
+          NetObj *object = m_childList->get(i);
+               if (object->getObjectClass() == OBJECT_SLMCHECK)
+                       ((SlmCheck *)object)->execute();
+               else if (object->getObjectClass() == OBJECT_NODELINK)
+                       ((NodeLink*)object)->execute();
        }
-   UnlockChildList();
+   unlockChildList();
 
        // Set the status based on what the kids' been up to
        calculateCompoundStatus();
 
-       m_lastPollStatus = m_iStatus;
+       m_lastPollStatus = m_status;
        DbgPrintf(5, _T("Finished polling of business service %s [%d]"), m_name, (int)m_id);
        m_busy = false;
 }
@@ -239,27 +240,29 @@ void BusinessService::poll(ClientSession *pSession, UINT32 dwRqId, PollerInfo *p
  */
 void BusinessService::getApplicableTemplates(ServiceContainer *target, ObjectArray<SlmCheck> *templates)
 {
-       LockChildList(FALSE);
-       for(UINT32 i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-               if ((m_pChildList[i]->getObjectClass() == OBJECT_SLMCHECK) &&
-          ((SlmCheck *)m_pChildList[i])->isTemplate())
+      NetObj *object = m_childList->get(i);
+               if ((object->getObjectClass() == OBJECT_SLMCHECK) &&
+          ((SlmCheck *)object)->isTemplate())
                {
-                       m_pChildList[i]->incRefCount();
-                       templates->add((SlmCheck *)m_pChildList[i]);
+                  object->incRefCount();
+                       templates->add((SlmCheck *)object);
                }
        }
-       UnlockChildList();
+       unlockChildList();
 
-       LockParentList(FALSE);
-       for(UINT32 i = 0; i < m_dwParentCount; i++)
+       lockParentList(false);
+       for(int i = 0; i < m_parentList->size(); i++)
        {
-               if (m_pParentList[i]->getObjectClass() == OBJECT_BUSINESSSERVICE)
+      NetObj *object = m_parentList->get(i);
+               if (object->getObjectClass() == OBJECT_BUSINESSSERVICE)
                {
-                       ((BusinessService *)m_pParentList[i])->getApplicableTemplates(target, templates);
+                       ((BusinessService *)object)->getApplicableTemplates(target, templates);
                }
        }
-       UnlockParentList();
+       unlockParentList();
 }
 
 /**
index 52a19d8..8fed8b3 100644 (file)
@@ -30,7 +30,7 @@ BusinessServiceRoot::BusinessServiceRoot() : ServiceContainer()
        m_id = BUILTIN_OID_BUSINESSSERVICEROOT;
        _tcscpy(m_name, _T("Business Services"));
    m_guid = uuid::generate();
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 }
 
 /**
@@ -46,7 +46,6 @@ BusinessServiceRoot::~BusinessServiceRoot()
 BOOL BusinessServiceRoot::saveToDatabase(DB_HANDLE hdb)
 {
    TCHAR szQuery[1024];
-   UINT32 i;
 
    lockProperties();
 
@@ -55,13 +54,13 @@ BOOL BusinessServiceRoot::saveToDatabase(DB_HANDLE hdb)
    // Update members list
    _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("DELETE FROM container_members WHERE container_id=%d"), m_id);
    DBQuery(hdb, szQuery);
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("INSERT INTO container_members (container_id,object_id) VALUES (%d,%d)"), m_id, m_pChildList[i]->getId());
+      _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("INSERT INTO container_members (container_id,object_id) VALUES (%d,%d)"), m_id, m_childList->get(i)->getId());
       DBQuery(hdb, szQuery);
    }
-   UnlockChildList();
+   unlockChildList();
 
    // Save access list
    saveACLToDB(hdb);
index 343a19c..e55d9f7 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -203,7 +203,6 @@ BOOL Cluster::saveToDatabase(DB_HANDLE hdb)
 {
        TCHAR szQuery[4096], szIpAddr[64];
    BOOL bResult;
-   UINT32 i;
 
    // Lock object's access
    lockProperties();
@@ -224,7 +223,7 @@ BOOL Cluster::saveToDatabase(DB_HANDLE hdb)
    if (bResult)
    {
                lockDciAccess(false);
-      for(i = 0; i < (UINT32)m_dcObjects->size(); i++)
+      for(int i = 0; i < m_dcObjects->size(); i++)
          m_dcObjects->get(i)->saveToDatabase(hdb);
                unlockDciAccess();
 
@@ -233,19 +232,19 @@ BOOL Cluster::saveToDatabase(DB_HANDLE hdb)
                {
                        _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("DELETE FROM cluster_members WHERE cluster_id=%d"), m_id);
                        DBQuery(hdb, szQuery);
-                       LockChildList(FALSE);
-                       for(i = 0; i < m_dwChildCount; i++)
+                       lockChildList(false);
+                       for(int i = 0; i < m_childList->size(); i++)
                        {
-                               if (m_pChildList[i]->getObjectClass() == OBJECT_NODE)
+                               if (m_childList->get(i)->getObjectClass() == OBJECT_NODE)
                                {
                                        _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("INSERT INTO cluster_members (cluster_id,node_id) VALUES (%d,%d)"),
-                                                                m_id, m_pChildList[i]->getId());
+                                                                m_id, m_childList->get(i)->getId());
                                        bResult = DBQuery(hdb, szQuery);
                                        if (!bResult)
                                                break;
                                }
                        }
-                       UnlockChildList();
+                       unlockChildList();
                        if (bResult)
                                DBCommit(hdb);
                        else
@@ -290,7 +289,7 @@ BOOL Cluster::saveToDatabase(DB_HANDLE hdb)
                        {
                                _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("DELETE FROM cluster_resources WHERE cluster_id=%d"), m_id);
                                DBQuery(hdb, szQuery);
-                               for(i = 0; i < m_dwNumResources; i++)
+                               for(UINT32 i = 0; i < m_dwNumResources; i++)
                                {
                                        _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("INSERT INTO cluster_resources (cluster_id,resource_id,resource_name,ip_addr,current_owner) VALUES (%d,%d,%s,'%s',%d)"),
                                                   m_id, m_pResourceList[i].dwId, (const TCHAR *)DBPrepareString(hdb, m_pResourceList[i].szName),
@@ -497,17 +496,20 @@ void Cluster::statusPoll(ClientSession *pSession, UINT32 dwRqId, PollerInfo *pol
        NetObj **ppPollList;
 
    // Create polling list
-   ppPollList = (NetObj **)malloc(sizeof(NetObj *) * m_dwChildCount);
-   LockChildList(FALSE);
-   for(i = 0, dwPollListSize = 0; i < m_dwChildCount; i++)
-      if ((m_pChildList[i]->Status() != STATUS_UNMANAGED) &&
-                        (m_pChildList[i]->getObjectClass() == OBJECT_NODE))
+   ppPollList = (NetObj **)malloc(sizeof(NetObj *) * m_childList->size());
+   lockChildList(false);
+   for(i = 0, dwPollListSize = 0; i < m_childList->size(); i++)
+   {
+      NetObj *object = m_childList->get(i);
+      if ((object->getStatus() != STATUS_UNMANAGED) &&
+                        (object->getObjectClass() == OBJECT_NODE))
       {
-         m_pChildList[i]->incRefCount();
-                       ((Node *)m_pChildList[i])->lockForStatusPoll();
-         ppPollList[dwPollListSize++] = m_pChildList[i];
+         object->incRefCount();
+                       ((Node *)object)->lockForStatusPoll();
+         ppPollList[dwPollListSize++] = object;
       }
-   UnlockChildList();
+   }
+   unlockChildList();
 
        // Perform status poll on all member nodes
        DbgPrintf(6, _T("CLUSTER STATUS POLL [%s]: Polling member nodes"), m_name);
@@ -661,15 +663,15 @@ bool Cluster::isResourceOnNode(UINT32 dwResource, UINT32 dwNode)
  */
 UINT32 Cluster::collectAggregatedData(DCItem *item, TCHAR *buffer)
 {
-   LockChildList(TRUE);
-   ItemValue **values = (ItemValue **)malloc(sizeof(ItemValue *) * m_dwChildCount);
+   lockChildList(true);
+   ItemValue **values = (ItemValue **)malloc(sizeof(ItemValue *) * m_childList->size());
    int valueCount = 0;
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   for(UINT32 i = 0; i < m_childList->size(); i++)
    {
-      if (m_pChildList[i]->getObjectClass() != OBJECT_NODE)
+      if (m_childList->get(i)->getObjectClass() != OBJECT_NODE)
          continue;
 
-      Node *node = (Node *)m_pChildList[i];
+      Node *node = (Node *)m_childList->get(i);
       DCObject *dco = node->getDCObjectByTemplateId(item->getId());
       if ((dco != NULL) &&
           (dco->getType() == DCO_TYPE_ITEM) &&
@@ -682,7 +684,7 @@ UINT32 Cluster::collectAggregatedData(DCItem *item, TCHAR *buffer)
             values[valueCount++] = v;
       }
    }
-   UnlockChildList();
+   unlockChildList();
 
    UINT32 rcc = DCE_SUCCESS;
    if (valueCount > 0)
@@ -725,15 +727,15 @@ UINT32 Cluster::collectAggregatedData(DCItem *item, TCHAR *buffer)
  */
 UINT32 Cluster::collectAggregatedData(DCTable *table, Table **result)
 {
-   LockChildList(TRUE);
-   Table **values = (Table **)malloc(sizeof(Table *) * m_dwChildCount);
+   lockChildList(true);
+   Table **values = (Table **)malloc(sizeof(Table *) * m_childList->size());
    int valueCount = 0;
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      if (m_pChildList[i]->getObjectClass() != OBJECT_NODE)
+      if (m_childList->get(i)->getObjectClass() != OBJECT_NODE)
          continue;
 
-      Node *node = (Node *)m_pChildList[i];
+      Node *node = (Node *)m_childList->get(i);
       DCObject *dco = node->getDCObjectByTemplateId(table->getId());
       if ((dco != NULL) &&
           (dco->getType() == DCO_TYPE_TABLE) &&
@@ -746,7 +748,7 @@ UINT32 Cluster::collectAggregatedData(DCTable *table, Table **result)
             values[valueCount++] = v;
       }
    }
-   UnlockChildList();
+   unlockChildList();
 
    UINT32 rcc = DCE_SUCCESS;
    if (valueCount > 0)
index f0f1152..a2c1311 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -387,9 +387,9 @@ void Condition::check()
    NXSL_Value **ppValueList, *pValue;
    NetObj *pObject;
    UINT32 i, dwNumValues;
-   int iOldStatus = m_iStatus;
+   int iOldStatus = m_status;
 
-   if ((m_script == NULL) || (m_iStatus == STATUS_UNMANAGED) || IsShutdownInProgress())
+   if ((m_script == NULL) || (m_status == STATUS_UNMANAGED) || IsShutdownInProgress())
       return;
 
    lockProperties();
@@ -444,14 +444,14 @@ void Condition::check()
          {
             // Deactivate condition
             lockProperties();
-            m_iStatus = m_inactiveStatus;
+            m_status = m_inactiveStatus;
             m_isActive = FALSE;
             setModified();
             unlockProperties();
 
             PostEvent(m_deactivationEventCode,
                       (m_sourceObject == 0) ? g_dwMgmtNode : m_sourceObject,
-                      "dsdd", m_id, m_name, iOldStatus, m_iStatus);
+                      "dsdd", m_id, m_name, iOldStatus, m_status);
 
             DbgPrintf(6, _T("Condition %d \"%s\" deactivated"),
                       m_id, m_name);
@@ -461,9 +461,9 @@ void Condition::check()
             DbgPrintf(6, _T("Condition %d \"%s\" still inactive"),
                       m_id, m_name);
             lockProperties();
-            if (m_iStatus != m_inactiveStatus)
+            if (m_status != m_inactiveStatus)
             {
-               m_iStatus = m_inactiveStatus;
+               m_status = m_inactiveStatus;
                setModified();
             }
             unlockProperties();
@@ -475,14 +475,14 @@ void Condition::check()
          {
             // Activate condition
             lockProperties();
-            m_iStatus = m_activeStatus;
+            m_status = m_activeStatus;
             m_isActive = TRUE;
             setModified();
             unlockProperties();
 
             PostEvent(m_activationEventCode,
                       (m_sourceObject == 0) ? g_dwMgmtNode : m_sourceObject,
-                      "dsdd", m_id, m_name, iOldStatus, m_iStatus);
+                      "dsdd", m_id, m_name, iOldStatus, m_status);
 
             DbgPrintf(6, _T("Condition %d \"%s\" activated"),
                       m_id, m_name);
@@ -492,9 +492,9 @@ void Condition::check()
             DbgPrintf(6, _T("Condition %d \"%s\" still active"),
                       m_id, m_name);
             lockProperties();
-            if (m_iStatus != m_activeStatus)
+            if (m_status != m_activeStatus)
             {
-               m_iStatus = m_activeStatus;
+               m_status = m_activeStatus;
                setModified();
             }
             unlockProperties();
@@ -507,9 +507,9 @@ void Condition::check()
                "dss", m_id, m_name, m_script->getErrorText());
 
       lockProperties();
-      if (m_iStatus != STATUS_UNKNOWN)
+      if (m_status != STATUS_UNKNOWN)
       {
-         m_iStatus = STATUS_UNKNOWN;
+         m_status = STATUS_UNKNOWN;
          setModified();
       }
       unlockProperties();
@@ -517,12 +517,12 @@ void Condition::check()
    free(ppValueList);
 
    // Cause parent object(s) to recalculate it's status
-   if (iOldStatus != m_iStatus)
+   if (iOldStatus != m_status)
    {
-      LockParentList(FALSE);
-      for(i = 0; i < m_dwParentCount; i++)
-         m_pParentList[i]->calculateCompoundStatus();
-      UnlockParentList();
+      lockParentList(false);
+      for(int i = 0; i < m_parentList->size(); i++)
+         m_parentList->get(i)->calculateCompoundStatus();
+      unlockParentList();
    }
 }
 
index b3e0556..b48cce3 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -167,13 +167,13 @@ BOOL Container::saveToDatabase(DB_HANDLE hdb)
                // Update members list
                _sntprintf(query, sizeof(query) / sizeof(TCHAR), _T("DELETE FROM container_members WHERE container_id=%d"), m_id);
                DBQuery(hdb, query);
-               LockChildList(FALSE);
-               for(UINT32 i = 0; i < m_dwChildCount; i++)
+               lockChildList(false);
+               for(int i = 0; i < m_childList->size(); i++)
                {
-                       _sntprintf(query, sizeof(query) / sizeof(TCHAR), _T("INSERT INTO container_members (container_id,object_id) VALUES (%d,%d)"), m_id, m_pChildList[i]->getId());
+                       _sntprintf(query, sizeof(query) / sizeof(TCHAR), _T("INSERT INTO container_members (container_id,object_id) VALUES (%d,%d)"), m_id, m_childList->get(i)->getId());
                        DBQuery(hdb, query);
                }
-               UnlockChildList();
+               unlockChildList();
 
                // Save access list
                saveACLToDB(hdb);
@@ -234,10 +234,10 @@ void Container::calculateCompoundStatus(BOOL bForcedRecalc)
 {
        NetObj::calculateCompoundStatus(bForcedRecalc);
 
-       if ((m_iStatus == STATUS_UNKNOWN) && (m_dwChildIdListSize == 0))
+       if ((m_status == STATUS_UNKNOWN) && (m_dwChildIdListSize == 0))
    {
                lockProperties();
-               m_iStatus = STATUS_NORMAL;
+               m_status = STATUS_NORMAL;
                setModified();
                unlockProperties();
        }
index 923abde..774f03b 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -133,7 +133,7 @@ static void C_SysNodeDown(Node *pNode, Event *pEvent)
          // Next hop is behind VPN tunnel
          VPNConnector *vpnConn = (VPNConnector *)FindObjectById(hop->ifIndex, OBJECT_VPNCONNECTOR);
          if ((vpnConn != NULL) &&
-             (vpnConn->Status() == STATUS_CRITICAL))
+             (vpnConn->getStatus() == STATUS_CRITICAL))
          {
             /* TODO: set root id */
          }
@@ -141,7 +141,7 @@ static void C_SysNodeDown(Node *pNode, Event *pEvent)
       else
       {
          Interface *pInterface = ((Node *)hop->object)->findInterfaceByIndex(hop->ifIndex);
-         if ((pInterface != NULL) && ((pInterface->Status() == STATUS_CRITICAL) || (pInterface->Status() == STATUS_DISABLED)))
+         if ((pInterface != NULL) && ((pInterface->getStatus() == STATUS_CRITICAL) || (pInterface->getStatus() == STATUS_DISABLED)))
          {
                                DbgPrintf(5, _T("C_SysNodeDown: upstream interface %s [%d] on node %s [%d] for current node %s [%d] is down"),
                                          pInterface->getName(), pInterface->getId(), hop->object->getName(), hop->object->getId(), pNode->getName(), pNode->getId());
index 2ed83c7..6e72816 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2011 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -32,7 +32,7 @@ Dashboard::Dashboard() : Container()
        m_elements->setOwner(true);
        m_numColumns = 1;
        m_options = 0;
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 }
 
 /**
@@ -44,7 +44,7 @@ Dashboard::Dashboard(const TCHAR *name) : Container(name, 0)
        m_elements->setOwner(true);
        m_numColumns = 1;
        m_options = 0;
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 }
 
 /**
@@ -60,7 +60,7 @@ Dashboard::~Dashboard()
  */
 void Dashboard::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
 
 /**
@@ -71,7 +71,7 @@ bool Dashboard::loadFromDatabase(DB_HANDLE hdb, UINT32 dwId)
        if (!Container::loadFromDatabase(hdb, dwId))
                return false;
 
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 
        TCHAR query[256];
        _sntprintf(query, 256, _T("SELECT num_columns,options FROM dashboards WHERE id=%d"), (int)dwId);
index 22e5a13..e162b4e 100644 (file)
@@ -454,7 +454,7 @@ UINT32 DataCollectionTarget::getThresholdSummary(NXCPMessage *msg, UINT32 baseId
    for(int i = 0; i < m_dcObjects->size(); i++)
        {
                DCObject *object = m_dcObjects->get(i);
-               if (object->hasValue() && (object->getType() == DCO_TYPE_ITEM) && object->getStatus() == ITEM_STATUS_ACTIVE)
+               if (object->hasValue() && (object->getType() == DCO_TYPE_ITEM) && (object->getStatus() == ITEM_STATUS_ACTIVE))
                {
                        if (((DCItem *)object)->hasActiveThreshold())
                        {
@@ -496,7 +496,7 @@ bool DataCollectionTarget::isDataCollectionDisabled()
  */
 void DataCollectionTarget::queueItemsForPolling(Queue *pPollerQueue)
 {
-   if ((m_iStatus == STATUS_UNMANAGED) || isDataCollectionDisabled() || m_isDeleted)
+   if ((m_status == STATUS_UNMANAGED) || isDataCollectionDisabled() || m_isDeleted)
       return;  // Do not collect data for unmanaged objects or if data collection is disabled
 
    time_t currTime = time(NULL);
@@ -532,17 +532,18 @@ NetObj *DataCollectionTarget::objectFromParameter(const TCHAR *param)
 
    // Find child object with requested ID or name
    NetObj *object = NULL;
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      if (((objectId == 0) && (!_tcsicmp(m_pChildList[i]->getName(), arg))) ||
-          (objectId == m_pChildList[i]->getId()))
+      NetObj *curr = m_childList->get(i);
+      if (((objectId == 0) && (!_tcsicmp(curr->getName(), arg))) ||
+          (objectId == curr->getId()))
       {
-         object = m_pChildList[i];
+         object = curr;
          break;
       }
    }
-   UnlockChildList();
+   unlockChildList();
    return object;
 }
 
@@ -555,7 +556,7 @@ UINT32 DataCollectionTarget::getInternalItem(const TCHAR *param, size_t bufSize,
 
    if (!_tcsicmp(param, _T("Status")))
    {
-      _sntprintf(buffer, bufSize, _T("%d"), m_iStatus);
+      _sntprintf(buffer, bufSize, _T("%d"), m_status);
    }
    else if (!_tcsicmp(param, _T("Dummy")) || MatchString(_T("Dummy(*)"), param, FALSE))
    {
@@ -566,7 +567,7 @@ UINT32 DataCollectionTarget::getInternalItem(const TCHAR *param, size_t bufSize,
       NetObj *object = objectFromParameter(param);
       if (object != NULL)
       {
-         _sntprintf(buffer, bufSize, _T("%d"), object->Status());
+         _sntprintf(buffer, bufSize, _T("%d"), object->getStatus());
       }
       else
       {
@@ -598,7 +599,7 @@ UINT32 DataCollectionTarget::getInternalItem(const TCHAR *param, size_t bufSize,
       {
                        if (pObject->isTrustedNode(m_id))
                        {
-                               _sntprintf(buffer, bufSize, _T("%d"), pObject->Status());
+                               _sntprintf(buffer, bufSize, _T("%d"), pObject->getStatus());
                        }
                        else
                        {
@@ -944,3 +945,11 @@ void DataCollectionTarget::updateDCItemCacheSize(UINT32 dciId, UINT32 conditionI
    }
    unlockDciAccess();
 }
+
+/**
+ * Returns true if object is data collection target
+ */
+bool DataCollectionTarget::isDataCollectionTarget()
+{
+   return true;
+}
index 60ebbaa..482c93b 100644 (file)
@@ -471,12 +471,12 @@ void Interface::statusPoll(ClientSession *session, UINT32 rqId, Queue *eventQueu
    Node *pNode = getParentNode();
    if (pNode == NULL)
    {
-      m_iStatus = STATUS_UNKNOWN;
+      m_status = STATUS_UNKNOWN;
       return;     // Cannot find parent node, which is VERY strange
    }
 
    sendPollerMsg(rqId, _T("   Starting status poll on interface %s\r\n"), m_name);
-   sendPollerMsg(rqId, _T("      Current interface status is %s\r\n"), GetStatusAsText(m_iStatus, true));
+   sendPollerMsg(rqId, _T("      Current interface status is %s\r\n"), GetStatusAsText(m_status, true));
 
        InterfaceAdminState adminState = IF_ADMIN_STATE_UNKNOWN;
        InterfaceOperState operState = IF_OPER_STATE_UNKNOWN;
@@ -534,7 +534,7 @@ void Interface::statusPoll(ClientSession *session, UINT32 rqId, Queue *eventQueu
    }
 
        // Calculate interface object status based on admin state, oper state, and expected state
-   int oldStatus = m_iStatus;
+   int oldStatus = m_status;
        int newStatus;
        int expectedState = (m_flags & IF_EXPECTED_STATE_MASK) >> 28;
        switch(adminState)
@@ -663,27 +663,27 @@ void Interface::statusPoll(ClientSession *session, UINT32 rqId, Queue *eventQueu
                        EVENT_INTERFACE_TESTING   // Testing
                };
 
-               DbgPrintf(7, _T("Interface::StatusPoll(%d,%s): status changed from %d to %d"), m_id, m_name, m_iStatus, newStatus);
-               m_iStatus = newStatus;
+               DbgPrintf(7, _T("Interface::StatusPoll(%d,%s): status changed from %d to %d"), m_id, m_name, m_status, newStatus);
+               m_status = newStatus;
                m_pendingStatus = -1;   // Invalidate pending status
       if (!m_isSystem)
       {
-                  sendPollerMsg(rqId, _T("      Interface status changed to %s\r\n"), GetStatusAsText(m_iStatus, true));
+                  sendPollerMsg(rqId, _T("      Interface status changed to %s\r\n"), GetStatusAsText(m_status, true));
          const InetAddress& addr = m_ipAddressList.getFirstUnicastAddress();
                   PostEventEx(eventQueue,
-                              (expectedState == IF_EXPECTED_STATE_DOWN) ? statusToEventInverted[m_iStatus] : statusToEvent[m_iStatus],
+                              (expectedState == IF_EXPECTED_STATE_DOWN) ? statusToEventInverted[m_status] : statusToEvent[m_status],
                      pNode->getId(), "dsAdd", m_id, m_name, &addr, addr.getMaskBits(), m_index);
       }
    }
        else if (expectedState == IF_EXPECTED_STATE_IGNORE)
        {
-               m_iStatus = (newStatus <= STATUS_CRITICAL) ? STATUS_NORMAL : newStatus;
-               if (m_iStatus != oldStatus)
+               m_status = (newStatus <= STATUS_CRITICAL) ? STATUS_NORMAL : newStatus;
+               if (m_status != oldStatus)
                        m_pendingStatus = -1;   // Invalidate pending status
        }
 
        lockProperties();
-       if ((m_iStatus != oldStatus) || (adminState != (int)m_adminState) || (operState != (int)m_operState))
+       if ((m_status != oldStatus) || (adminState != (int)m_adminState) || (operState != (int)m_operState))
        {
                m_adminState = (WORD)adminState;
                m_operState = (WORD)operState;
@@ -691,7 +691,7 @@ void Interface::statusPoll(ClientSession *session, UINT32 rqId, Queue *eventQueu
        }
        unlockProperties();
 
-       sendPollerMsg(rqId, _T("      Interface status after poll is %s\r\n"), GetStatusAsText(m_iStatus, true));
+       sendPollerMsg(rqId, _T("      Interface status after poll is %s\r\n"), GetStatusAsText(m_status, true));
        sendPollerMsg(rqId, _T("   Finished status poll on interface %s\r\n"), m_name);
 }
 
@@ -1103,17 +1103,16 @@ UINT32 Interface::wakeUp()
  */
 Node *Interface::getParentNode()
 {
-   UINT32 i;
    Node *pNode = NULL;
 
-   LockParentList(FALSE);
-   for(i = 0; i < m_dwParentCount; i++)
-      if (m_pParentList[i]->getObjectClass() == OBJECT_NODE)
+   lockParentList(false);
+   for(int i = 0; i < m_parentList->size(); i++)
+      if (m_parentList->get(i)->getObjectClass() == OBJECT_NODE)
       {
-         pNode = (Node *)m_pParentList[i];
+         pNode = (Node *)m_parentList->get(i);
          break;
       }
-   UnlockParentList();
+   unlockParentList();
    return pNode;
 }
 
index dc55516..cfbf4d6 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -328,10 +328,10 @@ void MobileDevice::calculateCompoundStatus(BOOL bForcedRecalc)
    NetObj::calculateCompoundStatus(bForcedRecalc);
 
    // Assume normal status by default for mobile device
-   if (m_iStatus == STATUS_UNKNOWN)
+   if (m_status == STATUS_UNKNOWN)
    {
       lockProperties();
-      m_iStatus = STATUS_NORMAL;
+      m_status = STATUS_NORMAL;
       setModified();
       unlockProperties();
    }
index 50e041f..c3185e9 100644 (file)
@@ -27,7 +27,7 @@
  */
 void NetworkMapGroup::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
 
 /**
@@ -48,7 +48,7 @@ NetworkMap::NetworkMap() : NetObj()
        m_discoveryRadius = -1;
        m_flags = MF_SHOW_STATUS_ICON;
        m_layout = MAP_LAYOUT_MANUAL;
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
        m_backgroundLatitude = 0;
        m_backgroundLongitude = 0;
        m_backgroundZoom = 1;
@@ -73,7 +73,7 @@ NetworkMap::NetworkMap(int type, UINT32 seed) : NetObj()
        m_discoveryRadius = -1;
        m_flags = MF_SHOW_STATUS_ICON;
    m_layout = (type == NETMAP_USER_DEFINED) ? MAP_LAYOUT_MANUAL : MAP_LAYOUT_SPRING;
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
        m_backgroundLatitude = 0;
        m_backgroundLongitude = 0;
        m_backgroundZoom = 1;
@@ -107,22 +107,22 @@ void NetworkMap::calculateCompoundStatus(BOOL bForcedRecalc)
 {
    if (m_flags & MF_CALCULATE_STATUS)
    {
-      if (m_iStatus != STATUS_UNMANAGED)
+      if (m_status != STATUS_UNMANAGED)
       {
          int iMostCriticalStatus, iCount, iStatusAlg;
-         int nSingleThreshold, *pnThresholds, iOldStatus = m_iStatus;
+         int nSingleThreshold, *pnThresholds, iOldStatus = m_status;
          int nRating[5], iChildStatus, nThresholds[4];
 
          lockProperties();
-         if (m_iStatusCalcAlg == SA_CALCULATE_DEFAULT)
+         if (m_statusCalcAlg == SA_CALCULATE_DEFAULT)
          {
             iStatusAlg = GetDefaultStatusCalculation(&nSingleThreshold, &pnThresholds);
          }
          else
          {
-            iStatusAlg = m_iStatusCalcAlg;
-            nSingleThreshold = m_iStatusSingleThreshold;
-            pnThresholds = m_iStatusThresholds;
+            iStatusAlg = m_statusCalcAlg;
+            nSingleThreshold = m_statusSingleThreshold;
+            pnThresholds = m_statusThresholds;
          }
          if (iStatusAlg == SA_CALCULATE_SINGLE_THRESHOLD)
          {
@@ -154,11 +154,11 @@ void NetworkMap::calculateCompoundStatus(BOOL bForcedRecalc)
                      iCount++;
                   }
                }
-               m_iStatus = (iCount > 0) ? iMostCriticalStatus : STATUS_NORMAL;
+               m_status = (iCount > 0) ? iMostCriticalStatus : STATUS_NORMAL;
                break;
             case SA_CALCULATE_SINGLE_THRESHOLD:
             case SA_CALCULATE_MULTIPLE_THRESHOLDS:
-               // Step 1: calculate severity raitings
+               // Step 1: calculate severity ratings
                memset(nRating, 0, sizeof(int) * 5);
                iCount = 0;
                for(int i = 0; i < m_elements->size(); i++)
@@ -179,7 +179,6 @@ void NetworkMap::calculateCompoundStatus(BOOL bForcedRecalc)
                      iCount++;
                   }
                }
-               UnlockChildList();
 
                // Step 2: check what severity rating is above threshold
                if (iCount > 0)
@@ -188,26 +187,26 @@ void NetworkMap::calculateCompoundStatus(BOOL bForcedRecalc)
                   for(i = 4; i > 0; i--)
                      if (nRating[i] * 100 / iCount >= pnThresholds[i - 1])
                         break;
-                  m_iStatus = i;
+                  m_status = i;
                }
                else
                {
-                  m_iStatus = STATUS_NORMAL;
+                  m_status = STATUS_NORMAL;
                }
                break;
             default:
-               m_iStatus = STATUS_NORMAL;
+               m_status = STATUS_NORMAL;
                break;
          }
          unlockProperties();
 
          // Cause parent object(s) to recalculate it's status
-         if ((iOldStatus != m_iStatus) || bForcedRecalc)
+         if ((iOldStatus != m_status) || bForcedRecalc)
          {
-            LockParentList(FALSE);
-            for(UINT32 i = 0; i < m_dwParentCount; i++)
-               m_pParentList[i]->calculateCompoundStatus();
-            UnlockParentList();
+            lockParentList(false);
+            for(UINT32 i = 0; i < m_parentList->size(); i++)
+               m_parentList->get(i)->calculateCompoundStatus();
+            unlockParentList();
             lockProperties();
             setModified();
             unlockProperties();
@@ -216,13 +215,13 @@ void NetworkMap::calculateCompoundStatus(BOOL bForcedRecalc)
    }
    else
    {
-      if (m_iStatus != STATUS_NORMAL)
+      if (m_status != STATUS_NORMAL)
       {
-         m_iStatus = STATUS_NORMAL;
-         LockParentList(FALSE);
-         for(UINT32 i = 0; i < m_dwParentCount; i++)
-            m_pParentList[i]->calculateCompoundStatus();
-         UnlockParentList();
+         m_status = STATUS_NORMAL;
+         lockParentList(false);
+         for(UINT32 i = 0; i < m_parentList->size(); i++)
+            m_parentList->get(i)->calculateCompoundStatus();
+         unlockParentList();
          lockProperties();
          setModified();
          unlockProperties();
@@ -466,7 +465,7 @@ bool NetworkMap::loadFromDatabase(DB_HANDLE hdb, UINT32 dwId)
       }
        }
 
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 
        return true;
 }
index aaa17f7..6439f7e 100644 (file)
@@ -53,34 +53,32 @@ NetObj::NetObj()
    m_mutexACL = MutexCreate();
    m_rwlockParentList = RWLockCreate();
    m_rwlockChildList = RWLockCreate();
-   m_iStatus = STATUS_UNKNOWN;
+   m_status = STATUS_UNKNOWN;
    m_name[0] = 0;
-   m_pszComments = NULL;
+   m_comments = NULL;
    m_isModified = false;
    m_isDeleted = false;
    m_isHidden = false;
        m_isSystem = false;
        m_maintenanceMode = false;
        m_maintenanceEventId = 0;
-   m_dwChildCount = 0;
-   m_pChildList = NULL;
-   m_dwParentCount = 0;
-   m_pParentList = NULL;
+   m_childList = new ObjectArray<NetObj>(0, 16, false);
+   m_parentList = new ObjectArray<NetObj>(4, 4, false);
    m_accessList = new AccessList();
    m_inheritAccessRights = true;
        m_dwNumTrustedNodes = 0;
        m_pdwTrustedNodes = NULL;
    m_pollRequestor = NULL;
-   m_iStatusCalcAlg = SA_CALCULATE_DEFAULT;
-   m_iStatusPropAlg = SA_PROPAGATE_DEFAULT;
-   m_iFixedStatus = STATUS_WARNING;
-   m_iStatusShift = 0;
-   m_iStatusSingleThreshold = 75;
+   m_statusCalcAlg = SA_CALCULATE_DEFAULT;
+   m_statusPropAlg = SA_PROPAGATE_DEFAULT;
+   m_fixedStatus = STATUS_WARNING;
+   m_statusShift = 0;
+   m_statusSingleThreshold = 75;
    m_dwTimeStamp = 0;
    for(i = 0; i < 4; i++)
    {
-      m_iStatusTranslation[i] = i + 1;
-      m_iStatusThresholds[i] = 80 - i * 20;
+      m_statusTranslation[i] = i + 1;
+      m_statusThresholds[i] = 80 - i * 20;
    }
        m_submapId = 0;
    m_moduleData = NULL;
@@ -98,11 +96,11 @@ NetObj::~NetObj()
    MutexDestroy(m_mutexACL);
    RWLockDestroy(m_rwlockParentList);
    RWLockDestroy(m_rwlockChildList);
-   safe_free(m_pChildList);
-   safe_free(m_pParentList);
+   delete m_childList;
+   delete m_parentList;
    delete m_accessList;
        safe_free(m_pdwTrustedNodes);
-   safe_free(m_pszComments);
+   safe_free(m_comments);
    delete m_moduleData;
    delete m_postalAddress;
    delete m_dashboards;
@@ -213,19 +211,19 @@ bool NetObj::loadCommonProperties(DB_HANDLE hdb)
                        if (DBGetNumRows(hResult) > 0)
                        {
                                DBGetField(hResult, 0, 0, m_name, MAX_OBJECT_NAME);
-                               m_iStatus = DBGetFieldLong(hResult, 0, 1);
+                               m_status = DBGetFieldLong(hResult, 0, 1);
                                m_isDeleted = DBGetFieldLong(hResult, 0, 2) ? true : false;
                                m_inheritAccessRights = DBGetFieldLong(hResult, 0, 3) ? true : false;
                                m_dwTimeStamp = DBGetFieldULong(hResult, 0, 4);
-                               m_iStatusCalcAlg = DBGetFieldLong(hResult, 0, 5);
-                               m_iStatusPropAlg = DBGetFieldLong(hResult, 0, 6);
-                               m_iFixedStatus = DBGetFieldLong(hResult, 0, 7);
-                               m_iStatusShift = DBGetFieldLong(hResult, 0, 8);
-                               DBGetFieldByteArray(hResult, 0, 9, m_iStatusTranslation, 4, STATUS_WARNING);
-                               m_iStatusSingleThreshold = DBGetFieldLong(hResult, 0, 10);
-                               DBGetFieldByteArray(hResult, 0, 11, m_iStatusThresholds, 4, 50);
-                               safe_free(m_pszComments);
-                               m_pszComments = DBGetField(hResult, 0, 12, NULL, 0);
+                               m_statusCalcAlg = DBGetFieldLong(hResult, 0, 5);
+                               m_statusPropAlg = DBGetFieldLong(hResult, 0, 6);
+                               m_fixedStatus = DBGetFieldLong(hResult, 0, 7);
+                               m_statusShift = DBGetFieldLong(hResult, 0, 8);
+                               DBGetFieldByteArray(hResult, 0, 9, m_statusTranslation, 4, STATUS_WARNING);
+                               m_statusSingleThreshold = DBGetFieldLong(hResult, 0, 10);
+                               DBGetFieldByteArray(hResult, 0, 11, m_statusThresholds, 4, 50);
+                               safe_free(m_comments);
+                               m_comments = DBGetField(hResult, 0, 12, NULL, 0);
                                m_isSystem = DBGetFieldLong(hResult, 0, 13) ? true : false;
 
                                int locType = DBGetFieldLong(hResult, 0, 14);
@@ -398,25 +396,25 @@ bool NetObj::saveCommonProperties(DB_HANDLE hdb)
    TCHAR szTranslation[16], szThresholds[16], lat[32], lon[32];
    for(int i = 0, j = 0; i < 4; i++, j += 2)
    {
-      _sntprintf(&szTranslation[j], 16 - j, _T("%02X"), (BYTE)m_iStatusTranslation[i]);
-      _sntprintf(&szThresholds[j], 16 - j, _T("%02X"), (BYTE)m_iStatusThresholds[i]);
+      _sntprintf(&szTranslation[j], 16 - j, _T("%02X"), (BYTE)m_statusTranslation[i]);
+      _sntprintf(&szThresholds[j], 16 - j, _T("%02X"), (BYTE)m_statusThresholds[i]);
    }
        _sntprintf(lat, 32, _T("%f"), m_geoLocation.getLatitude());
        _sntprintf(lon, 32, _T("%f"), m_geoLocation.getLongitude());
 
        DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, m_name, DB_BIND_STATIC);
-       DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, (LONG)m_iStatus);
+       DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, (LONG)m_status);
    DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, (LONG)(m_isDeleted ? 1 : 0));
        DBBind(hStmt, 4, DB_SQLTYPE_INTEGER, (LONG)(m_inheritAccessRights ? 1 : 0));
        DBBind(hStmt, 5, DB_SQLTYPE_INTEGER, (LONG)m_dwTimeStamp);
-       DBBind(hStmt, 6, DB_SQLTYPE_INTEGER, (LONG)m_iStatusCalcAlg);
-       DBBind(hStmt, 7, DB_SQLTYPE_INTEGER, (LONG)m_iStatusPropAlg);
-       DBBind(hStmt, 8, DB_SQLTYPE_INTEGER, (LONG)m_iFixedStatus);
-       DBBind(hStmt, 9, DB_SQLTYPE_INTEGER, (LONG)m_iStatusShift);
+       DBBind(hStmt, 6, DB_SQLTYPE_INTEGER, (LONG)m_statusCalcAlg);
+       DBBind(hStmt, 7, DB_SQLTYPE_INTEGER, (LONG)m_statusPropAlg);
+       DBBind(hStmt, 8, DB_SQLTYPE_INTEGER, (LONG)m_fixedStatus);
+       DBBind(hStmt, 9, DB_SQLTYPE_INTEGER, (LONG)m_statusShift);
        DBBind(hStmt, 10, DB_SQLTYPE_VARCHAR, szTranslation, DB_BIND_STATIC);
-       DBBind(hStmt, 11, DB_SQLTYPE_INTEGER, (LONG)m_iStatusSingleThreshold);
+       DBBind(hStmt, 11, DB_SQLTYPE_INTEGER, (LONG)m_statusSingleThreshold);
        DBBind(hStmt, 12, DB_SQLTYPE_VARCHAR, szThresholds, DB_BIND_STATIC);
-       DBBind(hStmt, 13, DB_SQLTYPE_VARCHAR, m_pszComments, DB_BIND_STATIC);
+       DBBind(hStmt, 13, DB_SQLTYPE_VARCHAR, m_comments, DB_BIND_STATIC);
    DBBind(hStmt, 14, DB_SQLTYPE_INTEGER, (LONG)(m_isSystem ? 1 : 0));
        DBBind(hStmt, 15, DB_SQLTYPE_INTEGER, (LONG)m_geoLocation.getType());
        DBBind(hStmt, 16, DB_SQLTYPE_VARCHAR, lat, DB_BIND_STATIC);
@@ -505,16 +503,11 @@ bool NetObj::saveCommonProperties(DB_HANDLE hdb)
  */
 void NetObj::addChild(NetObj *object)
 {
-   LockChildList(TRUE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i] == object)
-      {
-         UnlockChildList();
-         return;     // Already in the child list
-      }
-   m_pChildList = (NetObj **)realloc(m_pChildList, sizeof(NetObj *) * (m_dwChildCount + 1));
-   m_pChildList[m_dwChildCount++] = object;
-   UnlockChildList();
+   lockChildList(true);
+   if (m_childList->contains(object))
+      return;     // Already in the child list
+   m_childList->add(object);
+   unlockChildList();
        incRefCount();
    setModified();
    DbgPrintf(7, _T("NetObj::addChild: this=%s [%d]; object=%s [%d]"), m_name, m_id, object->m_name, object->m_id);
@@ -525,16 +518,11 @@ void NetObj::addChild(NetObj *object)
  */
 void NetObj::addParent(NetObj *object)
 {
-   LockParentList(TRUE);
-   for(UINT32 i = 0; i < m_dwParentCount; i++)
-      if (m_pParentList[i] == object)
-      {
-         UnlockParentList();
-         return;     // Already in the parents list
-      }
-   m_pParentList = (NetObj **)realloc(m_pParentList, sizeof(NetObj *) * (m_dwParentCount + 1));
-   m_pParentList[m_dwParentCount++] = object;
-   UnlockParentList();
+   lockParentList(true);
+   if (m_parentList->contains(object))
+      return;     // Already in the parents list
+   m_parentList->add(object);
+   unlockParentList();
        incRefCount();
    setModified();
    DbgPrintf(7, _T("NetObj::addParent: this=%s [%d]; object=%s [%d]"), m_name, m_id, object->m_name, object->m_id);
@@ -545,33 +533,22 @@ void NetObj::addParent(NetObj *object)
  */
 void NetObj::deleteChild(NetObj *object)
 {
-   UINT32 i;
+   int i;
 
-   LockChildList(TRUE);
-   for(i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i] == object)
+   lockChildList(true);
+   for(i = 0; i < m_childList->size(); i++)
+      if (m_childList->get(i) == object)
          break;
 
-   if (i == m_dwChildCount)   // No such object
+   if (i == m_childList->size())   // No such object
    {
-      UnlockChildList();
+      unlockChildList();
       return;
    }
 
    DbgPrintf(7, _T("NetObj::deleteChild: this=%s [%d]; object=%s [%d]"), m_name, m_id, object->m_name, object->m_id);
-
-   m_dwChildCount--;
-   if (m_dwChildCount > 0)
-   {
-      memmove(&m_pChildList[i], &m_pChildList[i + 1], sizeof(NetObj *) * (m_dwChildCount - i));
-      m_pChildList = (NetObj **)realloc(m_pChildList, sizeof(NetObj *) * m_dwChildCount);
-   }
-   else
-   {
-      free(m_pChildList);
-      m_pChildList = NULL;
-   }
-   UnlockChildList();
+   m_childList->remove(i);
+   unlockChildList();
        decRefCount();
    setModified();
 }
@@ -581,32 +558,22 @@ void NetObj::deleteChild(NetObj *object)
  */
 void NetObj::deleteParent(NetObj *object)
 {
-   UINT32 i;
+   int i;
 
-   LockParentList(TRUE);
-   for(i = 0; i < m_dwParentCount; i++)
-      if (m_pParentList[i] == object)
+   lockParentList(true);
+   for(i = 0; i < m_parentList->size(); i++)
+      if (m_parentList->get(i) == object)
          break;
-   if (i == m_dwParentCount)   // No such object
+   if (i == m_parentList->size())   // No such object
    {
-      UnlockParentList();
+      unlockParentList();
       return;
    }
 
    DbgPrintf(7, _T("NetObj::deleteParent: this=%s [%d]; object=%s [%d]"), m_name, m_id, object->m_name, object->m_id);
 
-   m_dwParentCount--;
-   if (m_dwParentCount > 0)
-   {
-      memmove(&m_pParentList[i], &m_pParentList[i + 1], sizeof(NetObj *) * (m_dwParentCount - i));
-      m_pParentList = (NetObj **)realloc(m_pParentList, sizeof(NetObj *) * m_dwParentCount);
-   }
-   else
-   {
-      free(m_pParentList);
-      m_pParentList = NULL;
-   }
-   UnlockParentList();
+   m_parentList->remove(i);
+   unlockParentList();
        decRefCount();
    setModified();
 }
@@ -647,57 +614,55 @@ void NetObj::deleteObject(NetObj *initiator)
    // Delete references to this object from child objects
    DbgPrintf(5, _T("NetObj::deleteObject(): clearing child list for object %d"), m_id);
    ObjectArray<NetObj> *deleteList = NULL;
-   LockChildList(TRUE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   lockChildList(true);
+   for(UINT32 i = 0; i < m_childList->size(); i++)
    {
-      if (m_pChildList[i]->getParentCount() == 1)
+      NetObj *o = m_childList->get(i);
+      if (o->getParentCount() == 1)
       {
          // last parent, delete object
          if (deleteList == NULL)
             deleteList = new ObjectArray<NetObj>(16, 16, false);
-                       deleteList->add(m_pChildList[i]);
+                       deleteList->add(o);
       }
       else
       {
-         m_pChildList[i]->deleteParent(this);
+         o->deleteParent(this);
       }
                decRefCount();
    }
-   free(m_pChildList);
-   m_pChildList = NULL;
-   m_dwChildCount = 0;
-   UnlockChildList();
+   m_childList->clear();
+   unlockChildList();
 
    // Delete orphaned child objects
    if (deleteList != NULL)
    {
       for(int i = 0; i < deleteList->size(); i++)
       {
-         NetObj *o = deleteList->get(i);
-         DbgPrintf(5, _T("NetObj::deleteObject(): calling deleteObject() on %s [%d]"), o->getName(), o->getId());
-         o->deleteObject(this);
+         NetObj *obj = deleteList->get(i);
+         DbgPrintf(5, _T("NetObj::deleteObject(): calling deleteObject() on %s [%d]"), obj->getName(), obj->getId());
+         obj->deleteObject(this);
       }
       delete deleteList;
    }
 
    // Remove references to this object from parent objects
    DbgPrintf(5, _T("NetObj::Delete(): clearing parent list for object %d"), m_id);
-   LockParentList(TRUE);
-   for(UINT32 i = 0; i < m_dwParentCount; i++)
+   lockParentList(true);
+   for(int i = 0; i < m_parentList->size(); i++)
    {
       // If parent is deletion initiator then this object already
       // removed from parent's list
-      if (m_pParentList[i] != initiator)
+      NetObj *obj = m_parentList->get(i);
+      if (obj != initiator)
       {
-         m_pParentList[i]->deleteChild(this);
-         m_pParentList[i]->calculateCompoundStatus();
+         obj->deleteChild(this);
+         obj->calculateCompoundStatus();
       }
                decRefCount();
    }
-   free(m_pParentList);
-   m_pParentList = NULL;
-   m_dwParentCount = 0;
-   UnlockParentList();
+   m_parentList->clear();
+   unlockParentList();
 
    lockProperties();
    m_isHidden = false;
@@ -724,18 +689,16 @@ void NetObj::onObjectDelete(UINT32 dwObjectId)
  */
 const TCHAR *NetObj::dbgGetChildList(TCHAR *szBuffer)
 {
-   UINT32 i;
    TCHAR *pBuf = szBuffer;
-
    *pBuf = 0;
-   LockChildList(FALSE);
-   for(i = 0, pBuf = szBuffer; i < m_dwChildCount; i++)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      _sntprintf(pBuf, 10, _T("%d "), m_pChildList[i]->getId());
+      _sntprintf(pBuf, 10, _T("%d "), m_childList->get(i)->getId());
       while(*pBuf)
          pBuf++;
    }
-   UnlockChildList();
+   unlockChildList();
    if (pBuf != szBuffer)
       *(pBuf - 1) = 0;
    return szBuffer;
@@ -746,18 +709,16 @@ const TCHAR *NetObj::dbgGetChildList(TCHAR *szBuffer)
  */
 const TCHAR *NetObj::dbgGetParentList(TCHAR *szBuffer)
 {
-   UINT32 i;
    TCHAR *pBuf = szBuffer;
-
    *pBuf = 0;
-   LockParentList(FALSE);
-   for(i = 0; i < m_dwParentCount; i++)
+   lockParentList(false);
+   for(int i = 0; i < m_parentList->size(); i++)
    {
-      _sntprintf(pBuf, 10, _T("%d "), m_pParentList[i]->getId());
+      _sntprintf(pBuf, 10, _T("%d "), m_parentList->get(i)->getId());
       while(*pBuf)
          pBuf++;
    }
-   UnlockParentList();
+   unlockParentList();
    if (pBuf != szBuffer)
       *(pBuf - 1) = 0;
    return szBuffer;
@@ -768,7 +729,7 @@ const TCHAR *NetObj::dbgGetParentList(TCHAR *szBuffer)
  */
 void NetObj::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   if (m_iStatus == STATUS_UNMANAGED)
+   if (m_status == STATUS_UNMANAGED)
       return;
 
    int mostCriticalAlarm = GetMostCriticalStatusForObject(m_id);
@@ -776,22 +737,21 @@ void NetObj::calculateCompoundStatus(BOOL bForcedRecalc)
       (getObjectClass() == OBJECT_NODE || getObjectClass() == OBJECT_MOBILEDEVICE || getObjectClass() == OBJECT_CLUSTER || getObjectClass() == OBJECT_ACCESSPOINT) ?
          ((DataCollectionTarget *)this)->getMostCriticalDCIStatus() : STATUS_UNKNOWN;
 
-   UINT32 i;
-   int oldStatus = m_iStatus;
-   int mostCriticalStatus, count, iStatusAlg;
+   int oldStatus = m_status;
+   int mostCriticalStatus, i, count, iStatusAlg;
    int nSingleThreshold, *pnThresholds;
    int nRating[5], iChildStatus, nThresholds[4];
 
    lockProperties();
-   if (m_iStatusCalcAlg == SA_CALCULATE_DEFAULT)
+   if (m_statusCalcAlg == SA_CALCULATE_DEFAULT)
    {
       iStatusAlg = GetDefaultStatusCalculation(&nSingleThreshold, &pnThresholds);
    }
    else
    {
-      iStatusAlg = m_iStatusCalcAlg;
-      nSingleThreshold = m_iStatusSingleThreshold;
-      pnThresholds = m_iStatusThresholds;
+      iStatusAlg = m_statusCalcAlg;
+      nSingleThreshold = m_statusSingleThreshold;
+      pnThresholds = m_statusThresholds;
    }
    if (iStatusAlg == SA_CALCULATE_SINGLE_THRESHOLD)
    {
@@ -803,10 +763,10 @@ void NetObj::calculateCompoundStatus(BOOL bForcedRecalc)
    switch(iStatusAlg)
    {
       case SA_CALCULATE_MOST_CRITICAL:
-         LockChildList(FALSE);
-         for(i = 0, count = 0, mostCriticalStatus = -1; i < m_dwChildCount; i++)
+         lockChildList(false);
+         for(i = 0, count = 0, mostCriticalStatus = -1; i < m_childList->size(); i++)
          {
-            iChildStatus = m_pChildList[i]->getPropagatedStatus();
+            iChildStatus = m_childList->get(i)->getPropagatedStatus();
             if ((iChildStatus < STATUS_UNKNOWN) &&
                 (iChildStatus > mostCriticalStatus))
             {
@@ -814,17 +774,17 @@ void NetObj::calculateCompoundStatus(BOOL bForcedRecalc)
                count++;
             }
          }
-         m_iStatus = (count > 0) ? mostCriticalStatus : STATUS_UNKNOWN;
-         UnlockChildList();
+         m_status = (count > 0) ? mostCriticalStatus : STATUS_UNKNOWN;
+         unlockChildList();
          break;
       case SA_CALCULATE_SINGLE_THRESHOLD:
       case SA_CALCULATE_MULTIPLE_THRESHOLDS:
          // Step 1: calculate severity raitings
          memset(nRating, 0, sizeof(int) * 5);
-         LockChildList(FALSE);
-         for(i = 0, count = 0; i < m_dwChildCount; i++)
+         lockChildList(false);
+         for(i = 0, count = 0; i < m_childList->size(); i++)
          {
-            iChildStatus = m_pChildList[i]->getPropagatedStatus();
+            iChildStatus = m_childList->get(i)->getPropagatedStatus();
             if (iChildStatus < STATUS_UNKNOWN)
             {
                while(iChildStatus >= 0)
@@ -832,7 +792,7 @@ void NetObj::calculateCompoundStatus(BOOL bForcedRecalc)
                count++;
             }
          }
-         UnlockChildList();
+         unlockChildList();
 
          // Step 2: check what severity rating is above threshold
          if (count > 0)
@@ -840,41 +800,41 @@ void NetObj::calculateCompoundStatus(BOOL bForcedRecalc)
             for(i = 4; i > 0; i--)
                if (nRating[i] * 100 / count >= pnThresholds[i - 1])
                   break;
-            m_iStatus = i;
+            m_status = i;
          }
          else
          {
-            m_iStatus = STATUS_UNKNOWN;
+            m_status = STATUS_UNKNOWN;
          }
          break;
       default:
-         m_iStatus = STATUS_UNKNOWN;
+         m_status = STATUS_UNKNOWN;
          break;
    }
 
    // If alarms exist for object, apply alarm severity to object's status
    if (mostCriticalAlarm != STATUS_UNKNOWN)
    {
-      if (m_iStatus == STATUS_UNKNOWN)
+      if (m_status == STATUS_UNKNOWN)
       {
-         m_iStatus = mostCriticalAlarm;
+         m_status = mostCriticalAlarm;
       }
       else
       {
-         m_iStatus = max(m_iStatus, mostCriticalAlarm);
+         m_status = max(m_status, mostCriticalAlarm);
       }
    }
 
    // If DCI status is calculated for object apply DCI object's statud
    if (mostCriticalDCI != STATUS_UNKNOWN)
    {
-      if (m_iStatus == STATUS_UNKNOWN)
+      if (m_status == STATUS_UNKNOWN)
       {
-         m_iStatus = mostCriticalDCI;
+         m_status = mostCriticalDCI;
       }
       else
       {
-         m_iStatus = max(m_iStatus, mostCriticalDCI);
+         m_status = max(m_status, mostCriticalDCI);
       }
    }
 
@@ -884,13 +844,13 @@ void NetObj::calculateCompoundStatus(BOOL bForcedRecalc)
       int moduleStatus = g_pModuleList[__i].pfCalculateObjectStatus(this);
       if (moduleStatus != STATUS_UNKNOWN)
       {
-         if (m_iStatus == STATUS_UNKNOWN)
+         if (m_status == STATUS_UNKNOWN)
          {
-            m_iStatus = moduleStatus;
+            m_status = moduleStatus;
          }
          else
          {
-            m_iStatus = max(m_iStatus, moduleStatus);
+            m_status = max(m_status, moduleStatus);
          }
       }
    }
@@ -898,12 +858,12 @@ void NetObj::calculateCompoundStatus(BOOL bForcedRecalc)
    unlockProperties();
 
    // Cause parent object(s) to recalculate it's status
-   if ((oldStatus != m_iStatus) || bForcedRecalc)
+   if ((oldStatus != m_status) || bForcedRecalc)
    {
-      LockParentList(FALSE);
-      for(i = 0; i < m_dwParentCount; i++)
-         m_pParentList[i]->calculateCompoundStatus();
-      UnlockParentList();
+      lockParentList(false);
+      for(i = 0; i < m_parentList->size(); i++)
+         m_parentList->get(i)->calculateCompoundStatus();
+      unlockParentList();
       lockProperties();
       setModified();
       unlockProperties();
@@ -1010,26 +970,26 @@ void NetObj::fillMessageInternal(NXCPMessage *pMsg)
    pMsg->setField(VID_OBJECT_ID, m_id);
        pMsg->setField(VID_GUID, m_guid);
    pMsg->setField(VID_OBJECT_NAME, m_name);
-   pMsg->setField(VID_OBJECT_STATUS, (WORD)m_iStatus);
+   pMsg->setField(VID_OBJECT_STATUS, (WORD)m_status);
    pMsg->setField(VID_IS_DELETED, (WORD)(m_isDeleted ? 1 : 0));
    pMsg->setField(VID_IS_SYSTEM, (INT16)(m_isSystem ? 1 : 0));
    pMsg->setField(VID_MAINTENANCE_MODE, (INT16)(m_maintenanceEventId ? 1 : 0));
 
    pMsg->setField(VID_INHERIT_RIGHTS, m_inheritAccessRights);
-   pMsg->setField(VID_STATUS_CALCULATION_ALG, (WORD)m_iStatusCalcAlg);
-   pMsg->setField(VID_STATUS_PROPAGATION_ALG, (WORD)m_iStatusPropAlg);
-   pMsg->setField(VID_FIXED_STATUS, (WORD)m_iFixedStatus);
-   pMsg->setField(VID_STATUS_SHIFT, (WORD)m_iStatusShift);
-   pMsg->setField(VID_STATUS_TRANSLATION_1, (WORD)m_iStatusTranslation[0]);
-   pMsg->setField(VID_STATUS_TRANSLATION_2, (WORD)m_iStatusTranslation[1]);
-   pMsg->setField(VID_STATUS_TRANSLATION_3, (WORD)m_iStatusTranslation[2]);
-   pMsg->setField(VID_STATUS_TRANSLATION_4, (WORD)m_iStatusTranslation[3]);
-   pMsg->setField(VID_STATUS_SINGLE_THRESHOLD, (WORD)m_iStatusSingleThreshold);
-   pMsg->setField(VID_STATUS_THRESHOLD_1, (WORD)m_iStatusThresholds[0]);
-   pMsg->setField(VID_STATUS_THRESHOLD_2, (WORD)m_iStatusThresholds[1]);
-   pMsg->setField(VID_STATUS_THRESHOLD_3, (WORD)m_iStatusThresholds[2]);
-   pMsg->setField(VID_STATUS_THRESHOLD_4, (WORD)m_iStatusThresholds[3]);
-   pMsg->setField(VID_COMMENTS, CHECK_NULL_EX(m_pszComments));
+   pMsg->setField(VID_STATUS_CALCULATION_ALG, (WORD)m_statusCalcAlg);
+   pMsg->setField(VID_STATUS_PROPAGATION_ALG, (WORD)m_statusPropAlg);
+   pMsg->setField(VID_FIXED_STATUS, (WORD)m_fixedStatus);
+   pMsg->setField(VID_STATUS_SHIFT, (WORD)m_statusShift);
+   pMsg->setField(VID_STATUS_TRANSLATION_1, (WORD)m_statusTranslation[0]);
+   pMsg->setField(VID_STATUS_TRANSLATION_2, (WORD)m_statusTranslation[1]);
+   pMsg->setField(VID_STATUS_TRANSLATION_3, (WORD)m_statusTranslation[2]);
+   pMsg->setField(VID_STATUS_TRANSLATION_4, (WORD)m_statusTranslation[3]);
+   pMsg->setField(VID_STATUS_SINGLE_THRESHOLD, (WORD)m_statusSingleThreshold);
+   pMsg->setField(VID_STATUS_THRESHOLD_1, (WORD)m_statusThresholds[0]);
+   pMsg->setField(VID_STATUS_THRESHOLD_2, (WORD)m_statusThresholds[1]);
+   pMsg->setField(VID_STATUS_THRESHOLD_3, (WORD)m_statusThresholds[2]);
+   pMsg->setField(VID_STATUS_THRESHOLD_4, (WORD)m_statusThresholds[3]);
+   pMsg->setField(VID_COMMENTS, CHECK_NULL_EX(m_comments));
        pMsg->setField(VID_IMAGE, m_image);
        pMsg->setField(VID_SUBMAP_ID, m_submapId);
        pMsg->setField(VID_NUM_TRUSTED_NODES, m_dwNumTrustedNodes);
@@ -1084,19 +1044,20 @@ void NetObj::fillMessage(NXCPMessage *msg)
    m_accessList->fillMessage(msg);
    unlockACL();
 
-   UINT32 i, dwId;
+   UINT32 dwId;
+   int i;
 
-   LockParentList(FALSE);
-   msg->setField(VID_PARENT_CNT, m_dwParentCount);
-   for(i = 0, dwId = VID_PARENT_ID_BASE; i < m_dwParentCount; i++, dwId++)
-      msg->setField(dwId, m_pParentList[i]->getId());
-   UnlockParentList();
+   lockParentList(false);
+   msg->setField(VID_PARENT_CNT, m_parentList->size());
+   for(i = 0, dwId = VID_PARENT_ID_BASE; i < m_parentList->size(); i++, dwId++)
+      msg->setField(dwId, m_parentList->get(i)->getId());
+   unlockParentList();
 
-   LockChildList(FALSE);
-   msg->setField(VID_CHILD_CNT, m_dwChildCount);
-   for(i = 0, dwId = VID_CHILD_ID_BASE; i < m_dwChildCount; i++, dwId++)
-      msg->setField(dwId, m_pChildList[i]->getId());
-   UnlockChildList();
+   lockChildList(false);
+   msg->setField(VID_CHILD_CNT, m_childList->size());
+   for(i = 0, dwId = VID_CHILD_ID_BASE; i < m_childList->size(); i++, dwId++)
+      msg->setField(dwId, m_childList->get(i)->getId());
+   unlockChildList();
 }
 
 /**
@@ -1149,19 +1110,19 @@ UINT32 NetObj::modifyFromMessageInternal(NXCPMessage *pRequest)
    // Change object's status calculation/propagation algorithms
    if (pRequest->isFieldExist(VID_STATUS_CALCULATION_ALG))
    {
-      m_iStatusCalcAlg = pRequest->getFieldAsInt16(VID_STATUS_CALCULATION_ALG);
-      m_iStatusPropAlg = pRequest->getFieldAsInt16(VID_STATUS_PROPAGATION_ALG);
-      m_iFixedStatus = pRequest->getFieldAsInt16(VID_FIXED_STATUS);
-      m_iStatusShift = pRequest->getFieldAsInt16(VID_STATUS_SHIFT);
-      m_iStatusTranslation[0] = pRequest->getFieldAsInt16(VID_STATUS_TRANSLATION_1);
-      m_iStatusTranslation[1] = pRequest->getFieldAsInt16(VID_STATUS_TRANSLATION_2);
-      m_iStatusTranslation[2] = pRequest->getFieldAsInt16(VID_STATUS_TRANSLATION_3);
-      m_iStatusTranslation[3] = pRequest->getFieldAsInt16(VID_STATUS_TRANSLATION_4);
-      m_iStatusSingleThreshold = pRequest->getFieldAsInt16(VID_STATUS_SINGLE_THRESHOLD);
-      m_iStatusThresholds[0] = pRequest->getFieldAsInt16(VID_STATUS_THRESHOLD_1);
-      m_iStatusThresholds[1] = pRequest->getFieldAsInt16(VID_STATUS_THRESHOLD_2);
-      m_iStatusThresholds[2] = pRequest->getFieldAsInt16(VID_STATUS_THRESHOLD_3);
-      m_iStatusThresholds[3] = pRequest->getFieldAsInt16(VID_STATUS_THRESHOLD_4);
+      m_statusCalcAlg = pRequest->getFieldAsInt16(VID_STATUS_CALCULATION_ALG);
+      m_statusPropAlg = pRequest->getFieldAsInt16(VID_STATUS_PROPAGATION_ALG);
+      m_fixedStatus = pRequest->getFieldAsInt16(VID_FIXED_STATUS);
+      m_statusShift = pRequest->getFieldAsInt16(VID_STATUS_SHIFT);
+      m_statusTranslation[0] = pRequest->getFieldAsInt16(VID_STATUS_TRANSLATION_1);
+      m_statusTranslation[1] = pRequest->getFieldAsInt16(VID_STATUS_TRANSLATION_2);
+      m_statusTranslation[2] = pRequest->getFieldAsInt16(VID_STATUS_TRANSLATION_3);
+      m_statusTranslation[3] = pRequest->getFieldAsInt16(VID_STATUS_TRANSLATION_4);
+      m_statusSingleThreshold = pRequest->getFieldAsInt16(VID_STATUS_SINGLE_THRESHOLD);
+      m_statusThresholds[0] = pRequest->getFieldAsInt16(VID_STATUS_THRESHOLD_1);
+      m_statusThresholds[1] = pRequest->getFieldAsInt16(VID_STATUS_THRESHOLD_2);
+      m_statusThresholds[2] = pRequest->getFieldAsInt16(VID_STATUS_THRESHOLD_3);
+      m_statusThresholds[3] = pRequest->getFieldAsInt16(VID_STATUS_THRESHOLD_4);
    }
 
        // Change image
@@ -1290,12 +1251,11 @@ UINT32 NetObj::getUserRights(UINT32 userId)
       // We don't. If this object inherit rights from parents, get them
       if (m_inheritAccessRights)
       {
-         UINT32 i;
-
-         LockParentList(FALSE);
-         for(i = 0, dwRights = 0; i < m_dwParentCount; i++)
-            dwRights |= m_pParentList[i]->getUserRights(userId);
-         UnlockParentList();
+         dwRights = 0;
+         lockParentList(false);
+         for(int i = 0; i < m_parentList->size(); i++)
+            dwRights |= m_parentList->get(i)->getUserRights(userId);
+         unlockParentList();
       }
    }
 
@@ -1336,20 +1296,19 @@ void NetObj::dropUserAccess(UINT32 dwUserId)
  */
 void NetObj::setMgmtStatus(BOOL bIsManaged)
 {
-   UINT32 i;
    int oldStatus;
 
    lockProperties();
 
-   if ((bIsManaged && (m_iStatus != STATUS_UNMANAGED)) ||
-       ((!bIsManaged) && (m_iStatus == STATUS_UNMANAGED)))
+   if ((bIsManaged && (m_status != STATUS_UNMANAGED)) ||
+       ((!bIsManaged) && (m_status == STATUS_UNMANAGED)))
    {
       unlockProperties();
       return;  // Status is already correct
    }
 
-   oldStatus = m_iStatus;
-   m_iStatus = (bIsManaged ? STATUS_UNKNOWN : STATUS_UNMANAGED);
+   oldStatus = m_status;
+   m_status = (bIsManaged ? STATUS_UNKNOWN : STATUS_UNMANAGED);
 
    // Generate event if current object is a node
    if (getObjectClass() == OBJECT_NODE)
@@ -1359,16 +1318,16 @@ void NetObj::setMgmtStatus(BOOL bIsManaged)
    unlockProperties();
 
    // Change status for child objects also
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
-      m_pChildList[i]->setMgmtStatus(bIsManaged);
-   UnlockChildList();
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+      m_childList->get(i)->setMgmtStatus(bIsManaged);
+   unlockChildList();
 
    // Cause parent object(s) to recalculate it's status
-   LockParentList(FALSE);
-   for(i = 0; i < m_dwParentCount; i++)
-      m_pParentList[i]->calculateCompoundStatus();
-   UnlockParentList();
+   lockParentList(false);
+   for(int i = 0; i < m_parentList->size(); i++)
+      m_parentList->get(i)->calculateCompoundStatus();
+   unlockParentList();
 }
 
 /**
@@ -1378,7 +1337,6 @@ void NetObj::setMgmtStatus(BOOL bIsManaged)
  */
 bool NetObj::isChild(UINT32 id)
 {
-   UINT32 i;
    bool bResult = false;
 
    // Check for our own ID (object ID should never change, so we may not lock object's data)
@@ -1388,27 +1346,27 @@ bool NetObj::isChild(UINT32 id)
    // First, walk through our own child list
    if (!bResult)
    {
-      LockChildList(FALSE);
-      for(i = 0; i < m_dwChildCount; i++)
-         if (m_pChildList[i]->getId() == id)
+      lockChildList(false);
+      for(int i = 0; i < m_childList->size(); i++)
+         if (m_childList->get(i)->getId() == id)
          {
             bResult = true;
             break;
          }
-      UnlockChildList();
+      unlockChildList();
    }
 
    // If given object is not in child list, check if it is indirect child
    if (!bResult)
    {
-      LockChildList(FALSE);
-      for(i = 0; i < m_dwChildCount; i++)
-         if (m_pChildList[i]->isChild(id))
+      lockChildList(false);
+      for(int i = 0; i < m_childList->size(); i++)
+         if (m_childList->get(i)->isChild(id))
          {
             bResult = true;
             break;
          }
-      UnlockChildList();
+      unlockChildList();
    }
 
    return bResult;
@@ -1437,34 +1395,33 @@ void NetObj::sendPollerMsg(UINT32 dwRqId, const TCHAR *pszFormat, ...)
  */
 void NetObj::addChildNodesToList(ObjectArray<Node> *nodeList, UINT32 dwUserId)
 {
-   UINT32 i;
-
-   LockChildList(FALSE);
+   lockChildList(false);
 
    // Walk through our own child list
-   for(i = 0; i < m_dwChildCount; i++)
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      if (m_pChildList[i]->getObjectClass() == OBJECT_NODE)
+      NetObj *object = m_childList->get(i);
+      if (object->getObjectClass() == OBJECT_NODE)
       {
          // Check if this node already in the list
                        int j;
                        for(j = 0; j < nodeList->size(); j++)
-                               if (nodeList->get(j)->getId() == m_pChildList[i]->getId())
+                               if (nodeList->get(j)->getId() == object->getId())
                break;
          if (j == nodeList->size())
          {
-            m_pChildList[i]->incRefCount();
-                               nodeList->add((Node *)m_pChildList[i]);
+            object->incRefCount();
+                               nodeList->add((Node *)object);
          }
       }
       else
       {
-         if (m_pChildList[i]->checkAccessRights(dwUserId, OBJECT_ACCESS_READ))
-            m_pChildList[i]->addChildNodesToList(nodeList, dwUserId);
+         if (object->checkAccessRights(dwUserId, OBJECT_ACCESS_READ))
+            object->addChildNodesToList(nodeList, dwUserId);
       }
    }
 
-   UnlockChildList();
+   unlockChildList();
 }
 
 /**
@@ -1472,34 +1429,32 @@ void NetObj::addChildNodesToList(ObjectArray<Node> *nodeList, UINT32 dwUserId)
  */
 void NetObj::addChildDCTargetsToList(ObjectArray<DataCollectionTarget> *dctList, UINT32 dwUserId)
 {
-   UINT32 i;
-
-   LockChildList(FALSE);
+   lockChildList(false);
 
    // Walk through our own child list
-   for(i = 0; i < m_dwChildCount; i++)
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      if ((m_pChildList[i]->getObjectClass() == OBJECT_NODE) || (m_pChildList[i]->getObjectClass() == OBJECT_MOBILEDEVICE))
+      NetObj *object = m_childList->get(i);
+      if (!object->checkAccessRights(dwUserId, OBJECT_ACCESS_READ))
+         continue;
+
+      if (object->isDataCollectionTarget())
       {
          // Check if this objects already in the list
                        int j;
                        for(j = 0; j < dctList->size(); j++)
-                               if (dctList->get(j)->getId() == m_pChildList[i]->getId())
+                               if (dctList->get(j)->getId() == object->getId())
                break;
          if (j == dctList->size())
          {
-            m_pChildList[i]->incRefCount();
-                               dctList->add((DataCollectionTarget *)m_pChildList[i]);
+            object->incRefCount();
+                               dctList->add((DataCollectionTarget *)object);
          }
       }
-      else
-      {
-         if (m_pChildList[i]->checkAccessRights(dwUserId, OBJECT_ACCESS_READ))
-            m_pChildList[i]->addChildDCTargetsToList(dctList, dwUserId);
-      }
+      object->addChildDCTargetsToList(dctList, dwUserId);
    }
 
-   UnlockChildList();
+   unlockChildList();
 }
 
 /**
@@ -1507,12 +1462,10 @@ void NetObj::addChildDCTargetsToList(ObjectArray<DataCollectionTarget> *dctList,
  */
 void NetObj::hide()
 {
-   UINT32 i;
-
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
-      m_pChildList[i]->hide();
-   UnlockChildList();
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+      m_childList->get(i)->hide();
+   unlockChildList();
 
        lockProperties();
    m_isHidden = true;
@@ -1524,18 +1477,16 @@ void NetObj::hide()
  */
 void NetObj::unhide()
 {
-   UINT32 i;
-
    lockProperties();
    m_isHidden = false;
    if (!m_isSystem)
       EnumerateClientSessions(BroadcastObjectChange, this);
    unlockProperties();
 
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
-      m_pChildList[i]->unhide();
-   UnlockChildList();
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+      m_childList->get(i)->unhide();
+   unlockChildList();
 }
 
 /**
@@ -1545,24 +1496,24 @@ int NetObj::getPropagatedStatus()
 {
    int iStatus;
 
-   if (m_iStatusPropAlg == SA_PROPAGATE_DEFAULT)
+   if (m_statusPropAlg == SA_PROPAGATE_DEFAULT)
    {
-      iStatus = DefaultPropagatedStatus(m_iStatus);
+      iStatus = DefaultPropagatedStatus(m_status);
    }
    else
    {
-      switch(m_iStatusPropAlg)
+      switch(m_statusPropAlg)
       {
          case SA_PROPAGATE_UNCHANGED:
-            iStatus = m_iStatus;
+            iStatus = m_status;
             break;
          case SA_PROPAGATE_FIXED:
-            iStatus = ((m_iStatus > STATUS_NORMAL) && (m_iStatus < STATUS_UNKNOWN)) ? m_iFixedStatus : m_iStatus;
+            iStatus = ((m_status > STATUS_NORMAL) && (m_status < STATUS_UNKNOWN)) ? m_fixedStatus : m_status;
             break;
          case SA_PROPAGATE_RELATIVE:
-            if ((m_iStatus > STATUS_NORMAL) && (m_iStatus < STATUS_UNKNOWN))
+            if ((m_status > STATUS_NORMAL) && (m_status < STATUS_UNKNOWN))
             {
-               iStatus = m_iStatus + m_iStatusShift;
+               iStatus = m_status + m_statusShift;
                if (iStatus < 0)
                   iStatus = 0;
                if (iStatus > STATUS_CRITICAL)
@@ -1570,17 +1521,17 @@ int NetObj::getPropagatedStatus()
             }
             else
             {
-               iStatus = m_iStatus;
+               iStatus = m_status;
             }
             break;
          case SA_PROPAGATE_TRANSLATED:
-            if ((m_iStatus > STATUS_NORMAL) && (m_iStatus < STATUS_UNKNOWN))
+            if ((m_status > STATUS_NORMAL) && (m_status < STATUS_UNKNOWN))
             {
-               iStatus = m_iStatusTranslation[m_iStatus - 1];
+               iStatus = m_statusTranslation[m_status - 1];
             }
             else
             {
-               iStatus = m_iStatus;
+               iStatus = m_status;
             }
             break;
          default:
@@ -1606,8 +1557,8 @@ void NetObj::prepareForDeletion()
 void NetObj::setComments(TCHAR *text)
 {
    lockProperties();
-   safe_free(m_pszComments);
-   m_pszComments = text;
+   safe_free(m_comments);
+   m_comments = text;
    setModified();
    unlockProperties();
 }
@@ -1618,7 +1569,7 @@ void NetObj::setComments(TCHAR *text)
 void NetObj::commentsToMessage(NXCPMessage *pMsg)
 {
    lockProperties();
-   pMsg->setField(VID_COMMENTS, CHECK_NULL_EX(m_pszComments));
+   pMsg->setField(VID_COMMENTS, CHECK_NULL_EX(m_comments));
    unlockProperties();
 }
 
@@ -1713,17 +1664,18 @@ NXSL_Array *NetObj::getParentsForNXSL()
        NXSL_Array *parents = new NXSL_Array;
        int index = 0;
 
-       LockParentList(FALSE);
-       for(UINT32 i = 0; i < m_dwParentCount; i++)
+       lockParentList(false);
+       for(int i = 0; i < m_parentList->size(); i++)
        {
-               if ((m_pParentList[i]->getObjectClass() == OBJECT_CONTAINER) ||
-                        (m_pParentList[i]->getObjectClass() == OBJECT_SERVICEROOT) ||
-                        (m_pParentList[i]->getObjectClass() == OBJECT_NETWORK))
+          NetObj *obj = m_parentList->get(i);
+               if ((obj->getObjectClass() == OBJECT_CONTAINER) ||
+                        (obj->getObjectClass() == OBJECT_SERVICEROOT) ||
+                        (obj->getObjectClass() == OBJECT_NETWORK))
                {
-                       parents->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, m_pParentList[i])));
+                       parents->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, obj)));
                }
        }
-       UnlockParentList();
+       unlockParentList();
 
        return parents;
 }
@@ -1736,23 +1688,24 @@ NXSL_Array *NetObj::getChildrenForNXSL()
        NXSL_Array *children = new NXSL_Array;
        int index = 0;
 
-       LockChildList(FALSE);
-       for(UINT32 i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-               if (m_pChildList[i]->getObjectClass() == OBJECT_NODE)
+          NetObj *obj = m_childList->get(i);
+               if (obj->getObjectClass() == OBJECT_NODE)
                {
-                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, m_pChildList[i])));
+                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, obj)));
                }
-               else if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+               else if (obj->getObjectClass() == OBJECT_INTERFACE)
                {
-                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslInterfaceClass, m_pChildList[i])));
+                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslInterfaceClass, obj)));
                }
                else
                {
-                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, m_pChildList[i])));
+                       children->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, obj)));
                }
        }
-       UnlockChildList();
+       unlockChildList();
 
        return children;
 }
@@ -1762,14 +1715,15 @@ NXSL_Array *NetObj::getChildrenForNXSL()
  */
 void NetObj::getFullChildListInternal(ObjectIndex *list, bool eventSourceOnly)
 {
-       LockChildList(FALSE);
-       for(UINT32 i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-               if (!eventSourceOnly || IsEventSource(m_pChildList[i]->getObjectClass()))
-                       list->put(m_pChildList[i]->getId(), m_pChildList[i]);
-               m_pChildList[i]->getFullChildListInternal(list, eventSourceOnly);
+      NetObj *obj = m_childList->get(i);
+               if (!eventSourceOnly || IsEventSource(obj->getObjectClass()))
+                       list->put(obj->getId(), obj);
+               obj->getFullChildListInternal(list, eventSourceOnly);
        }
-       UnlockChildList();
+       unlockChildList();
 }
 
 /**
@@ -1794,14 +1748,14 @@ ObjectArray<NetObj> *NetObj::getFullChildList(bool eventSourceOnly, bool updateR
  */
 ObjectArray<NetObj> *NetObj::getChildList(int typeFilter)
 {
-       LockChildList(FALSE);
-       ObjectArray<NetObj> *list = new ObjectArray<NetObj>((int)m_dwChildCount, 16, false);
-       for(UINT32 i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       ObjectArray<NetObj> *list = new ObjectArray<NetObj>((int)m_childList->size(), 16, false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-               if ((typeFilter == -1) || (typeFilter == m_pChildList[i]->getObjectClass()))
-                       list->add(m_pChildList[i]);
+               if ((typeFilter == -1) || (typeFilter == m_childList->get(i)->getObjectClass()))
+                       list->add(m_childList->get(i));
        }
-       UnlockChildList();
+       unlockChildList();
        return list;
 }
 
@@ -1814,14 +1768,14 @@ ObjectArray<NetObj> *NetObj::getChildList(int typeFilter)
  */
 ObjectArray<NetObj> *NetObj::getParentList(int typeFilter)
 {
-    LockParentList(FALSE);
-    ObjectArray<NetObj> *list = new ObjectArray<NetObj>((int)m_dwParentCount, 16, false);
-    for(UINT32 i = 0; i < m_dwParentCount; i++)
+    lockParentList(false);
+    ObjectArray<NetObj> *list = new ObjectArray<NetObj>(m_parentList->size(), 16, false);
+    for(int i = 0; i < m_parentList->size(); i++)
     {
-        if ((typeFilter == -1) || (typeFilter == m_pParentList[i]->getObjectClass()))
-            list->add(m_pParentList[i]);
+        if ((typeFilter == -1) || (typeFilter == m_parentList->get(i)->getObjectClass()))
+            list->add(m_parentList->get(i));
     }
-    UnlockParentList();
+    unlockParentList();
     return list;
 }
 
@@ -1831,16 +1785,17 @@ ObjectArray<NetObj> *NetObj::getParentList(int typeFilter)
 NetObj *NetObj::findChildObject(const TCHAR *name, int typeFilter)
 {
    NetObj *object = NULL;
-       LockChildList(FALSE);
-       for(UINT32 i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-      if (((typeFilter == -1) || (typeFilter == m_pChildList[i]->getObjectClass())) && !_tcsicmp(name, m_pChildList[i]->getName()))
+          NetObj *o = m_childList->get(i);
+      if (((typeFilter == -1) || (typeFilter == o->getObjectClass())) && !_tcsicmp(name, o->getName()))
       {
-         object = m_pChildList[i];
+         object = o;
          break;
       }
        }
-       UnlockChildList();
+       unlockChildList();
        return object;
 }
 
@@ -1861,6 +1816,14 @@ bool NetObj::isEventSource()
    return false;
 }
 
+/**
+ * Must return true if object is a possible data collection target
+ */
+bool NetObj::isDataCollectionTarget()
+{
+   return false;
+}
+
 /**
  * Get module data
  */
@@ -2018,17 +1981,17 @@ bool NetObj::createLocationHistoryTable(DB_HANDLE hdb)
 void NetObj::setStatusCalculation(int method, int arg1, int arg2, int arg3, int arg4)
 {
    lockProperties();
-   m_iStatusCalcAlg = method;
+   m_statusCalcAlg = method;
    switch(method)
    {
       case SA_CALCULATE_SINGLE_THRESHOLD:
-         m_iStatusSingleThreshold = arg1;
+         m_statusSingleThreshold = arg1;
          break;
       case SA_CALCULATE_MULTIPLE_THRESHOLDS:
-         m_iStatusThresholds[0] = arg1;
-         m_iStatusThresholds[1] = arg2;
-         m_iStatusThresholds[2] = arg3;
-         m_iStatusThresholds[3] = arg4;
+         m_statusThresholds[0] = arg1;
+         m_statusThresholds[1] = arg2;
+         m_statusThresholds[2] = arg3;
+         m_statusThresholds[3] = arg4;
          break;
       default:
          break;
@@ -2043,20 +2006,20 @@ void NetObj::setStatusCalculation(int method, int arg1, int arg2, int arg3, int
 void NetObj::setStatusPropagation(int method, int arg1, int arg2, int arg3, int arg4)
 {
    lockProperties();
-   m_iStatusPropAlg = method;
+   m_statusPropAlg = method;
    switch(method)
    {
       case SA_PROPAGATE_FIXED:
-         m_iFixedStatus = arg1;
+         m_fixedStatus = arg1;
          break;
       case SA_PROPAGATE_RELATIVE:
-         m_iStatusShift = arg1;
+         m_statusShift = arg1;
          break;
       case SA_PROPAGATE_TRANSLATED:
-         m_iStatusTranslation[0] = arg1;
-         m_iStatusTranslation[1] = arg2;
-         m_iStatusTranslation[2] = arg3;
-         m_iStatusTranslation[3] = arg4;
+         m_statusTranslation[0] = arg1;
+         m_statusTranslation[1] = arg2;
+         m_statusTranslation[2] = arg3;
+         m_statusTranslation[3] = arg4;
          break;
       default:
          break;
@@ -2072,13 +2035,14 @@ void NetObj::enterMaintenanceMode()
 {
    DbgPrintf(4, _T("Entering maintenance mode for object %s [%d] (%s)"), m_name, m_id, getObjectClassName());
 
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      if (m_pChildList[i]->Status() != STATUS_UNMANAGED)
-         m_pChildList[i]->enterMaintenanceMode();
+      NetObj *object = m_childList->get(i);
+      if (object->getStatus() != STATUS_UNMANAGED)
+         object->enterMaintenanceMode();
    }
-   UnlockChildList();
+   unlockChildList();
 }
 
 /**
@@ -2088,13 +2052,14 @@ void NetObj::leaveMaintenanceMode()
 {
    DbgPrintf(4, _T("Leaving maintenance mode for object %s [%d] (%s)"), m_name, m_id, getObjectClassName());
 
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      if (m_pChildList[i]->Status() != STATUS_UNMANAGED)
-         m_pChildList[i]->leaveMaintenanceMode();
+      NetObj *object = m_childList->get(i);
+      if (object->getStatus() != STATUS_UNMANAGED)
+         object->leaveMaintenanceMode();
    }
-   UnlockChildList();
+   unlockChildList();
 }
 
 /**
index ed7fb22..f91d3d6 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2014 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -322,18 +322,18 @@ UINT32 NetworkService::modifyFromMessageInternal(NXCPMessage *pRequest)
  */
 void NetworkService::statusPoll(ClientSession *session, UINT32 rqId, Node *pollerNode, Queue *eventQueue)
 {
-   int oldStatus = m_iStatus, newStatus;
+   int oldStatus = m_status, newStatus;
    Node *pNode;
 
    m_pollRequestor = session;
    if (m_hostNode == NULL)
    {
-      m_iStatus = STATUS_UNKNOWN;
+      m_status = STATUS_UNKNOWN;
       return;     // Service without host node, which is VERY strange
    }
 
    sendPollerMsg(rqId, _T("   Starting status poll on network service %s\r\n"), m_name);
-   sendPollerMsg(rqId, _T("      Current service status is %s\r\n"), GetStatusAsText(m_iStatus, true));
+   sendPollerMsg(rqId, _T("      Current service status is %s\r\n"), GetStatusAsText(m_status, true));
 
    if (m_pollerNode != 0)
    {
@@ -399,11 +399,11 @@ void NetworkService::statusPoll(ClientSession *session, UINT32 rqId, Node *polle
 
                if (m_pollCount >= ((m_requiredPollCount > 0) ? m_requiredPollCount : g_requiredPolls))
                {
-                       m_iStatus = newStatus;
+                       m_status = newStatus;
                        m_pendingStatus = -1;   // Invalidate pending status
-                       sendPollerMsg(rqId, _T("      Service status changed to %s\r\n"), GetStatusAsText(m_iStatus, true));
-                       PostEventEx(eventQueue, m_iStatus == STATUS_NORMAL ? EVENT_SERVICE_UP :
-                                                       (m_iStatus == STATUS_CRITICAL ? EVENT_SERVICE_DOWN : EVENT_SERVICE_UNKNOWN),
+                       sendPollerMsg(rqId, _T("      Service status changed to %s\r\n"), GetStatusAsText(m_status, true));
+                       PostEventEx(eventQueue, m_status == STATUS_NORMAL ? EVENT_SERVICE_UP :
+                                                       (m_status == STATUS_CRITICAL ? EVENT_SERVICE_DOWN : EVENT_SERVICE_UNKNOWN),
                                                        m_hostNode->getId(), "sdd", m_name, m_id, m_serviceType);
                        lockProperties();
                        setModified();
index 53e8fa0..9cec2f4 100644 (file)
@@ -28,7 +28,7 @@
 Node::Node() : DataCollectionTarget()
 {
        m_primaryName[0] = 0;
-   m_iStatus = STATUS_UNKNOWN;
+   m_status = STATUS_UNKNOWN;
    m_dwFlags = 0;
    m_dwDynamicFlags = 0;
    m_zoneId = 0;
@@ -114,7 +114,7 @@ Node::Node() : DataCollectionTarget()
 Node::Node(const InetAddress& addr, UINT32 dwFlags, UINT32 agentProxy, UINT32 snmpProxy, UINT32 dwZone) : DataCollectionTarget()
 {
    addr.toString(m_primaryName);
-   m_iStatus = STATUS_UNKNOWN;
+   m_status = STATUS_UNKNOWN;
    m_ipAddress = addr;
    m_dwFlags = dwFlags;
    m_dwDynamicFlags = 0;
@@ -719,18 +719,18 @@ Interface *Node::findInterfaceByIndex(UINT32 ifIndex)
    UINT32 i;
    Interface *pInterface;
 
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+   lockChildList(false);
+   for(i = 0; i < m_childList->size(); i++)
+      if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
       {
-         pInterface = (Interface *)m_pChildList[i];
+         pInterface = (Interface *)m_childList->get(i);
                        if (pInterface->getIfIndex() == ifIndex)
          {
-            UnlockChildList();
+            unlockChildList();
             return pInterface;
          }
       }
-   UnlockChildList();
+   unlockChildList();
    return NULL;
 }
 
@@ -745,18 +745,18 @@ Interface *Node::findInterfaceByName(const TCHAR *name)
 
    Interface *pInterface;
 
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+   lockChildList(false);
+   for(UINT32 i = 0; i < m_childList->size(); i++)
+      if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
       {
-         pInterface = (Interface *)m_pChildList[i];
+         pInterface = (Interface *)m_childList->get(i);
                        if (!_tcsicmp(pInterface->getName(), name) || !_tcsicmp(pInterface->getDescription(), name))
          {
-            UnlockChildList();
+            unlockChildList();
             return pInterface;
          }
       }
-   UnlockChildList();
+   unlockChildList();
    return NULL;
 }
 
@@ -769,18 +769,18 @@ Interface *Node::findInterfaceBySlotAndPort(UINT32 slot, UINT32 port)
    UINT32 i;
    Interface *pInterface;
 
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+   lockChildList(false);
+   for(i = 0; i < m_childList->size(); i++)
+      if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
       {
-         pInterface = (Interface *)m_pChildList[i];
+         pInterface = (Interface *)m_childList->get(i);
                        if (pInterface->isPhysicalPort() && (pInterface->getSlotNumber() == slot) && (pInterface->getPortNumber() == port))
          {
-            UnlockChildList();
+            unlockChildList();
             return pInterface;
          }
       }
-   UnlockChildList();
+   unlockChildList();
    return NULL;
 }
 
@@ -791,17 +791,20 @@ Interface *Node::findInterfaceBySlotAndPort(UINT32 slot, UINT32 port)
 Interface *Node::findInterfaceByMAC(const BYTE *macAddr)
 {
    Interface *iface = NULL;
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+   {
+      NetObj *curr = m_childList->get(i);
+      if (curr->getObjectClass() == OBJECT_INTERFACE)
       {
-                       if (!memcmp(((Interface *)m_pChildList[i])->getMacAddr(), macAddr, MAC_ADDR_LENGTH))
+                       if (!memcmp(((Interface *)curr)->getMacAddr(), macAddr, MAC_ADDR_LENGTH))
          {
-            iface = (Interface *)m_pChildList[i];
+            iface = (Interface *)curr;
             break;
          }
       }
-   UnlockChildList();
+   }
+   unlockChildList();
    return iface;
 }
 
@@ -811,24 +814,21 @@ Interface *Node::findInterfaceByMAC(const BYTE *macAddr)
  */
 Interface *Node::findInterfaceByIP(const InetAddress& addr)
 {
-   UINT32 i;
-   Interface *pInterface;
-
    if (!addr.isValid())
                return NULL;
 
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+      if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
       {
-         pInterface = (Interface *)m_pChildList[i];
+         Interface *pInterface = (Interface *)m_childList->get(i);
          if (pInterface->getIpAddressList()->hasAddress(addr))
          {
-            UnlockChildList();
+            unlockChildList();
             return pInterface;
          }
       }
-   UnlockChildList();
+   unlockChildList();
    return NULL;
 }
 
@@ -837,21 +837,18 @@ Interface *Node::findInterfaceByIP(const InetAddress& addr)
  */
 Interface *Node::findBridgePort(UINT32 bridgePortNumber)
 {
-   UINT32 i;
-   Interface *pInterface;
-
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+      if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
       {
-         pInterface = (Interface *)m_pChildList[i];
+         Interface *pInterface = (Interface *)m_childList->get(i);
                        if (pInterface->getBridgePortNumber() == bridgePortNumber)
          {
-            UnlockChildList();
+            unlockChildList();
             return pInterface;
          }
       }
-   UnlockChildList();
+   unlockChildList();
    return NULL;
 }
 
@@ -861,12 +858,12 @@ Interface *Node::findBridgePort(UINT32 bridgePortNumber)
 NetObj *Node::findConnectionPoint(UINT32 *localIfId, BYTE *localMacAddr, int *type)
 {
        NetObj *cp = NULL;
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+      if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
       {
-         Interface *iface = (Interface *)m_pChildList[i];
+         Interface *iface = (Interface *)m_childList->get(i);
                        cp = FindInterfaceConnectionPoint(iface->getMacAddr(), type);
                        if (cp != NULL)
                        {
@@ -876,7 +873,7 @@ NetObj *Node::findConnectionPoint(UINT32 *localIfId, BYTE *localMacAddr, int *ty
                        }
                }
    }
-   UnlockChildList();
+   unlockChildList();
    return cp;
 }
 
@@ -886,17 +883,20 @@ NetObj *Node::findConnectionPoint(UINT32 *localIfId, BYTE *localMacAddr, int *ty
 AccessPoint *Node::findAccessPointByMAC(const BYTE *macAddr)
 {
    AccessPoint *ap = NULL;
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_ACCESSPOINT)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+   {
+      NetObj *curr = m_childList->get(i);
+      if (curr->getObjectClass() == OBJECT_ACCESSPOINT)
       {
-         if (!memcmp(((AccessPoint *)m_pChildList[i])->getMacAddr(), macAddr, MAC_ADDR_LENGTH))
+         if (!memcmp(((AccessPoint *)curr)->getMacAddr(), macAddr, MAC_ADDR_LENGTH))
          {
-            ap = (AccessPoint *)m_pChildList[i];
+            ap = (AccessPoint *)curr;
             break;
          }
       }
-   UnlockChildList();
+   }
+   unlockChildList();
    return ap;
 }
 
@@ -906,17 +906,20 @@ AccessPoint *Node::findAccessPointByMAC(const BYTE *macAddr)
 AccessPoint *Node::findAccessPointByRadioId(int rfIndex)
 {
    AccessPoint *ap = NULL;
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_ACCESSPOINT)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+   {
+      NetObj *curr = m_childList->get(i);
+      if (curr->getObjectClass() == OBJECT_ACCESSPOINT)
       {
-         if (((AccessPoint *)m_pChildList[i])->isMyRadio(rfIndex))
+         if (((AccessPoint *)curr)->isMyRadio(rfIndex))
          {
-            ap = (AccessPoint *)m_pChildList[i];
+            ap = (AccessPoint *)curr;
             break;
          }
       }
-   UnlockChildList();
+   }
+   unlockChildList();
    return ap;
 }
 
@@ -926,18 +929,21 @@ AccessPoint *Node::findAccessPointByRadioId(int rfIndex)
 AccessPoint *Node::findAccessPointByBSSID(const BYTE *bssid)
 {
    AccessPoint *ap = NULL;
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_ACCESSPOINT)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+   {
+      NetObj *curr = m_childList->get(i);
+      if (curr->getObjectClass() == OBJECT_ACCESSPOINT)
       {
-         if (!memcmp(((AccessPoint *)m_pChildList[i])->getMacAddr(), bssid, MAC_ADDR_LENGTH) ||
-             ((AccessPoint *)m_pChildList[i])->isMyRadio(bssid))
+         if (!memcmp(((AccessPoint *)curr)->getMacAddr(), bssid, MAC_ADDR_LENGTH) ||
+             ((AccessPoint *)curr)->isMyRadio(bssid))
          {
-            ap = (AccessPoint *)m_pChildList[i];
+            ap = (AccessPoint *)curr;
             break;
          }
       }
-   UnlockChildList();
+   }
+   unlockChildList();
    return ap;
 }
 
@@ -946,19 +952,17 @@ AccessPoint *Node::findAccessPointByBSSID(const BYTE *bssid)
  */
 bool Node::isMyIP(const InetAddress& addr)
 {
-   UINT32 i;
-
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+      if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
       {
-         if (((Interface *)m_pChildList[i])->getIpAddressList()->hasAddress(addr))
+         if (((Interface *)m_childList->get(i))->getIpAddressList()->hasAddress(addr))
          {
-            UnlockChildList();
+            unlockChildList();
             return true;
          }
       }
-   UnlockChildList();
+   unlockChildList();
    return false;
 }
 
@@ -1160,15 +1164,18 @@ void Node::deleteInterface(Interface *iface)
          bool doUnlink = true;
          const InetAddress *addr = list->get(i);
 
-         LockChildList(FALSE);
-         for(UINT32 j = 0; j < m_dwChildCount; j++)
-            if ((m_pChildList[j]->getObjectClass() == OBJECT_INTERFACE) && (m_pChildList[j] != iface) &&
-                ((Interface *)m_pChildList[j])->getIpAddressList()->findSameSubnetAddress(*addr).isValid())
+         lockChildList(false);
+         for(int j = 0; j < m_childList->size(); j++)
+         {
+            NetObj *curr = m_childList->get(i);
+            if ((curr->getObjectClass() == OBJECT_INTERFACE) && (curr != iface) &&
+                ((Interface *)curr)->getIpAddressList()->findSameSubnetAddress(*addr).isValid())
             {
                doUnlink = false;
                break;
             }
-         UnlockChildList();
+         }
+         unlockChildList();
 
          if (doUnlink)
          {
@@ -1194,14 +1201,14 @@ void Node::deleteInterface(Interface *iface)
  */
 void Node::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   int iOldStatus = m_iStatus;
+   int iOldStatus = m_status;
    static UINT32 dwEventCodes[] = { EVENT_NODE_NORMAL, EVENT_NODE_WARNING,
       EVENT_NODE_MINOR, EVENT_NODE_MAJOR, EVENT_NODE_CRITICAL,
       EVENT_NODE_UNKNOWN, EVENT_NODE_UNMANAGED };
 
    DataCollectionTarget::calculateCompoundStatus(bForcedRecalc);
-   if (m_iStatus != iOldStatus)
-      PostEvent(dwEventCodes[m_iStatus], m_id, "d", iOldStatus);
+   if (m_status != iOldStatus)
+      PostEvent(dwEventCodes[m_status], m_id, "d", iOldStatus);
 }
 
 /**
@@ -1436,15 +1443,18 @@ restart_agent_check:
    }
 
    // Create polling list
-   ppPollList = (NetObj **)malloc(sizeof(NetObj *) * m_dwChildCount);
-   LockChildList(FALSE);
-   for(i = 0, dwPollListSize = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->Status() != STATUS_UNMANAGED)
+   ppPollList = (NetObj **)malloc(sizeof(NetObj *) * m_childList->size());
+   lockChildList(false);
+   for(i = 0, dwPollListSize = 0; i < m_childList->size(); i++)
+   {
+      NetObj *curr = m_childList->get(i);
+      if (curr->getStatus() != STATUS_UNMANAGED)
       {
-         m_pChildList[i]->incRefCount();
-         ppPollList[dwPollListSize++] = m_pChildList[i];
+         curr->incRefCount();
+         ppPollList[dwPollListSize++] = curr;
       }
-   UnlockChildList();
+   }
+   unlockChildList();
 
    // Poll interfaces and services
    poller->setStatus(_T("child poll"));
@@ -1482,20 +1492,20 @@ restart_agent_check:
        if (m_ipAddress.isValidUnicast())
        {
           bool allDown = true;
-               LockChildList(FALSE);
-               if (m_dwChildCount > 0)
-               {
-                       for(i = 0; i < m_dwChildCount; i++)
-                               if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) &&
-                (((Interface *)m_pChildList[i])->getAdminState() != IF_ADMIN_STATE_DOWN) &&
-                                        (((Interface *)m_pChildList[i])->getConfirmedOperState() == IF_OPER_STATE_UP) &&
-                                        (m_pChildList[i]->Status() != STATUS_UNMANAGED))
-                               {
-                                       allDown = false;
-                                       break;
-                               }
-               }
-               UnlockChildList();
+               lockChildList(false);
+      for(i = 0; i < m_childList->size(); i++)
+      {
+         NetObj *curr = m_childList->get(i);
+         if ((curr->getObjectClass() == OBJECT_INTERFACE) &&
+             (((Interface *)curr)->getAdminState() != IF_ADMIN_STATE_DOWN) &&
+             (((Interface *)curr)->getConfirmedOperState() == IF_OPER_STATE_UP) &&
+             (curr->getStatus() != STATUS_UNMANAGED))
+         {
+            allDown = false;
+            break;
+         }
+      }
+               unlockChildList();
                if (allDown && (m_dwFlags & NF_IS_NATIVE_AGENT) &&
                    (!(m_dwFlags & NF_DISABLE_NXCP)))
                   if (!(m_dwDynamicFlags & NDF_AGENT_UNREACHABLE))
@@ -1518,14 +1528,17 @@ restart_agent_check:
                              m_dwDynamicFlags |= NDF_NETWORK_PATH_PROBLEM;
 
                                        // Set interfaces and network services to UNKNOWN state
-                                       LockChildList(FALSE);
-                                       for(i = 0; i < m_dwChildCount; i++)
-                                               if (((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) || (m_pChildList[i]->getObjectClass() == OBJECT_NETWORKSERVICE)) &&
-                                                        (m_pChildList[i]->Status() == STATUS_CRITICAL))
+                                       lockChildList(false);
+                                       for(i = 0; i < m_childList->size(); i++)
+                                       {
+                                NetObj *curr = m_childList->get(i);
+                                               if (((curr->getObjectClass() == OBJECT_INTERFACE) || (curr->getObjectClass() == OBJECT_NETWORKSERVICE)) &&
+                                                        (curr->getStatus() == STATUS_CRITICAL))
                                                {
-                                                       m_pChildList[i]->resetStatus();
+                                                       curr->resetStatus();
                                                }
-                                       UnlockChildList();
+                                       }
+                                       unlockChildList();
 
                                        // Clear delayed event queue
                                        while(1)
@@ -1709,7 +1722,7 @@ restart_agent_check:
    calculateCompoundStatus();
    m_lastStatusPoll = time(NULL);
    sendPollerMsg(dwRqId, _T("Finished status poll for node %s\r\n"), m_name);
-   sendPollerMsg(dwRqId, _T("Node status after poll is %s\r\n"), GetStatusAsText(m_iStatus, true));
+   sendPollerMsg(dwRqId, _T("Node status after poll is %s\r\n"), GetStatusAsText(m_status, true));
    m_pollRequestor = NULL;
    if (dwRqId == 0)
       m_dwDynamicFlags &= ~NDF_QUEUED_FOR_STATUS_POLL;
@@ -1894,14 +1907,14 @@ void Node::checkAgentPolicyBinding(AgentConnection *conn)
 
                // Check for bound but not installed policies and schedule it's installation again
                //Job will be unbound if it was not possible to add job
-               LockParentList(FALSE);
-               NetObj **unbindList = (NetObj **)malloc(sizeof(NetObj *) * m_dwParentCount);
+               lockParentList(false);
+               NetObj **unbindList = (NetObj **)malloc(sizeof(NetObj *) * m_parentList->size());
                int unbindListSize = 0;
-               for(UINT32 i = 0; i < m_dwParentCount; i++)
+               for(int i = 0; i < m_parentList->size(); i++)
                {
-                       if (IsAgentPolicyObject(m_pParentList[i]))
+                       if (IsAgentPolicyObject(m_parentList->get(i)))
                        {
-                               const uuid& guid = m_pParentList[i]->getGuid();
+                               const uuid& guid = m_parentList->get(i)->getGuid();
             int j;
                                for(j = 0; j < ap->size(); j++)
                                {
@@ -1910,21 +1923,21 @@ void Node::checkAgentPolicyBinding(AgentConnection *conn)
                                }
                                if (j == ap->size())
             {
-               ServerJob *job = new PolicyDeploymentJob(this, (AgentPolicy *)m_pParentList[i], 0); //TODO: change to system user
+               ServerJob *job = new PolicyDeploymentJob(this, (AgentPolicy *)m_parentList->get(i), 0); //TODO: change to system user
                                        if (AddJob(job))
                                        {
-                  DbgPrintf(5, _T("ConfPoll(%s): \"%s\" policy deploy scheduled for \"%s\" node"), m_name, m_pParentList[i]->getName(), m_name );
+                  DbgPrintf(5, _T("ConfPoll(%s): \"%s\" policy deploy scheduled for \"%s\" node"), m_name, m_parentList->get(i)->getName(), m_name );
                                        }
                                        else
                                        {
-                  DbgPrintf(5, _T("ConfPoll(%s): \"%s\" policy deploy is not possible to scheduled for \"%s\" node"), m_name, m_pParentList[i]->getName(), m_name);
+                  DbgPrintf(5, _T("ConfPoll(%s): \"%s\" policy deploy is not possible to scheduled for \"%s\" node"), m_name, m_parentList->get(i)->getName(), m_name);
                                                delete job;
-                  unbindList[unbindListSize++] = m_pParentList[i];
+                  unbindList[unbindListSize++] = m_parentList->get(i);
                                        }
             }
                        }
                }
-               UnlockParentList();
+               unlockParentList();
 
                for(int i = 0; i < unbindListSize; i++)
                {
@@ -2872,28 +2885,32 @@ bool Node::deleteDuplicateInterfaces(UINT32 rqid)
 {
    ObjectArray<Interface> deleteList(16, 16, false);
 
-   LockChildList(FALSE);
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      if ((m_pChildList[i]->getObjectClass() != OBJECT_INTERFACE) ||
-          ((Interface *)m_pChildList[i])->isManuallyCreated())
+      NetObj *curr = m_childList->get(i);
+
+      if ((curr->getObjectClass() != OBJECT_INTERFACE) ||
+          ((Interface *)curr)->isManuallyCreated())
          continue;
-      Interface *iface = (Interface *)m_pChildList[i];
-      for(UINT32 j = i + 1; j < m_dwChildCount; j++)
+      Interface *iface = (Interface *)curr;
+      for(int j = i + 1; j < m_childList->size(); j++)
       {
-         if ((m_pChildList[j]->getObjectClass() != OBJECT_INTERFACE) ||
-             ((Interface *)m_pChildList[j])->isManuallyCreated() ||
-             (deleteList.contains((Interface *)m_pChildList[j])))
+         NetObj *next = m_childList->get(j);
+
+         if ((next->getObjectClass() != OBJECT_INTERFACE) ||
+             ((Interface *)next)->isManuallyCreated() ||
+             (deleteList.contains((Interface *)next)))
             continue;
-         if (iface->getIfIndex() == ((Interface *)m_pChildList[j])->getIfIndex())
+         if (iface->getIfIndex() == ((Interface *)next)->getIfIndex())
          {
-            deleteList.add((Interface *)m_pChildList[j]);
+            deleteList.add((Interface *)next);
             DbgPrintf(6, _T("Node::deleteDuplicateInterfaces(%s [%d]): found duplicate interface %s [%d], original %s [%d], ifIndex=%d"),
-               m_name, m_id, m_pChildList[j]->getName(), m_pChildList[j]->getId(), iface->getName(), iface->getId(), iface->getIfIndex());
+               m_name, m_id, next->getName(), next->getId(), iface->getName(), iface->getId(), iface->getIfIndex());
          }
       }
    }
-   UnlockChildList();
+   unlockChildList();
 
    for(int i = 0; i < deleteList.size(); i++)
    {
@@ -2920,13 +2937,13 @@ bool Node::updateInterfaceConfiguration(UINT32 rqid, int maskBits)
                DbgPrintf(6, _T("Node::updateInterfaceConfiguration(%s [%u]): got %d interfaces"), m_name, m_id, pIfList->size());
 
       // Find non-existing interfaces
-      LockChildList(FALSE);
-      ObjectArray<Interface> deleteList(m_dwChildCount, 8, false);
-      for(UINT32 i = 0; i < m_dwChildCount; i++)
+      lockChildList(false);
+      ObjectArray<Interface> deleteList(m_childList->size(), 8, false);
+      for(int i = 0; i < m_childList->size(); i++)
       {
-         if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+         if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
          {
-            Interface *pInterface = (Interface *)m_pChildList[i];
+            Interface *pInterface = (Interface *)m_childList->get(i);
                                if (!pInterface->isManuallyCreated())
                                {
                int j;
@@ -2944,7 +2961,7 @@ bool Node::updateInterfaceConfiguration(UINT32 rqid, int maskBits)
                                }
          }
       }
-      UnlockChildList();
+      unlockChildList();
 
       // Delete non-existent interfaces
       if (deleteList.size() > 0)
@@ -2966,12 +2983,12 @@ bool Node::updateInterfaceConfiguration(UINT32 rqid, int maskBits)
                        InterfaceInfo *ifInfo = pIfList->get(j);
          BOOL bNewInterface = TRUE;
 
-         LockChildList(FALSE);
-         for(UINT32 i = 0; i < m_dwChildCount; i++)
+         lockChildList(false);
+         for(int i = 0; i < m_childList->size(); i++)
          {
-            if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+            if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
             {
-               Interface *pInterface = (Interface *)m_pChildList[i];
+               Interface *pInterface = (Interface *)m_childList->get(i);
 
                if (ifInfo->index == pInterface->getIfIndex())
                {
@@ -3077,7 +3094,7 @@ bool Node::updateInterfaceConfiguration(UINT32 rqid, int maskBits)
                }
             }
          }
-         UnlockChildList();
+         unlockChildList();
 
          if (bNewInterface)
          {
@@ -3106,15 +3123,15 @@ bool Node::updateInterfaceConfiguration(UINT32 rqid, int maskBits)
       // Delete all existing interfaces in case of forced capability recheck
       if (m_dwDynamicFlags & NDF_RECHECK_CAPABILITIES)
       {
-         LockChildList(FALSE);
-         Interface **ppDeleteList = (Interface **)malloc(sizeof(Interface *) * m_dwChildCount);
+         lockChildList(false);
+         Interface **ppDeleteList = (Interface **)malloc(sizeof(Interface *) * m_childList->size());
          int delCount = 0;
-         for(UINT32 i = 0; i < m_dwChildCount; i++)
+         for(int i = 0; i < m_childList->size(); i++)
          {
-                               if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) && !((Interface *)m_pChildList[i])->isManuallyCreated())
-               ppDeleteList[delCount++] = (Interface *)m_pChildList[i];
+                               if ((m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE) && !((Interface *)m_childList->get(i))->isManuallyCreated())
+               ppDeleteList[delCount++] = (Interface *)m_childList->get(i);
          }
-         UnlockChildList();
+         unlockChildList();
          for(int j = 0; j < delCount; j++)
          {
             sendPollerMsg(rqid, POLLER_WARNING _T("   Interface \"%s\" is no longer exist\r\n"),
@@ -4320,16 +4337,16 @@ UINT32 Node::getInternalItem(const TCHAR *param, size_t bufSize, TCHAR *buffer)
          Interface *iface = NULL;
 
          // Find interface for primary IP
-         LockChildList(FALSE);
-         for(int i = 0; i < (int)m_dwChildCount; i++)
+         lockChildList(false);
+         for(int i = 0; i < m_childList->size(); i++)
          {
-            if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) && ((Interface *)m_pChildList[i])->getIpAddressList()->hasAddress(m_ipAddress))
+            if ((m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE) && ((Interface *)m_childList->get(i))->getIpAddressList()->hasAddress(m_ipAddress))
             {
-               iface = (Interface *)m_pChildList[i];
+               iface = (Interface *)m_childList->get(i);
                break;
             }
          }
-         UnlockChildList();
+         unlockChildList();
 
          UINT32 value = 10000;
          if (iface != NULL)
@@ -4696,14 +4713,14 @@ UINT32 Node::modifyFromMessageInternal(NXCPMessage *pRequest)
       else
       {
          // Check if received IP address is one of node's interface addresses
-         LockChildList(FALSE);
-         UINT32 i;
-         for(i = 0; i < m_dwChildCount; i++)
-            if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) &&
-                ((Interface *)m_pChildList[i])->getIpAddressList()->hasAddress(ipAddr))
+         lockChildList(false);
+         int i, count = m_childList->size();
+         for(i = 0; i < count; i++)
+            if ((m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE) &&
+                ((Interface *)m_childList->get(i))->getIpAddressList()->hasAddress(ipAddr))
                break;
-         UnlockChildList();
-         if (i == m_dwChildCount)
+         unlockChildList();
+         if (i == count)
          {
             return RCC_INVALID_IP_ADDR;
          }
@@ -4738,14 +4755,14 @@ UINT32 Node::modifyFromMessageInternal(NXCPMessage *pRequest)
       if (ipAddr.isValid() && !(m_dwFlags & NF_REMOTE_AGENT))
       {
          // Check if received IP address is one of node's interface addresses
-         LockChildList(FALSE);
-         UINT32 i;
-         for(i = 0; i < m_dwChildCount; i++)
-            if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) &&
-                ((Interface *)m_pChildList[i])->getIpAddressList()->hasAddress(ipAddr))
+         lockChildList(false);
+         int i, count = m_childList->size();
+         for(i = 0; i < count; i++)
+            if ((m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE) &&
+                ((Interface *)m_childList->get(i))->getIpAddressList()->hasAddress(ipAddr))
                break;
-         UnlockChildList();
-         if (i == m_dwChildCount)
+         unlockChildList();
+         if (i == count)
          {
             // Check that there is no node with same IP as we try to change
             if ((FindNodeByIP(m_zoneId, ipAddr) != NULL) || (FindSubnetByIP(m_zoneId, ipAddr) != NULL))
@@ -4919,35 +4936,41 @@ void Node::onSnmpProxyChange(UINT32 oldProxy)
  */
 UINT32 Node::wakeUp()
 {
-   UINT32 i, dwResult = RCC_NO_WOL_INTERFACES;
+   UINT32 dwResult = RCC_NO_WOL_INTERFACES;
 
-   LockChildList(FALSE);
+   lockChildList(false);
 
-   for(i = 0; i < m_dwChildCount; i++)
-      if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) &&
-          (m_pChildList[i]->Status() != STATUS_UNMANAGED) &&
-          ((Interface *)m_pChildList[i])->getIpAddressList()->getFirstUnicastAddressV4().isValid())
+   for(int i = 0; i < m_childList->size(); i++)
+   {
+      NetObj *object = m_childList->get(i);
+      if ((object->getObjectClass() == OBJECT_INTERFACE) &&
+          (object->getStatus() != STATUS_UNMANAGED) &&
+          ((Interface *)object)->getIpAddressList()->getFirstUnicastAddressV4().isValid())
       {
-         dwResult = ((Interface *)m_pChildList[i])->wakeUp();
+         dwResult = ((Interface *)object)->wakeUp();
          if (dwResult == RCC_SUCCESS)
             break;
       }
+   }
 
    // If no interface found try to find interface in unmanaged state
    if (dwResult != RCC_SUCCESS)
    {
-      for(i = 0; i < m_dwChildCount; i++)
-         if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) &&
-             (m_pChildList[i]->Status() == STATUS_UNMANAGED) &&
-             ((Interface *)m_pChildList[i])->getIpAddressList()->getFirstUnicastAddressV4().isValid())
+      for(int i = 0; i < m_childList->size(); i++)
+      {
+         NetObj *object = m_childList->get(i);
+         if ((object->getObjectClass() == OBJECT_INTERFACE) &&
+             (object->getStatus() == STATUS_UNMANAGED) &&
+             ((Interface *)object)->getIpAddressList()->getFirstUnicastAddressV4().isValid())
          {
-            dwResult = ((Interface *)m_pChildList[i])->wakeUp();
+            dwResult = ((Interface *)object)->wakeUp();
             if (dwResult == RCC_SUCCESS)
                break;
          }
+      }
    }
 
-   UnlockChildList();
+   unlockChildList();
    return dwResult;
 }
 
@@ -5263,8 +5286,6 @@ void Node::setPrimaryIPAddress(const InetAddress& addr)
  */
 void Node::changeIPAddress(const InetAddress& ipAddr)
 {
-   UINT32 i;
-
    pollerLock();
 
    lockProperties();
@@ -5280,21 +5301,22 @@ void Node::changeIPAddress(const InetAddress& ipAddr)
                setPrimaryIPAddress(ipAddr);
                m_dwDynamicFlags |= NDF_FORCE_CONFIGURATION_POLL | NDF_RECHECK_CAPABILITIES;
 
-               // Change status of node and all it's childs to UNKNOWN
-               m_iStatus = STATUS_UNKNOWN;
-               LockChildList(FALSE);
-               for(i = 0; i < m_dwChildCount; i++)
+               // Change status of node and all it's children to UNKNOWN
+               m_status = STATUS_UNKNOWN;
+               lockChildList(false);
+               for(int i = 0; i < m_childList->size(); i++)
                {
-                       m_pChildList[i]->resetStatus();
-                       if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+                  NetObj *object = m_childList->get(i);
+                  object->resetStatus();
+                       if (object->getObjectClass() == OBJECT_INTERFACE)
                        {
-                               if (((Interface *)m_pChildList[i])->isFake())
+                               if (((Interface *)object)->isFake())
                                {
-                                       ((Interface *)m_pChildList[i])->setIpAddress(ipAddr);
+                                       ((Interface *)object)->setIpAddress(ipAddr);
                                }
                        }
                }
-               UnlockChildList();
+               unlockChildList();
 
                setModified();
        }
@@ -5312,7 +5334,7 @@ void Node::changeIPAddress(const InetAddress& ipAddr)
  */
 void Node::changeZone(UINT32 newZone)
 {
-   UINT32 i;
+   int i;
 
    pollerLock();
 
@@ -5323,13 +5345,13 @@ void Node::changeZone(UINT32 newZone)
        m_lastConfigurationPoll = 0;
 
        // Remove from subnets
-       LockParentList(FALSE);
-       NetObj **subnets = (NetObj **)malloc(sizeof(NetObj *) * m_dwParentCount);
-       UINT32 count = 0;
-       for(i = 0; i < m_dwParentCount; i++)
-               if (m_pParentList[i]->getObjectClass() == OBJECT_SUBNET)
-                       subnets[count++] = m_pParentList[i];
-       UnlockParentList();
+       lockParentList(false);
+       NetObj **subnets = (NetObj **)malloc(sizeof(NetObj *) * m_parentList->size());
+       int count = 0;
+       for(i = 0; i < m_parentList->size(); i++)
+               if (m_parentList->get(i)->getObjectClass() == OBJECT_SUBNET)
+                       subnets[count++] = m_parentList->get(i);
+       unlockParentList();
 
        for(i = 0; i < count; i++)
        {
@@ -5339,11 +5361,11 @@ void Node::changeZone(UINT32 newZone)
        safe_free(subnets);
 
        // Change zone ID on interfaces
-       LockChildList(FALSE);
-       for(i = 0; i < m_dwChildCount; i++)
-               if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
-                       ((Interface *)m_pChildList[i])->updateZoneId();
-       UnlockChildList();
+       lockChildList(false);
+       for(i = 0; i < m_childList->size(); i++)
+               if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
+                       ((Interface *)m_childList->get(i))->updateZoneId();
+       unlockChildList();
 
    setModified();
    unlockProperties();
@@ -5376,14 +5398,14 @@ UINT32 Node::getInterfaceCount(Interface **ppInterface)
 {
    UINT32 i, dwCount;
 
-   LockChildList(FALSE);
-   for(i = 0, dwCount = 0; i < m_dwChildCount; i++)
-      if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+   lockChildList(false);
+   for(i = 0, dwCount = 0; i < m_childList->size(); i++)
+      if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
       {
          dwCount++;
-         *ppInterface = (Interface *)m_pChildList[i];
+         *ppInterface = (Interface *)m_childList->get(i);
       }
-   UnlockChildList();
+   unlockChildList();
    return dwCount;
 }
 
@@ -5463,36 +5485,36 @@ bool Node::getOutwardInterface(const InetAddress& destAddr, InetAddress *srcAddr
  */
 bool Node::getNextHop(const InetAddress& srcAddr, const InetAddress& destAddr, InetAddress *nextHop, UINT32 *ifIndex, bool *isVpn, TCHAR *name)
 {
-   UINT32 i;
    bool nextHopFound = false;
    *name = 0;
 
        // Check directly connected networks and VPN connectors
        bool nonFunctionalInterfaceFound = false;
-       LockChildList(FALSE);
-       for(i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-               if (m_pChildList[i]->getObjectClass() == OBJECT_VPNCONNECTOR)
+          NetObj *object = m_childList->get(i);
+               if (object->getObjectClass() == OBJECT_VPNCONNECTOR)
                {
-                       if (((VPNConnector *)m_pChildList[i])->isRemoteAddr(destAddr) &&
-                                ((VPNConnector *)m_pChildList[i])->isLocalAddr(srcAddr))
+                       if (((VPNConnector *)object)->isRemoteAddr(destAddr) &&
+                                ((VPNConnector *)object)->isLocalAddr(srcAddr))
                        {
-                               *nextHop = ((VPNConnector *)m_pChildList[i])->getPeerGatewayAddr();
-                               *ifIndex = m_pChildList[i]->getId();
+                               *nextHop = ((VPNConnector *)object)->getPeerGatewayAddr();
+                               *ifIndex = object->getId();
                                *isVpn = true;
-            nx_strncpy(name, m_pChildList[i]->getName(), MAX_OBJECT_NAME);
+            nx_strncpy(name, object->getName(), MAX_OBJECT_NAME);
                                nextHopFound = true;
                                break;
                        }
                }
-               else if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) &&
-               ((Interface *)m_pChildList[i])->getIpAddressList()->findSameSubnetAddress(destAddr).isValid())
+               else if ((object->getObjectClass() == OBJECT_INTERFACE) &&
+               ((Interface *)object)->getIpAddressList()->findSameSubnetAddress(destAddr).isValid())
                {
                        *nextHop = destAddr;
-                       *ifIndex = ((Interface *)m_pChildList[i])->getIfIndex();
+                       *ifIndex = ((Interface *)object)->getIfIndex();
                        *isVpn = false;
-         nx_strncpy(name, m_pChildList[i]->getName(), MAX_OBJECT_NAME);
-                       if (m_pChildList[i]->Status() == SEVERITY_NORMAL)  /* TODO: use separate link status */
+         nx_strncpy(name, object->getName(), MAX_OBJECT_NAME);
+                       if (object->getStatus() == SEVERITY_NORMAL)  /* TODO: use separate link status */
                        {
                                // found operational interface
                                nextHopFound = true;
@@ -5503,7 +5525,7 @@ bool Node::getNextHop(const InetAddress& srcAddr, const InetAddress& destAddr, I
                        nonFunctionalInterfaceFound = true;
                }
        }
-       UnlockChildList();
+       unlockChildList();
 
        // Check routing table
        // If directly connected subnet found, only check host routes
@@ -5511,7 +5533,7 @@ bool Node::getNextHop(const InetAddress& srcAddr, const InetAddress& destAddr, I
    routingTableLock();
    if (m_pRoutingTable != NULL)
    {
-      for(i = 0; i < (UINT32)m_pRoutingTable->iNumEntries; i++)
+      for(int i = 0; i < m_pRoutingTable->iNumEntries; i++)
                {
          if ((!nextHopFound || (m_pRoutingTable->pRoutes[i].dwDestMask == 0xFFFFFFFF)) &&
              ((destAddr.getAddressV4() & m_pRoutingTable->pRoutes[i].dwDestMask) == m_pRoutingTable->pRoutes[i].dwDestAddr))
@@ -5712,14 +5734,14 @@ Cluster *Node::getMyCluster()
        UINT32 i;
        Cluster *pCluster = NULL;
 
-       LockParentList(FALSE);
-       for(i = 0; i < m_dwParentCount; i++)
-               if (m_pParentList[i]->getObjectClass() == OBJECT_CLUSTER)
+       lockParentList(false);
+       for(i = 0; i < m_parentList->size(); i++)
+               if (m_parentList->get(i)->getObjectClass() == OBJECT_CLUSTER)
                {
-                       pCluster = (Cluster *)m_pParentList[i];
+                       pCluster = (Cluster *)m_parentList->get(i);
                        break;
                }
-       UnlockParentList();
+       unlockParentList();
        return pCluster;
 }
 
@@ -5848,12 +5870,12 @@ BOOL Node::resolveName(BOOL useOnlyDNS)
        else
        {
                // Try to resolve each interface's IP address
-               LockChildList(FALSE);
-               for(UINT32 i = 0; i < m_dwChildCount; i++)
+               lockChildList(false);
+               for(int i = 0; i < m_childList->size(); i++)
                {
-                       if ((m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE) && !((Interface *)m_pChildList[i])->isLoopback())
+                       if ((m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE) && !((Interface *)m_childList->get(i))->isLoopback())
                        {
-            const InetAddressList *list = ((Interface *)m_pChildList[i])->getIpAddressList();
+            const InetAddressList *list = ((Interface *)m_childList->get(i))->getIpAddressList();
             for(int n = 0; n < list->size(); n++)
             {
                const InetAddress& a = list->get(i);
@@ -5866,7 +5888,7 @@ BOOL Node::resolveName(BOOL useOnlyDNS)
             }
                        }
                }
-               UnlockChildList();
+               unlockChildList();
 
                // Try to get hostname from agent if address resolution fails
                if (!(bSuccess || useOnlyDNS))
@@ -5991,52 +6013,53 @@ void Node::buildIPTopologyInternal(nxmap_ObjList &topology, int nDepth, UINT32 s
 
        if (nDepth > 0)
        {
-      UINT32 i;
-      int j;
-
                ObjectArray<Subnet> subnets;
-               LockParentList(FALSE);
-               for(i = 0; i < m_dwParentCount; i++)
+               lockParentList(false);
+               for(int i = 0; i < m_parentList->size(); i++)
                {
-                       if ((m_pParentList[i]->getId() == seedSubnet) || (m_pParentList[i]->getObjectClass() != OBJECT_SUBNET))
+                  NetObj *object = m_parentList->get(i);
+
+                       if ((object->getId() == seedSubnet) || (object->getObjectClass() != OBJECT_SUBNET))
                                continue;
 
-         if (!topology.isObjectExist(m_pParentList[i]->getId()))
+         if (!topology.isObjectExist(object->getId()))
          {
-                          topology.addObject(m_pParentList[i]->getId());
-                          m_pParentList[i]->incRefCount();
-                          subnets.add((Subnet *)m_pParentList[i]);
+                          topology.addObject(object->getId());
+                          object->incRefCount();
+                          subnets.add((Subnet *)object);
          }
-                       topology.linkObjects(m_id, m_pParentList[i]->getId());
+                       topology.linkObjects(m_id, object->getId());
                }
-               UnlockParentList();
+               unlockParentList();
 
-               for(j = 0; j < subnets.size(); j++)
+               for(int i = 0; i < subnets.size(); i++)
                {
-                       Subnet *s = subnets.get(j);
+                       Subnet *s = subnets.get(i);
                        s->buildIPTopologyInternal(topology, nDepth, m_id, includeEndNodes);
                        s->decRefCount();
                }
 
       ObjectArray<Node> peers;
-               LockChildList(FALSE);
-               for(i = 0; i < m_dwChildCount; i++)
+               lockChildList(false);
+               for(int i = 0; i < m_childList->size(); i++)
                {
-                       if (m_pChildList[i]->getObjectClass() != OBJECT_VPNCONNECTOR)
+         NetObj *object = m_parentList->get(i);
+
+                       if (object->getObjectClass() != OBJECT_VPNCONNECTOR)
                                continue;
 
-         Node *node = (Node *)FindObjectById(((VPNConnector *)m_pChildList[i])->getPeerGatewayId(), OBJECT_NODE);
+         Node *node = (Node *)FindObjectById(((VPNConnector *)object)->getPeerGatewayId(), OBJECT_NODE);
          if ((node != NULL) && (node->getId() != seedSubnet) && !topology.isObjectExist(node->getId()))
          {
             node->incRefCount();
                           peers.add(node);
          }
                }
-               UnlockChildList();
+               unlockChildList();
 
-               for(j = 0; j < peers.size(); j++)
+               for(int i = 0; i < peers.size(); i++)
                {
-                       Node *n = peers.get(j);
+                       Node *n = peers.get(i);
                        n->buildIPTopologyInternal(topology, nDepth - 1, m_id, true, includeEndNodes);
                        n->decRefCount();
                }
@@ -6197,13 +6220,13 @@ void Node::topologyPoll(ClientSession *pSession, UINT32 dwRqId, PollerInfo *poll
                        }
                }
 
-      LockChildList(FALSE);
-      for(DWORD i = 0; i < m_dwChildCount; i++)
+      lockChildList(false);
+      for(int i = 0; i < m_childList->size(); i++)
       {
-         if (m_pChildList[i]->getObjectClass() != OBJECT_INTERFACE)
+         if (m_childList->get(i)->getObjectClass() != OBJECT_INTERFACE)
             continue;
 
-         Interface *iface = (Interface *)m_pChildList[i];
+         Interface *iface = (Interface *)m_childList->get(i);
 
          // Clear self-linked interfaces caused by bug in previous release
          if ((iface->getPeerNodeId() == m_id) && (iface->getPeerInterfaceId() == iface->getId()))
@@ -6249,7 +6272,7 @@ void Node::topologyPoll(ClientSession *pSession, UINT32 dwRqId, PollerInfo *poll
             }
          }
       }
-      UnlockChildList();
+      unlockChildList();
 
           sendPollerMsg(dwRqId, _T("Link layer topology processed\r\n"));
                DbgPrintf(4, _T("Link layer topology processed for node %s [%d]"), m_name, m_id);
@@ -6342,13 +6365,13 @@ void Node::addHostConnections(LinkLayerNeighbors *nbs)
 
        DbgPrintf(5, _T("Node::addHostConnections(%s [%d]): FDB retrieved"), m_name, (int)m_id);
 
-       LockChildList(FALSE);
-       for(int i = 0; i < (int)m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < (int)m_childList->size(); i++)
        {
-               if (m_pChildList[i]->getObjectClass() != OBJECT_INTERFACE)
+               if (m_childList->get(i)->getObjectClass() != OBJECT_INTERFACE)
                        continue;
 
-               Interface *ifLocal = (Interface *)m_pChildList[i];
+               Interface *ifLocal = (Interface *)m_childList->get(i);
                BYTE macAddr[MAC_ADDR_LENGTH];
                if (fdb->isSingleMacOnPort(ifLocal->getIfIndex(), macAddr))
                {
@@ -6376,7 +6399,7 @@ void Node::addHostConnections(LinkLayerNeighbors *nbs)
                        }
                }
        }
-       UnlockChildList();
+       unlockChildList();
 
        fdb->decRefCount();
 }
@@ -6386,13 +6409,13 @@ void Node::addHostConnections(LinkLayerNeighbors *nbs)
  */
 void Node::addExistingConnections(LinkLayerNeighbors *nbs)
 {
-       LockChildList(FALSE);
-       for(int i = 0; i < (int)m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < (int)m_childList->size(); i++)
        {
-               if (m_pChildList[i]->getObjectClass() != OBJECT_INTERFACE)
+               if (m_childList->get(i)->getObjectClass() != OBJECT_INTERFACE)
                        continue;
 
-               Interface *ifLocal = (Interface *)m_pChildList[i];
+               Interface *ifLocal = (Interface *)m_childList->get(i);
                if ((ifLocal->getPeerNodeId() != 0) && (ifLocal->getPeerInterfaceId() != 0))
                {
                        Interface *ifRemote = (Interface *)FindObjectById(ifLocal->getPeerInterfaceId(), OBJECT_INTERFACE);
@@ -6410,7 +6433,7 @@ void Node::addExistingConnections(LinkLayerNeighbors *nbs)
                        }
                }
        }
-       UnlockChildList();
+       unlockChildList();
 }
 
 /**
@@ -6498,12 +6521,12 @@ void Node::checkSubnetBinding()
 
    // Build consolidated IP address list
    InetAddressList addrList;
-   LockChildList(FALSE);
-   for(UINT32 n = 0; n < m_dwChildCount; n++)
+   lockChildList(false);
+   for(int n = 0; n < m_childList->size(); n++)
    {
-      if (m_pChildList[n]->getObjectClass() != OBJECT_INTERFACE)
+      if (m_childList->get(n)->getObjectClass() != OBJECT_INTERFACE)
          continue;
-      Interface *iface = (Interface *)m_pChildList[n];
+      Interface *iface = (Interface *)m_childList->get(n);
       if (iface->isLoopback() || iface->isExcludedFromTopology())
          continue;
       for(int m = 0; m < iface->getIpAddressList()->size(); m++)
@@ -6515,7 +6538,7 @@ void Node::checkSubnetBinding()
          }
       }
    }
-   UnlockChildList();
+   unlockChildList();
 
    // Check if we have subnet bindings for all interfaces
    DbgPrintf(5, _T("Checking subnet bindings for node %s [%d]"), m_name, m_id);
@@ -6634,14 +6657,14 @@ void Node::checkSubnetBinding()
    }
 
        // Check for incorrect parent subnets
-       LockParentList(FALSE);
-       LockChildList(FALSE);
-   ObjectArray<NetObj> unlinkList(m_dwParentCount, 8, false);
-       for(UINT32 i = 0; i < m_dwParentCount; i++)
+       lockParentList(false);
+       lockChildList(false);
+   ObjectArray<NetObj> unlinkList(m_parentList->size(), 8, false);
+       for(int i = 0; i < m_parentList->size(); i++)
        {
-               if (m_pParentList[i]->getObjectClass() == OBJECT_SUBNET)
+               if (m_parentList->get(i)->getObjectClass() == OBJECT_SUBNET)
                {
-                       Subnet *pSubnet = (Subnet *)m_pParentList[i];
+                       Subnet *pSubnet = (Subnet *)m_parentList->get(i);
                        if (pSubnet->getIpAddress().contain(m_ipAddress) && !(m_dwFlags & NF_REMOTE_AGENT))
             continue;   // primary IP is in given subnet
 
@@ -6666,8 +6689,8 @@ void Node::checkSubnetBinding()
                        }
                }
        }
-       UnlockChildList();
-       UnlockParentList();
+       unlockChildList();
+       unlockParentList();
 
        // Unlink for incorrect subnet objects
    for(int n = 0; n < unlinkList.size(); n++)
@@ -6704,12 +6727,12 @@ void Node::updateInterfaceNames(ClientSession *pSession, UINT32 dwRqId)
       {
          InterfaceInfo *ifInfo = pIfList->get(j);
 
-         LockChildList(FALSE);
-         for(UINT32 i = 0; i < m_dwChildCount; i++)
+         lockChildList(false);
+         for(int i = 0; i < m_childList->size(); i++)
          {
-            if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+            if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
             {
-               Interface *pInterface = (Interface *)m_pChildList[i];
+               Interface *pInterface = (Interface *)m_childList->get(i);
 
                if (ifInfo->index == pInterface->getIfIndex())
                {
@@ -6733,7 +6756,7 @@ void Node::updateInterfaceNames(ClientSession *pSession, UINT32 dwRqId)
                }
             }
          }
-         UnlockChildList();
+         unlockChildList();
       }
 
       delete pIfList;
@@ -6757,19 +6780,20 @@ NXSL_Array *Node::getParentsForNXSL()
        NXSL_Array *parents = new NXSL_Array;
        int index = 0;
 
-       LockParentList(FALSE);
-       for(UINT32 i = 0; i < m_dwParentCount; i++)
+       lockParentList(FALSE);
+       for(UINT32 i = 0; i < m_parentList->size(); i++)
        {
-               if (((m_pParentList[i]->getObjectClass() == OBJECT_CONTAINER) ||
-                    (m_pParentList[i]->getObjectClass() == OBJECT_CLUSTER) ||
-                         (m_pParentList[i]->getObjectClass() == OBJECT_SUBNET) ||
-                         (m_pParentList[i]->getObjectClass() == OBJECT_SERVICEROOT)) &&
-                   m_pParentList[i]->isTrustedNode(m_id))
+          NetObj *object = m_parentList->get(i);
+               if (((object->getObjectClass() == OBJECT_CONTAINER) ||
+                    (object->getObjectClass() == OBJECT_CLUSTER) ||
+                         (object->getObjectClass() == OBJECT_SUBNET) ||
+                         (object->getObjectClass() == OBJECT_SERVICEROOT)) &&
+                   object->isTrustedNode(m_id))
                {
-                       parents->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, m_pParentList[i])));
+                       parents->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, object)));
                }
        }
-       UnlockParentList();
+       unlockParentList();
 
        return parents;
 }
@@ -6782,16 +6806,16 @@ NXSL_Array *Node::getTemplatesForNXSL()
        NXSL_Array *parents = new NXSL_Array;
        int index = 0;
 
-       LockParentList(FALSE);
-       for(UINT32 i = 0; i < m_dwParentCount; i++)
+       lockParentList(false);
+       for(int i = 0; i < m_parentList->size(); i++)
        {
-               if ((m_pParentList[i]->getObjectClass() == OBJECT_TEMPLATE) &&
-                   m_pParentList[i]->isTrustedNode(m_id))
+      NetObj *object = m_parentList->get(i);
+               if ((object->getObjectClass() == OBJECT_TEMPLATE) && object->isTrustedNode(m_id))
                {
-                       parents->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, m_pParentList[i])));
+                       parents->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, object)));
                }
        }
-       UnlockParentList();
+       unlockParentList();
 
        return parents;
 }
@@ -6804,15 +6828,15 @@ NXSL_Array *Node::getInterfacesForNXSL()
        NXSL_Array *ifaces = new NXSL_Array;
        int index = 0;
 
-       LockChildList(FALSE);
-       for(UINT32 i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-               if (m_pChildList[i]->getObjectClass() == OBJECT_INTERFACE)
+               if (m_childList->get(i)->getObjectClass() == OBJECT_INTERFACE)
                {
-                       ifaces->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslInterfaceClass, m_pChildList[i])));
+                       ifaces->set(index++, new NXSL_Value(new NXSL_Object(&g_nxslInterfaceClass, m_childList->get(i))));
                }
        }
-       UnlockChildList();
+       unlockChildList();
 
        return ifaces;
 }
@@ -7589,20 +7613,21 @@ void Node::updateRackBinding()
    bool rackFound = false;
    ObjectArray<NetObj> deleteList(16, 16, false);
 
-   LockParentList(TRUE);
-   for(UINT32 i = 0; i < m_dwParentCount; i++)
+   lockParentList(true);
+   for(int i = 0; i < m_parentList->size(); i++)
    {
-      if (m_pParentList[i]->getObjectClass() != OBJECT_RACK)
+      NetObj *object = m_parentList->get(i);
+      if (object->getObjectClass() != OBJECT_RACK)
          continue;
-      if (m_pParentList[i]->getId() == m_rackId)
+      if (object->getId() == m_rackId)
       {
          rackFound = true;
          continue;
       }
-      m_pParentList[i]->incRefCount();
-      deleteList.add(m_pParentList[i]);
+      object->incRefCount();
+      deleteList.add(object);
    }
-   UnlockParentList();
+   unlockParentList();
 
    for(int n = 0; n < deleteList.size(); n++)
    {
index 6c78c51..70d0eb3 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2012 Raden Solutions
+** Copyright (C) 2003-2016 Raden Solutions
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -186,13 +186,13 @@ void NodeLink::execute()
 {
        DbgPrintf(6, _T("NodeLink::execute() started for %s [%ld]"), m_name, (long)m_id);
 
-   LockChildList(FALSE);
-       for (int i = 0; i < int(m_dwChildCount); i++)
+   lockChildList(false);
+       for (int i = 0; i < m_childList->size(); i++)
        {
-               if (m_pChildList[i]->getObjectClass() == OBJECT_SLMCHECK)
-                       ((SlmCheck *)m_pChildList[i])->execute();
+               if (m_childList->get(i)->getObjectClass() == OBJECT_SLMCHECK)
+                       ((SlmCheck *)m_childList->get(i))->execute();
        }
-   UnlockChildList();
+   unlockChildList();
 
        calculateCompoundStatus();
 
@@ -206,17 +206,17 @@ void NodeLink::applyTemplate(SlmCheck *tmpl)
 {
        // Check if we already have check created from this template
        SlmCheck *check = NULL;
-       LockChildList(FALSE);
-       for(UINT32 i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-               if ((m_pChildList[i]->getObjectClass() == OBJECT_SLMCHECK) &&
-                   (((SlmCheck *)m_pChildList[i])->getTemplateId() == tmpl->getId()))
+               if ((m_childList->get(i)->getObjectClass() == OBJECT_SLMCHECK) &&
+                   (((SlmCheck *)m_childList->get(i))->getTemplateId() == tmpl->getId()))
                {
-                       check = (SlmCheck *)m_pChildList[i];
+                       check = (SlmCheck *)m_childList->get(i);
                        break;
                }
        }
-       UnlockChildList();
+       unlockChildList();
 
        if (check == NULL)
        {
@@ -239,16 +239,16 @@ void NodeLink::applyTemplates()
 {
        ObjectArray<SlmCheck> templates;
 
-       LockParentList(FALSE);
-       for(UINT32 i = 0; i < m_dwParentCount; i++)
+       lockParentList(false);
+       for(int i = 0; i < m_parentList->size(); i++)
        {
-               if (m_pParentList[i]->getObjectClass() != OBJECT_BUSINESSSERVICE)
+               if (m_parentList->get(i)->getObjectClass() != OBJECT_BUSINESSSERVICE)
                        continue;
 
-               BusinessService *parent = (BusinessService *)m_pParentList[i];
+               BusinessService *parent = (BusinessService *)m_parentList->get(i);
                parent->getApplicableTemplates(this, &templates);
        }
-       UnlockParentList();
+       unlockParentList();
 
        for(int j = 0; j < templates.size(); j++)
        {
index d5fb913..1f88cc0 100644 (file)
@@ -176,7 +176,7 @@ NXSL_Value *NXSL_NetObjClass::getAttr(NXSL_Object *_object, const TCHAR *attr)
    }
    else if (!_tcscmp(attr, _T("status")))
    {
-      value = new NXSL_Value((LONG)object->Status());
+      value = new NXSL_Value((LONG)object->getStatus());
    }
    else if (!_tcscmp(attr, _T("ipAddr")))
    {
index 3860d8e..acc49b8 100644 (file)
@@ -1823,7 +1823,7 @@ static void DumpObjectCallback(NetObj *object, void *data)
        ConsolePrintf(pCtx, _T("Object ID %d \"%s\"\n")
                        _T("   Class: %s  Status: %s  IsModified: %d  IsDeleted: %d\n"),
                                          object->getId(), object->getName(), object->getObjectClassName(),
-                 GetStatusAsText(object->Status(), true),
+                 GetStatusAsText(object->getStatus(), true),
                  object->isModified(), object->isDeleted());
    ConsolePrintf(pCtx, _T("   Parents: <%s>\n   Childs: <%s>\n"),
                  object->dbgGetParentList(dd->buffer), object->dbgGetChildList(&dd->buffer[4096]));
index 58c0316..f0cf4b3 100644 (file)
@@ -53,7 +53,7 @@ TemplateRoot::TemplateRoot() : UniversalRoot()
 {
    m_id = BUILTIN_OID_TEMPLATEROOT;
    _tcscpy(m_name, _T("Templates"));
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 }
 
 /**
@@ -68,7 +68,7 @@ TemplateRoot::~TemplateRoot()
  */
 void TemplateRoot::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
 
 /**
@@ -78,7 +78,7 @@ PolicyRoot::PolicyRoot() : UniversalRoot()
 {
    m_id = BUILTIN_OID_POLICYROOT;
    _tcscpy(m_name, _T("Policies"));
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 }
 
 /**
@@ -93,7 +93,7 @@ PolicyRoot::~PolicyRoot()
  */
 void PolicyRoot::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
 
 /**
@@ -103,7 +103,7 @@ NetworkMapRoot::NetworkMapRoot() : UniversalRoot()
 {
    m_id = BUILTIN_OID_NETWORKMAPROOT;
    _tcscpy(m_name, _T("Network Maps"));
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 }
 
 /**
@@ -118,7 +118,7 @@ NetworkMapRoot::~NetworkMapRoot()
  */
 void NetworkMapRoot::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
 
 /**
@@ -128,7 +128,7 @@ DashboardRoot::DashboardRoot() : UniversalRoot()
 {
    m_id = BUILTIN_OID_DASHBOARDROOT;
    _tcscpy(m_name, _T("Dashboards"));
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 }
 
 /**
@@ -143,5 +143,5 @@ DashboardRoot::~DashboardRoot()
  */
 void DashboardRoot::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
index 44c48ca..d3cc303 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2014 Raden Solutions
+** Copyright (C) 2003-2016 Raden Solutions
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 
 NXSL_VariableSystem SlmCheck::m_nxslConstants;
 
-
-//
-// Initialize static members
-//
-
+/**
+ * Initialize static members
+ */
 void SlmCheck::init()
 {
        m_nxslConstants.create(_T("OK"), new NXSL_Value((LONG)0));
        m_nxslConstants.create(_T("FAIL"), new NXSL_Value((LONG)1));
 }
 
-
-//
-// SLM check default constructor
-//
-
+/**
+ * SLM check default constructor
+ */
 SlmCheck::SlmCheck() : NetObj()
 {
        _tcscpy(m_name, _T("Default"));
@@ -365,7 +361,7 @@ void SlmCheck::execute()
        if (m_isTemplate)
                return;
 
-       UINT32 oldStatus = m_iStatus;
+       UINT32 oldStatus = m_status;
 
        switch (m_type)
        {
@@ -379,8 +375,8 @@ void SlmCheck::execute()
                                if (m_pCompiledScript->run(0, NULL, NULL, &pGlobals, &m_nxslConstants))
                                {
                                        NXSL_Value *pValue = m_pCompiledScript->getResult();
-                                       m_iStatus = (pValue->getValueAsInt32() == 0) ? STATUS_NORMAL : STATUS_CRITICAL;
-                                       if (m_iStatus == STATUS_CRITICAL)
+                                       m_status = (pValue->getValueAsInt32() == 0) ? STATUS_NORMAL : STATUS_CRITICAL;
+                                       if (m_status == STATUS_CRITICAL)
                                        {
                                                NXSL_Variable *reason = pGlobals->find(_T("$reason"));
                                                setReason((reason != NULL) ? reason->getValue()->getValueAsCString() : _T("Check script returns error"));
@@ -394,26 +390,26 @@ void SlmCheck::execute()
                                        _sntprintf(buffer, 1024, _T("ServiceCheck::%s::%d"), m_name, m_id);
                                        PostEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, "ssd", buffer, m_pCompiledScript->getErrorText(), m_id);
                                        nxlog_write(MSG_SLMCHECK_SCRIPT_EXECUTION_ERROR, NXLOG_WARNING, "dss", m_id, m_name, m_pCompiledScript->getErrorText());
-                                       m_iStatus = STATUS_UNKNOWN;
+                                       m_status = STATUS_UNKNOWN;
                                }
                                delete pGlobals;
                        }
                        else
                        {
-                               m_iStatus = STATUS_UNKNOWN;
+                               m_status = STATUS_UNKNOWN;
                        }
                        break;
                case check_threshold:
                default:
                        DbgPrintf(4, _T("SlmCheck::execute() called for undefined check type, check %s/%ld"), m_name, (long)m_id);
-                       m_iStatus = STATUS_UNKNOWN;
+                       m_status = STATUS_UNKNOWN;
                        break;
        }
 
        lockProperties();
-       if (m_iStatus != oldStatus)
+       if (m_status != oldStatus)
        {
-               if (m_iStatus == STATUS_CRITICAL)
+               if (m_status == STATUS_CRITICAL)
                        insertTicket();
                else
                        closeTicket();
@@ -429,7 +425,7 @@ bool SlmCheck::insertTicket()
 {
        DbgPrintf(4, _T("SlmCheck::insertTicket() called for %s [%d], reason='%s'"), m_name, (int)m_id, m_reason);
 
-       if (m_iStatus == STATUS_NORMAL)
+       if (m_status == STATUS_NORMAL)
                return false;
 
        m_currentTicketId = CreateUniqueId(IDG_SLM_TICKET);
@@ -477,17 +473,18 @@ UINT32 SlmCheck::getOwnerId()
 {
        UINT32 ownerId = 0;
 
-       LockParentList(FALSE);
-       for(UINT32 i = 0; i < m_dwParentCount; i++)
+       lockParentList(false);
+       for(int i = 0; i < m_parentList->size(); i++)
        {
-               if ((m_pParentList[i]->getObjectClass() == OBJECT_BUSINESSSERVICE) ||
-                   (m_pParentList[i]->getObjectClass() == OBJECT_NODELINK))
+      NetObj *object = m_parentList->get(i);
+               if ((object->getObjectClass() == OBJECT_BUSINESSSERVICE) ||
+                   (object->getObjectClass() == OBJECT_NODELINK))
                {
-                       ownerId = m_pParentList[i]->getId();
+                       ownerId = object->getId();
                        break;
                }
        }
-       UnlockParentList();
+       unlockParentList();
        return ownerId;
 }
 
@@ -500,16 +497,17 @@ NXSL_Value *SlmCheck::getNodeObjectForNXSL()
        NXSL_Value *value = NULL;
        UINT32 nodeId = 0;
 
-       LockParentList(FALSE);
-       for(UINT32 i = 0; i < m_dwParentCount; i++)
+       lockParentList(false);
+       for(int i = 0; i < m_parentList->size(); i++)
        {
-               if (m_pParentList[i]->getObjectClass() == OBJECT_NODELINK)
+          NetObj *object = m_parentList->get(i);
+               if (object->getObjectClass() == OBJECT_NODELINK)
                {
-                       nodeId = ((NodeLink *)m_pParentList[i])->getNodeId();
+                       nodeId = ((NodeLink *)object)->getNodeId();
                        break;
                }
        }
-       UnlockParentList();
+       unlockParentList();
 
        if (nodeId != 0)
        {
index bafd9fe..7431587 100644 (file)
@@ -330,7 +330,7 @@ void ProcessTrap(SNMP_PDU *pdu, const InetAddress& srcAddr, int srcPort, SNMP_Tr
    if (pNode != NULL)
    {
       DbgPrintf(4, _T("ProcessTrap: trap matched to node %s [%d]"), pNode->getName(), pNode->getId());
-      if ((pNode->Status() != STATUS_UNMANAGED) || (g_flags & AF_TRAPS_FROM_UNMANAGED_NODES))
+      if ((pNode->getStatus() != STATUS_UNMANAGED) || (g_flags & AF_TRAPS_FROM_UNMANAGED_NODES))
       {
          UINT32 i;
 
index 745a32b..6ea84fc 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -92,7 +92,6 @@ bool Subnet::loadFromDatabase(DB_HANDLE hdb, UINT32 dwId)
 BOOL Subnet::saveToDatabase(DB_HANDLE hdb)
 {
    TCHAR szQuery[1024], szIpAddr[64];
-   UINT32 i;
 
    // Lock object's access
    lockProperties();
@@ -113,13 +112,13 @@ BOOL Subnet::saveToDatabase(DB_HANDLE hdb)
    // Update node to subnet mapping
    _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("DELETE FROM nsmap WHERE subnet_id=%d"), m_id);
    DBQuery(hdb, szQuery);
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("INSERT INTO nsmap (subnet_id,node_id) VALUES (%d,%d)"), m_id, m_pChildList[i]->getId());
+      _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("INSERT INTO nsmap (subnet_id,node_id) VALUES (%d,%d)"), m_id, m_childList->get(i)->getId());
       DBQuery(hdb, szQuery);
    }
-   UnlockChildList();
+   unlockChildList();
 
    // Save access list
    saveACLToDB(hdb);
@@ -201,14 +200,14 @@ bool Subnet::findMacAddress(const InetAddress& ipAddr, BYTE *macAddr)
 {
        bool success = false;
 
-       LockChildList(FALSE);
+       lockChildList(false);
 
-   for(UINT32 i = 0; (i < m_dwChildCount) && !success; i++)
+   for(int i = 0; (i < m_childList->size()) && !success; i++)
    {
-      if (m_pChildList[i]->getObjectClass() != OBJECT_NODE)
+      if (m_childList->get(i)->getObjectClass() != OBJECT_NODE)
                        continue;
 
-               Node *node = (Node *)m_pChildList[i];
+               Node *node = (Node *)m_childList->get(i);
                DbgPrintf(6, _T("Subnet[%s]::findMacAddress: reading ARP cache for node %s [%u]"), m_name, node->getName(), node->getId());
                ARP_CACHE *arpCache = node->getArpCache();
                if (arpCache == NULL)
@@ -227,7 +226,7 @@ bool Subnet::findMacAddress(const InetAddress& ipAddr, BYTE *macAddr)
                DestroyArpCache(arpCache);
    }
 
-       UnlockChildList();
+       unlockChildList();
 
        return success;
 }
@@ -238,17 +237,18 @@ bool Subnet::findMacAddress(const InetAddress& ipAddr, BYTE *macAddr)
 void Subnet::buildIPTopologyInternal(nxmap_ObjList &topology, int nDepth, UINT32 seedNode, bool includeEndNodes)
 {
        ObjectArray<Node> nodes;
-       LockChildList(FALSE);
-       for(UINT32 i = 0; i < m_dwChildCount; i++)
+       lockChildList(false);
+       for(int i = 0; i < m_childList->size(); i++)
        {
-               if ((m_pChildList[i]->getId() == seedNode) || (m_pChildList[i]->getObjectClass() != OBJECT_NODE))
+          NetObj *object = m_childList->get(i);
+               if ((object->getId() == seedNode) || (object->getObjectClass() != OBJECT_NODE))
                        continue;
-               if (!includeEndNodes && !((Node *)m_pChildList[i])->isRouter())
+               if (!includeEndNodes && !((Node *)object)->isRouter())
                        continue;
-               m_pChildList[i]->incRefCount();
-               nodes.add((Node *)m_pChildList[i]);
+               object->incRefCount();
+               nodes.add((Node *)object);
        }
-       UnlockChildList();
+       unlockChildList();
 
        for(int j = 0; j < nodes.size(); j++)
        {
index 18edb82..2d9175d 100644 (file)
@@ -113,15 +113,15 @@ UINT32 ServiceContainer::modifyFromMessageInternal(NXCPMessage *pRequest)
 void ServiceContainer::calculateCompoundStatus(BOOL bForcedRecalc)
 {
        int i, iCount, iMostCriticalStatus;
-       int iOldStatus = m_iStatus;
+       int iOldStatus = m_status;
 
        DbgPrintf(7, _T("ServiceContainer::calculateCompoundStatus() for %s [%d]"), m_name, m_id);
 
        // Calculate own status by selecting the most critical status of the kids
-       LockChildList(FALSE);
-       for(i = 0, iCount = 0, iMostCriticalStatus = -1; i < int(m_dwChildCount); i++)
+       lockChildList(false);
+       for(i = 0, iCount = 0, iMostCriticalStatus = -1; i < m_childList->size(); i++)
        {
-               int iChildStatus = m_pChildList[i]->Status();
+               int iChildStatus = m_childList->get(i)->getStatus();
                if ((iChildStatus < STATUS_UNKNOWN) &&
                        (iChildStatus > iMostCriticalStatus))
                {
@@ -131,21 +131,21 @@ void ServiceContainer::calculateCompoundStatus(BOOL bForcedRecalc)
        }
        // Set status and update uptime counters
        setStatus((iCount > 0) ? iMostCriticalStatus : STATUS_UNKNOWN);
-       UnlockChildList();
+       unlockChildList();
 
        // Cause parent object(s) to recalculate it's status
-       if ((iOldStatus != m_iStatus) || bForcedRecalc)
+       if ((iOldStatus != m_status) || bForcedRecalc)
        {
-               LockParentList(FALSE);
-               for(i = 0; i < int(m_dwParentCount); i++)
-                       m_pParentList[i]->calculateCompoundStatus();
-               UnlockParentList();
+               lockParentList(false);
+               for(i = 0; i < m_parentList->size(); i++)
+                       m_parentList->get(i)->calculateCompoundStatus();
+               unlockParentList();
                setModified();   /* LOCK? */
        }
 
-       DbgPrintf(6, _T("ServiceContainer::calculateCompoundStatus(%s [%d]): old_status=%d new_status=%d"), m_name, m_id, iOldStatus, m_iStatus);
+       DbgPrintf(6, _T("ServiceContainer::calculateCompoundStatus(%s [%d]): old_status=%d new_status=%d"), m_name, m_id, iOldStatus, m_status);
 
-       if (iOldStatus != STATUS_UNKNOWN && iOldStatus != m_iStatus)
+       if (iOldStatus != STATUS_UNKNOWN && iOldStatus != m_status)
                addHistoryRecord();
 }
 
@@ -154,7 +154,7 @@ void ServiceContainer::calculateCompoundStatus(BOOL bForcedRecalc)
  */
 void ServiceContainer::setStatus(int newStatus)
 {
-       m_iStatus = newStatus;
+       m_status = newStatus;
 }
 
 /**
@@ -185,7 +185,7 @@ BOOL ServiceContainer::addHistoryRecord()
                DBBind(hStmt, 1, DB_SQLTYPE_INTEGER, ServiceContainer::logRecordId);
                DBBind(hStmt, 2, DB_SQLTYPE_INTEGER, m_id);
                DBBind(hStmt, 3, DB_SQLTYPE_INTEGER, UINT32(time(NULL)));
-               DBBind(hStmt, 4, DB_SQLTYPE_INTEGER, UINT32(m_iStatus));
+               DBBind(hStmt, 4, DB_SQLTYPE_INTEGER, UINT32(m_status));
                if (!DBExecute(hStmt))
                {
                        DBFreeStatement(hStmt);
@@ -209,7 +209,7 @@ BOOL ServiceContainer::addHistoryRecord()
 void ServiceContainer::initUptimeStats()
 {
        lockProperties();
-       m_prevUptimeUpdateStatus = m_iStatus;
+       m_prevUptimeUpdateStatus = m_status;
        m_uptimeDay = getUptimeFromDBFor(DAY, &m_downtimeDay);
        m_uptimeWeek = getUptimeFromDBFor(WEEK, &m_downtimeWeek);
        m_uptimeMonth = getUptimeFromDBFor(MONTH, &m_downtimeMonth);
@@ -259,7 +259,7 @@ double ServiceContainer::getUptimeFromDBFor(Period period, INT32 *downtime)
                if (newStatus == STATUS_CRITICAL) // the service is still down, add period till now
                        *downtime += LONG(time(NULL) - prevChangeTimestamp);
                // no rows for period && critical status -> downtime from beginning till now
-               if (realRows == 0 && m_iStatus == STATUS_CRITICAL)
+               if (realRows == 0 && m_status == STATUS_CRITICAL)
                        *downtime = timediffTillNow;
                percentage = 100.0 - (double)(*downtime * 100) / (double)getSecondsInPeriod(period);
                DbgPrintf(7, _T("++++ ServiceContainer::getUptimeFromDBFor(), downtime %ld"), *downtime);
@@ -289,7 +289,7 @@ void ServiceContainer::updateUptimeStats(time_t currentTime, BOOL updateChilds)
        double prevUptimeWeek = m_uptimeWeek;
        double prevUptimeMonth = m_uptimeMonth;
 
-       if (m_iStatus == STATUS_CRITICAL && m_prevUptimeUpdateStatus == STATUS_CRITICAL)
+       if (m_status == STATUS_CRITICAL && m_prevUptimeUpdateStatus == STATUS_CRITICAL)
        {
                downtimeBetweenPolls = LONG(currentTime - m_prevUptimeUpdateTime);
                DbgPrintf(7, _T("++++ ServiceContainer::updateUptimeStats() both statuses critical"));
@@ -324,21 +324,21 @@ void ServiceContainer::updateUptimeStats(time_t currentTime, BOOL updateChilds)
        }
        unlockProperties();
 
-       m_prevUptimeUpdateStatus = m_iStatus;
+       m_prevUptimeUpdateStatus = m_status;
        m_prevUptimeUpdateTime = currentTime;
 
        DbgPrintf(7, _T("++++ ServiceContainer::updateUptimeStats() [%d] %lf %lf %lf"), int(m_id), m_uptimeDay, m_uptimeWeek, m_uptimeMonth);
 
        if (updateChilds)
        {
-               LockChildList(FALSE);
-               for (int i = 0; i < int(m_dwChildCount); i++)
+               lockChildList(false);
+               for(int i = 0; i < m_childList->size(); i++)
                {
-                       NetObj *child = m_pChildList[i];
+                       NetObj *child = m_childList->get(i);
                        if (child->getObjectClass() == OBJECT_BUSINESSSERVICE || child->getObjectClass() == OBJECT_NODELINK)
                                ((ServiceContainer*)child)->updateUptimeStats(currentTime, TRUE);
                }
-               UnlockChildList();
+               unlockChildList();
        }
 }
 
index 7923fc2..0f8b43b 100644 (file)
@@ -429,7 +429,7 @@ static void ProcessSyslogMessage(char *psMsg, int nMsgLen, const InetAddress& so
 
                MutexLock(s_parserLock);
                if ((record.dwSourceObject != 0) && (s_parser != NULL) &&
-          ((node->Status() != STATUS_UNMANAGED) || (g_flags & AF_TRAPS_FROM_UNMANAGED_NODES)))
+          ((node->getStatus() != STATUS_UNMANAGED) || (g_flags & AF_TRAPS_FROM_UNMANAGED_NODES)))
                {
 #ifdef UNICODE
                        WCHAR wtag[MAX_SYSLOG_TAG_LEN];
index 3cbc3e7..439ae89 100644 (file)
@@ -27,7 +27,7 @@
  */
 void TemplateGroup::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
 
 /**
@@ -49,7 +49,7 @@ Template::Template() : NetObj()
    m_dwVersion = 0x00010000;  // Initial version is 1.0
        m_applyFilter = NULL;
        m_applyFilterSource = NULL;
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
    m_dciAccessLock = RWLockCreate();
    m_dciListModified = false;
 }
@@ -66,7 +66,7 @@ Template::Template(const TCHAR *pszName) : NetObj()
    m_dwVersion = 0x00010000;  // Initial version is 1.0
        m_applyFilter = NULL;
        m_applyFilterSource = NULL;
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
    m_isHidden = true;
    m_dciAccessLock = RWLockCreate();
    m_dciListModified = false;
@@ -79,7 +79,7 @@ Template::Template(ConfigEntry *config) : NetObj()
 {
    m_isHidden = true;
    m_dciLockStatus = -1;
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
    m_dciAccessLock = RWLockCreate();
    m_dciListModified = false;
 
@@ -259,7 +259,7 @@ bool Template::loadFromDatabase(DB_HANDLE hdb, UINT32 dwId)
       }
    }
 
-       m_iStatus = STATUS_NORMAL;
+       m_status = STATUS_NORMAL;
 
    return success;
 }
@@ -306,13 +306,13 @@ BOOL Template::saveToDatabase(DB_HANDLE hdb)
                // Update members list
                _sntprintf(query, 256, _T("DELETE FROM dct_node_map WHERE template_id=%d"), m_id);
                DBQuery(hdb, query);
-               LockChildList(FALSE);
-               for(UINT32 i = 0; i < m_dwChildCount; i++)
+               lockChildList(false);
+               for(int i = 0; i < m_childList->size(); i++)
                {
-                       _sntprintf(query, 256, _T("INSERT INTO dct_node_map (template_id,node_id) VALUES (%d,%d)"), m_id, m_pChildList[i]->getId());
+                       _sntprintf(query, 256, _T("INSERT INTO dct_node_map (template_id,node_id) VALUES (%d,%d)"), m_id, m_childList->get(i)->getId());
                        DBQuery(hdb, query);
                }
-               UnlockChildList();
+               unlockChildList();
 
                // Save access list
                saveACLToDB(hdb);
@@ -864,7 +864,7 @@ NXSL_Value *Template::getAllDCObjectsForNXSL(const TCHAR *name, const TCHAR *des
  */
 void Template::calculateCompoundStatus(BOOL bForcedRecalc)
 {
-   m_iStatus = STATUS_NORMAL;
+   m_status = STATUS_NORMAL;
 }
 
 /**
@@ -971,19 +971,22 @@ BOOL Template::applyToTarget(DataCollectionTarget *target)
  */
 void Template::queueUpdate()
 {
-   lockProperties();
-   for(UINT32 i = 0; i < m_dwChildCount; i++)
-      if ((m_pChildList[i]->getObjectClass() == OBJECT_NODE) || (m_pChildList[i]->getObjectClass() == OBJECT_CLUSTER) || (m_pChildList[i]->getObjectClass() == OBJECT_MOBILEDEVICE))
+   lockChildList(false);
+   for(int i = 0; i < m_childList->size(); i++)
+   {
+      NetObj *object = m_childList->get(i);
+      if (object->isDataCollectionTarget())
       {
          incRefCount();
          TEMPLATE_UPDATE_INFO *pInfo = (TEMPLATE_UPDATE_INFO *)malloc(sizeof(TEMPLATE_UPDATE_INFO));
          pInfo->updateType = APPLY_TEMPLATE;
          pInfo->pTemplate = this;
-         pInfo->targetId = m_pChildList[i]->getId();
+         pInfo->targetId = object->getId();
          pInfo->removeDCI = false;
          g_pTemplateUpdateQueue->put(pInfo);
       }
-   unlockProperties();
+   }
+   unlockChildList();
 }
 
 /**
@@ -1155,15 +1158,14 @@ void Template::prepareForDeletion()
 {
        if (getObjectClass() == OBJECT_TEMPLATE)
        {
-               UINT32 i;
-
-               LockChildList(FALSE);
-               for(i = 0; i < m_dwChildCount; i++)
+               lockChildList(false);
+               for(int i = 0; i < m_childList->size(); i++)
                {
-                       if ((m_pChildList[i]->getObjectClass() == OBJECT_NODE) || (m_pChildList[i]->getObjectClass() == OBJECT_MOBILEDEVICE))
-                               queueRemoveFromTarget(m_pChildList[i]->getId(), TRUE);
+                  NetObj *object = m_childList->get(i);
+                       if (object->isDataCollectionTarget())
+                               queueRemoveFromTarget(object->getId(), true);
                }
-               UnlockChildList();
+               unlockChildList();
        }
        NetObj::prepareForDeletion();
 }
index 7af9c2b..fea1c1d 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -73,7 +73,6 @@ void UniversalRoot::linkChildObjects()
 BOOL UniversalRoot::saveToDatabase(DB_HANDLE hdb)
 {
    TCHAR szQuery[1024];
-   UINT32 i;
 
    lockProperties();
 
@@ -82,13 +81,13 @@ BOOL UniversalRoot::saveToDatabase(DB_HANDLE hdb)
    // Update members list
    _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("DELETE FROM container_members WHERE container_id=%d"), m_id);
    DBQuery(hdb, szQuery);
-   LockChildList(FALSE);
-   for(i = 0; i < m_dwChildCount; i++)
+   lockChildList(FALSE);
+   for(int i = 0; i < m_childList->size(); i++)
    {
-      _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("INSERT INTO container_members (container_id,object_id) VALUES (%d,%d)"), m_id, m_pChildList[i]->getId());
+      _sntprintf(szQuery, sizeof(szQuery) / sizeof(TCHAR), _T("INSERT INTO container_members (container_id,object_id) VALUES (%d,%d)"), m_id, m_childList->get(i)->getId());
       DBQuery(hdb, szQuery);
    }
-   UnlockChildList();
+   unlockChildList();
 
    // Save access list
    saveACLToDB(hdb);
index d889bf5..1d1e465 100644 (file)
@@ -200,17 +200,19 @@ bool VPNConnector::deleteFromDatabase(DB_HANDLE hdb)
  */
 Node *VPNConnector::getParentNode()
 {
-   UINT32 i;
    Node *pNode = NULL;
 
-   LockParentList(FALSE);
-   for(i = 0; i < m_dwParentCount; i++)
-      if (m_pParentList[i]->getObjectClass() == OBJECT_NODE)
+   lockParentList(false);
+   for(int i = 0; i < m_parentList->size(); i++)
+   {
+      NetObj *object = m_parentList->get(i);
+      if (object->getObjectClass() == OBJECT_NODE)
       {
-         pNode = (Node *)m_pParentList[i];
+         pNode = (Node *)object;
          break;
       }
-   UnlockParentList();
+   }
+   unlockParentList();
    return pNode;
 }
 
index 30dd481..8830189 100644 (file)
@@ -442,15 +442,15 @@ protected:
    UINT32 m_dwTimeStamp;       // Last change time stamp
    UINT32 m_dwRefCount;        // Number of references. Object can be destroyed only when this counter is zero
    TCHAR m_name[MAX_OBJECT_NAME];
-   TCHAR *m_pszComments;      // User comments
-   int m_iStatus;
-   int m_iStatusCalcAlg;      // Status calculation algorithm
-   int m_iStatusPropAlg;      // Status propagation algorithm
-   int m_iFixedStatus;        // Status if propagation is "Fixed"
-   int m_iStatusShift;        // Shift value for "shifted" status propagation
-   int m_iStatusTranslation[4];
-   int m_iStatusSingleThreshold;
-   int m_iStatusThresholds[4];
+   TCHAR *m_comments;      // User comments
+   int m_status;
+   int m_statusCalcAlg;      // Status calculation algorithm
+   int m_statusPropAlg;      // Status propagation algorithm
+   int m_fixedStatus;        // Status if propagation is "Fixed"
+   int m_statusShift;        // Shift value for "shifted" status propagation
+   int m_statusTranslation[4];
+   int m_statusSingleThreshold;
+   int m_statusThresholds[4];
    bool m_isModified;
    bool m_isDeleted;
    bool m_isHidden;
@@ -468,11 +468,8 @@ protected:
        UINT32 m_submapId;                              // Map object which should be open on drill-down request
        IntegerArray<UINT32> *m_dashboards; // Dashboards associated with this object
 
-   UINT32 m_dwChildCount;      // Number of child objects
-   NetObj **m_pChildList;     // Array of pointers to child objects
-
-   UINT32 m_dwParentCount;     // Number of parent objects
-   NetObj **m_pParentList;    // Array of pointers to parent objects
+   ObjectArray<NetObj> *m_childList;     // Array of pointers to child objects
+   ObjectArray<NetObj> *m_parentList;    // Array of pointers to parent objects
 
    AccessList *m_accessList;
    bool m_inheritAccessRights;
@@ -488,22 +485,22 @@ protected:
    void unlockProperties() const { MutexUnlock(m_mutexProperties); }
    void lockACL() { MutexLock(m_mutexACL); }
    void unlockACL() { MutexUnlock(m_mutexACL); }
-   void LockParentList(BOOL bWrite)
+   void lockParentList(bool writeLock)
    {
-      if (bWrite)
+      if (writeLock)
          RWLockWriteLock(m_rwlockParentList, INFINITE);
       else
          RWLockReadLock(m_rwlockParentList, INFINITE);
    }
-   void UnlockParentList() { RWLockUnlock(m_rwlockParentList); }
-   void LockChildList(BOOL bWrite)
+   void unlockParentList() { RWLockUnlock(m_rwlockParentList); }
+   void lockChildList(bool writeLock)
    {
-      if (bWrite)
+      if (writeLock)
          RWLockWriteLock(m_rwlockChildList, INFINITE);
       else
          RWLockReadLock(m_rwlockChildList, INFINITE);
    }
-   void UnlockChildList() { RWLockUnlock(m_rwlockChildList); }
+   void unlockChildList() { RWLockUnlock(m_rwlockChildList); }
 
    void setModified();                  // Used to mark object as modified
 
@@ -535,11 +532,11 @@ public:
 
    UINT32 getId() const { return m_id; }
    const TCHAR *getName() const { return m_name; }
-   int Status() const { return m_iStatus; }
+   int getStatus() const { return m_status; }
    int getPropagatedStatus();
    UINT32 getTimeStamp() const { return m_dwTimeStamp; }
        const uuid& getGuid() const { return m_guid; }
-       const TCHAR *getComments() const { return CHECK_NULL_EX(m_pszComments); }
+       const TCHAR *getComments() const { return CHECK_NULL_EX(m_comments); }
 
        const GeoLocation& getGeoLocation() const { return m_geoLocation; }
        void setGeoLocation(const GeoLocation& geoLocation) { m_geoLocation = geoLocation; markAsModified(); }
@@ -549,8 +546,8 @@ public:
 
    bool isModified() const { return m_isModified; }
    bool isDeleted() const { return m_isDeleted; }
-   bool isOrphaned() const { return m_dwParentCount == 0; }
-   bool isEmpty() const { return m_dwChildCount == 0; }
+   bool isOrphaned() const { return m_parentList->size() == 0; }
+   bool isEmpty() const { return m_childList->size() == 0; }
 
        bool isSystem() const { return m_isSystem; }
        void setSystemFlag(bool flag) { m_isSystem = flag; }
@@ -582,7 +579,7 @@ public:
    void setId(UINT32 dwId) { m_id = dwId; setModified(); }
    void generateGuid() { m_guid = uuid::generate(); }
    void setName(const TCHAR *pszName) { nx_strncpy(m_name, pszName, MAX_OBJECT_NAME); setModified(); }
-   void resetStatus() { m_iStatus = STATUS_UNKNOWN; setModified(); }
+   void resetStatus() { m_status = STATUS_UNKNOWN; setModified(); }
    void setComments(TCHAR *text);      /* text must be dynamically allocated */
 
    bool isInMaintenanceMode() { return m_maintenanceMode; }
@@ -624,14 +621,15 @@ public:
 
    NetObj *findChildObject(const TCHAR *name, int typeFilter);
 
-   int getChildCount() { return (int)m_dwChildCount; }
-   int getParentCount() { return (int)m_dwParentCount; }
+   int getChildCount() { return m_childList->size(); }
+   int getParentCount() { return m_parentList->size(); }
 
        virtual NXSL_Array *getParentsForNXSL();
        virtual NXSL_Array *getChildrenForNXSL();
 
        virtual bool showThresholdSummary();
    virtual bool isEventSource();
+   virtual bool isDataCollectionTarget();
 
    void setStatusCalculation(int method, int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0);
    void setStatusPropagation(int method, int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0);
@@ -995,6 +993,7 @@ public:
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
 
    virtual void calculateCompoundStatus(BOOL bForcedRecalc = FALSE);
+   virtual bool isDataCollectionTarget();
 
    virtual void enterMaintenanceMode();
    virtual void leaveMaintenanceMode();
@@ -1171,7 +1170,7 @@ public:
    void lockForStatusPoll() { m_dwFlags |= CLF_QUEUED_FOR_STATUS_POLL; }
    bool isReadyForStatusPoll()
    {
-      return ((m_iStatus != STATUS_UNMANAGED) && (!m_isDeleted) &&
+      return ((m_status != STATUS_UNMANAGED) && (!m_isDeleted) &&
               (!(m_dwFlags & CLF_QUEUED_FOR_STATUS_POLL)) &&
               ((UINT32)time(NULL) - (UINT32)m_tmLastPoll > g_dwStatusPollingInterval))
                   ? true : false;
@@ -1573,7 +1572,7 @@ inline bool Node::isReadyForStatusPoll()
       m_dwDynamicFlags &= ~NDF_FORCE_STATUS_POLL;
       return true;
    }
-   return (m_iStatus != STATUS_UNMANAGED) &&
+   return (m_status != STATUS_UNMANAGED) &&
               (!(m_dwFlags & NF_DISABLE_STATUS_POLL)) &&
           (!(m_dwDynamicFlags & NDF_QUEUED_FOR_STATUS_POLL)) &&
           (!(m_dwDynamicFlags & NDF_POLLING_DISABLED)) &&
@@ -1590,7 +1589,7 @@ inline bool Node::isReadyForConfigurationPoll()
       m_dwDynamicFlags &= ~NDF_FORCE_CONFIGURATION_POLL;
       return true;
    }
-   return (m_iStatus != STATUS_UNMANAGED) &&
+   return (m_status != STATUS_UNMANAGED) &&
               (!(m_dwFlags & NF_DISABLE_CONF_POLL)) &&
           (!(m_dwDynamicFlags & NDF_QUEUED_FOR_CONFIG_POLL)) &&
           (!(m_dwDynamicFlags & NDF_POLLING_DISABLED)) &&
@@ -1602,7 +1601,7 @@ inline bool Node::isReadyForDiscoveryPoll()
        if (m_isDeleted)
                return false;
    return (g_flags & AF_ENABLE_NETWORK_DISCOVERY) &&
-          (m_iStatus != STATUS_UNMANAGED) &&
+          (m_status != STATUS_UNMANAGED) &&
                         (!(m_dwFlags & NF_DISABLE_DISCOVERY_POLL)) &&
           (!(m_dwDynamicFlags & NDF_QUEUED_FOR_DISCOVERY_POLL)) &&
           (!(m_dwDynamicFlags & NDF_POLLING_DISABLED)) &&
@@ -1614,7 +1613,7 @@ inline bool Node::isReadyForRoutePoll()
 {
        if (m_isDeleted)
                return false;
-   return (m_iStatus != STATUS_UNMANAGED) &&
+   return (m_status != STATUS_UNMANAGED) &&
               (!(m_dwFlags & NF_DISABLE_ROUTE_POLL)) &&
           (!(m_dwDynamicFlags & NDF_QUEUED_FOR_ROUTE_POLL)) &&
           (!(m_dwDynamicFlags & NDF_POLLING_DISABLED)) &&
@@ -1626,7 +1625,7 @@ inline bool Node::isReadyForTopologyPoll()
 {
        if (m_isDeleted)
                return false;
-   return (m_iStatus != STATUS_UNMANAGED) &&
+   return (m_status != STATUS_UNMANAGED) &&
               (!(m_dwFlags & NF_DISABLE_TOPOLOGY_POLL)) &&
           (!(m_dwDynamicFlags & NDF_QUEUED_FOR_TOPOLOGY_POLL)) &&
           (!(m_dwDynamicFlags & NDF_POLLING_DISABLED)) &&
@@ -1638,7 +1637,7 @@ inline bool Node::isReadyForInstancePoll()
 {
        if (m_isDeleted)
                return false;
-   return (m_iStatus != STATUS_UNMANAGED) &&
+   return (m_status != STATUS_UNMANAGED) &&
               (!(m_dwFlags & NF_DISABLE_CONF_POLL)) &&
           (!(m_dwDynamicFlags & NDF_QUEUED_FOR_INSTANCE_POLL)) &&
           (!(m_dwDynamicFlags & NDF_POLLING_DISABLED)) &&
@@ -1826,7 +1825,7 @@ class NXCORE_EXPORTABLE TemplateGroup : public Container
 {
 public:
    TemplateGroup() : Container() { }
-   TemplateGroup(const TCHAR *pszName) : Container(pszName, 0) { m_iStatus = STATUS_NORMAL; }
+   TemplateGroup(const TCHAR *pszName) : Container(pszName, 0) { m_status = STATUS_NORMAL; }
    virtual ~TemplateGroup() { }
 
    virtual int getObjectClass() const { return OBJECT_TEMPLATEGROUP; }
@@ -1977,7 +1976,7 @@ public:
 
    bool isReadyForPoll()
    {
-      return ((m_iStatus != STATUS_UNMANAGED) &&
+      return ((m_status != STATUS_UNMANAGED) &&
               (!m_queuedForPolling) && (!m_isDeleted) &&
               ((UINT32)time(NULL) - (UINT32)m_lastPoll > g_dwConditionPollingInterval));
    }