xml/xmldomandxpath/src/xmlenginedom/xmlengbinarycontainer.cpp
changeset 0 e35f40988205
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmldomandxpath/src/xmlenginedom/xmlengbinarycontainer.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,98 @@
+// 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:
+// Methods for all kind of text nodes
+//
+
+#include <xml/dom/xmlengbinarycontainer.h>
+#include <stdapis/libxml2/libxml2_tree.h>
+#include "xmlengdomdefs.h"
+#include <stdapis/libxml2/libxml2_globals.h>
+
+// -------------------------------------------------------------------------------
+// @return Binary contents of the container
+//
+// -------------------------------------------------------------------------------
+//
+EXPORT_C TPtrC8 TXmlEngBinaryContainer::Contents() const
+    {
+    return TPtrC8((const TUint8*)LIBXML_NODE->content, (TInt)LIBXML_NODE->properties);
+    }
+
+// -------------------------------------------------------------------------------
+// Sets contents of binary container
+//
+// @param aNewContents  The actual value to store
+// -------------------------------------------------------------------------------
+//
+EXPORT_C void TXmlEngBinaryContainer::SetContentsL( const TDesC8& aNewContents )
+    {
+    if (!LIBXML_NODE) 
+    	{
+    	User::Leave(KXmlEngErrNullNode);
+    	}
+    // Note: TXmlEngBinaryContainer is treated internally by Libxml2 as text nodes.
+    // Hence, appending 0 at the end to ensure that text is not parsed beyond actual data in any case.
+    
+    TUint len = aNewContents.Size();
+    unsigned char* str = new(ELeave) unsigned char[len + 1];
+    memcpy(str, aNewContents.Ptr(), len);
+    str[len] = 0;
+               
+    if (LIBXML_NODE->content
+            &&
+         !(LIBXML_NODE->doc       &&
+           LIBXML_NODE->doc->dict &&
+           xmlDictOwns(LIBXML_NODE->doc->dict, LIBXML_NODE->content)))
+        {
+        xmlFree(LIBXML_NODE->content);
+        }       
+    LIBXML_NODE->properties = (xmlAttr*) len;
+    LIBXML_NODE->content = str;
+    }
+
+// -------------------------------------------------------------------------------
+// Extends the contents of binary container by appending aContents
+//
+// @param aContents  Content to be appended to current content
+// -------------------------------------------------------------------------------
+//
+EXPORT_C void TXmlEngBinaryContainer::AppendContentsL( const TDesC8& aData )
+    {
+        if (!LIBXML_NODE) 
+    	{
+    	User::Leave(KXmlEngErrNullNode);
+    	}
+    
+    // Note: TXmlEngBinaryContainer is treated internally by Libxml2 as text nodes.
+    // Hence, appending 0 at the end to ensure that text is not parsed beyond actual data in any case.
+    
+    TPtrC8 prevContent = Contents();
+    TInt len = prevContent.Length() + aData.Length();
+    unsigned char* newContent = new(ELeave) unsigned char[len + 1];
+    
+    TAny* last = Mem::Copy((TAny*)newContent, prevContent.Ptr(), prevContent.Length());
+    memcpy(last, aData.Ptr(), aData.Length());
+    newContent[len] = 0;
+    
+    if (LIBXML_NODE->content
+            &&
+         !(LIBXML_NODE->doc       &&
+           LIBXML_NODE->doc->dict &&
+           xmlDictOwns(LIBXML_NODE->doc->dict, LIBXML_NODE->content)))
+        {
+        xmlFree(LIBXML_NODE->content);
+        }
+    LIBXML_NODE->properties = (xmlAttr*) len;    
+    LIBXML_NODE->content = (unsigned char *)newContent;    
+    }