applayerprotocols/wappushsupport/XmlElement/XMLELEMT.CPP
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/wappushsupport/XmlElement/XMLELEMT.CPP	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,302 @@
+// Copyright (c) 1999-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:
+// XmlElement.cpp
+// XML Element class
+// Derived from CTypedNode. Adds functionality
+// to make the use of the node simpler
+// 
+//
+
+#include <f32file.h>
+#include <attrlut.h> 
+
+#include <xmlelemt.h>
+
+LOCAL_C TBool Compare(TInt aLength,const TText* aStringA,const TDesC& aStringB)
+	{
+	if(aLength==aStringB.Length())
+		{
+		const TText* stringB=aStringB.Ptr();
+		while( STATIC_CAST(TUint, aLength) >= (sizeof(TInt32) / sizeof(TText)) )
+			{
+			if(*(TInt32*)stringB!=*(TInt32*)aStringA)
+				return EFalse;
+			stringB+=(sizeof(TInt32)/sizeof(TText));
+			aStringA+=(sizeof(TInt32)/sizeof(TText));
+			aLength-=(sizeof(TInt32)/sizeof(TText));
+			}
+		while(aLength>0)
+			{
+			if(*stringB++!=*aStringA++)
+				return EFalse;
+			aLength--;
+			}
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+
+//-------------------------------------------------------------------------
+
+EXPORT_C void CXmlElement::InsertChildL(TInt aIndexToInsertBefore, CXmlElement* aElement)
+{
+	if(!iChildList)
+	{
+		iChildList = new (ELeave) CArrayPtrFlat<CNode>(KGranularity);
+	}
+	iChildList->InsertL(aIndexToInsertBefore, aElement);
+}
+
+//-------------------------------------------------------------------------
+
+EXPORT_C const TDesC* CXmlElement::Attribute(const TDesC& aAttributeName) const
+{
+	const TInt count = AttributeCount();
+	TInt length=aAttributeName.Length();
+	const TText* stringPtr=aAttributeName.Ptr();
+	for (TInt i = 0; i < count; i++)
+	{ 
+		TXmlAttributeType name;
+		CBase* att=AttributeByIndex(i,name);
+		if (Compare(length,stringPtr,*name))
+			return (TDesC*)((CDataDelete*)att)->Data();
+	}  
+ 
+	return NULL;
+}
+
+//-------------------------------------------------------------------------
+
+EXPORT_C void CXmlElement::SetAttributeL(const TDesC& aAttributeName, 
+										 const TDesC& aAttributeValue, 
+										 CAttributeLookupTable& aAttributeLUT)
+{
+	TXmlAttributeType type = aAttributeLUT.Des2IDL(aAttributeName);
+
+	HBufC* attrValue = aAttributeValue.AllocLC();
+	CDataDelete* attrib = new (ELeave) CDataDelete((HBufC16*)attrValue);
+	CleanupStack::Pop(); // attrValue
+	CleanupStack::PushL(attrib);
+	AddAttributeL(type, attrib);
+	CleanupStack::Pop(); // attrib
+}
+
+//-------------------------------------------------------------------------
+
+EXPORT_C void CXmlElement::SetTextL(const TDesC16& aData)
+	{
+	HBufC* data = aData.AllocLC();
+	CTypedNode<TXmlElementType, TXmlAttributeType>::SetDataL(data);
+	CleanupStack::Pop(data);
+	}
+
+//-------------------------------------------------------------------------
+
+EXPORT_C void CXmlElement::SetDataItemL(CBase* aDataItem, CAttributeLookupTable& aAttributeLUT)
+{
+	__ASSERT_DEBUG(aDataItem, Panic(EXmlElPanicInvalidDataItem));
+
+	TXmlAttributeType type = aAttributeLUT.Des2IDL(KXmlElementDataItemAttributeName);
+	CDataItemAttribute* attrib = new (ELeave) CDataItemAttribute;
+
+	CleanupStack::PushL(attrib);
+	AddAttributeL(type, attrib);
+	CleanupStack::Pop(); // attrib
+
+	// Take ownership last
+	attrib->iDataItem = aDataItem;
+}
+
+//-------------------------------------------------------------------------
+
+EXPORT_C void CXmlElement::DeleteDataItem(CAttributeLookupTable& aAttributeLUT)
+{
+	TXmlAttributeType type = NULL;
+	TRAPD(err, type = aAttributeLUT.Des2IDL(KXmlElementDataItemAttributeName));
+	__ASSERT_DEBUG(err==KErrNone, Panic(EXmlElPanicInvalidDataItem));
+	if(err==KErrNone)
+		{
+		// Delete data item
+		DeleteAttribute(type);
+		}
+}
+
+//-------------------------------------------------------------------------
+
+EXPORT_C CBase* CXmlElement::DataItem() const
+{
+	const TInt count = AttributeCount();
+	TPtrC attName(KXmlElementDataItemAttributeName);
+	TInt length=attName.Length();
+	const TText* stringPtr=attName.Ptr();
+	for (TInt i = 0; i < count; i++)
+	{
+		TXmlAttributeType name;
+		CBase* att=AttributeByIndex(i,name);
+		if (Compare(length,stringPtr,*name))
+			return ((CDataItemAttribute*)att)->iDataItem;
+	}
+	return NULL;
+}
+
+//-------------------------------------------------------------------------
+
+EXPORT_C TInt CXmlElement::ChildIndex(CXmlElement* aChild) const
+{
+	TInt i;
+	for( i=0; i < Count(); i++)
+	{
+		if( Child(i) == aChild )
+			return(i);
+	}
+	return( -1 );
+}
+
+//#ifdef _DEBUG
+// Write the name of the class into a debug file
+void CXmlElement::WriteNameL(RFile& aFile, TInt aIndentation)
+{
+	// Write line feed
+	aFile.Write(_L8("\r\n"));
+
+	// Write as many tabs as the current indentation level
+	for (TInt i = 0; i < aIndentation; i++)
+	{
+		aFile.Write(_L8("\t"));
+	}
+ 
+	// Write the name of element
+	TXmlElementType type = Type();
+
+	if (type)
+	{
+		// Convert to 8 bit
+		HBufC8* type8 = HBufC8::NewL(type->Length());
+		type8->Des().Copy(*type);
+		aFile.Write(*type8);
+		delete type8;
+	}
+	else
+		aFile.Write(_L8("Error: Type = NULL"));
+
+
+	// Write attributes
+	const TInt count = AttributeCount();
+	if(count > 0 || Data())
+	{
+		aFile.Write(_L8(" ("));
+	}
+
+	for (TInt a = 0; a < count; a++)
+	{
+		if(a>0 && count>1)
+		{
+			aFile.Write(_L8("\", "));
+		}
+		TXmlAttributeType type = AttributeTypeByIndex(a);
+		// Convert to 8 bit
+		HBufC8* type8 = HBufC8::NewL(type->Length());
+		type8->Des().Copy(*type);
+		aFile.Write(*type8);
+		delete type8;
+
+		aFile.Write(_L8(" = \""));
+
+		const TDesC* attrib = Attribute(a);
+		HBufC8* attrib8 = HBufC8::NewL(attrib->Length());
+		attrib8->Des().Copy(*attrib);
+		aFile.Write(*attrib8);
+		delete attrib8;
+	}
+ 
+	// Write data
+	if (Data())
+	{
+		// Data is expected to be a text (for now)
+		aFile.Write(_L8("\""));
+		const TDesC* data = (TDesC*)Data();
+		HBufC8* data8 = HBufC8::NewL(data->Length());
+		data8->Des().Copy(*data);
+		aFile.Write(*data8);
+		delete data8;
+		aFile.Write(_L8("\""));
+	}
+
+	if(count>0)
+	{
+		// Write ")
+		aFile.Write(_L8("\")"));
+	}
+	else if(Data())
+	{
+		// Write )
+		aFile.Write(_L8(")"));
+	}
+}
+
+//-------------------------------------------------------------------------
+// Write name of class in debug file
+void CXmlElement::StartWriteL(RFile& aFile, TInt aIndentation)
+{
+	// Write itself
+	WriteNameL(aFile, aIndentation);
+
+	// Write children with one tab stop more
+	aIndentation++;
+	const TInt count = Count();
+	for (TInt i = 0; i < count; i++)
+	{
+		Child(i)->StartWriteL(aFile, aIndentation);
+	}
+}
+
+EXPORT_C void CXmlElement::WriteIntoFileL() 
+{ 
+	RFs fileSession;
+	User::LeaveIfError(fileSession.Connect());
+	CleanupClosePushL(fileSession);
+	RFile file2;
+	TPtrC filePath;
+	filePath.Set( _L("c:\\tree.txt"));
+	User::LeaveIfError(file2.Replace( fileSession, filePath , EFileWrite ));
+	CleanupClosePushL(file2);
+
+	// Write contents
+	StartWriteL(file2, 0);
+	CleanupStack::PopAndDestroy(2);	// fileSession, file2
+}
+
+//#endif
+#ifndef __WAP_MONOLITHIC__
+// Its a standalone DLL
+//-------------------------------------------------------------------------
+
+GLDEF_C void Panic(TXmlElementPanic aPanic)
+{
+	User::Panic(_L("XML-ELM"),aPanic);	
+}
+
+//-----------------------------------------------------------------------------
+//    	Dlls entry point
+//-----------------------------------------------------------------------------
+
+#ifndef EKA2
+GLDEF_C TInt E32Dll (TDllReason)
+{
+	return KErrNone;
+}
+#endif // EKA2
+#endif // __WAP_MONOLITHIC__
+