Click here to Skip to main content
15,892,746 members
Articles / Programming Languages / C#

Windows Development in C++, COM API Clients

Rate me:
Please Sign up or sign in to vote.
4.98/5 (31 votes)
3 Jan 2015CPOL7 min read 63K   1.6K   106  
Using the Facade Pattern to simplify development with COM based APIs
// hwinxml.h

#pragma once
#ifndef __HWINXML_H__
#define __HWINXML_H__

#include "hwindef.h"
#include "hwincom.h"
#include "hwinexception.h"
#include "hwinvariant.h"
#include "hwinobj.h"

#include <msxml6.h>


namespace harlinn
{
    namespace windows
    {
        namespace xml
        {
            namespace dom
            {

                class Implementation : public Dispatch
                {
                public:
                    typedef Dispatch Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(Implementation, Dispatch,IXMLDOMImplementation,IDispatch)

                    bool HasFeature( BSTR feature, BSTR version)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->hasFeature( feature, version, &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }
        
                };

                enum class NodeType
                {
                    Invalid = NODE_INVALID,
                    Element = NODE_ELEMENT,
                    Attribute = NODE_ATTRIBUTE,
                    Text = NODE_TEXT,
                    CDataSection = NODE_CDATA_SECTION,
                    EntityReference = NODE_ENTITY_REFERENCE,
                    Entity = NODE_ENTITY,
                    ProcessingInstruction = NODE_PROCESSING_INSTRUCTION,
                    Comment = NODE_COMMENT,
                    Document = NODE_DOCUMENT,
                    DocumentType = NODE_DOCUMENT_TYPE,
                    DocumentFragment = NODE_DOCUMENT_FRAGMENT,
                    Notation = NODE_NOTATION
                };

                typedef SysString XmlString;

                class NodeList;
                class NamedNodeMap;
                class Document;

                class Node : public Dispatch
                {
                public:
                    typedef Dispatch Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(Node, Dispatch,IXMLDOMNode,IDispatch)


                    XmlString NodeName( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_nodeName(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    Variant NodeValue( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        Variant result;
                        auto hr = pInterface->get_nodeValue(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    Node& SetNodeValue(const VARIANT& value)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_nodeValue(value);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    NodeType NodeType( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        DOMNodeType result;
                        auto hr = pInterface->get_nodeType(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::NodeType(result);
                    }
        
                    Node ParentNode( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->get_parentNode(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    NodeList ChildNodes( ) const;
        
                    Node FirstChild( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->get_firstChild(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node LastChild( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->get_lastChild(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node PreviousSibling( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->get_previousSibling(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node NextSibling( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->get_nextSibling(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    NamedNodeMap Attributes() const;
        
                    Node InsertBefore( IXMLDOMNode *newChild,const VARIANT& refChild)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->insertBefore( newChild, refChild,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node ReplaceChild( IXMLDOMNode *newChild,IXMLDOMNode *oldChild)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->replaceChild( newChild, oldChild,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node RemoveChild( IXMLDOMNode *childNode )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->removeChild( childNode,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node AppendChild( IXMLDOMNode *newChild )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->appendChild( newChild,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }

                    bool HasChildNodes( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->hasChildNodes( &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }
        
                    Document OwnerDocument( ) const;
        
                    Node CloneNode( bool deep = true)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->cloneNode( deep?VARIANT_TRUE:VARIANT_FALSE,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    XmlString NodeTypeString( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_nodeTypeString(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    XmlString Text( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_text(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    Node& SetText( BSTR text)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_text(text);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    bool Specified( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->get_specified( &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }
        
                    Node Definition( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->get_definition( &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Variant NodeTypedValue( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        Variant result;
                        auto hr = pInterface->get_nodeTypedValue( &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    Node& SetNodeTypedValue( const VARIANT& typedValue )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_nodeTypedValue( typedValue );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    Variant DataType( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        Variant result;
                        auto hr = pInterface->get_dataType( &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }

                    Node& SetDataType( BSTR dataTypeName )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_dataType(dataTypeName);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    XmlString Xml( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_xml(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    XmlString TransformNode( IXMLDOMNode *stylesheet)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->transformNode(stylesheet, &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    NodeList SelectNodes( BSTR queryString ) const;

                    Node SelectSingleNode( BSTR queryString ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->selectSingleNode( queryString,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    bool Parsed( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->get_parsed( &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }
        
                    XmlString NamespaceURI( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_namespaceURI(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    XmlString Prefix( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_prefix(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    XmlString BaseName( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_baseName(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    const Node& TransformNodeToObject( IXMLDOMNode *stylesheet, IXMLDOMDocument* outputObject) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        Variant destination(outputObject);
                        auto hr = pInterface->transformNodeToObject( stylesheet, destination);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }

                    const Node& transformNodeToObject( IXMLDOMNode *stylesheet, IStream* outputObject) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        Variant destination(outputObject);
                        auto hr = pInterface->transformNodeToObject( stylesheet, destination);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }


                };

                class NodeList : public Dispatch
                {
                public:
                    typedef Dispatch Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(NodeList, Dispatch,IXMLDOMNodeList,IDispatch)

                    Node Item( long index )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->get_item(index,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    long Length( ) const
                    {
                        HWIN_TRACE();
                        if(unknown)
                        {
                            auto pInterface = GetInterface();
                            long result = 0;
                            auto hr = pInterface->get_length(&result);
                            if(FAILED(hr))
                            {
                                CheckHRESULT(hr);
                            }
                            return result;
                        }
                        return 0;
                    }
        
                    Node NextNode( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->nextNode(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    NodeList& Reset( void )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->reset( );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    EnumUnknown NewEnum( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IUnknown *pUnknown = nullptr;
                        auto hr = pInterface->get__newEnum(&pUnknown);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        IEnumUnknown* pEnum = nullptr;

                        hr = pUnknown->QueryInterface<IEnumUnknown>(&pEnum);
                        pUnknown->Release();
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return EnumUnknown(pEnum);
                    }
        
                };

                inline NodeList Node::ChildNodes( ) const
                {
                    HWIN_TRACE();
                    auto pInterface = GetInterface();
                    IXMLDOMNodeList *result = nullptr;
                    auto hr = pInterface->get_childNodes(&result);
                    if(FAILED(hr))
                    {
                        CheckHRESULT(hr);
                    }
                    return NodeList(result);
                }


                inline NodeList Node::SelectNodes( BSTR queryString ) const
                {
                    HWIN_TRACE();
                    auto pInterface = GetInterface();
                    IXMLDOMNodeList *result;
                    auto hr = pInterface->selectNodes(queryString, &result);
                    if(FAILED(hr))
                    {
                        CheckHRESULT(hr);
                    }
                    return NodeList(result);
                }


                class NamedNodeMap : public Dispatch
                {
                public:
                    typedef Dispatch Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(NamedNodeMap, Dispatch,IXMLDOMNamedNodeMap,IDispatch)

                    Node NamedItem( BSTR name )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->getNamedItem(name,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node SetNamedItem( IXMLDOMNode *newItem)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->setNamedItem(newItem,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node RemoveNamedItem( BSTR name )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->removeNamedItem(name,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    Node Item( long index )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result;
                        auto hr = pInterface->get_item(index,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    long Length( ) const
                    {
                        HWIN_TRACE();
                        if(unknown)
                        {
                            auto pInterface = GetInterface();
                            long result = 0;
                            auto hr = pInterface->get_length(&result);
                            if(FAILED(hr))
                            {
                                CheckHRESULT(hr);
                            }
                            return result;
                        }
                        return 0;
                    }
        
                    Node QualifiedItem( BSTR baseName,BSTR namespaceURI)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->getQualifiedItem(baseName,namespaceURI,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }

                    Node RemoveQualifiedItem( BSTR baseName,BSTR namespaceURI)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->removeQualifiedItem(baseName,namespaceURI,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }

                    Node NextNode( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->nextNode(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    NamedNodeMap& Reset( void )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->reset( );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    EnumUnknown NewEnum( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IUnknown *pUnknown = nullptr;
                        auto hr = pInterface->get__newEnum(&pUnknown);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        IEnumUnknown* pEnum = nullptr;

                        hr = pUnknown->QueryInterface<IEnumUnknown>(&pEnum);
                        pUnknown->Release();
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return EnumUnknown(pEnum);
                    }
        
                };

                inline NamedNodeMap Node::Attributes() const
                {
                    HWIN_TRACE();
                    auto pInterface = GetInterface();
                    IXMLDOMNamedNodeMap *result = nullptr;
                    auto hr = pInterface->get_attributes(&result);
                    if(FAILED(hr))
                    {
                        CheckHRESULT(hr);
                    }
                    return NamedNodeMap(result);
                }


                class DocumentType : public Node
                {
                public:
                    typedef Node Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(DocumentType, Node,IXMLDOMDocumentType,IXMLDOMNode)

                    XmlString Name( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_name(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    NamedNodeMap Entities( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNamedNodeMap *result = nullptr;
                        auto hr = pInterface->get_entities(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return NamedNodeMap(result);
                    }
        
                    NamedNodeMap get_notations( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNamedNodeMap *result = nullptr;
                        auto hr = pInterface->get_notations(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return NamedNodeMap(result);
                    }
        
                };


                class Attribute : public Node
                {
                public:
                    typedef Node Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(Attribute, Node,IXMLDOMAttribute,IXMLDOMNode)

                    XmlString Name( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_name(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    Variant Value( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        Variant result;
                        auto hr = pInterface->get_value( &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    Attribute& SetValue( const VARIANT& attributeValue )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_value( attributeValue );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
                };


                class Element : public Node
                {
                public:
                    typedef Node Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(Element, Node,IXMLDOMElement,IXMLDOMNode)

                    XmlString TagName( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_tagName(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    Variant Attribute(BSTR name)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        Variant result;
                        auto hr = pInterface->getAttribute(name, &result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    Element& SetAttribute( BSTR name,VARIANT value)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->setAttribute( name, value );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    Element& RemoveAttribute(BSTR name)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->removeAttribute( name );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    harlinn::windows::xml::dom::Attribute AttributeNode(BSTR name)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMAttribute *result = nullptr;
                        auto hr = pInterface->getAttributeNode(name,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::Attribute(result);
                    }
        
                    harlinn::windows::xml::dom::Attribute SetAttributeNode( IXMLDOMAttribute *DOMAttribute )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMAttribute *result = nullptr;
                        auto hr = pInterface->setAttributeNode(DOMAttribute,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::Attribute(result);
                    }
        
                    harlinn::windows::xml::dom::Attribute RemoveAttributeNode( IXMLDOMAttribute *DOMAttribute )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMAttribute *result = nullptr;
                        auto hr = pInterface->removeAttributeNode(DOMAttribute,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::Attribute(result);
                    }

                    NodeList ElementsByTagName( BSTR tagName )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNodeList *result = nullptr;
                        auto hr = pInterface->getElementsByTagName(tagName,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return NodeList(result);
                    }
        
                    Element& Normalize( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->normalize( );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                };


                class DocumentFragment : public Node
                {
                public:
                    typedef Node Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(DocumentFragment, Node,IXMLDOMDocumentFragment,IXMLDOMNode)
                };

                class CharacterData : public Node
                {
                public:
                    typedef Node Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(CharacterData, Node,IXMLDOMCharacterData,IXMLDOMNode)

                    XmlString Data( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_data(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    CharacterData& SetData( BSTR data )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_data(data);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    long Length( long *dataLength )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        long result = 0;
                        auto hr = pInterface->get_length(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    XmlString SubstringData( long offset,long count,BSTR *data)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->substringData(offset,count,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    CharacterData& AppendData( BSTR data )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->appendData(data);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
                    CharacterData& InsertData( long offset, BSTR data)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->insertData(offset, data);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    CharacterData& DeleteData( long offset,long count) 
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->deleteData(offset, count );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }

                    CharacterData& ReplaceData( long offset,long count, BSTR data)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->replaceData(offset, count, data);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                };


                class Text : public CharacterData
                {
                public:
                    typedef CharacterData Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(Text, CharacterData,IXMLDOMText,IXMLDOMCharacterData)

                    Text splitText( long offset )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMText *result = nullptr;
                        auto hr = pInterface->splitText(offset,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Text(result);
                    }
                };

                class Comment : public CharacterData
                {
                public:
                    typedef CharacterData Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(Comment, CharacterData,IXMLDOMComment,IXMLDOMCharacterData)

                };



                class CDATASection : public Text
                {

                public:
                    typedef Text Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(CDATASection,Text,IXMLDOMCDATASection ,IXMLDOMText)
                };


                class ProcessingInstruction : public Node
                {
                public:
                    typedef Node Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(ProcessingInstruction, Node,IXMLDOMProcessingInstruction,IXMLDOMNode)

                    XmlString Target( BSTR *name)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_target(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }

                    XmlString Data( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_data(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    ProcessingInstruction& SetData( BSTR data )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_data(data);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                };


                class EntityReference : public Node
                {
                public:
                    typedef Node Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(EntityReference, Node,IXMLDOMEntityReference,IXMLDOMNode)
                };


                class ParseError : public Dispatch
                {
                public:
                    typedef Dispatch Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(ParseError, Dispatch,IXMLDOMParseError,IDispatch)

                    long  ErrorCode( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        long result = 0;
                        auto hr = pInterface->get_errorCode(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    XmlString Url( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_url(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    XmlString Reason( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_reason(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    XmlString SrcText( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_srcText(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    long Line( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        long result = 0;
                        auto hr = pInterface->get_line(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    long LinePos( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        long result = 0;
                        auto hr = pInterface->get_linepos(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    long FilePos()
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        long result = 0;
                        auto hr = pInterface->get_filepos(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                };


                class SchemaCollection : public Dispatch
                {
                public:
                    typedef Dispatch Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(SchemaCollection, Dispatch,IXMLDOMSchemaCollection,IDispatch)

                    SchemaCollection& Add( BSTR namespaceURI, const VARIANT& var)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->add(namespaceURI, var);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    Node SchemaNodeForNamespace( BSTR namespaceURI )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode* result = 0;
                        auto hr = pInterface->get(namespaceURI,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    SchemaCollection& Remove( BSTR namespaceURI)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->remove(namespaceURI);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    long Length( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        long result = 0;
                        auto hr = pInterface->get_length(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }

                    XmlString At( long index )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_namespaceURI(index,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    XmlString NamespaceURI( long index )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = 0;
                        auto hr = pInterface->get_namespaceURI(index,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    SchemaCollection& AddCollection( IXMLDOMSchemaCollection *otherCollection)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->addCollection(otherCollection);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    EnumUnknown NewEnum( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IUnknown *pUnknown = nullptr;
                        auto hr = pInterface->get__newEnum(&pUnknown);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        IEnumUnknown* pEnum = nullptr;

                        hr = pUnknown->QueryInterface<IEnumUnknown>(&pEnum);
                        pUnknown->Release();
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return EnumUnknown(pEnum);
                    }
        
                };




                class Document : public Node
                {
                public:
                    typedef Node Base;
                    HARLINN_WINDOWS_COM_STANDARD_METHODS_IMPL(Document, Node,IXMLDOMDocument3,IXMLDOMNode)


                    DocumentType Doctype( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMDocumentType *result = nullptr;
                        auto hr = pInterface->get_doctype(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return DocumentType(result);
                    }
        
                    Implementation Implementation( ) const
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMImplementation *result = nullptr;
                        auto hr = pInterface->get_implementation(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::Implementation(result);
                    }
        
                    Element DocumentElement( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMElement *result = nullptr;
                        auto hr = pInterface->get_documentElement(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Element(result);
                    }
        
                    Document& SetDocumentElement( IXMLDOMElement *DOMElement )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->putref_documentElement(DOMElement);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    Element CreateElement( BSTR tagName )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMElement *result = nullptr;
                        auto hr = pInterface->createElement(tagName,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Element(result);
                    }

                    DocumentFragment CreateDocumentFragment( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMDocumentFragment *result = nullptr;
                        auto hr = pInterface->createDocumentFragment(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return DocumentFragment(result);
                    }

                    harlinn::windows::xml::dom::Text CreateTextNode( BSTR data )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMText *result = nullptr;
                        auto hr = pInterface->createTextNode(data,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::Text(result);
                    }
        
                    Comment CreateComment( BSTR data )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMComment *result = nullptr;
                        auto hr = pInterface->createComment(data,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Comment(result);
                    }
        
                    CDATASection CreateCDATASection( BSTR data )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMCDATASection *result = nullptr;
                        auto hr = pInterface->createCDATASection(data,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return CDATASection(result);
                    }

                    ProcessingInstruction CreateProcessingInstruction( BSTR target,BSTR data )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMProcessingInstruction *result = nullptr;
                        auto hr = pInterface->createProcessingInstruction(target,data,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return ProcessingInstruction(result);
                    }

                    Attribute CreateAttribute( BSTR name)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMAttribute *result = nullptr;
                        auto hr = pInterface->createAttribute(name,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Attribute(result);
                    }
        
                    EntityReference CreateEntityReference( BSTR name )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMEntityReference *result = nullptr;
                        auto hr = pInterface->createEntityReference(name,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return EntityReference(result);
                    }
        
                    NodeList ElementsByTagName( BSTR tagName )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNodeList *result = nullptr;
                        auto hr = pInterface->getElementsByTagName(tagName,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return NodeList(result);
                    }

                    Node CreateNode( const VARIANT& Type,BSTR name,BSTR namespaceURI,IXMLDOMNode **node)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->createNode(Type,name,namespaceURI,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }

                    Node NodeFromID( BSTR idString )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode *result = nullptr;
                        auto hr = pInterface->nodeFromID(idString,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }
        
                    bool Load(const VARIANT& xmlSource)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->load(xmlSource,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }
        
                    long ReadyState( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        long result = VARIANT_FALSE;
                        auto hr = pInterface->get_readyState(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
        
                    ParseError ParseError( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMParseError* result = nullptr;
                        auto hr = pInterface->get_parseError(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::ParseError(result);
                    }

                    XmlString Url( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        BSTR result = nullptr;
                        auto hr = pInterface->get_url(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return XmlString(result,true);
                    }
        
                    bool Async( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->get_async(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }

                    Document& SetAsync( bool isAsync = true)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_async(isAsync?VARIANT_TRUE:VARIANT_FALSE);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    Document& Abort( void)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->abort( );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    bool LoadXML( BSTR bstrXML )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->loadXML(bstrXML,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }

                    Document& Save( const VARIANT& destination )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->save( destination );
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }

                    Document& Save( const String& destination )
                    {
                        HWIN_TRACE();
                        Variant arg( destination );
                        Save(arg);
                        return *this;
                    }

                    Document& Save( IStream* destination )
                    {
                        HWIN_TRACE();
                        Variant arg( destination ); 
                        Save(arg);
                        return *this;
                    }


        
                    bool ValidateOnParse( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->get_validateOnParse(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }
        
                    Document& SetValidateOnParse( bool isValidating = true)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_validateOnParse(isValidating?VARIANT_TRUE:VARIANT_FALSE);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }

                    bool ResolveExternals( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->get_resolveExternals(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }

                    Document& SetResolveExternals( bool isResolving = true)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_resolveExternals(isResolving?VARIANT_TRUE:VARIANT_FALSE);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    bool PreserveWhiteSpace( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        VARIANT_BOOL result = VARIANT_FALSE;
                        auto hr = pInterface->get_preserveWhiteSpace(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result != VARIANT_FALSE;
                    }
        

                    Document& SetPreserveWhiteSpace( bool isPreserving = true)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->put_preserveWhiteSpace(isPreserving?VARIANT_TRUE:VARIANT_FALSE);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        
                        return *this;
                    }
        
                    /*
                    HRESULT STDMETHODCALLTYPE put_onreadystatechange( VARIANT readystatechangeSink);
        
                    HRESULT STDMETHODCALLTYPE put_ondataavailable( VARIANT ondataavailableSink);
        
                    HRESULT STDMETHODCALLTYPE put_ontransformnode( VARIANT ontransformnodeSink);
                    */

                    SchemaCollection Namespaces( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMSchemaCollection *result = nullptr;
                        auto hr = pInterface->get_namespaces(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return SchemaCollection(result);
                    }
        
                    /*
                    HRESULT STDMETHODCALLTYPE get_schemas(VARIANT *otherCollection);
        
                    HRESULT STDMETHODCALLTYPE putref_schemas( VARIANT otherCollection);
                    */

                    harlinn::windows::xml::dom::ParseError Validate( )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMParseError* result = nullptr;
                        auto hr = pInterface->validate(&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::ParseError(result);
                    }
        
                    Document& SetProperty( BSTR name, const VARIANT& value)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        auto hr = pInterface->setProperty(name,value);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return *this;
                    }
        
                    Variant GetProperty( BSTR name)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        Variant result;
                        auto hr = pInterface->getProperty(name,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return result;
                    }
                        
                    harlinn::windows::xml::dom::ParseError validateNode( IXMLDOMNode *node )
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMParseError* result = nullptr;
                        auto hr = pInterface->validateNode(node,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return harlinn::windows::xml::dom::ParseError(result);
                    }
        
                    Node ImportNode( IXMLDOMNode *node,bool deep = true)
                    {
                        HWIN_TRACE();
                        auto pInterface = GetInterface();
                        IXMLDOMNode* result;
                        auto hr = pInterface->importNode(node,deep?VARIANT_TRUE:VARIANT_FALSE,&result);
                        if(FAILED(hr))
                        {
                            CheckHRESULT(hr);
                        }
                        return Node(result);
                    }

                };



                inline Document Node::OwnerDocument( ) const
                {
                    HWIN_TRACE();
                    auto pInterface = GetInterface();
                    IXMLDOMDocument *pDocument = nullptr;
                    auto hr = pInterface->get_ownerDocument(&pDocument);
                    if(FAILED(hr))
                    {
                        CheckHRESULT(hr);
                    }
                    IXMLDOMDocument3* pDocument3 = nullptr;

                    hr = pDocument->QueryInterface<IXMLDOMDocument3>(&pDocument3);
                    pDocument->Release();
                    if(FAILED(hr))
                    {
                        CheckHRESULT(hr);
                    }

                    return Document(pDocument3);
                }





            }

            namespace sax
            {
            }
        };
    };
};

#endif //__HWINXML_H__

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Sea Surveillance AS
Norway Norway
Chief Architect - Sea Surveillance AS.

Specializing in integrated operations and high performance computing solutions.

I’ve been fooling around with computers since the early eighties, I’ve even done work on CP/M and MP/M.

Wrote my first “real” program on a BBC micro model B based on a series in a magazine at that time. It was fun and I got hooked on this thing called programming ...

A few Highlights:

  • High performance application server development
  • Model Driven Architecture and Code generators
  • Real-Time Distributed Solutions
  • C, C++, C#, Java, TSQL, PL/SQL, Delphi, ActionScript, Perl, Rexx
  • Microsoft SQL Server, Oracle RDBMS, IBM DB2, PostGreSQL
  • AMQP, Apache qpid, RabbitMQ, Microsoft Message Queuing, IBM WebSphereMQ, Oracle TuxidoMQ
  • Oracle WebLogic, IBM WebSphere
  • Corba, COM, DCE, WCF
  • AspenTech InfoPlus.21(IP21), OsiSoft PI


More information about what I do for a living can be found at: harlinn.com or LinkedIn

You can contact me at espen@harlinn.no

Comments and Discussions