diff -r 000000000000 -r e35f40988205 xml/xmldomandxpath/src/xmlenginedom/xmlengbinarycontainer.cpp --- /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 +#include +#include "xmlengdomdefs.h" +#include + +// ------------------------------------------------------------------------------- +// @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; + }