From 7afcc72098938177f430f179b2e56188744063ca Mon Sep 17 00:00:00 2001
From: Rahul Jain <rahulj@apache.org>
Date: Mon, 19 Jun 2000 20:06:36 +0000
Subject: [PATCH] Changes for increased conformance and stability. Submitted by
 Curt.Arnold@hyprotech.com. Verified by Joe Polastre.

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@172178 13f79535-47bb-0310-9956-ffa450edef68
---
 .../VC6/xerces-all/xerces-com/xerces-com.dsp  |  46 +++--
 src/com/IXMLDOMNodeImpl.h                     |   7 +-
 src/com/IXMLDOMNodeImpl.inl                   |  19 +-
 src/com/StdAfx.cpp                            |   2 +-
 src/com/XMLDOMAttribute.cpp                   |  22 +++
 src/com/XMLDOMAttribute.h                     |   8 +
 src/com/XMLDOMDocument.cpp                    |  41 ++++-
 src/com/XMLDOMDocument.h                      |   5 +
 src/com/XMLDOMElement.cpp                     |  63 +++++--
 src/com/XMLDOMNamedNodeMap.cpp                |  38 ++--
 src/com/XMLDOMNodeList.cpp                    |  15 +-
 src/com/XMLDOMUtil.cpp                        |  63 +++++--
 src/com/XMLDOMUtil.h                          |   6 +-
 src/com/XMLDOMXMLDecl.cpp                     | 166 ++++++++++++++++++
 src/com/XMLDOMXMLDecl.h                       | 100 +++++++++++
 src/com/xml4com.cpp                           | 109 +++++++++++-
 src/com/xml4com.idl                           |  31 ++++
 src/com/xmldocument.rgs                       |  12 +-
 src/com/xmlhttprequest.rgs                    |  12 +-
 19 files changed, 670 insertions(+), 95 deletions(-)
 create mode 100644 src/com/XMLDOMXMLDecl.cpp
 create mode 100644 src/com/XMLDOMXMLDecl.h

diff --git a/Projects/Win32/VC6/xerces-all/xerces-com/xerces-com.dsp b/Projects/Win32/VC6/xerces-all/xerces-com/xerces-com.dsp
index 79e17ee93..a6bd9c069 100644
--- a/Projects/Win32/VC6/xerces-all/xerces-com/xerces-com.dsp
+++ b/Projects/Win32/VC6/xerces-all/xerces-com/xerces-com.dsp
@@ -58,14 +58,14 @@ LINK32=link.exe
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wininet.lib shlwapi.lib xerces-c_1D.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\..\..\Build\Win32\VC6\Debug"
 # Begin Custom Build - Performing registration
 OutDir=.\..\..\..\..\..\Build\Win32\xml4com\Debug
-TargetDir=\xml-xerces\c\Build\Win32\xml4com\Debug
-TargetPath=\xml-xerces\c\Build\Win32\xml4com\Debug\xerces-com.dll
-InputPath=\xml-xerces\c\Build\Win32\xml4com\Debug\xerces-com.dll
+TargetDir=.\..\..\..\..\..\Build\Win32\xml4com\Debug
+TargetPath=.\..\..\..\..\..\Build\Win32\xml4com\Debug\xerces-com.dll
+InputPath=.\..\..\..\..\..\Build\Win32\xml4com\Debug\xerces-com.dll
 SOURCE="$(InputPath)"
 
 "$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	echo copy ..\..\..\..\..\Build\Win32\VC6\Debug\xerces-c_1_2.dll $(TargetDir) 
-	copy ..\..\..\..\..\Build\Win32\VC6\Debug\xerces-c_1_2.dll $(TargetDir) 
+	echo copy ..\..\..\..\..\Build\Win32\VC6\Debug\xerces-c_1_2D.dll "$(TargetDir)" 
+	copy ..\..\..\..\..\Build\Win32\VC6\Debug\xerces-c_1_2D.dll "$(TargetDir)" 
 	regsvr32 /s /c "$(TargetPath)" 
 	echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" 
 	
@@ -96,8 +96,8 @@ LINK32=link.exe
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wininet.lib shlwapi.lib xerces-c_1.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\..\..\Build\Win32\VC6\Debug"
 # Begin Custom Build - Performing registration
 OutDir=.\..\..\..\..\..\Build\Win32\xml4com\DebugU
-TargetPath=\xml-xerces\c\Build\Win32\xml4com\DebugU\xerces-com.dll
-InputPath=\xml-xerces\c\Build\Win32\xml4com\DebugU\xerces-com.dll
+TargetPath=.\..\..\..\..\..\Build\Win32\xml4com\DebugU\xerces-com.dll
+InputPath=.\..\..\..\..\..\Build\Win32\xml4com\DebugU\xerces-com.dll
 SOURCE="$(InputPath)"
 
 "$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
@@ -137,9 +137,9 @@ LINK32=link.exe
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wininet.lib shlwapi.lib xerces-c_1.lib /nologo /subsystem:windows /dll /machine:I386 /libpath:"..\..\..\..\..\Build\Win32\VC6\Release"
 # Begin Custom Build - Performing registration
 OutDir=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseMinSize
-TargetDir=\xml-xerces\c\Build\Win32\xml4com\ReleaseMinSize
-TargetPath=\xml-xerces\c\Build\Win32\xml4com\ReleaseMinSize\xerces-com.dll
-InputPath=\xml-xerces\c\Build\Win32\xml4com\ReleaseMinSize\xerces-com.dll
+TargetDir=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseMinSize
+TargetPath=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseMinSize\xerces-com.dll
+InputPath=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseMinSize\xerces-com.dll
 SOURCE="$(InputPath)"
 
 BuildCmds= \
@@ -181,9 +181,9 @@ LINK32=link.exe
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wininet.lib shlwapi.lib xerces-c_1.lib /nologo /subsystem:windows /dll /machine:I386 /libpath:"..\..\..\..\..\Build\Win32\VC6\Release"
 # Begin Custom Build - Performing registration
 OutDir=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseMinDependency
-TargetDir=\xml-xerces\c\Build\Win32\xml4com\ReleaseMinDependency
-TargetPath=\xml-xerces\c\Build\Win32\xml4com\ReleaseMinDependency\xerces-com.dll
-InputPath=\xml-xerces\c\Build\Win32\xml4com\ReleaseMinDependency\xerces-com.dll
+TargetDir=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseMinDependency
+TargetPath=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseMinDependency\xerces-com.dll
+InputPath=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseMinDependency\xerces-com.dll
 SOURCE="$(InputPath)"
 
 BuildCmds= \
@@ -225,9 +225,9 @@ LINK32=link.exe
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wininet.lib shlwapi.lib xerces-c_1.lib /nologo /subsystem:windows /dll /machine:I386 /libpath:"..\..\..\..\..\Build\Win32\VC6\Release"
 # Begin Custom Build - Performing registration
 OutDir=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseUMinSize
-TargetDir=\xml-xerces\c\Build\Win32\xml4com\ReleaseUMinSize
-TargetPath=\xml-xerces\c\Build\Win32\xml4com\ReleaseUMinSize\xerces-com.dll
-InputPath=\xml-xerces\c\Build\Win32\xml4com\ReleaseUMinSize\xerces-com.dll
+TargetDir=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseUMinSize
+TargetPath=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseUMinSize\xerces-com.dll
+InputPath=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseUMinSize\xerces-com.dll
 SOURCE="$(InputPath)"
 
 BuildCmds= \
@@ -275,9 +275,9 @@ LINK32=link.exe
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wininet.lib shlwapi.lib xerces-c_1.lib /nologo /subsystem:windows /dll /machine:I386
 # Begin Custom Build - Performing registration
 OutDir=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseUMinDependency
-TargetDir=\xml-xerces\c\Build\Win32\xml4com\ReleaseUMinDependency
-TargetPath=\xml-xerces\c\Build\Win32\xml4com\ReleaseUMinDependency\xerces-com.dll
-InputPath=\xml-xerces\c\Build\Win32\xml4com\ReleaseUMinDependency\xerces-com.dll
+TargetDir=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseUMinDependency
+TargetPath=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseUMinDependency\xerces-com.dll
+InputPath=.\..\..\..\..\..\Build\Win32\xml4com\ReleaseUMinDependency\xerces-com.dll
 SOURCE="$(InputPath)"
 
 BuildCmds= \
@@ -426,6 +426,10 @@ SOURCE=..\..\..\..\..\src\com\XMLDOMUtil.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\..\..\..\src\com\XMLDOMXMLDecl.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\..\..\..\src\com\XMLHTTPRequest.h
 # End Source File
 # End Group
@@ -509,6 +513,10 @@ SOURCE=..\..\..\..\..\src\com\XMLDOMUtil.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\..\..\..\src\com\XMLDOMXMLDecl.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\..\..\..\src\com\XMLHTTPRequest.cpp
 # End Source File
 # End Group
diff --git a/src/com/IXMLDOMNodeImpl.h b/src/com/IXMLDOMNodeImpl.h
index b3daab2ac..1f0c0666a 100644
--- a/src/com/IXMLDOMNodeImpl.h
+++ b/src/com/IXMLDOMNodeImpl.h
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.4  2000/06/19 20:05:56  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.3  2000/06/03 00:28:54  andyh
  * COM Wrapper changes from Curt Arnold
  *
@@ -77,8 +81,9 @@
 //      on the Directories tab on the dialog displayed after selecting Tools Options
 //      from the Visual Studio IDE.
 //
+//   See http://xml.apache.org/xerces-c/build.html#BuildCOM
 #ifndef __IXMLDOMNode_INTERFACE_DEFINED__
-#error "xerces-dom requires an MSXML.H compatible with IE5 or later.  See comments for directions to correct this problem."
+#error "xerces-dom requires an MSXML.H compatible with IE5 or later.  See http://xml.apache.org/xerces-c/build.html#BuildCOM for directions to correct this problem."
 #endif
 
 
diff --git a/src/com/IXMLDOMNodeImpl.inl b/src/com/IXMLDOMNodeImpl.inl
index 120c30903..f43aaeb58 100644
--- a/src/com/IXMLDOMNodeImpl.inl
+++ b/src/com/IXMLDOMNodeImpl.inl
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.4  2000/06/19 20:05:56  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.3  2000/06/03 00:28:54  andyh
  * COM Wrapper changes from Curt Arnold
  *
@@ -163,12 +167,16 @@ IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_parentNode(IXMLDOMNod
 	if (NULL == pVal)
 		return E_POINTER;
 
+	if(*pVal) (*pVal)->Release();
 	*pVal = NULL;
 	HRESULT hr = S_OK;
 
 	try
 	{
-		hr = wrapNode(m_pIXMLDOMDocument, get_DOM_Node().getParentNode(),IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));
+		DOM_Node n = get_DOM_Node().getParentNode();
+		if(!n.isNull()) {
+			hr = wrapNode(m_pIXMLDOMDocument, n,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));
+		}
 	}
 	catch(...)
 	{
@@ -523,7 +531,8 @@ IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::removeChild(IXMLDOMNode *
 	try
 	{
 		DOM_Node n = get_DOM_Node().removeChild(*pChildNode);
-		hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (oldChild));
+		if(!n.isNull())
+			hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (oldChild));
 	}
 	catch(...)
 	{
@@ -648,7 +657,7 @@ IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_nodeTypeString(BSTR *
 	if (NULL == pVal)
 		return E_POINTER;
 
-	*pVal = ::SysAllocString(T2OLE(g_DomNodeName[get_DOMNodeType()]));
+	*pVal = ::SysAllocString(g_DomNodeName[get_DOMNodeType()]);
 	
 	return S_OK;
 }
@@ -715,13 +724,15 @@ IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::put_text(BSTR newVal)
 	return S_OK;
 }
 
+
 template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
 STDMETHODIMP
 IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_specified(VARIANT_BOOL *pVal)
 {
 	ATLTRACE(_T("IXMLDOMNodeImpl::get_specified\n"));
 
-	return E_NOTIMPL;
+	*pVal = VARIANT_TRUE;
+	return S_OK;
 }
 
 template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
diff --git a/src/com/StdAfx.cpp b/src/com/StdAfx.cpp
index 093a22d41..b37c3ed62 100644
--- a/src/com/StdAfx.cpp
+++ b/src/com/StdAfx.cpp
@@ -21,6 +21,6 @@
 //      from the Visual Studio IDE.
 //
 #ifndef __IXMLDOMNode_INTERFACE_DEFINED__
-#error "xerces-dom requires an MSXML.H compatible with IE5 or later.  See comments for directions to correct this problem."
+#error "xerces-dom requires an MSXML.H compatible with IE5 or later.  See http://xml.apache.org/xerces-c/build.html#BuildCOM for directions to correct this problem."
 #endif
 
diff --git a/src/com/XMLDOMAttribute.cpp b/src/com/XMLDOMAttribute.cpp
index c45acb5a8..50ab697e3 100644
--- a/src/com/XMLDOMAttribute.cpp
+++ b/src/com/XMLDOMAttribute.cpp
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.3  2000/06/19 20:05:57  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.2  2000/03/30 02:00:12  abagchi
  * Initial checkin of working code with Copyright Notice
  *
@@ -128,3 +132,21 @@ STDMETHODIMP CXMLDOMAttribute::put_value(VARIANT newVal)
 	return S_OK;
 }
 
+	//  IXMLDOMNode method
+STDMETHODIMP CXMLDOMAttribute::get_specified(VARIANT_BOOL  *pVal)
+{
+	ATLTRACE(_T("CXMLDOMAttribute::get_specified\n"));
+
+	try
+	{
+		*pVal = attr.getSpecified() ? VARIANT_TRUE : VARIANT_FALSE;
+	}
+	catch(...)
+	{
+		return E_FAIL;
+	}
+	
+	return S_OK;
+}
+
+
diff --git a/src/com/XMLDOMAttribute.h b/src/com/XMLDOMAttribute.h
index 6ef509be4..b11bccd5a 100644
--- a/src/com/XMLDOMAttribute.h
+++ b/src/com/XMLDOMAttribute.h
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.4  2000/06/19 20:05:57  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.3  2000/06/03 00:28:55  andyh
  * COM Wrapper changes from Curt Arnold
  *
@@ -96,6 +100,10 @@ BEGIN_COM_MAP(CXMLDOMAttribute)
 	COM_INTERFACE_ENTRY(IDispatch)
 END_COM_MAP()
 	
+	//  IXMLDOMNode method
+	STDMETHOD(get_specified)(VARIANT_BOOL  *pVal);
+
+
 	// IXMLDOMAttribute methods
 	STDMETHOD(get_name)(BSTR  *pVal);
 	STDMETHOD(get_value)(VARIANT  *pVal);
diff --git a/src/com/XMLDOMDocument.cpp b/src/com/XMLDOMDocument.cpp
index 1e6cad71f..9abad9851 100644
--- a/src/com/XMLDOMDocument.cpp
+++ b/src/com/XMLDOMDocument.cpp
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.4  2000/06/19 20:05:57  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.3  2000/06/03 00:28:57  andyh
  * COM Wrapper changes from Curt Arnold
  *
@@ -131,6 +135,7 @@ CXMLDOMDocument::CXMLDOMDocument()
 	,m_xml						(_T(""))
 	,m_bParseError				(false)
 	,m_bThreadValidate			(false)
+	,m_bPreserveWhiteSpace      (false)
 {
 }
 
@@ -259,7 +264,15 @@ STDMETHODIMP CXMLDOMDocument::get_doctype(IXMLDOMDocumentType  **pVal)
 	if (NULL == pVal)
 		return E_POINTER;
 
+	if(*pVal) (*pVal)->Release();
 	*pVal = NULL;
+	DOM_DocumentType doctype = m_Document.getDoctype();
+
+	//
+	//   if the document had no doctype then return a null object
+	//
+	if(doctype.isNull())
+		return S_OK;
 
 	CXMLDOMDocumentTypeObj *pObj = NULL;
 	HRESULT hr = CXMLDOMDocumentTypeObj::CreateInstance(&pObj);
@@ -271,7 +284,7 @@ STDMETHODIMP CXMLDOMDocument::get_doctype(IXMLDOMDocumentType  **pVal)
 
 	try
 	{
-		pObj->documentType = m_Document.getDoctype();
+		pObj->documentType = doctype;
 	}
 	catch(...)
 	{
@@ -732,9 +745,9 @@ STDMETHODIMP CXMLDOMDocument::createNode(VARIANT TYPE, BSTR name, BSTR namespace
 	if (VT_I4 == V_VT(&type))
 		nodeType = static_cast<DOMNodeType> (V_I4(&type));
 	else {
-		_bstr_t str = V_BSTR(&type);
+		OLECHAR* str = V_BSTR(&type);
 		for (int i = 0; i < g_DomNodeNameSize; ++i) {
-			if (0 == lstrcmpi(str,g_DomNodeName[i])) {
+			if (0 == _wcsicmp(str,g_DomNodeName[i])) {
 				nodeType = static_cast<DOMNodeType> (i);
 				break;
 			}
@@ -1318,6 +1331,20 @@ UINT APIENTRY CXMLDOMDocument::ParseThread(void *pParm)
 	}
 
 	DOMParser parser;
+
+	//
+	//   If set to true then an node supporting IXMLDOMProcessingInstruction
+	//     is added for the XML declaration.
+	//
+	//   Setting to true in a custom DLL will better mimic
+	//      MSXML.DLL but at a cost of conformance errors
+	//      using David Brownell's suite
+	parser.setToCreateXMLDeclTypeNode(false);
+
+	parser.setIncludeIgnorableWhitespace(pThis->m_bPreserveWhiteSpace);
+
+
+
 	if (!pThis->m_bParseError && !pThis->m_bAbort)
 		parser.setDoValidation(pThis->m_bThreadValidate);
 
@@ -1437,13 +1464,17 @@ STDMETHODIMP CXMLDOMDocument::get_preserveWhiteSpace(VARIANT_BOOL  *pVal)
 	if (NULL == pVal)
 		return E_POINTER;
 
-	return E_NOTIMPL;
+	*pVal = (m_bPreserveWhiteSpace) ? VARIANT_TRUE : VARIANT_FALSE;
+
+	return S_OK;
 }
 
 STDMETHODIMP CXMLDOMDocument::put_preserveWhiteSpace(VARIANT_BOOL newVal)
 {	
 	ATLTRACE(_T("CXMLDOMDocument::put_preserveWhiteSpace\n"));
-	return E_NOTIMPL;
+	m_bPreserveWhiteSpace = (VARIANT_TRUE == newVal) ? true : false;
+	return S_OK;
+
 }
 
 STDMETHODIMP CXMLDOMDocument::put_onreadystatechange(VARIANT newVal)
diff --git a/src/com/XMLDOMDocument.h b/src/com/XMLDOMDocument.h
index e8d596deb..43f0fe7cb 100644
--- a/src/com/XMLDOMDocument.h
+++ b/src/com/XMLDOMDocument.h
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.4  2000/06/19 20:05:58  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.3  2000/06/03 00:28:57  andyh
  * COM Wrapper changes from Curt Arnold
  *
@@ -200,6 +204,7 @@ private:
 	DOM_Document		  m_TmpDocument;
 	bool			      m_bParseError;
 	bool				  m_bThreadValidate;
+	bool                  m_bPreserveWhiteSpace;
 	
 	HRESULT GetBaseURL(_bstr_t &baseURL);
 	
diff --git a/src/com/XMLDOMElement.cpp b/src/com/XMLDOMElement.cpp
index eb644ba85..8a323f70a 100644
--- a/src/com/XMLDOMElement.cpp
+++ b/src/com/XMLDOMElement.cpp
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.3  2000/06/19 20:05:58  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.2  2000/03/30 02:00:11  abagchi
  * Initial checkin of working code with Copyright Notice
  *
@@ -97,15 +101,17 @@ STDMETHODIMP CXMLDOMElement::getAttribute(BSTR name, VARIANT  *pVal)
 		return E_POINTER;
 
 	::VariantInit(pVal);
-
-	try
-	{
-		V_VT(pVal)   = VT_BSTR;
-		V_BSTR(pVal) = SysAllocString(element.getAttribute(name).rawBuffer());
-	}
-	catch(...)
-	{
-		return E_FAIL;
+	V_VT(pVal) = VT_EMPTY;
+
+	DOMString a = element.getAttribute(name);
+	if(a.length() > 0) {
+		try {
+			V_VT(pVal)   = VT_BSTR;
+			V_BSTR(pVal) = SysAllocString(a.rawBuffer());
+		}
+		catch(...) {
+			return E_FAIL;
+		}
 	}
 	
 	return S_OK;
@@ -154,19 +160,24 @@ STDMETHODIMP CXMLDOMElement::getAttributeNode(BSTR name, IXMLDOMAttribute  **att
 	if (NULL == attr)
 		return E_POINTER;
 
+	if(*attr) (*attr)->Release();
 	*attr = NULL;
+	DOM_Attr attrNode(element.getAttributeNode(name));
+	if(attrNode.isNull())
+		return S_OK;
+	
 
 	CXMLDOMAttributeObj *pObj = NULL;
 	HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj);
 	if (S_OK != hr) 
 		return hr;
-	
+
 	pObj->AddRef();
 	pObj->SetOwnerDoc(m_pIXMLDOMDocument);
 
 	try
 	{
-		pObj->attr = element.getAttributeNode(name);
+		pObj->attr = attrNode;
 	}
 	catch(...)
 	{
@@ -189,8 +200,28 @@ STDMETHODIMP CXMLDOMElement::setAttributeNode(IXMLDOMAttribute  *attr, IXMLDOMAt
 	if (NULL == attr || NULL == attributeNode)
 		return E_POINTER;
 
+	if(*attributeNode) (*attributeNode)->Release();
 	*attributeNode = NULL;
 
+	long id = 0;
+	IIBMXMLDOMNodeIdentity* nodeID = NULL;
+	if(SUCCEEDED(attr->QueryInterface(IID_IIBMXMLDOMNodeIdentity,(void**) &nodeID))) {
+		nodeID->get_NodeId(&id);
+		nodeID->Release();
+	}
+
+	DOM_Attr attrNode;
+	try {
+		attrNode = (element.setAttributeNode(*((DOM_Attr*) id)));
+		if(attrNode.isNull())
+			return S_OK;
+	}
+	catch(...) {
+		return E_FAIL;
+	}
+
+
+
 	CXMLDOMAttributeObj *pObj = NULL;
 	HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj);
 	if (S_OK != hr) 
@@ -201,7 +232,7 @@ STDMETHODIMP CXMLDOMElement::setAttributeNode(IXMLDOMAttribute  *attr, IXMLDOMAt
 
 	try
 	{
-		pObj->attr = element.setAttributeNode(((CXMLDOMAttribute*) attr)->attr);
+		pObj->attr = element.setAttributeNode(attrNode);
 	}
 	catch(...)
 	{
@@ -236,7 +267,13 @@ STDMETHODIMP CXMLDOMElement::removeAttributeNode(IXMLDOMAttribute  *attr, IXMLDO
 
 	try
 	{
-		pObj->attr = element.removeAttributeNode(((CXMLDOMAttribute*) attr)->attr);
+		long id = 0;
+		IIBMXMLDOMNodeIdentity* nodeID = NULL;
+		if(SUCCEEDED(attr->QueryInterface(IID_IIBMXMLDOMNodeIdentity,(void**) &nodeID))) {
+			nodeID->get_NodeId(&id);
+			nodeID->Release();
+		}
+		pObj->attr = element.removeAttributeNode(*((DOM_Attr*) id));
 	}
 	catch(...)
 	{
diff --git a/src/com/XMLDOMNamedNodeMap.cpp b/src/com/XMLDOMNamedNodeMap.cpp
index 4f19f9905..b7164af8b 100644
--- a/src/com/XMLDOMNamedNodeMap.cpp
+++ b/src/com/XMLDOMNamedNodeMap.cpp
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.3  2000/06/19 20:05:58  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.2  2000/03/30 01:59:11  abagchi
  * Initial checkin of working code with Copyright Notice
  *
@@ -84,7 +88,9 @@ STDMETHODIMP CXMLDOMNamedNodeMap::getNamedItem(BSTR name, IXMLDOMNode  **pVal)
 
 	try
 	{
-		hr = wrapNode(m_pIXMLDOMDocument,m_container.getNamedItem(name),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
+		DOM_Node n = m_container.getNamedItem(name);
+		if(!n.isNull())
+			hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
 	}
 	catch(...)
 	{
@@ -126,7 +132,9 @@ STDMETHODIMP CXMLDOMNamedNodeMap::setNamedItem(IXMLDOMNode  *newItem, IXMLDOMNod
 	{
 		DOMString  name = pNewItemNode->getNodeName();
 		m_container.setNamedItem(*pNewItemNode);
-		hr = wrapNode(m_pIXMLDOMDocument,m_container.getNamedItem(name),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
+		DOM_Node n = m_container.getNamedItem(name);
+		if(!n.isNull())
+			hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
 	}
 	catch(...)
 	{
@@ -151,11 +159,15 @@ STDMETHODIMP CXMLDOMNamedNodeMap::removeNamedItem(BSTR name, IXMLDOMNode  **pVal
 
 	try
 	{
-		hr = wrapNode(m_pIXMLDOMDocument,m_container.removeNamedItem(name),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
+		DOM_Node n = m_container.removeNamedItem(name);
+		if(!n.isNull())
+			hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
 	}
+	//
+	//   if we had a failure, return success anyway
+	//
 	catch(...)
 	{
-		return E_FAIL;
 	}
 	
 	return hr;
@@ -177,10 +189,8 @@ STDMETHODIMP CXMLDOMNamedNodeMap::get_item(long index, IXMLDOMNode  **pVal)
 			return E_INVALIDARG;
 
 		long length =  m_container.getLength();
-		if (index >= length)
-			return E_INVALIDARG;
-
-		hr = wrapNode(m_pIXMLDOMDocument,m_container.item(index),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
+		if (index < length)
+			hr = wrapNode(m_pIXMLDOMDocument,m_container.item(index),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
 	}
 	catch(...)
 	{
@@ -230,7 +240,9 @@ STDMETHODIMP CXMLDOMNamedNodeMap::getQualifiedItem(BSTR baseName, BSTR namespace
 
 	try
 	{
-		hr = wrapNode(m_pIXMLDOMDocument,m_container.getNamedItemNS(namespaceURI,baseName),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
+		DOM_Node n = m_container.getNamedItemNS(namespaceURI,baseName);
+		if(!n.isNull())
+			hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
 	}
 	catch(...)
 	{
@@ -256,7 +268,9 @@ STDMETHODIMP CXMLDOMNamedNodeMap::removeQualifiedItem(BSTR baseName, BSTR namesp
 
 	try
 	{
-		hr = wrapNode(m_pIXMLDOMDocument,m_container.removeNamedItemNS(namespaceURI,baseName),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
+		DOM_Node n = m_container.removeNamedItemNS(namespaceURI,baseName);
+		if(!n.isNull())
+			hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
 	}
 	catch(...)
 	{
@@ -288,7 +302,9 @@ STDMETHODIMP CXMLDOMNamedNodeMap::nextNode(IXMLDOMNode  **pVal)
 
 	try
 	{
-		hr = wrapNode(m_pIXMLDOMDocument,m_container.item(m_NextNodeIndex),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
+		DOM_Node n = m_container.item(m_NextNodeIndex);
+		if(!n.isNull())
+			hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
 	}
 	catch(...)
 	{
diff --git a/src/com/XMLDOMNodeList.cpp b/src/com/XMLDOMNodeList.cpp
index 28fb83847..203432561 100644
--- a/src/com/XMLDOMNodeList.cpp
+++ b/src/com/XMLDOMNodeList.cpp
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.3  2000/06/19 20:05:58  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.2  2000/03/30 02:00:10  abagchi
  * Initial checkin of working code with Copyright Notice
  *
@@ -76,6 +80,7 @@ STDMETHODIMP CXMLDOMNodeList::get_item(long index, IXMLDOMNode  **pVal)
 	if (NULL == pVal)
 		return E_POINTER;
 
+	if(*pVal) (*pVal)->Release();
 	*pVal = NULL;
 	HRESULT hr = S_OK;
 
@@ -85,10 +90,12 @@ STDMETHODIMP CXMLDOMNodeList::get_item(long index, IXMLDOMNode  **pVal)
 			return E_INVALIDARG;
 
 		long length = m_container.getLength(); 
-		if (index >= length)
-			return E_INVALIDARG;
-
-		hr = wrapNode(m_pIXMLDOMDocument,m_container.item(index),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
+		//
+		//    if index is beyond end
+		//       return a null object not an exception
+		//
+		if (index < length)
+			hr = wrapNode(m_pIXMLDOMDocument,m_container.item(index),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
 	}
 	catch(...)
 	{
diff --git a/src/com/XMLDOMUtil.cpp b/src/com/XMLDOMUtil.cpp
index aa2478379..49cc6d33e 100644
--- a/src/com/XMLDOMUtil.cpp
+++ b/src/com/XMLDOMUtil.cpp
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.4  2000/06/19 20:05:59  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.3  2000/06/03 00:29:02  andyh
  * COM Wrapper changes from Curt Arnold
  *
@@ -78,28 +82,29 @@
 #include "XMLDOMDocumentType.h"
 #include "XMLDOMDocumentFragment.h"
 #include "XMLDOMNotation.h"
+#include "XMLDOMXMLDecl.h"
 #include "XMLDOMUtil.h"
 #include <util/PlatformUtils.hpp>
 
 
-const TCHAR* g_DomNodeName[] = 
+const OLECHAR* g_DomNodeName[] = 
 {	
-	_T("invalid"),
-	_T("element"),
-	_T("attribute"),
-	_T("text"),
-	_T("cdatasection"),
-	_T("entityreference"),
-	_T("entity"),
-	_T("processinginstruction"),
-	_T("comment"),
-	_T("document"),
-	_T("documenttype"),
-	_T("documentfragment"),
-	_T("notation")
+	OLESTR("invalid"),
+	OLESTR("element"),
+	OLESTR("attribute"),
+	OLESTR("text"),
+	OLESTR("cdatasection"),
+	OLESTR("entityreference"),
+	OLESTR("entity"),
+	OLESTR("processinginstruction"),
+	OLESTR("comment"),
+	OLESTR("document"),
+	OLESTR("documenttype"),
+	OLESTR("documentfragment"),
+	OLESTR("notation")
 };
  
-const int g_DomNodeNameSize = sizeof(g_DomNodeName) / sizeof(TCHAR*);
+const int g_DomNodeNameSize = sizeof(g_DomNodeName) / sizeof(OLECHAR*);
 
 void GetText(const DOM_Node& node, _bstr_t &text)
 {
@@ -651,6 +656,34 @@ HRESULT wrapNode(IXMLDOMDocument *pDoc, DOM_Node& node, REFIID iid, LPVOID *pVal
 		pObj->Release();
 		break;
 	}
+
+	case DOM_Node::XML_DECL_NODE:
+	{
+		CXMLDOMXMLDeclObj *pObj = NULL;
+		hr = CXMLDOMXMLDeclObj::CreateInstance(&pObj);
+		if (S_OK != hr) 
+			return hr;
+	
+		pObj->AddRef();
+		pObj->SetOwnerDoc(pDoc);
+
+		try
+		{
+			pObj->xmlDecl = *(static_cast<DOM_XMLDecl*> (&node));
+		}
+		catch(...)
+		{
+			pObj->Release(); 
+			return E_FAIL;
+		}
+	
+		hr = pObj->QueryInterface(iid, pVal);
+		if (S_OK != hr) 
+			*pVal = NULL;
+
+		pObj->Release();
+		break;
+	}
 	default:
 		hr = E_NOTIMPL;
 		break;
diff --git a/src/com/XMLDOMUtil.h b/src/com/XMLDOMUtil.h
index 7a4385257..b890f0a67 100644
--- a/src/com/XMLDOMUtil.h
+++ b/src/com/XMLDOMUtil.h
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.4  2000/06/19 20:05:59  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.3  2000/06/03 00:29:03  andyh
  * COM Wrapper changes from Curt Arnold
  *
@@ -69,7 +73,7 @@
 
 class DOM_Node;
 
-extern const TCHAR* g_DomNodeName[];
+extern const OLECHAR* g_DomNodeName[];
 extern const int	g_DomNodeNameSize;
 
 void GetXML (const DOM_Node &node, _bstr_t &text);
diff --git a/src/com/XMLDOMXMLDecl.cpp b/src/com/XMLDOMXMLDecl.cpp
new file mode 100644
index 000000000..13cb0cd8b
--- /dev/null
+++ b/src/com/XMLDOMXMLDecl.cpp
@@ -0,0 +1,166 @@
+/*
+ * The Apache Software License, Version 1.1
+ * 
+ * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
+ * reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ * 
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ * 
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact apache\@apache.org.
+ * 
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ * 
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ * 
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation, and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com .  For more information
+ * on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+
+#include "stdafx.h"
+#include "xml4com.h"
+#include "XMLDOMXMLDecl.h"
+
+// IXMLDOMProcessingInstruction methods
+STDMETHODIMP CXMLDOMXMLDecl::get_target(BSTR  *pVal)
+{
+	ATLTRACE(_T("CXMLDOMXMLDecl::get_target\n"));
+
+	if (NULL == pVal)
+		return E_POINTER;
+
+	*pVal = NULL;
+
+	try
+	{
+		*pVal = SysAllocString(OLESTR("xml"));
+	}
+	catch(...)
+	{
+		return E_FAIL;
+	}
+
+	return S_OK;
+}
+
+STDMETHODIMP CXMLDOMXMLDecl::get_data(BSTR  *pVal)
+{
+	ATLTRACE(_T("CXMLDOMXMLDecl::get_data\n"));
+
+	if (NULL == pVal)
+		return E_POINTER;
+
+	*pVal = NULL;
+
+	try
+	{
+		unsigned int len= 0;
+		unsigned int totalLen = 0;
+		DOMString version(xmlDecl.getVersion());
+		len = version.length();
+		if(len > 0) totalLen = len + 10;
+
+		DOMString standalone(xmlDecl.getStandalone());
+		len = standalone.length();
+		if(len > 0) {
+			if(totalLen > 0) 
+				totalLen += len + 14;
+			else
+				totalLen = len + 13;
+		}
+
+		DOMString encoding(xmlDecl.getEncoding());
+		len = encoding.length();
+		if(len > 0) {
+			if(totalLen > 0)
+				totalLen += len + 13;
+			else
+				totalLen = len + 12;
+		}
+
+		*pVal = SysAllocStringLen(NULL,totalLen+1);
+		**pVal = 0;
+
+		len = version.length();
+		totalLen = len;
+		if(len > 0) {
+			wcscpy(*pVal,OLESTR("version=\""));
+			wcscat(*pVal,version.rawBuffer());
+			wcscat(*pVal,OLESTR("\""));
+		}
+
+		len = standalone.length();
+		if(len > 0) {
+			if(totalLen > 0)
+				wcscat(*pVal,OLESTR(" standalone=\""));
+			else
+				wcscat(*pVal,OLESTR("standalone=\""));
+			wcscat(*pVal,standalone.rawBuffer());
+			wcscat(*pVal,OLESTR("\""));
+			totalLen += len;
+		}
+
+		len = encoding.length();
+		if(len > 0) {
+			if(totalLen > 0)
+				wcscat(*pVal,OLESTR(" encoding=\""));
+			else
+				wcscat(*pVal,OLESTR("encoding=\""));
+			wcscat(*pVal,encoding.rawBuffer());
+			wcscat(*pVal,OLESTR("\""));
+		}
+
+	}
+	catch(...)
+	{
+		return E_FAIL;
+	}
+
+	return S_OK;
+
+}
+
+STDMETHODIMP CXMLDOMXMLDecl::put_data(BSTR newVal)
+{
+	ATLTRACE(_T("CXMLDOMXMLDecl::put_data\n"));
+
+	return E_NOTIMPL;
+}
diff --git a/src/com/XMLDOMXMLDecl.h b/src/com/XMLDOMXMLDecl.h
new file mode 100644
index 000000000..93a95e6b1
--- /dev/null
+++ b/src/com/XMLDOMXMLDecl.h
@@ -0,0 +1,100 @@
+/*
+ * The Apache Software License, Version 1.1
+ * 
+ * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
+ * reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ * 
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ * 
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact apache\@apache.org.
+ * 
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ * 
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ * 
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation, and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com .  For more information
+ * on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+
+#ifndef ___xmldomxmldecl_h___
+#define ___xmldomxmldecl_h___
+
+#include <dom/DOM_XMLDecl.hpp>
+#include "IXMLDOMNodeImpl.h"
+
+class ATL_NO_VTABLE CXMLDOMXMLDecl : 
+	public CComObjectRootEx<CComSingleThreadModel>,
+	public IXMLDOMNodeImpl<IXMLDOMProcessingInstruction, &IID_IXMLDOMProcessingInstruction, &LIBID_Xerces>
+{
+public:
+	CXMLDOMXMLDecl()
+	{}
+	
+	void	FinalRelease()
+	{
+		ReleaseOwnerDoc();
+	}
+
+	virtual DOM_Node& get_DOM_Node()			 { return xmlDecl;} 
+	virtual DOMNodeType get_DOMNodeType() const  { return NODE_PROCESSING_INSTRUCTION; }
+
+DECLARE_NOT_AGGREGATABLE(CXMLDOMXMLDecl)
+DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+BEGIN_COM_MAP(CXMLDOMXMLDecl)
+	COM_INTERFACE_ENTRY(IXMLDOMProcessingInstruction)
+	COM_INTERFACE_ENTRY(IXMLDOMNode)
+	COM_INTERFACE_ENTRY(IIBMXMLDOMNodeIdentity)
+	COM_INTERFACE_ENTRY(IDispatch)
+END_COM_MAP()
+
+	// IXMLDOMProcessingInstruction methods
+	STDMETHOD(get_target)(BSTR  *pVal);
+	STDMETHOD(get_data)(BSTR  *pVal);
+	STDMETHOD(put_data)(BSTR newVal);
+
+	DOM_XMLDecl xmlDecl;
+};
+
+typedef CComObject<CXMLDOMXMLDecl> CXMLDOMXMLDeclObj;
+
+#endif // ___xmldomprocessinginstruction_h___
\ No newline at end of file
diff --git a/src/com/xml4com.cpp b/src/com/xml4com.cpp
index 8f7346e68..6390d4801 100644
--- a/src/com/xml4com.cpp
+++ b/src/com/xml4com.cpp
@@ -56,6 +56,10 @@
 
 /*
  * $Log$
+ * Revision 1.4  2000/06/19 20:05:59  rahulj
+ * Changes for increased conformance and stability. Submitted by
+ * Curt.Arnold@hyprotech.com. Verified by Joe Polastre.
+ *
  * Revision 1.3  2000/06/03 00:29:04  andyh
  * COM Wrapper changes from Curt Arnold
  *
@@ -93,17 +97,104 @@
 #include <util/PlatformUtils.hpp>
 #include "xml4com.h"
 
+
 //
-//   This file is generated from the type library compilation
-//       of xmldom.idl
 //
-//   The define prevent the Microsoft versions of DOMDocument
-//      and HTTPRequest from causing symbol clashes with ours
-#define CLSID_DOMDocument CLSID_MSDOMDocument
-#define CLSID_XMLHTTPRequest CLSID_MSXMLHTTPRequest
-#include "msxml_i.c"
-#undef CLSID_DOMDocument
-#undef CLSID_XMLHTTPRequest
+//    These were extracted from an identifier definition file
+//       generated by compiling MSXML.IDL using the MIDL compiler
+//        (and removing CLSID_DOMDocument, CLSID_XMLHttpRequest, et al)
+//
+const IID LIBID_MSXML = {0xd63e0ce2,0xa0a2,0x11d0,{0x9c,0x02,0x00,0xc0,0x4f,0xc9,0x9c,0x8e}};
+
+
+const IID IID_IXMLDOMImplementation = {0x2933BF8F,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMNode = {0x2933BF80,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMDocumentFragment = {0x3efaa413,0x272f,0x11d2,{0x83,0x6f,0x00,0x00,0xf8,0x7a,0x77,0x82}};
+
+
+const IID IID_IXMLDOMDocument = {0x2933BF81,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMNodeList = {0x2933BF82,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMNamedNodeMap = {0x2933BF83,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMCharacterData = {0x2933BF84,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMAttribute = {0x2933BF85,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMElement = {0x2933BF86,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMText = {0x2933BF87,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMComment = {0x2933BF88,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMProcessingInstruction = {0x2933BF89,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMCDATASection = {0x2933BF8A,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMDocumentType = {0x2933BF8B,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMNotation = {0x2933BF8C,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMEntity = {0x2933BF8D,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMEntityReference = {0x2933BF8E,0x7B36,0x11d2,{0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
+
+
+const IID IID_IXMLDOMParseError = {0x3efaa426,0x272f,0x11d2,{0x83,0x6f,0x00,0x00,0xf8,0x7a,0x77,0x82}};
+
+
+const IID IID_IXTLRuntime = {0x3efaa425,0x272f,0x11d2,{0x83,0x6f,0x00,0x00,0xf8,0x7a,0x77,0x82}};
+
+
+const IID DIID_XMLDOMDocumentEvents = {0x3efaa427,0x272f,0x11d2,{0x83,0x6f,0x00,0x00,0xf8,0x7a,0x77,0x82}};
+
+
+
+const IID IID_IXMLHttpRequest = {0xED8C108D,0x4349,0x11D2,{0x91,0xA4,0x00,0xC0,0x4F,0x79,0x69,0xE8}};
+
+
+const IID IID_IXMLDSOControl = {0x310afa62,0x0575,0x11d2,{0x9c,0xa9,0x00,0x60,0xb0,0xec,0x3d,0x39}};
+
+
+const IID IID_IXMLElementCollection = {0x65725580,0x9B5D,0x11d0,{0x9B,0xFE,0x00,0xC0,0x4F,0xC9,0x9C,0x8E}};
+
+
+const IID IID_IXMLDocument = {0xF52E2B61,0x18A1,0x11d1,{0xB1,0x05,0x00,0x80,0x5F,0x49,0x91,0x6B}};
+
+
+const IID IID_IXMLDocument2 = {0x2B8DE2FE,0x8D2D,0x11d1,{0xB2,0xFC,0x00,0xC0,0x4F,0xD9,0x15,0xA9}};
+
+
+const IID IID_IXMLElement = {0x3F7F31AC,0xE15F,0x11d0,{0x9C,0x25,0x00,0xC0,0x4F,0xC9,0x9C,0x8E}};
+
+
+const IID IID_IXMLElement2 = {0x2B8DE2FF,0x8D2D,0x11d1,{0xB2,0xFC,0x00,0xC0,0x4F,0xD9,0x15,0xA9}};
+
+
+const IID IID_IXMLAttribute = {0xD4D4A0FC,0x3B73,0x11d1,{0xB2,0xB4,0x00,0xC0,0x4F,0xB9,0x25,0x96}};
+
+
+const IID IID_IXMLError = {0x948C5AD3,0xC58D,0x11d0,{0x9C,0x0B,0x00,0xC0,0x4F,0xC9,0x9C,0x8E}};
+
+
 
 //
 //   This file is generated from the type library compilation
diff --git a/src/com/xml4com.idl b/src/com/xml4com.idl
index b007cea88..d3b691405 100644
--- a/src/com/xml4com.idl
+++ b/src/com/xml4com.idl
@@ -74,7 +74,38 @@ library Xerces
 	importlib("stdole32.tlb");
 	importlib("stdole2.tlb");
 
+	//
+	//   it appears to be necessary to forward declare
+	//      this interface to lure it into the type library
+	interface IXMLDOMNotation;
 
+	//
+	//   might as well insure the rest we use are here
+	//
+	interface IXMLDOMAttribute;
+	interface IXMLDOMCDATASection;
+	interface IXMLDOMComment;
+	interface IXMLDOMDocument;
+	interface IXMLDOMDocumentType;
+	interface IXMLDOMElement;
+	interface IXMLDOMEntity;
+	interface IXMLDOMEntityReference;
+	interface IXMLDOMImplementation;
+	interface IXMLDOMNamedNodeMap;
+	interface IXMLDOMNodeList;
+	interface IXMLDOMParseError;
+	interface IXMLDOMProcessingInstruction;
+	interface IXMLDOMText;
+	interface IXMLHttpRequest;
+
+
+	//
+	//
+	//    if you get an "Cannot open input file" error here
+	//       then you most probably do not have a recent 
+	//        Microsoft Platform SDK in your include path
+	//
+	//    See http://xml.apache.org/xerces-c/build.html#BuildCOM
 	import "xmldom.idl";
 	
 	[
diff --git a/src/com/xmldocument.rgs b/src/com/xmldocument.rgs
index f9a97a773..28a9b9a19 100644
--- a/src/com/xmldocument.rgs
+++ b/src/com/xmldocument.rgs
@@ -1,20 +1,20 @@
 HKCR
 {
-	IBMXML.XMLDOMDocument.1 = s 'IBM XML Parser for COM Class'
+	Xerces.DOMDocument.1.2 = s 'Apache Xerces Parser for COM'
 	{
 		CLSID = s '{79516F6F-3AEA-11D3-BC47-0004ACB7DBEB}'
 	}
-	IBMXML.XMLDOMDocument = s 'IBM XML Parser for COM Class'
+	Xerces.DOMDocument = s 'Apache Xerces Parser For COM'
 	{
 		CLSID = s '{79516F6F-3AEA-11D3-BC47-0004ACB7DBEB}'
-		CurVer = s 'IBMXML.XMLDOMDocument.1'
+		CurVer = s 'Xerces.DOMDocument.1.2'
 	}
 	NoRemove CLSID
 	{
-		ForceRemove {79516F6F-3AEA-11D3-BC47-0004ACB7DBEB} = s 'IBM XML Parser for COM Class'
+		ForceRemove {79516F6F-3AEA-11D3-BC47-0004ACB7DBEB} = s 'Apache Xerces Parser for COM'
 		{
-			ProgID = s 'IBMXML.XMLDOMDocument.1'
-			VersionIndependentProgID = s 'IBMXML.XMLDOMDocument'
+			ProgID = s 'Xerces.DOMDocument.1.2'
+			VersionIndependentProgID = s 'Xerces.DOMDocument'
 			ForceRemove 'Programmable'
 			InprocServer32 = s '%XMLMODULE%'
 			{
diff --git a/src/com/xmlhttprequest.rgs b/src/com/xmlhttprequest.rgs
index f4090b420..2ebb02179 100644
--- a/src/com/xmlhttprequest.rgs
+++ b/src/com/xmlhttprequest.rgs
@@ -1,20 +1,20 @@
 HKCR
 {
-	IBMXML.XMLHttpRequest.1 = s 'IBM XML Http Request'
+	IBMXML.XMLHttpRequest.1.2 = s 'Apache Xerces XML Http Request'
 	{
 		CLSID = s '{1C598E82-9AB9-456b-9C24-D711F08F3584}'
 	}
-	IBMXML.XMLHttpRequest = s 'IBM XML Http Request'
+	IBMXML.XMLHttpRequest = s 'Apache Xerces XML Http Request'
 	{
 		CLSID = s '{1C598E82-9AB9-456b-9C24-D711F08F3584}'
-		CurVer = s 'IBMXML.XMLHttpRequest.1'
+		CurVer = s 'Xerces.XMLHttpRequest.1.2'
 	}
 	NoRemove CLSID
 	{
-		ForceRemove {1C598E82-9AB9-456b-9C24-D711F08F3584} = s 'IBM XML Http Request'
+		ForceRemove {1C598E82-9AB9-456b-9C24-D711F08F3584} = s 'Apache Xerces XML Http Request'
 		{
-			ProgID = s 'IBMXML.XMLHttpRequest.1'
-			VersionIndependentProgID = s 'IBMXML.XMLHttpRequest'
+			ProgID = s 'Xerces.XMLHttpRequest.1.2'
+			VersionIndependentProgID = s 'Xerces.XMLHttpRequest'
 			ForceRemove 'Programmable'
 			InprocServer32 = s '%XMLMODULE%'
 			{
-- 
GitLab