diff -r 000000000000 -r b16258d2340f applayerprotocols/wappushsupport/XmlElement/XMLELEMT.CPP --- /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 +#include + +#include + +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(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::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__ +