xml/xmldomandxpath/src/xmlenginedom/xmlengownednodescontainer.cpp
changeset 0 e35f40988205
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmldomandxpath/src/xmlenginedom/xmlengownednodescontainer.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,141 @@
+// 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:
+// Node container implementation
+//
+
+#include <xml/utils/xmlengmem.h>
+#include "xmlengownednodescontainer.h"
+#include "xmlengdomdefs.h"
+#include <stdapis/libxml2/libxml2_tree.h>
+#include <stdapis/libxml2/libxml2_globals.h>
+
+// --------------------------------------------------------------------------------------
+// Creates an instance of CXmlEngOwnedNodesContainer
+// --------------------------------------------------------------------------------------
+//
+CXmlEngOwnedNodesContainer* CXmlEngOwnedNodesContainer::NewL()
+    {
+    CXmlEngOwnedNodesContainer* obj = new (ELeave) CXmlEngOwnedNodesContainer();
+    obj->iNodes = NULL;
+    obj->iLast = NULL;
+    obj->iCount = 0;
+    return obj;
+    }
+
+CXmlEngOwnedNodesContainer::~CXmlEngOwnedNodesContainer()
+    {
+    }
+// --------------------------------------------------------------------------------------
+// Searches for a node in the list
+//
+// @param   aNode Pointer to a libxml2 node
+// @return Index in the list of nodes [0; iCount-1] or iCount if not found
+// --------------------------------------------------------------------------------------
+//
+TUint CXmlEngOwnedNodesContainer::Lookup(xmlNodePtr aNode)
+    {
+    TUint i = 0;
+    xmlNodePtr tmp = iNodes;
+    for(; tmp; tmp = tmp->next, i++)
+        if(tmp == aNode)
+            return i;
+    return iCount;
+    }
+
+// --------------------------------------------------------------------------------------
+// Performs clean up of the list
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngOwnedNodesContainer::RemoveAll()
+    {
+    iNodes = NULL;
+    iCount = 0;
+    }
+
+// --------------------------------------------------------------------------------------
+// Performs clean up of all owned nodes:
+// xmlFreeNode is called on every contained pointer
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngOwnedNodesContainer::FreeAll()
+    {
+    xmlNodePtr tmp = iNodes;
+    xmlNodePtr ptr;
+    for(;tmp;)
+        {
+        ptr = tmp;
+        tmp = tmp->next;
+        if(ptr)
+            xmlFreeNode(ptr);
+        }
+    iNodes = NULL;
+    iCount = 0;
+    }
+
+
+// --------------------------------------------------------------------------------------
+// Adds an owned node.
+//
+// @param aNode  A pointer to some node to be added into the container
+//
+// @note This method does not check whether the pointer is already in the container
+// @note In OOM situation the node is destroyed before leave occurs
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngOwnedNodesContainer::Add(
+    xmlNodePtr aNode )
+    {
+    if(iLast)
+        {
+        iLast->next = aNode;
+        aNode->prev = iLast;        
+        }
+    else
+        {
+        iNodes = iLast = aNode;
+        }
+    iLast = aNode;
+    ++iCount;
+    }
+
+// --------------------------------------------------------------------------------------
+// Excludes node pointer from the list of owned nodes.
+// 
+// does nothing if provided node pointer is not on the list.
+// --------------------------------------------------------------------------------------
+//
+void CXmlEngOwnedNodesContainer::Remove(
+    xmlNodePtr aNode )
+    {
+    if(aNode == iLast)
+        {
+        iLast = aNode->prev;
+        }
+    else
+        {
+        aNode->next->prev = aNode->prev;    
+        }
+    if(aNode == iNodes)
+        {
+        iNodes = aNode->next;
+        }
+    else
+        {
+        aNode->prev->next = aNode->next;
+        }    
+    
+    aNode->prev = NULL;
+    aNode->next = NULL;
+    --iCount;
+    }