[mapguide-commits] r5015 - sandbox/rfc102/MgDev/Server/src/Services/Resource

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Fri Jul 9 10:01:39 EDT 2010


Author: rohitr
Date: 2010-07-09 14:01:39 +0000 (Fri, 09 Jul 2010)
New Revision: 5015

Added:
   sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.cpp
   sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.h
Modified:
   sandbox/rfc102/MgDev/Server/src/Services/Resource/DbEnvironment.cpp
   sandbox/rfc102/MgDev/Server/src/Services/Resource/RepositoryManager.cpp
   sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceDefinitionManager.cpp
   sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceHeaderManager.cpp
   sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceServiceDefs.h
   sandbox/rfc102/MgDev/Server/src/Services/Resource/SiteResourceContentManager.cpp
Log:
Changes for upgrade to xerces 3.1.0. Additional information in Ticket #1399


Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/DbEnvironment.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/DbEnvironment.cpp	2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/DbEnvironment.cpp	2010-07-09 14:01:39 UTC (rev 5015)
@@ -69,7 +69,8 @@
 
         if (MgRepositoryType::Session == repositoryType)
         {
-            m_dbEnv.set_flags(DB_LOG_INMEMORY, 1);
+            //this has to be changed since the underlying function has changed
+            m_dbEnv.log_set_config(DB_LOG_IN_MEMORY, 1);
             environmentFlags |= DB_PRIVATE;
         }
         else
@@ -96,7 +97,7 @@
         pageSize = MG_SESS_DBXML_PAGE_SIZE;
     }
 
-    m_xmlMan = XmlManager(&m_dbEnv, DBXML_ALLOW_EXTERNAL_ACCESS);
+    m_xmlMan = XmlManager(m_dbEnv.get_DB_ENV(), DBXML_ALLOW_EXTERNAL_ACCESS);
     m_xmlMan.setDefaultPageSize(pageSize);
     m_xmlMan.setDefaultContainerType(XmlContainer::WholedocContainer);
 

Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/RepositoryManager.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/RepositoryManager.cpp	2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/RepositoryManager.cpp	2010-07-09 14:01:39 UTC (rev 5015)
@@ -431,7 +431,7 @@
         assert(NULL != m_dbTxn);
 
         m_xmlTxn.reset(new XmlTransaction(
-            environment->GetXmlManager().createTransaction(m_dbTxn)));
+            environment->GetXmlManager().createTransaction(m_dbTxn->get_DB_TXN())));
         assert(NULL != m_xmlTxn.get());
     }
     else

Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceDefinitionManager.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceDefinitionManager.cpp	2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceDefinitionManager.cpp	2010-07-09 14:01:39 UTC (rev 5015)
@@ -388,7 +388,9 @@
 
     if (!resource.IsRuntimeResource())
     {
-        DOMDocument* domDoc = xmlDoc.getContentAsDOM();
+        //bad programming but I want it to work, the first time. :)
+        DbXml::XmlValue temp_xmlValue(xmlDoc);
+        DOMDocument* domDoc = getContentAsDOM(temp_xmlValue);
         assert(NULL != domDoc);
         MgXmlUtil xmlUtil(domDoc, false);
         DOMElement* rootNode = xmlUtil.GetRootNode();

Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceHeaderManager.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceHeaderManager.cpp	2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceHeaderManager.cpp	2010-07-09 14:01:39 UTC (rev 5015)
@@ -1475,7 +1475,6 @@
     XmlQueryExpression& selectGroupPermissions)
 {
     XmlManager& xmlMan = m_container.getManager();
-    queryContext.setReturnType(XmlQueryContext::DeadValues);
 
     string xpathInheritedFlags = "/*/Security/Inherited/text()";
     selectInheritedFlags = IsTransacted() ?

Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceServiceDefs.h
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceServiceDefs.h	2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/ResourceServiceDefs.h	2010-07-09 14:01:39 UTC (rev 5015)
@@ -21,12 +21,14 @@
 #include "MapGuideCommon.h"
 #include "System/XmlDefs.h"
 #include "System/XmlUtil.h"
+#include "xercesDomTranslator.hpp"
 
 #include <assert.h>
 #include <map>
 #include <vector>
 #include <dbxml/DbXml.hpp>
 #include <dwfcore/ZipFileDescriptor.h>
+#include <db_cxx.h>
 
 using namespace DbXml;
 
@@ -59,25 +61,6 @@
         mgException = new MgDbXmlException(methodName, __LINE__, __WFILE__, NULL, L"MgFormatInnerExceptionMessage", &arguments); \
         (static_cast<MgThirdPartyException*>(mgException.p))->SetErrorCode(e.getDbErrno()); \
     }                                                                         \
-    catch (DbException& e)                                                    \
-    {                                                                         \
-        MgStringCollection arguments;                                         \
-        STRING message;                                                       \
-                                                                              \
-        if (DB_LOCK_DEADLOCK == e.get_errno())                                \
-        {                                                                     \
-            message = MgUtil::GetResourceMessage(                             \
-                MgResources::ResourceService, L"MgRepositoryBusy");           \
-        }                                                                     \
-        else                                                                  \
-        {                                                                     \
-            MgUtil::MultiByteToWideChar(string(e.what()), message);           \
-        }                                                                     \
-                                                                              \
-        arguments.Add(message);                                               \
-        mgException = new MgDbException(methodName, __LINE__, __WFILE__, NULL, L"MgFormatInnerExceptionMessage", &arguments); \
-        (static_cast<MgThirdPartyException*>(mgException.p))->SetErrorCode(e.get_errno()); \
-    }                                                                         \
     catch (DWFException& e)                                                   \
     {                                                                         \
         MgStringCollection arguments;                                         \

Modified: sandbox/rfc102/MgDev/Server/src/Services/Resource/SiteResourceContentManager.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/SiteResourceContentManager.cpp	2010-07-09 13:52:50 UTC (rev 5014)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/SiteResourceContentManager.cpp	2010-07-09 14:01:39 UTC (rev 5015)
@@ -292,7 +292,6 @@
 
         string docQuery = "/Group/Users/User/Name/text()";
         XmlQueryContext docContext = xmlMan.createQueryContext();
-        docContext.setReturnType(XmlQueryContext::DeadValues);
 
         // Execute the XQuery.
 
@@ -395,7 +394,7 @@
 
         string docQuery = "/Role/Users/User/Name/text()";
         XmlQueryContext docContext = xmlMan.createQueryContext();
-        docContext.setReturnType(XmlQueryContext::DeadValues);
+        
 
         // Execute the XQuery.
 
@@ -889,8 +888,7 @@
 
         string docQuery = "/Role/Groups/Group/Name/text()";
         XmlQueryContext docContext = xmlMan.createQueryContext();
-        docContext.setReturnType(XmlQueryContext::DeadValues);
-
+        
         // Execute the XQuery.
 
         XmlResults nodeResults = IsTransacted() ?
@@ -2026,8 +2024,8 @@
     XmlValue docValue(xmlDoc);
 
     // Set up an XQuery.
-
-    string query = "/Group/Users/User[Name=\"";
+    // node and nodes are interchangeable
+    string query = "delete nodes /Group/Users/User[Name=\"";
     query += MgUtil::WideCharToMultiByte(userId);
     query += "\"]";
 
@@ -2035,22 +2033,15 @@
 
     XmlManager& xmlMan = m_container.getManager();
     XmlQueryContext queryContext = xmlMan.createQueryContext();
-    XmlUpdateContext updateContext = xmlMan.createUpdateContext();
-    XmlModify xmlMod = xmlMan.createModify();
-
     if (IsTransacted())
     {
-        XmlQueryExpression xmlSelect = xmlMan.prepare(GetXmlTxn(), query, queryContext);
+        xmlMan.query(GetXmlTxn(), query, queryContext);
 
-        xmlMod.addRemoveStep(xmlSelect);
-        xmlMod.execute(GetXmlTxn(), docValue, queryContext, updateContext);
     }
     else
     {
-        XmlQueryExpression xmlSelect = xmlMan.prepare(query, queryContext);
+        xmlMan.query(query, queryContext);
 
-        xmlMod.addRemoveStep(xmlSelect);
-        xmlMod.execute(docValue, queryContext, updateContext);
     }
 
     MG_RESOURCE_SERVICE_CATCH_AND_THROW(L"MgSiteResourceContentManager.RemoveUserFromGroup")
@@ -2143,7 +2134,7 @@
 
     // Set up an XQuery.
 
-    string query = "/Role/Users/User[Name=\"";
+    string query = "delete nodes /Role/Users/User[Name=\"";
     query += MgUtil::WideCharToMultiByte(userId);
     query += "\"]";
 
@@ -2151,22 +2142,16 @@
 
     XmlManager& xmlMan = m_container.getManager();
     XmlQueryContext queryContext = xmlMan.createQueryContext();
-    XmlUpdateContext updateContext = xmlMan.createUpdateContext();
-    XmlModify xmlMod = xmlMan.createModify();
-
+    
     if (IsTransacted())
     {
-        XmlQueryExpression xmlSelect = xmlMan.prepare(GetXmlTxn(), query, queryContext);
+        xmlMan.query(GetXmlTxn(), query, queryContext);
 
-        xmlMod.addRemoveStep(xmlSelect);
-        xmlMod.execute(GetXmlTxn(), docValue, queryContext, updateContext);
     }
     else
     {
-        XmlQueryExpression xmlSelect = xmlMan.prepare(query, queryContext);
+        xmlMan.query(query, queryContext);
 
-        xmlMod.addRemoveStep(xmlSelect);
-        xmlMod.execute(docValue, queryContext, updateContext);
     }
 
     MG_RESOURCE_SERVICE_CATCH_AND_THROW(L"MgSiteResourceContentManager.RemoveUserFromRole")
@@ -2259,7 +2244,7 @@
 
     // Set up an XQuery.
 
-    string query = "/Role/Groups/Group[Name=\"";
+    string query = "delete nodes /Role/Groups/Group[Name=\"";
     query += MgUtil::WideCharToMultiByte(groupId);
     query += "\"]";
 
@@ -2267,22 +2252,16 @@
 
     XmlManager& xmlMan = m_container.getManager();
     XmlQueryContext queryContext = xmlMan.createQueryContext();
-    XmlUpdateContext updateContext = xmlMan.createUpdateContext();
-    XmlModify xmlMod = xmlMan.createModify();
-
+    
     if (IsTransacted())
     {
-        XmlQueryExpression xmlSelect = xmlMan.prepare(GetXmlTxn(), query, queryContext);
+        xmlMan.query(GetXmlTxn(), query, queryContext);
 
-        xmlMod.addRemoveStep(xmlSelect);
-        xmlMod.execute(GetXmlTxn(), docValue, queryContext, updateContext);
     }
     else
     {
-        XmlQueryExpression xmlSelect = xmlMan.prepare(query, queryContext);
+        xmlMan.query(query, queryContext);
 
-        xmlMod.addRemoveStep(xmlSelect);
-        xmlMod.execute(docValue, queryContext, updateContext);
     }
 
     MG_RESOURCE_SERVICE_CATCH_AND_THROW(L"MgSiteResourceContentManager.RemoveGroupFromRole")
@@ -2358,8 +2337,7 @@
     XmlManager& xmlMan = m_container.getManager();
 
     XmlQueryContext docContext = xmlMan.createQueryContext();
-    docContext.setReturnType(XmlQueryContext::DeadValues);
-
+    
     string xpathUserPassword = "/User/Password/text()";
     XmlQueryExpression selectUserPassword = IsTransacted() ?
         xmlMan.prepare(GetXmlTxn(), xpathUserPassword, docContext) :

Added: sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.cpp
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.cpp	                        (rev 0)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.cpp	2010-07-09 14:01:39 UTC (rev 5015)
@@ -0,0 +1,250 @@
+/*
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2004,2009 Oracle.  All rights reserved.
+ *
+ */
+// Heavily derived from the example given in dbxml/examples/dbcxx/xerces/
+//Modified to work with mapguide.
+//Stopgap arrangement till I write a cleaner class.
+// Implementation of sample code that uses Berkeley DB XML XmlEventReader
+// and XmlEventWriter interfaces to translate documents to and
+// from Xerces-C DOM documents.
+
+
+#include "xercesDomTranslator.hpp"
+#include <xercesc/dom/DOMImplementation.hpp>
+#include <xercesc/dom/DOM.hpp>
+#include <xercesc/parsers/XercesDOMParser.hpp>
+#include <xercesc/util/XMLException.hpp>
+#include <xercesc/util/XMLUni.hpp>
+#include <xercesc/framework/MemBufFormatTarget.hpp>
+#include <iostream>
+
+#if defined(XERCES_HAS_CPP_NAMESPACE)
+XERCES_CPP_NAMESPACE_USE
+#endif
+
+using namespace DbXml;
+
+#define localAssert(expr, msg) if (!(expr)) throw(msg)
+
+//
+// toXMLCh and fromXMLCh are utility classes to transcode
+// to/from Xerces-C DOM (these could easily be replaced
+// by better/more efficient code).  They are necessary because
+// Xerces-C uses XMLCh (usually UTF-16) and BDB XML uses UTF-8
+// in its event interfaces.
+//
+class toXMLCh
+{
+public:
+	toXMLCh(const unsigned char *str) {
+		if (str)
+			str_ = XMLString::transcode((const char *)str);
+		else
+			str_ = 0;
+	}
+	toXMLCh(const char *str) {
+		if (str)
+			str_ = XMLString::transcode(str);
+		else
+			str_ = 0;
+	}
+	~toXMLCh() { XMLString::release(&str_); }
+	const XMLCh *str() const { return str_; }
+private:
+	XMLCh *str_;
+		
+};
+
+class fromXMLCh
+{
+public:
+	fromXMLCh(const XMLCh *str) {
+		if (str && *str)
+			str_ = XMLString::transcode(str);
+		else
+			str_ = 0;
+	}
+	~fromXMLCh() { XMLString::release(&str_); }
+	const unsigned char *str() const {
+		return (const unsigned char *)str_;
+	}
+	operator const unsigned char *() {
+		return str();
+	}
+private:
+	char *str_;
+		
+};
+
+//
+// Public API implementation
+//
+XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *
+getContentAsDOM(const XmlValue &value)
+{
+	XmlEventReader &reader = value.asEventReader();
+	DOMEventWriter domWriter;
+	XmlEventReaderToWriter r2w(reader, domWriter,
+				   false, false);
+	r2w.start();
+	reader.close();
+	return domWriter.getDocument();
+}
+
+//
+// Internals of implementation from here down
+//
+
+//
+// EventReaderToDOM Implementation.  This class knows how to
+// construct Xerces-C DOM objects from BDB XML events
+//
+DOMEventWriter::DOMEventWriter()
+	: doc_(0), currentParent_(0), currentNode_(0)
+{
+	DOMImplementation *domImpl = DOMImplementation::getImplementation();
+	doc_ = domImpl->createDocument();
+	currentParent_ = doc_;
+	currentNode_ = doc_;
+}
+
+void DOMEventWriter::close()
+{
+	delete this;
+}
+
+void DOMEventWriter::writeAttribute(const unsigned char *localName,
+				    const unsigned char *prefix,
+				    const unsigned char *uri,
+				    const unsigned char *value,
+				    bool isSpecified)
+{
+	localAssert((doc_ && currentParent_), "state");
+	DOMAttr *attr = doc_->createAttributeNS(
+		toXMLCh(uri).str(), toXMLCh(localName).str());
+	if (prefix)
+		attr->setPrefix(toXMLCh(prefix).str());
+	attr->setValue(toXMLCh(value).str());
+	currentNode_ = attr;
+	currentParent_->getAttributes()->setNamedItemNS(attr);
+}
+
+// text, comments, CDATA, ignorable whitespace
+// length does not include trailing null
+void DOMEventWriter::writeText(
+	DbXml::XmlEventReader::XmlEventType type,
+	const unsigned char *text,
+	size_t length)
+{
+	// TBD -- maybe use length...
+	toXMLCh x(text);
+	if(currentNode_ && currentNode_->getNodeType() == DOMNode::TEXT_NODE
+		&& type == XmlEventReader::Characters) {
+		((DOMText *)currentNode_)->appendData(x.str()); // coalesce
+	} else {
+		DOMNode *node = 0;
+		switch (type) {
+		case XmlEventReader::Characters:
+		case XmlEventReader::Whitespace:
+			node = doc_->createTextNode(x.str());
+			break;
+		case XmlEventReader::CDATA:
+			node = doc_->createCDATASection(x.str());
+			break;
+		case XmlEventReader::Comment:
+			node = doc_->createComment(x.str());
+			break;
+		default:
+			localAssert(false, "unknown text type");
+		};
+		localAssert(currentParent_, "state");
+		currentParent_->appendChild(node);
+		currentNode_ = node;
+	}
+}
+
+// processing Instruction
+void DOMEventWriter::writeProcessingInstruction(
+	const unsigned char *target,
+	const unsigned char *data)
+{
+	toXMLCh t(target);
+	toXMLCh d(data);
+	DOMProcessingInstruction *pi = doc_->createProcessingInstruction(
+		t.str(), d.str());
+	localAssert(currentParent_, "state");
+	currentParent_->appendChild(pi);
+	currentNode_ = pi;
+}
+
+// elements
+void DOMEventWriter::writeStartElement(
+	const unsigned char *localName,
+	const unsigned char *prefix,
+	const unsigned char *uri,
+	int numAttributes,
+	bool isEmpty)
+{
+	toXMLCh lname(localName);
+	toXMLCh u(uri);
+	
+	DOMElement *elem = doc_->createElementNS(u.str(), lname.str());
+	if(prefix != 0)
+		elem->setPrefix(toXMLCh(prefix).str());
+	if (currentParent_)
+		currentParent_->appendChild(elem);
+	currentParent_ = elem;
+	currentNode_ = elem;
+	// empty elements don't get end element events
+	if (isEmpty)
+		writeEndElement(localName, prefix, uri);
+}
+
+void DOMEventWriter::writeEndElement(
+	const unsigned char *localName,
+	const unsigned char *prefix,
+	const unsigned char *uri)
+{
+	currentNode_ = currentParent_;
+	currentParent_ = currentNode_->getParentNode();
+}
+	
+// DTD
+void DOMEventWriter::writeDTD(
+	const unsigned char *dtd, size_t length)
+{
+	localAssert(false, "cannot write DTD");
+}
+
+// XML decl and start document
+void DOMEventWriter::writeStartDocument(
+	const unsigned char *version,
+	const unsigned char *encoding,
+	const unsigned char *standalone)
+{
+	// no-op -- allocate document node in ctor
+	localAssert(doc_, "state");
+}
+
+void DOMEventWriter::writeEndDocument()
+{
+	currentNode_ = currentParent_;
+	currentParent_ = currentParent_->getParentNode();
+}
+
+// note the start of entity expansion
+void DOMEventWriter::writeStartEntity(
+	const unsigned char *name,
+	bool expandedInfoFollows)
+{
+}
+
+// note the end of entity expansion
+void DOMEventWriter::writeEndEntity(
+	const unsigned char *name)
+{
+}
+

Added: sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.h
===================================================================
--- sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.h	                        (rev 0)
+++ sandbox/rfc102/MgDev/Server/src/Services/Resource/xercesDomTranslator.h	2010-07-09 14:01:39 UTC (rev 5015)
@@ -0,0 +1,94 @@
+/*
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2004,2009 Oracle.  All rights reserved.
+ *
+ */
+// Heavily derived from the example given in dbxml/examples/dbcxx/xerces/
+// Modified to work with mapguide.
+// Stopgap arrangement till I write a cleaner class.
+// Implementation of sample code that uses Berkeley DB XML XmlEventReader
+// and XmlEventWriter interfaces to translate documents to and
+// from Xerces-C DOM documents.
+
+
+
+#include <dbxml/DbXml.hpp>
+#include <xercesc/dom/DOMDocument.hpp>
+
+
+//
+// Implementation classes from here down
+//
+
+// 
+// This class implements XmlEventWriter in order to push (write)
+// BDB XML events (obtained via XmlEventReader) to a Xerces-C
+// DOMDocument.
+//
+class DOMEventWriter : public DbXml::XmlEventWriter
+{
+public:
+	DOMEventWriter();
+	XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *getDocument() {
+		return doc_;
+	}
+	virtual void close();
+	
+	// attributes (including namespaces)
+	virtual void writeAttribute(const unsigned char *localName,
+				    const unsigned char *prefix,
+				    const unsigned char *uri,
+				    const unsigned char *value,
+				    bool isSpecified);
+
+	// text, comments, CDATA, ignorable whitespace
+	// length does not include trailing null
+	virtual void writeText(DbXml::XmlEventReader::XmlEventType type,
+			       const unsigned char *text,
+			       size_t length);
+
+	// processing Instruction
+	virtual void writeProcessingInstruction(const unsigned char *target,
+						const unsigned char *data);
+
+	// elements
+	virtual void writeStartElement(const unsigned char *localName,
+				       const unsigned char *prefix,
+				       const unsigned char *uri,
+				       int numAttributes,
+				       bool isEmpty);
+	virtual void writeEndElement(const unsigned char *localName,
+				     const unsigned char *prefix,
+				     const unsigned char *uri);
+	
+	// DTD
+	virtual void writeDTD(const unsigned char *dtd, size_t length);
+
+	// XML decl and start document
+	virtual void writeStartDocument(const unsigned char *version,
+					const unsigned char *encoding,
+					const unsigned char *standalone);
+	virtual void writeEndDocument();
+
+	// note the start of entity expansion
+	virtual void writeStartEntity(const unsigned char *name,
+				      bool expandedInfoFollows);
+
+	// note the end of entity expansion
+	virtual void writeEndEntity(const unsigned char *name);
+
+private:
+	XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc_;
+	XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *currentParent_;
+	XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *currentNode_;
+};
+
+
+using namespace DbXml;
+//
+// The public API to get/put content using Xerces-C DOM
+//
+XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *getContentAsDOM(
+        const DbXml::XmlValue &value);
+



More information about the mapguide-commits mailing list