xml/xmldomandxpath/src/xmlenginedom/xmlengdombase.cpp
changeset 0 e35f40988205
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmldomandxpath/src/xmlenginedom/xmlengdombase.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,119 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Document & node callbacks
+//
+
+#include <stdapis/libxml2/xmlengconfig.h>
+#include <xml/utils/xmlengmem.h>
+#include <xml/dom/xmlenguserdata.h>
+#include <xml/dom/xmlengdocument.h>
+#include "xmlengdomdefs.h"
+#include "xmlengownednodescontainer.h"
+#include <xml/dom/xmlengnode.h>
+#include <xml/dom/xmlengnodefilter.h>
+#include <stdapis/libxml2/libxml2_tree.h>
+#include "libxml2_globals_private.h"
+#include <string.h>
+
+
+void NodeConstructCallback(
+    xmlNodePtr aNode)
+    {
+    // NOTE for further evaluation of component _private is not copied by libxml
+    if (aNode && aNode->_private) 
+        {
+        if (aNode->type == XML_ELEMENT_NODE || aNode->type == XML_ATTRIBUTE_NODE) 
+            {
+            MXmlEngUserData* data = static_cast<MXmlEngUserData*>(aNode->_private);
+            TInt err;
+            TRAP(err,aNode->_private = data->CloneL());
+            if(err == KErrNoMemory)
+            	xmlSetOOM();
+            }
+        }
+    }
+
+void NodeDestructCallback(
+    xmlNodePtr aNode )
+    {
+    if (aNode && aNode->_private) 
+        {
+        if (aNode->type == XML_ELEMENT_NODE || aNode->type == XML_ATTRIBUTE_NODE) 
+            {
+            MXmlEngUserData* data = static_cast<MXmlEngUserData*>(aNode->_private);
+            aNode->_private = NULL;
+            data->Destroy();
+            }
+        }
+    }
+
+int XMLCALL NodeFilterCallback(void* aFilter, xmlNodePtr aNode)
+    { 
+    MXmlEngNodeFilter* filter = reinterpret_cast<MXmlEngNodeFilter*>(aFilter);
+    return (int)filter->AcceptNode(*reinterpret_cast<TXmlEngNode*>(&aNode));
+    }
+
+void SetUserDataCallbacks()
+    {
+    xmlRegisterNodeDefault(NodeConstructCallback);
+    xmlDeregisterNodeDefault(NodeDestructCallback);
+    }
+
+xmlChar* xmlCharFromDesC8L(const TDesC8& aDesc)
+    {
+    if(!aDesc.Length())
+        {
+        return NULL;
+        }
+    xmlChar* newContent = (xmlChar*)new(ELeave) TUint8[aDesc.Length() + 1];
+    *(Mem::Copy((TAny*)newContent, aDesc.Ptr(), aDesc.Length())) = 0;
+    return newContent;
+    }
+
+void xmlCharAssignToRbuf8L(RBuf8& aOutput,xmlChar* text)
+{
+if(aOutput.Length())
+    {
+    aOutput.Close();
+    }
+if(text)
+    {
+    aOutput.Assign(text,strlen((char*)text),strlen((char*)text));
+    }
+else
+    {
+    aOutput.Assign(text,0);
+    }
+}
+//--------------------------------------------
+//using CXmlEngOwnedNodesContainer;
+
+void LibxmlDocumentCleanup(
+    TAny* aDocPtr )
+    {
+    if(((xmlDocPtr)aDocPtr)->ownedNodes)
+        {
+        CXmlEngOwnedNodesContainer* nc = (CXmlEngOwnedNodesContainer*)(((xmlDocPtr)aDocPtr)->ownedNodes);
+        nc->FreeAll();
+        xmlFree(nc->iNodes);
+        xmlFree(nc);
+        } 
+	xmlFreeDoc((xmlDocPtr)aDocPtr);
+    }
+
+void LibxmlNodeCleanup(
+    TAny* aNodePtr )
+    {
+	xmlFreeNode((xmlNodePtr)aNodePtr);
+    }