Fixed policy parsing. By default now XML config is merged, but it can be configured...
authorzev <zev@radensolutions.com>
Thu, 8 May 2014 10:58:35 +0000 (13:58 +0300)
committerzev <zev@radensolutions.com>
Thu, 8 May 2014 10:58:35 +0000 (13:58 +0300)
include/nxconfig.h
src/libnetxms/config.cpp

index 202fd9d..e40cec7 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
 ** NetXMS - Network Management System
 ** Copyright (C) 2003-2010 Victor Kirhenshtein
 **
@@ -59,7 +59,7 @@ public:
        int getId() { return m_id; }
        int getValueCount() { return m_valueCount; }
        int getConcatenatedValuesLength();
-       
+
        const TCHAR *getValue(int index = 0);
        INT32 getValueAsInt(int index = 0, INT32 defaultValue = 0);
        UINT32 getValueAsUInt(int index = 0, UINT32 defaultValue = 0);
@@ -121,7 +121,7 @@ private:
 
 protected:
        virtual void onError(const TCHAR *errorMessage);
-       
+
        void error(const TCHAR *format, ...);
        ConfigEntry *createEntry(const TCHAR *path);
 
@@ -135,7 +135,7 @@ public:
        void setTopLevelTag(const TCHAR *topLevelTag) { m_root->setName(topLevelTag); }
 
        bool loadXmlConfig(const TCHAR *file, const char *topLevelTag = NULL);
-       bool loadXmlConfigFromMemory(const char *xml, int xmlSize, const TCHAR *name = NULL, const char *topLevelTag = NULL);
+       bool loadXmlConfigFromMemory(const char *xml, int xmlSize, const TCHAR *name = NULL, const char *topLevelTag = NULL, bool merge = true);
        bool loadIniConfig(const TCHAR *file, const TCHAR *defaultIniSection, bool ignoreErrors = true);
        bool loadConfig(const TCHAR *file, const TCHAR *defaultIniSection, bool ignoreErrors = true);
 
index 2a44dae..e436d95 100644 (file)
@@ -1043,6 +1043,7 @@ typedef struct
    ConfigEntry *stack[MAX_STACK_DEPTH];
    String charData[MAX_STACK_DEPTH];
    bool trimValue[MAX_STACK_DEPTH];
+   bool merge;
 } XML_PARSER_STATE;
 
 /**
@@ -1098,7 +1099,7 @@ static void StartElement(void *userData, const char *name, const char **attrs)
             nx_strncpy(entryName, name, MAX_PATH);
 #endif
          // Only do merge on top level by default, otherwise add sub-entry with same name
-         bool merge = XMLGetAttrBoolean(attrs, "merge", (ps->level == 1));
+         bool merge = ps->merge;
          ps->stack[ps->level] = merge ? ps->stack[ps->level - 1]->findEntry(entryName) : NULL;
          if (ps->stack[ps->level] == NULL)
          {
@@ -1159,7 +1160,7 @@ static void CharData(void *userData, const XML_Char *s, int len)
 /**
  * Load config from XML in memory
  */
-bool Config::loadXmlConfigFromMemory(const char *xml, int xmlSize, const TCHAR *name, const char *topLevelTag)
+bool Config::loadXmlConfigFromMemory(const char *xml, int xmlSize, const TCHAR *name, const char *topLevelTag, bool merge)
 {
    XML_PARSER_STATE state;
 
@@ -1173,6 +1174,7 @@ bool Config::loadXmlConfigFromMemory(const char *xml, int xmlSize, const TCHAR *
    state.level = 0;
    state.parser = parser;
    state.file = (name != NULL) ? name : _T("<mem>");
+   state.merge = merge;
 
    bool success = (XML_Parse(parser, xml, xmlSize, TRUE) != XML_STATUS_ERROR);
    if (!success)