fixed bugs in node flags update (overriding flags set on one property page by another...
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 13 Jan 2017 10:20:31 +0000 (12:20 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 13 Jan 2017 10:20:31 +0000 (12:20 +0200)
12 files changed:
src/java/client/netxms-client/src/main/java/org/netxms/client/NXCObjectModificationData.java
src/java/netxms-eclipse/ObjectManager/src/org/netxms/ui/eclipse/objectmanager/propertypages/Communication.java
src/java/netxms-eclipse/ObjectManager/src/org/netxms/ui/eclipse/objectmanager/propertypages/InterfacePolling.java
src/java/netxms-eclipse/ObjectManager/src/org/netxms/ui/eclipse/objectmanager/propertypages/NodePolling.java
src/server/core/interface.cpp
src/server/core/node.cpp
src/server/core/template.cpp
src/server/include/nddrv.h
src/server/include/nms_objects.h
webui/webapp/ObjectManager/src/org/netxms/ui/eclipse/objectmanager/propertypages/Communication.java
webui/webapp/ObjectManager/src/org/netxms/ui/eclipse/objectmanager/propertypages/InterfacePolling.java
webui/webapp/ObjectManager/src/org/netxms/ui/eclipse/objectmanager/propertypages/NodePolling.java

index 4362ce8..a95d4a9 100644 (file)
@@ -1071,7 +1071,7 @@ public class NXCObjectModificationData
         */
        public void setObjectFlags(int objectFlags)
        {
-          setObjectFlags(objectFlags, 0x7FFFFFFF);
+          setObjectFlags(objectFlags, 0xFFFFFFFF);
        }
 
    /**
index ce059e7..cf77256 100644 (file)
@@ -113,13 +113,12 @@ public class Communication extends PropertyPage
                if (isApply)
                        setValid(false);
                
-               /* TODO: sync in some way with "Polling" page */
                int flags = node.getFlags();
       if (agentIsRemote.getSelection())
          flags |= AbstractNode.NF_REMOTE_AGENT;
       else
          flags &= ~AbstractNode.NF_REMOTE_AGENT;
-               md.setObjectFlags(flags);
+               md.setObjectFlags(flags, AbstractNode.NF_REMOTE_AGENT);
 
                final NXCSession session = (NXCSession)ConsoleSharedData.getSession();
                new ConsoleJob(String.format(Messages.get().Communication_JobName, node.getObjectName()), null, Activator.PLUGIN_ID, null) {
index 79b74d3..f389d6b 100644 (file)
@@ -109,7 +109,7 @@ public class InterfacePolling extends PropertyPage
                final NXCObjectModificationData data = new NXCObjectModificationData(object.getObjectId());
                data.setExpectedState(expectedState.getSelectionIndex());
                data.setRequiredPolls(pollCount.getSelection());
-               data.setObjectFlags(checkExcludeFromTopology.getSelection() ? Interface.IF_EXCLUDE_FROM_TOPOLOGY : 0);
+               data.setObjectFlags(checkExcludeFromTopology.getSelection() ? Interface.IF_EXCLUDE_FROM_TOPOLOGY : 0, Interface.IF_EXCLUDE_FROM_TOPOLOGY);
                new ConsoleJob(Messages.get().InterfacePolling_JobName, null, Activator.PLUGIN_ID, null) {
                        @Override
                        protected void runInternal(IProgressMonitor monitor) throws Exception
index a8f4d94..9764580 100644 (file)
@@ -211,6 +211,21 @@ public class NodePolling extends PropertyPage
                }
                return flags;
        }
+
+   /**
+    * Collect mask for flags being modified
+    * 
+    * @return
+    */
+   private int collectNodeFlagsMask()
+   {
+      int mask = 0;
+      for(int i = 0; i < flagButtons.size(); i++)
+      {
+         mask |= flagValues.get(i);
+      }
+      return mask;
+   }
        
        /**
         * Collect ifXTabe usage policy from radio buttons
@@ -250,7 +265,7 @@ public class NodePolling extends PropertyPage
                final NXCObjectModificationData md = new NXCObjectModificationData(object.getObjectId());
                
                md.setPollerNode(pollerNode.getObjectId());
-               md.setObjectFlags(collectNodeFlags());
+               md.setObjectFlags(collectNodeFlags(), collectNodeFlagsMask());
                md.setIfXTablePolicy(collectIfXTablePolicy());
                md.setAgentCacheMode(collectAgentCacheMode());
                
index cfc1df3..0b68554 100644 (file)
@@ -1041,10 +1041,9 @@ UINT32 Interface::modifyFromMessageInternal(NXCPMessage *pRequest)
        // Flags
        if (pRequest->isFieldExist(VID_FLAGS))
        {
-      UINT32 newFlags = pRequest->getFieldAsUInt32(VID_FLAGS);
-      newFlags &= IF_USER_FLAGS_MASK;
-               m_flags &= ~IF_USER_FLAGS_MASK;
-               m_flags |= newFlags;
+      UINT32 mask = pRequest->isFieldExist(VID_FLAGS_MASK) ? (pRequest->getFieldAsUInt32(VID_FLAGS_MASK) & IF_USER_FLAGS_MASK) : IF_USER_FLAGS_MASK;
+               m_flags &= ~mask;
+               m_flags |= pRequest->getFieldAsUInt32(VID_FLAGS) & mask;
        }
 
    return NetObj::modifyFromMessageInternal(pRequest);
index 6aad19f..3ee582e 100644 (file)
@@ -120,8 +120,8 @@ Node::Node() : DataCollectionTarget()
    m_sshLogin[0] = 0;
    m_sshPassword[0] = 0;
    m_sshProxy = 0;
-   m_numberingScheme = 0;
-   m_rows = 0;
+   m_portNumberingScheme = NDD_PN_UNKNOWN;
+   m_portRowCount = 0;
 }
 
 /**
@@ -220,8 +220,8 @@ Node::Node(const InetAddress& addr, UINT32 dwFlags, UINT32 agentProxy, UINT32 sn
    m_sshLogin[0] = 0;
    m_sshPassword[0] = 0;
    m_sshProxy = sshProxy;
-   m_numberingScheme = 0;
-   m_rows = 0;
+   m_portNumberingScheme = NDD_PN_UNKNOWN;
+   m_portRowCount = 0;
 }
 
 /**
@@ -386,8 +386,8 @@ bool Node::loadFromDatabase(DB_HANDLE hdb, UINT32 dwId)
    DBGetField(hResult, 0, 42, m_sshLogin, MAX_SSH_LOGIN_LEN);
    DBGetField(hResult, 0, 43, m_sshPassword, MAX_SSH_PASSWORD_LEN);
    m_sshProxy = DBGetFieldULong(hResult, 0, 44);
-   m_rows = DBGetFieldULong(hResult, 0, 45);
-   m_numberingScheme = DBGetFieldULong(hResult, 0, 46);
+   m_portRowCount = DBGetFieldULong(hResult, 0, 45);
+   m_portNumberingScheme = DBGetFieldULong(hResult, 0, 46);
 
    DBFreeResult(hResult);
    DBFreeStatement(hStmt);
@@ -562,8 +562,8 @@ BOOL Node::saveToDatabase(DB_HANDLE hdb)
    DBBind(hStmt, 45, DB_SQLTYPE_INTEGER, m_sshProxy);
    DBBind(hStmt, 46, DB_SQLTYPE_INTEGER, m_chassisId);
    DBBind(hStmt, 47, DB_SQLTYPE_INTEGER, m_id);
-   DBBind(hStmt, 48, DB_SQLTYPE_INTEGER, m_rows);
-   DBBind(hStmt, 49, DB_SQLTYPE_INTEGER, m_numberingScheme);
+   DBBind(hStmt, 48, DB_SQLTYPE_INTEGER, m_portRowCount);
+   DBBind(hStmt, 49, DB_SQLTYPE_INTEGER, m_portNumberingScheme);
 
    BOOL bResult = DBExecute(hStmt);
    DBFreeStatement(hStmt);
@@ -2585,8 +2585,8 @@ bool Node::confPollSnmp(UINT32 dwRqId)
    m_driver->analyzeDevice(pTransport, m_szObjectId, &m_customAttributes, &m_driverData);
    NDD_MODULE_LAYOUT layout;
    m_driver->getModuleLayout(pTransport, &m_customAttributes, m_driverData, 1, &layout); // TODO module set to 1
-   m_rows = layout.rows;
-   m_numberingScheme = layout.numberingScheme;
+   m_portRowCount = layout.rows;
+   m_portNumberingScheme = layout.numberingScheme;
 
    // Get sysName, sysContact, sysLocation
    if (querySnmpSysProperty(pTransport, _T(".1.3.6.1.2.1.1.5.0"), _T("name"), dwRqId, &m_sysName))
@@ -4584,6 +4584,8 @@ void Node::fillMessageInternal(NXCPMessage *pMsg)
    pMsg->setField(VID_PRIMARY_NAME, m_primaryName);
    pMsg->setField(VID_NODE_TYPE, (INT16)m_type);
    pMsg->setField(VID_NODE_SUBTYPE, m_subType);
+if (m_id==289)
+_tprintf(_T("**** FLAGS=%08X\n"), m_flags);
    pMsg->setField(VID_FLAGS, m_flags);
    pMsg->setField(VID_RUNTIME_FLAGS, m_dwDynamicFlags);
    pMsg->setField(VID_AGENT_PORT, m_agentPort);
@@ -4632,8 +4634,8 @@ void Node::fillMessageInternal(NXCPMessage *pMsg)
    pMsg->setField(VID_SSH_PROXY, m_sshProxy);
    pMsg->setField(VID_SSH_LOGIN, m_sshLogin);
    pMsg->setField(VID_SSH_PASSWORD, m_sshPassword);
-   pMsg->setField(VID_PORT_ROW_COUNT, m_rows);
-   pMsg->setField(VID_PORT_NUMBERING_SCHEME, m_numberingScheme);
+   pMsg->setField(VID_PORT_ROW_COUNT, m_portRowCount);
+   pMsg->setField(VID_PORT_NUMBERING_SCHEME, m_portNumberingScheme);
 }
 
 /**
@@ -4645,8 +4647,9 @@ UINT32 Node::modifyFromMessageInternal(NXCPMessage *pRequest)
    if (pRequest->isFieldExist(VID_FLAGS))
    {
       bool wasRemoteAgent = ((m_flags & NF_REMOTE_AGENT) != 0);
-      m_flags &= NF_SYSTEM_FLAGS;
-      m_flags |= pRequest->getFieldAsUInt32(VID_FLAGS) & NF_USER_FLAGS;
+      UINT32 mask = pRequest->isFieldExist(VID_FLAGS_MASK) ? (pRequest->getFieldAsUInt32(VID_FLAGS_MASK) & NF_USER_FLAGS) : NF_USER_FLAGS;
+      m_flags &= ~mask;
+      m_flags |= pRequest->getFieldAsUInt32(VID_FLAGS) & mask;
       if (wasRemoteAgent && !(m_flags & NF_REMOTE_AGENT) && m_ipAddress.isValidUnicast())
       {
          if (IsZoningEnabled())
index a2d6d6d..e39d171 100644 (file)
@@ -894,13 +894,21 @@ void Template::fillMessageInternal(NXCPMessage *pMsg)
  */
 UINT32 Template::modifyFromMessageInternal(NXCPMessage *pRequest)
 {
+   // Skip modifications for subclasses
+   if (getObjectClass() != OBJECT_TEMPLATE)
+      return NetObj::modifyFromMessageInternal(pRequest);
+
    // Change template version
    if (pRequest->isFieldExist(VID_TEMPLATE_VERSION))
       m_dwVersion = pRequest->getFieldAsUInt32(VID_TEMPLATE_VERSION);
 
    // Change flags
    if (pRequest->isFieldExist(VID_FLAGS))
-               m_flags = pRequest->getFieldAsUInt32(VID_FLAGS);
+   {
+      UINT32 mask = pRequest->isFieldExist(VID_FLAGS_MASK) ? pRequest->getFieldAsUInt32(VID_FLAGS_MASK) : 0xFFFFFFFF;
+      m_flags &= ~mask;
+      m_flags |= pRequest->getFieldAsUInt32(VID_FLAGS) & mask;
+   }
 
    // Change apply filter
        if (pRequest->isFieldExist(VID_AUTOBIND_FILTER))
index dc41508..8a5dc31 100644 (file)
@@ -51,7 +51,7 @@ extern "C" NetworkDeviceDriver __NDD_EXPORT *nddCreateInstance() { return new im
 /**
  * Port numbering schemes
  */
-enum
+enum PortNumberingScheme
 {
        NDD_PN_UNKNOWN = 0, // port layout not known to driver
        NDD_PN_CUSTOM = 1,  // custom layout, driver defines location of each port
@@ -72,7 +72,7 @@ enum
 /**
  * Modules orientation on the switch
  */
-enum
+enum ModuleOrientation
 {
        NDD_ORIENTATION_HORIZONTAL = 0,
        NDD_ORIENTATION_VERTICAL = 1
index 3840943..49804cb 100644 (file)
@@ -1402,8 +1402,8 @@ protected:
        TCHAR m_sshLogin[MAX_SSH_LOGIN_LEN];
        TCHAR m_sshPassword[MAX_SSH_PASSWORD_LEN];
        UINT32 m_sshProxy;
-       UINT32 m_numberingScheme;
-       UINT32 m_rows;
+       UINT32 m_portNumberingScheme;
+       UINT32 m_portRowCount;
 
    void pollerLock() { MutexLock(m_hPollerMutex); }
    void pollerUnlock() { MutexUnlock(m_hPollerMutex); }
index ce059e7..cf77256 100644 (file)
@@ -113,13 +113,12 @@ public class Communication extends PropertyPage
                if (isApply)
                        setValid(false);
                
-               /* TODO: sync in some way with "Polling" page */
                int flags = node.getFlags();
       if (agentIsRemote.getSelection())
          flags |= AbstractNode.NF_REMOTE_AGENT;
       else
          flags &= ~AbstractNode.NF_REMOTE_AGENT;
-               md.setObjectFlags(flags);
+               md.setObjectFlags(flags, AbstractNode.NF_REMOTE_AGENT);
 
                final NXCSession session = (NXCSession)ConsoleSharedData.getSession();
                new ConsoleJob(String.format(Messages.get().Communication_JobName, node.getObjectName()), null, Activator.PLUGIN_ID, null) {
index 79b74d3..f389d6b 100644 (file)
@@ -109,7 +109,7 @@ public class InterfacePolling extends PropertyPage
                final NXCObjectModificationData data = new NXCObjectModificationData(object.getObjectId());
                data.setExpectedState(expectedState.getSelectionIndex());
                data.setRequiredPolls(pollCount.getSelection());
-               data.setObjectFlags(checkExcludeFromTopology.getSelection() ? Interface.IF_EXCLUDE_FROM_TOPOLOGY : 0);
+               data.setObjectFlags(checkExcludeFromTopology.getSelection() ? Interface.IF_EXCLUDE_FROM_TOPOLOGY : 0, Interface.IF_EXCLUDE_FROM_TOPOLOGY);
                new ConsoleJob(Messages.get().InterfacePolling_JobName, null, Activator.PLUGIN_ID, null) {
                        @Override
                        protected void runInternal(IProgressMonitor monitor) throws Exception
index a8f4d94..9764580 100644 (file)
@@ -211,6 +211,21 @@ public class NodePolling extends PropertyPage
                }
                return flags;
        }
+
+   /**
+    * Collect mask for flags being modified
+    * 
+    * @return
+    */
+   private int collectNodeFlagsMask()
+   {
+      int mask = 0;
+      for(int i = 0; i < flagButtons.size(); i++)
+      {
+         mask |= flagValues.get(i);
+      }
+      return mask;
+   }
        
        /**
         * Collect ifXTabe usage policy from radio buttons
@@ -250,7 +265,7 @@ public class NodePolling extends PropertyPage
                final NXCObjectModificationData md = new NXCObjectModificationData(object.getObjectId());
                
                md.setPollerNode(pollerNode.getObjectId());
-               md.setObjectFlags(collectNodeFlags());
+               md.setObjectFlags(collectNodeFlags(), collectNodeFlagsMask());
                md.setIfXTablePolicy(collectIfXTablePolicy());
                md.setAgentCacheMode(collectAgentCacheMode());