[mapguide-commits] r5458 - in trunk/MgDev: Common/MdfModel Common/MdfParser Common/Schema UnitTest/TestData/MdfModel

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Thu Dec 9 20:44:16 EST 2010


Author: hubu
Date: 2010-12-09 17:44:16 -0800 (Thu, 09 Dec 2010)
New Revision: 5458

Modified:
   trunk/MgDev/Common/MdfModel/BaseMapLayer.h
   trunk/MgDev/Common/MdfModel/MapDefinition.h
   trunk/MgDev/Common/MdfModel/MapLayerGroupCommon.h
   trunk/MgDev/Common/MdfParser/IOBaseMapLayer.cpp
   trunk/MgDev/Common/MdfParser/IOBaseMapLayerGroup.cpp
   trunk/MgDev/Common/MdfParser/IOMapDefinition.cpp
   trunk/MgDev/Common/MdfParser/IOMapLayer.cpp
   trunk/MgDev/Common/MdfParser/IOMapLayerGroup.cpp
   trunk/MgDev/Common/Schema/MapDefinition-2.3.0.xsd
   trunk/MgDev/UnitTest/TestData/MdfModel/MdfTestMap.mdf
Log:
On behalf of: Spark Liu

Add ExtendedData1 section to MapDefinition to provide more extensibility.

Modified: trunk/MgDev/Common/MdfModel/BaseMapLayer.h
===================================================================
--- trunk/MgDev/Common/MdfModel/BaseMapLayer.h	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/MdfModel/BaseMapLayer.h	2010-12-10 01:44:16 UTC (rev 5458)
@@ -19,6 +19,7 @@
 #define BASEMAPLAYER_H_
 
 #include "MdfModel.h"
+#include "MdfRootObject.h"
 #include "MdfOwnerCollection.h"
 #include "LayerDefinition.h"
 
@@ -37,7 +38,7 @@
     // BaseMapLayer is also the base class of MapLayer.  BaseMapLayers are part of
     // BaseMapLayerGroups, whereas MapLayers are part of the main Map.
     //---------------------------------------------------------------------
-    class MDFMODEL_API BaseMapLayer
+    class MDFMODEL_API BaseMapLayer: public MdfRootObject
     {
     public:
         // Construction, destruction, initialization

Modified: trunk/MgDev/Common/MdfModel/MapDefinition.h
===================================================================
--- trunk/MgDev/Common/MdfModel/MapDefinition.h	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/MdfModel/MapDefinition.h	2010-12-10 01:44:16 UTC (rev 5458)
@@ -19,6 +19,7 @@
 #define MAPDEFINITION_H_
 
 #include "MdfModel.h"
+#include "MdfRootObject.h"
 #include "Box2D.h"
 #include "MapLayer.h"
 #include "MapLayerGroup.h"
@@ -33,7 +34,7 @@
     // The MapDefinition class is the root document node of the MdfModel. Through its
     // interface, one can get access to all the data in the MapDefinition.
     //------------------------------------------------------------------------
-    class MDFMODEL_API MapDefinition
+    class MDFMODEL_API MapDefinition : public MdfRootObject
     {
     public:
         // Construction, destruction, initialization.

Modified: trunk/MgDev/Common/MdfModel/MapLayerGroupCommon.h
===================================================================
--- trunk/MgDev/Common/MdfModel/MapLayerGroupCommon.h	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/MdfModel/MapLayerGroupCommon.h	2010-12-10 01:44:16 UTC (rev 5458)
@@ -19,6 +19,7 @@
 #define MAPLAYERGROUPCOMMON_H_
 
 #include "MdfModel.h"
+#include "MdfRootObject.h"
 
 BEGIN_NAMESPACE_MDFMODEL
 
@@ -28,7 +29,7 @@
     // It defines the set of common properties that are available for layer
     // groups.
     //---------------------------------------------------------------------
-    class MDFMODEL_API MapLayerGroupCommon
+    class MDFMODEL_API MapLayerGroupCommon: public MdfRootObject
     {
     public:
         // Construction, destruction, initialization

Modified: trunk/MgDev/Common/MdfParser/IOBaseMapLayer.cpp
===================================================================
--- trunk/MgDev/Common/MdfParser/IOBaseMapLayer.cpp	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/MdfParser/IOBaseMapLayer.cpp	2010-12-10 01:44:16 UTC (rev 5458)
@@ -17,11 +17,21 @@
 
 #include "stdafx.h"
 #include "IOBaseMapLayer.h"
+#include "IOUnknown.h"
 
 using namespace XERCES_CPP_NAMESPACE;
 using namespace MDFMODEL_NAMESPACE;
 using namespace MDFPARSER_NAMESPACE;
 
+CREATE_ELEMENT_MAP;
+ELEM_MAP_ENTRY(1, BaseMapLayer);
+ELEM_MAP_ENTRY(2, Name);
+ELEM_MAP_ENTRY(3, ResourceId);
+ELEM_MAP_ENTRY(4, Selectable);
+ELEM_MAP_ENTRY(5, ShowInLegend);
+ELEM_MAP_ENTRY(6, LegendLabel);
+ELEM_MAP_ENTRY(7, ExpandInLegend);
+ELEM_MAP_ENTRY(8, ExtendedData1);
 
 IOBaseMapLayer::IOBaseMapLayer(Version& version) : IOMapLayerCommon(version)
 {
@@ -42,10 +52,22 @@
 void IOBaseMapLayer::StartElement(const wchar_t* name, HandlerStack* handlerStack)
 {
     this->m_currElemName = name;
-    if (this->m_currElemName == L"BaseMapLayer") // NOXLATE
+    this->m_currElemId = _ElementIdFromName(name);
+
+    switch (this->m_currElemId)
     {
+    case eBaseMapLayer:
         this->m_startElemName = name;
         this->m_mapLayerCommon = new BaseMapLayer(L"", L"");
+        break;
+
+    case eExtendedData1:
+        this->m_procExtData = true;
+        break;
+
+    case eUnknown:
+        ParseUnknownXml(name, handlerStack);
+        break;
     }
 }
 
@@ -54,6 +76,7 @@
 {
     if (this->m_startElemName == name)
     {
+        this->m_mapLayerCommon->SetUnknownXml(this->m_unknownXml);
         this->m_baseMapLayers->Adopt(this->m_mapLayerCommon);
         this->m_baseMapLayers = NULL;
         this->m_mapLayerCommon = NULL;
@@ -61,16 +84,24 @@
         handlerStack->pop();
         delete this;
     }
+    else if (eExtendedData1 == _ElementIdFromName(name))
+    {
+        this->m_procExtData = false;
+    }
 }
 
 
 void IOBaseMapLayer::Write(MdfStream& fd, BaseMapLayer* baseMapLayer, Version* version)
 {
-    fd << tab() << "<BaseMapLayer>" << std::endl; // NOXLATE
+    fd << tab() << startStr(sBaseMapLayer) << std::endl;
     inctab();
 
     IOMapLayerCommon::Write(fd, baseMapLayer, version);
 
+    // Write any unknown XML / extended data
+    if (!version || (*version >= Version(2, 3, 0)))
+        IOUnknown::Write(fd, baseMapLayer->GetUnknownXml(), version);
+
     dectab();
-    fd << tab() << "</BaseMapLayer>" << std::endl; // NOXLATE
+    fd << tab() << endStr(sBaseMapLayer) << std::endl;
 }

Modified: trunk/MgDev/Common/MdfParser/IOBaseMapLayerGroup.cpp
===================================================================
--- trunk/MgDev/Common/MdfParser/IOBaseMapLayerGroup.cpp	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/MdfParser/IOBaseMapLayerGroup.cpp	2010-12-10 01:44:16 UTC (rev 5458)
@@ -18,12 +18,23 @@
 #include "stdafx.h"
 #include "IOBaseMapLayerGroup.h"
 #include "IOBaseMapLayer.h"
+#include "IOUnknown.h"
 
 using namespace XERCES_CPP_NAMESPACE;
 using namespace MDFMODEL_NAMESPACE;
 using namespace MDFPARSER_NAMESPACE;
 
+CREATE_ELEMENT_MAP;
+ELEM_MAP_ENTRY(1, BaseMapLayerGroup);
+ELEM_MAP_ENTRY(2, Name);
+ELEM_MAP_ENTRY(3, Visible);
+ELEM_MAP_ENTRY(4, ShowInLegend);
+ELEM_MAP_ENTRY(5, ExpandInLegend);
+ELEM_MAP_ENTRY(6, LegendLabel);
+ELEM_MAP_ENTRY(7, BaseMapLayer);
+ELEM_MAP_ENTRY(8, ExtendedData1);
 
+
 IOBaseMapLayerGroup::IOBaseMapLayerGroup(Version& version) : IOMapLayerGroupCommon(version)
 {
 }
@@ -42,20 +53,31 @@
 void IOBaseMapLayerGroup::StartElement(const wchar_t* name, HandlerStack* handlerStack)
 {
     this->m_currElemName = name;
-    if (this->m_currElemName == L"BaseMapLayerGroup") // NOXLATE
+    this->m_currElemId = _ElementIdFromName(name);
+
+    switch (this->m_currElemId)
     {
+    case eBaseMapLayerGroup:
         this->m_startElemName = name;
         this->m_layerGroup = new BaseMapLayerGroup(L"");
-    }
-    else
-    {
-        if (this->m_currElemName == L"BaseMapLayer") // NOXLATE
+        break;
+
+    case eBaseMapLayer:
         {
             BaseMapLayerGroup* baseMapLayerGroup = static_cast<BaseMapLayerGroup*>(this->m_layerGroup);
             IOBaseMapLayer* IO = new IOBaseMapLayer(baseMapLayerGroup->GetLayers(), this->m_version);
             handlerStack->push(IO);
             IO->StartElement(name, handlerStack);
         }
+        break;
+
+    case eExtendedData1:
+        this->m_procExtData = true;
+        break;
+
+    case eUnknown:
+        ParseUnknownXml(name, handlerStack);
+        break;
     }
 }
 
@@ -64,6 +86,7 @@
 {
     if (this->m_startElemName == name)
     {
+        this->m_layerGroup->SetUnknownXml(this->m_unknownXml);
         this->m_map->GetBaseMapLayerGroups()->Adopt(static_cast<BaseMapLayerGroup*>(this->m_layerGroup));
         this->m_map = NULL;
         this->m_layerGroup = NULL;
@@ -71,12 +94,16 @@
         handlerStack->pop();
         delete this;
     }
+    else if (eExtendedData1 == _ElementIdFromName(name))
+    {
+        this->m_procExtData = false;
+    }
 }
 
 
 void IOBaseMapLayerGroup::Write(MdfStream& fd, BaseMapLayerGroup* baseMapLayerGroup, Version* version)
 {
-    fd << tab() << "<BaseMapLayerGroup>" << std::endl; // NOXLATE
+    fd << tab() << startStr(sBaseMapLayerGroup) << std::endl;
     inctab();
 
     IOMapLayerGroupCommon::Write(fd, baseMapLayerGroup, version);
@@ -86,6 +113,10 @@
     for (int i=0; i<baseMapLayers->GetCount(); ++i)
         IOBaseMapLayer::Write(fd, static_cast<BaseMapLayer*>(baseMapLayers->GetAt(i)), version);
 
+    // Write any unknown XML / extended data
+    if (!version || (*version >= Version(2, 3, 0)))
+        IOUnknown::Write(fd, baseMapLayerGroup->GetUnknownXml(), version);
+
     dectab();
-    fd << tab() << "</BaseMapLayerGroup>" << std::endl; // NOXLATE
+    fd << tab() << endStr(sBaseMapLayerGroup) << std::endl;
 }

Modified: trunk/MgDev/Common/MdfParser/IOMapDefinition.cpp
===================================================================
--- trunk/MgDev/Common/MdfParser/IOMapDefinition.cpp	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/MdfParser/IOMapDefinition.cpp	2010-12-10 01:44:16 UTC (rev 5458)
@@ -23,11 +23,25 @@
 #include "IOMapLayerGroup.h"
 #include "IOWatermarkInstance.h"
 #include "IOBaseMapDefinition.h"
+#include "IOUnknown.h"
 
 using namespace XERCES_CPP_NAMESPACE;
 using namespace MDFMODEL_NAMESPACE;
 using namespace MDFPARSER_NAMESPACE;
 
+CREATE_ELEMENT_MAP;
+ELEM_MAP_ENTRY(1, MapDefinition);
+ELEM_MAP_ENTRY(2, Name);
+ELEM_MAP_ENTRY(3, CoordinateSystem);
+ELEM_MAP_ENTRY(4, Extents);
+ELEM_MAP_ENTRY(5, BackgroundColor);
+ELEM_MAP_ENTRY(6, Metadata);
+ELEM_MAP_ENTRY(7, MapLayer);
+ELEM_MAP_ENTRY(8, MapLayerGroup);
+ELEM_MAP_ENTRY(9, BaseMapDefinition);
+ELEM_MAP_ENTRY(10, Watermarks);
+ELEM_MAP_ENTRY(11, Watermark);
+ELEM_MAP_ENTRY(12, ExtendedData1);
 
 IOMapDefinition::IOMapDefinition(Version& version) : SAX2ElementHandler(version)
 {
@@ -49,33 +63,48 @@
 void IOMapDefinition::StartElement(const wchar_t* name, HandlerStack* handlerStack)
 {
     this->m_currElemName = name;
+    this->m_currElemId = _ElementIdFromName(name);
 
-    if (this->m_currElemName == L"MapDefinition") // NOXLATE
+    switch (this->m_currElemId)
     {
+    case eMapDefinition:
         this->m_startElemName = name;
-    }
-    else
-    {
-        if (this->m_currElemName == L"Extents") // NOXLATE
+        break;
+
+    case eExtents:
         {
             IOExtra* IO = new IOExtra(this->m_map, this->m_version);
             handlerStack->push(IO);
             IO->StartElement(name, handlerStack);
         }
-        else if (this->m_currElemName == L"MapLayer") // NOXLATE
+        break;
+
+    case eMapLayer:
         {
             IOMapLayer* IO = new IOMapLayer(this->m_map, this->m_version);
             handlerStack->push(IO);
             IO->StartElement(name, handlerStack);
         }
-        else if (this->m_currElemName == L"MapLayerGroup") // NOXLATE
+        break;
+
+    case eMapLayerGroup:
         {
             IOMapLayerGroup* IO = new IOMapLayerGroup(this->m_map, this->m_version);
             handlerStack->push(IO);
             IO->StartElement(name, handlerStack);
         }
-        else if (this->m_currElemName == L"Watermark") // NOXLATE
+        break;
+
+    case eBaseMapDefinition:
         {
+            IOBaseMapDefinition* IO = new IOBaseMapDefinition(this->m_map, this->m_version);
+            handlerStack->push(IO);
+            IO->StartElement(name, handlerStack);
+        }
+        break;
+
+    case eWatermark:
+        {
             Version wdVersion;
             if (!IOMapDefinition::GetWatermarkDefinitionVersion(&this->m_version, wdVersion))
                 return;
@@ -86,26 +115,39 @@
             handlerStack->push(IO);
             IO->StartElement(name, handlerStack);
         }
-        else if (this->m_currElemName == L"BaseMapDefinition") // NOXLATE
-        {
-            IOBaseMapDefinition* IO = new IOBaseMapDefinition(this->m_map, this->m_version);
-            handlerStack->push(IO);
-            IO->StartElement(name, handlerStack);
-        }
+        break;
+
+    case eExtendedData1:
+        this->m_procExtData = true;
+        break;
+
+    case eUnknown:
+        ParseUnknownXml(name, handlerStack);
+        break;
     }
 }
 
 
 void IOMapDefinition::ElementChars(const wchar_t* ch)
 {
-    if (this->m_currElemName == L"Name") // NOXLATE
+    switch (this->m_currElemId)
+    {
+    case eName:
         this->m_map->SetName(ch);
-    else if (this->m_currElemName == L"CoordinateSystem") // NOXLATE
+        break;
+
+    case eCoordinateSystem:
         this->m_map->SetCoordinateSystem(ch);
-    else if (this->m_currElemName == L"BackgroundColor") // NOXLATE
+        break;
+
+    case eBackgroundColor:
         this->m_map->SetBackgroundColor(ch);
-    else if (this->m_currElemName == L"Metadata") // NOXLATE
+        break;
+
+    case eMetadata:
         this->m_map->SetMetadata(ch);
+        break;
+    }
 }
 
 
@@ -113,11 +155,16 @@
 {
     if (this->m_startElemName == name)
     {
+        this->m_map->SetUnknownXml(this->m_unknownXml);
         this->m_map = NULL;
         this->m_startElemName = L"";
         handlerStack->pop();
         delete this;
     }
+    else if (eExtendedData1 == _ElementIdFromName(name))
+    {
+        this->m_procExtData = false;
+    }
 }
 
 
@@ -163,29 +210,29 @@
     inctab();
 
     // Property: Name
-    fd << tab() << "<Name>"; // NOXLATE
+    fd << tab() << startStr(sName);
     fd << EncodeString(map->GetName());
-    fd << "</Name>" << std::endl; // NOXLATE
+    fd << endStr(sName) << std::endl;
 
     // Property: CoordinateSystem
-    fd << tab() << "<CoordinateSystem>"; // NOXLATE
+    fd << tab() << startStr(sCoordinateSystem);
     fd << EncodeString(map->GetCoordinateSystem());
-    fd << "</CoordinateSystem>" << std::endl; // NOXLATE
+    fd << endStr(sCoordinateSystem) << std::endl;
 
     // Property: Extents
     IOExtra::WriteBox2D(fd, map->GetExtents(), false, version);
 
     // Property: BackgroundColor
-    fd << tab() << "<BackgroundColor>"; // NOXLATE
+    fd << tab() << startStr(sBackgroundColor);
     fd << EncodeString(map->GetBackgroundColor());
-    fd << "</BackgroundColor>" << std::endl; // NOXLATE
+    fd << endStr(sBackgroundColor) << std::endl;
 
     // Property: Metadata
     if (!map->GetMetadata().empty())
     {
-        fd << tab() << "<Metadata>"; // NOXLATE
+        fd << tab() << startStr(sMetadata);
         fd << EncodeString(map->GetMetadata());
-        fd << "</Metadata>" << std::endl; // NOXLATE
+        fd << endStr(sMetadata) << std::endl;
     }
 
     // Property: MapLayer
@@ -207,15 +254,19 @@
         // only write Watermarks if the MDF version is 2.3.0 or greater
         if (!version || (*version >= Version(2, 3, 0)))
         {
-            fd << tab() << startStr("Watermarks") << std::endl; // NOXLATE
+            fd << tab() << startStr(sWatermarks) << std::endl;
             inctab();
             for (int i=0; i<watermarkCount; ++i)
                 IOWatermarkInstance::Write(fd, map->GetWatermarks()->GetAt(i), version);
             dectab();
-            fd << tab() << endStr("Watermarks") << std::endl; // NOXLATE
+            fd << tab() << endStr(sWatermarks) << std::endl;
         }
     }
 
+    // Write any unknown XML / extended data
+    if (!version || (*version >= Version(2, 3, 0)))
+        IOUnknown::Write(fd, map->GetUnknownXml(), version);
+
     dectab();
     fd << tab() << "</MapDefinition>" << std::endl; // NOXLATE
 }

Modified: trunk/MgDev/Common/MdfParser/IOMapLayer.cpp
===================================================================
--- trunk/MgDev/Common/MdfParser/IOMapLayer.cpp	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/MdfParser/IOMapLayer.cpp	2010-12-10 01:44:16 UTC (rev 5458)
@@ -17,11 +17,23 @@
 
 #include "stdafx.h"
 #include "IOMapLayer.h"
+#include "IOUnknown.h"
 
 using namespace XERCES_CPP_NAMESPACE;
 using namespace MDFMODEL_NAMESPACE;
 using namespace MDFPARSER_NAMESPACE;
 
+CREATE_ELEMENT_MAP;
+ELEM_MAP_ENTRY(1, MapLayer);
+ELEM_MAP_ENTRY(2, Name);
+ELEM_MAP_ENTRY(3, ResourceId);
+ELEM_MAP_ENTRY(4, Selectable);
+ELEM_MAP_ENTRY(5, ShowInLegend);
+ELEM_MAP_ENTRY(6, LegendLabel);
+ELEM_MAP_ENTRY(7, ExpandInLegend);
+ELEM_MAP_ENTRY(8, Visible);
+ELEM_MAP_ENTRY(9, Group);
+ELEM_MAP_ENTRY(10, ExtendedData1);
 
 IOMapLayer::IOMapLayer(Version& version) : IOMapLayerCommon(version)
 {
@@ -43,10 +55,22 @@
 void IOMapLayer::StartElement(const wchar_t* name, HandlerStack* handlerStack)
 {
     this->m_currElemName = name;
-    if (this->m_currElemName == L"MapLayer") // NOXLATE
+    this->m_currElemId = _ElementIdFromName(name);
+
+    switch (this->m_currElemId)
     {
+    case eMapLayer:
         this->m_startElemName = name;
         this->m_mapLayerCommon = new MapLayer(L"", L"");
+        break;
+
+    case eExtendedData1:
+        this->m_procExtData = true;
+        break;
+
+    case eUnknown:
+        ParseUnknownXml(name, handlerStack);
+        break;
     }
 }
 
@@ -54,9 +78,9 @@
 void IOMapLayer::ElementChars(const wchar_t* ch)
 {
     MapLayer* mapLayer = static_cast<MapLayer*>(this->m_mapLayerCommon);
-    if (this->m_currElemName == L"Group") // NOXLATE
+    if (this->m_currElemId == eGroup)
         mapLayer->SetGroup(ch);
-    else if (this->m_currElemName == L"Visible") // NOXLATE
+    else if (this->m_currElemId == eVisible)
         mapLayer->SetVisible(wstrToBool(ch));
     else
         IOMapLayerCommon::ElementChars(ch);
@@ -67,6 +91,7 @@
 {
     if (this->m_startElemName == name)
     {
+        this->m_mapLayerCommon->SetUnknownXml(this->m_unknownXml);
         this->m_map->GetLayers()->Adopt(static_cast<MapLayer*>(this->m_mapLayerCommon));
         this->m_map = NULL;
         this->m_mapLayerCommon = NULL;
@@ -74,26 +99,34 @@
         handlerStack->pop();
         delete this;
     }
+    else if (eExtendedData1 == _ElementIdFromName(name))
+    {
+        this->m_procExtData = false;
+    }
 }
 
 
 void IOMapLayer::Write(MdfStream& fd, MapLayer* mapLayer, Version* version)
 {
-    fd << tab() << "<MapLayer>" << std::endl; // NOXLATE
+    fd << tab() << startStr(sMapLayer) << std::endl;
     inctab();
 
     IOMapLayerCommon::Write(fd, mapLayer, version);
 
     // Property: Visible
-    fd << tab() << "<Visible>"; // NOXLATE
+    fd << tab() << startStr(sVisible);
     fd << BoolToStr(mapLayer->IsVisible());
-    fd << "</Visible>" << std::endl; // NOXLATE
+    fd << endStr(sVisible) << std::endl;
 
     // Property: Group
-    fd << tab() << "<Group>"; // NOXLATE
+    fd << tab() << startStr(sGroup);
     fd << EncodeString(mapLayer->GetGroup());
-    fd << "</Group>" << std::endl; // NOXLATE
+    fd << endStr(sGroup) << std::endl;
 
+    // Write any unknown XML / extended data
+    if (!version || (*version >= Version(2, 3, 0)))
+        IOUnknown::Write(fd, mapLayer->GetUnknownXml(), version);
+
     dectab();
-    fd << tab() << "</MapLayer>" << std::endl; // NOXLATE
+    fd << tab() << endStr(sMapLayer) << std::endl; // NOXLATE
 }

Modified: trunk/MgDev/Common/MdfParser/IOMapLayerGroup.cpp
===================================================================
--- trunk/MgDev/Common/MdfParser/IOMapLayerGroup.cpp	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/MdfParser/IOMapLayerGroup.cpp	2010-12-10 01:44:16 UTC (rev 5458)
@@ -17,11 +17,21 @@
 
 #include "stdafx.h"
 #include "IOMapLayerGroup.h"
+#include "IOUnknown.h"
 
 using namespace XERCES_CPP_NAMESPACE;
 using namespace MDFMODEL_NAMESPACE;
 using namespace MDFPARSER_NAMESPACE;
 
+CREATE_ELEMENT_MAP;
+ELEM_MAP_ENTRY(1, MapLayerGroup);
+ELEM_MAP_ENTRY(2, Name);
+ELEM_MAP_ENTRY(3, Visible);
+ELEM_MAP_ENTRY(4, ShowInLegend);
+ELEM_MAP_ENTRY(5, ExpandInLegend);
+ELEM_MAP_ENTRY(6, LegendLabel);
+ELEM_MAP_ENTRY(7, Group);
+ELEM_MAP_ENTRY(8, ExtendedData1);
 
 IOMapLayerGroup::IOMapLayerGroup(Version& version) : IOMapLayerGroupCommon(version)
 {
@@ -41,17 +51,29 @@
 void IOMapLayerGroup::StartElement(const wchar_t* name, HandlerStack* handlerStack)
 {
     this->m_currElemName = name;
-    if (this->m_currElemName == L"MapLayerGroup") // NOXLATE
+    this->m_currElemId = _ElementIdFromName(name);
+
+    switch (this->m_currElemId)
     {
+    case eMapLayerGroup:
         this->m_startElemName = name;
         this->m_layerGroup = new MapLayerGroup(L"");
+        break;
+
+    case eExtendedData1:
+        this->m_procExtData = true;
+        break;
+
+    case eUnknown:
+        ParseUnknownXml(name, handlerStack);
+        break;
     }
 }
 
 
 void IOMapLayerGroup::ElementChars(const wchar_t* ch)
 {
-    if (this->m_currElemName == L"Group") // NOXLATE
+    if (this->m_currElemId == eGroup)
         static_cast<MapLayerGroup*>(this->m_layerGroup)->SetGroup(ch);
     else
         IOMapLayerGroupCommon::ElementChars(ch);
@@ -62,6 +84,7 @@
 {
     if (this->m_startElemName == name)
     {
+        this->m_layerGroup->SetUnknownXml(this->m_unknownXml);
         this->m_map->GetLayerGroups()->Adopt(static_cast<MapLayerGroup*>(this->m_layerGroup));
         this->m_map = NULL;
         this->m_layerGroup = NULL;
@@ -69,21 +92,29 @@
         handlerStack->pop();
         delete this;
     }
+    else if (eExtendedData1 == _ElementIdFromName(name))
+    {
+        this->m_procExtData = false;
+    }
 }
 
 
 void IOMapLayerGroup::Write(MdfStream& fd, MapLayerGroup* mapLayerGroup, Version* version)
 {
-    fd << tab() << "<MapLayerGroup>" << std::endl; // NOXLATE
+    fd << tab() << startStr(sMapLayerGroup) << std::endl;
     inctab();
 
     IOMapLayerGroupCommon::Write(fd, mapLayerGroup, version);
 
     // Property: Group
-    fd << tab() << "<Group>"; // NOXLATE
+    fd << tab() << startStr(sGroup);
     fd << EncodeString(mapLayerGroup->GetGroup());
-    fd << "</Group>" << std::endl; // NOXLATE
+    fd << endStr(sGroup) << std::endl;
 
+    // Write any unknown XML / extended data
+    if (!version || (*version >= Version(2, 3, 0)))
+        IOUnknown::Write(fd, mapLayerGroup->GetUnknownXml(), version);
+
     dectab();
-    fd << tab() << "</MapLayerGroup>" << std::endl; // NOXLATE
+    fd << tab() << endStr(sMapLayerGroup) << std::endl;
 }

Modified: trunk/MgDev/Common/Schema/MapDefinition-2.3.0.xsd
===================================================================
--- trunk/MgDev/Common/Schema/MapDefinition-2.3.0.xsd	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/Common/Schema/MapDefinition-2.3.0.xsd	2010-12-10 01:44:16 UTC (rev 5458)
@@ -28,9 +28,9 @@
       </xs:element>
     </xs:sequence>
   </xs:complexType>
-  <xs:complexType name="BaseMapLayerType">
+  <xs:complexType name="MapLayerCommonType">
     <xs:annotation>
-      <xs:documentation>BaseMapLayerType encapsulates the properties of a BaseMapLayer.</xs:documentation>
+      <xs:documentation>MapLayerCommonType is a common superclass of MapLayerType and BaseMapLayerType.</xs:documentation>
     </xs:annotation>
     <xs:sequence>
       <xs:element name="Name" type="xs:string">
@@ -70,7 +70,7 @@
       <xs:documentation>MapLayerType encapsulates the properties of a map layer, including its group and options about how it should be displayed.</xs:documentation>
     </xs:annotation>
     <xs:complexContent>
-      <xs:extension base="BaseMapLayerType">
+      <xs:extension base="MapLayerCommonType">
         <xs:sequence>
           <xs:element name="Visible" type="xs:boolean">
             <xs:annotation>
@@ -82,13 +82,26 @@
               <xs:documentation>Group of which the MapLayer is a member of</xs:documentation>
             </xs:annotation>
           </xs:element>
+          <xs:element name="ExtendedData1" type="ExtendedDataType" minOccurs="0"/>
         </xs:sequence>
       </xs:extension>
     </xs:complexContent>
   </xs:complexType>
+  <xs:complexType name="BaseMapLayerType">
+    <xs:annotation>
+      <xs:documentation>BaseMapLayerType encapsulates the properties of a BaseMapLayer.</xs:documentation>
+    </xs:annotation>
+    <xs:complexContent>
+      <xs:extension base="MapLayerCommonType">
+        <xs:sequence>
+          <xs:element name="ExtendedData1" type="ExtendedDataType" minOccurs="0"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
   <xs:complexType name="MapLayerGroupCommonType">
     <xs:annotation>
-      <xs:documentation>MapLayerGroupCommonType is a common subclass of MapLayerGroupCommonType and BaseMapLayerGroupCommonType</xs:documentation>
+      <xs:documentation>MapLayerGroupCommonType is a common superclass of MapLayerGroupType and BaseMapLayerGroupType.</xs:documentation>
     </xs:annotation>
     <xs:sequence>
       <xs:element name="Name" type="xs:string">
@@ -130,11 +143,12 @@
               <xs:documentation>The group that contains the MapLayerGroup</xs:documentation>
             </xs:annotation>
           </xs:element>
+          <xs:element name="ExtendedData1" type="ExtendedDataType" minOccurs="0"/>
         </xs:sequence>
       </xs:extension>
     </xs:complexContent>
   </xs:complexType>
-  <xs:complexType name="BaseMapLayerGroupCommonType">
+  <xs:complexType name="BaseMapLayerGroupType">
     <xs:annotation>
       <xs:documentation>BaseMapLayerGroupCommonType encapsulates the properties of a BaseMapLayerGroup. It extends MapLayerGroupCommonType by holding the layers in the group.  The base map layer groups defines what layers are used to render a tile set in the HTML viewer.</xs:documentation>
     </xs:annotation>
@@ -146,6 +160,7 @@
               <xs:documentation>The layers that are part of this group. The order of the layers represents the draw order, layers first is the list are drawn over top of layers later in the list.</xs:documentation>
             </xs:annotation>
           </xs:element>
+          <xs:element name="ExtendedData1" type="ExtendedDataType" minOccurs="0"/>
         </xs:sequence>
       </xs:extension>
     </xs:complexContent>
@@ -201,7 +216,7 @@
                 <xs:documentation>The display scales that the base map layers will have tiles available. Applies to the HTML viewer.</xs:documentation>
               </xs:annotation>
             </xs:element>
-            <xs:element name="BaseMapLayerGroup" type="BaseMapLayerGroupCommonType" minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="BaseMapLayerGroup" type="BaseMapLayerGroupType" minOccurs="0" maxOccurs="unbounded">
               <xs:annotation>
                 <xs:documentation>A group of layers that is used to compose a tiled layer in the HTML viewer</xs:documentation>
               </xs:annotation>
@@ -214,6 +229,7 @@
           <xs:documentation>The collection of watermarks used in the map.</xs:documentation>
         </xs:annotation>
       </xs:element>
+      <xs:element name="ExtendedData1" type="ExtendedDataType" minOccurs="0"/>
     </xs:sequence>
   </xs:complexType>
   <xs:element name="MapDefinition">

Modified: trunk/MgDev/UnitTest/TestData/MdfModel/MdfTestMap.mdf
===================================================================
--- trunk/MgDev/UnitTest/TestData/MdfModel/MdfTestMap.mdf	2010-12-09 22:50:41 UTC (rev 5457)
+++ trunk/MgDev/UnitTest/TestData/MdfModel/MdfTestMap.mdf	2010-12-10 01:44:16 UTC (rev 5458)
@@ -18,6 +18,12 @@
     <ExpandInLegend>false</ExpandInLegend>
     <Visible>true</Visible>
     <Group></Group>
+    <ExtendedData1>
+      <NewElementA>
+        <SubElement>DataA</SubElement>
+      </NewElementA>
+      <NewElementB>DataB</NewElementB>
+    </ExtendedData1>
   </MapLayer>
   <BaseMapDefinition>
     <FiniteDisplayScale>200000</FiniteDisplayScale>
@@ -43,6 +49,12 @@
         <ShowInLegend>true</ShowInLegend>
         <LegendLabel>Parcels</LegendLabel>
         <ExpandInLegend>false</ExpandInLegend>
+        <ExtendedData1>
+          <NewElementA>
+            <SubElement>DataA</SubElement>
+          </NewElementA>
+          <NewElementB>DataB</NewElementB>
+        </ExtendedData1>
       </BaseMapLayer>
       <BaseMapLayer>
         <Name>VotingDistricts</Name>
@@ -51,7 +63,19 @@
         <ShowInLegend>true</ShowInLegend>
         <LegendLabel>Voting Districts</LegendLabel>
         <ExpandInLegend>false</ExpandInLegend>
+        <ExtendedData1>
+          <NewElementA>
+            <SubElement>DataA</SubElement>
+          </NewElementA>
+          <NewElementB>DataB</NewElementB>
+        </ExtendedData1>
       </BaseMapLayer>
+      <ExtendedData1>
+        <NewElementA>
+          <SubElement>DataA</SubElement>
+        </NewElementA>
+        <NewElementB>DataB</NewElementB>
+      </ExtendedData1>
     </BaseMapLayerGroup>
   </BaseMapDefinition>
   <Watermarks>



More information about the mapguide-commits mailing list