diff -r 000000000000 -r e35f40988205 xml/xmlfw/test/rtest/tsrc/contenthandlers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/xmlfw/test/rtest/tsrc/contenthandlers.cpp Thu Dec 17 09:29:21 2009 +0200 @@ -0,0 +1,489 @@ +// Copyright (c) 2003-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: +// + +#include +#include +#include + +#include +#include +#include + +#include "contenthandlers.h" + +using namespace Xml; + +GLREF_D RTest test; + + +// +// TRebuildingContentHandler +// +TRebuildingContentHandler::TRebuildingContentHandler(RFile& aOut) + : iError(KErrNone), iOutFile(aOut) + { + } + +void TRebuildingContentHandler::OnStartDocumentL(const RDocumentParameters& aDocParam, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + + iOutFile.Write(_L8("\n")); + } + +void TRebuildingContentHandler::OnEndDocumentL(TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +void TRebuildingContentHandler::OnStartElementL(const RTagInfo& aElement, const RAttributeArray& aAttributes, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + + const TDesC8& localPart8 = aElement.LocalName().DesC(); + const TDesC8& prefix8 = aElement.Prefix().DesC(); + + if(prefix8.Length()) + { + iOutFile.Write(_L8("<")); + iOutFile.Write(prefix8); + iOutFile.Write(_L8(":")); + iOutFile.Write(localPart8); + } + else + { + iOutFile.Write(_L8("<")); + iOutFile.Write(localPart8); + } + + TInt nAttributes = aAttributes.Count(); + for(TInt i=0; i")); + } + +void TRebuildingContentHandler::OnEndElementL(const RTagInfo& aElement, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + + const TDesC8& localPart8 = aElement.LocalName().DesC(); + const TDesC8& prefix8 = aElement.Prefix().DesC(); + + iOutFile.Write(_L8("")); + } + +void TRebuildingContentHandler::OnContentL(const TDesC8& aData8, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + + _LIT8(K_gt8, ">"); + _LIT8(K_lt8, "<"); + _LIT8(K_amp8, "&"); + _LIT8(K_apos8, "'"); + _LIT8(K_quot8, """); + + TInt newLength = 0; + TInt length = aData8.Length(); + + TInt i; + for(i=0; i': + newLength += K_gt8().Length(); + break; + case '<': + newLength += K_lt8().Length(); + break; + case '&': + newLength += K_amp8().Length(); + break; + case '\"': + newLength += K_quot8().Length(); + break; + case '\'': + newLength += K_apos8().Length(); + break; + default: + newLength++; + } + + TPtr8 out = HBufC8::NewLC(newLength)->Des(); + + TChar c; + for(i=0; i': + out.Append(K_gt8); + break; + case '<': + out.Append(K_lt8); + break; + case '&': + out.Append(K_amp8); + break; + case '\"': + out.Append(K_quot8); + break; + case '\'': + out.Append(K_apos8); + break; + default: + out.Append(c); + } + + iOutFile.Write(out); + + CleanupStack::PopAndDestroy(); // out + } + +void TRebuildingContentHandler::OnStartPrefixMappingL(const RString& /*aPrefix*/, const RString& /*aUri*/, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +void TRebuildingContentHandler::OnEndPrefixMappingL(const RString& /*aPrefix*/, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +void TRebuildingContentHandler::OnIgnorableWhiteSpaceL(const TDesC8& /*aBytes*/, TInt /*aErrorCode*/) + { + } + +void TRebuildingContentHandler::OnSkippedEntityL(const RString& /*aName*/, TInt /*aErrorCode*/) + { + } + +void TRebuildingContentHandler::OnProcessingInstructionL(const TDesC8& aTarget8, const TDesC8& aData8, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + + iOutFile.Write(_L8("\n")); + } + +void TRebuildingContentHandler::OnExtensionL(const RString& /*aData*/, TInt /*aToken*/, TInt /*aErrorCode*/) + { + // Meaningless in XML + _LIT(KUnsupportedFeature,"Illegal call to TRebuildingContentHandler::OnExtensionL - aborting\n"); + test.Panic(KErrNotSupported, KUnsupportedFeature); + } + +void TRebuildingContentHandler::OnError(TInt aError) + { + iError = aError; + test.Printf(_L("TRebuildingContentHandler::OnError - ERROR: code=%d - Aborting parsing process\n"), aError); + } + +TAny* TRebuildingContentHandler::GetExtendedInterface(const TInt32) + { + // do nothing. + return NULL; + } + +// +// TSimpleContentHandler +// +const TInt TSimpleContentHandler::KExpectedLeaveCode = 1234; + +TSimpleContentHandler::TSimpleContentHandler() + : iLeaveOnStartElement(EFalse), iNumElements(0), iNumSkippedEntities(0), iNumPrefixMappings(0), iNumPrefixUnmappings(0), + iError(KErrNone) + { + } + +void TSimpleContentHandler::OnStartDocumentL(const RDocumentParameters&, TInt) + { + //test.Printf(_L("\n")); + + iNumElements = 0; + iNumSkippedEntities = 0; + iNumPrefixMappings = 0; + iNumPrefixUnmappings = 0; + } + +void TSimpleContentHandler::OnEndDocumentL(TInt) + { + //test.Printf(_L("\n\n")); + + test(!iLeaveOnStartElement); + } + +void TSimpleContentHandler::OnStartElementL(const RTagInfo&, const RAttributeArray&, TInt) + { + // test.Printf(_L("\n")); + + if(iLeaveOnStartElement) + if(iNumElements++ == 0) + { + //test.Printf(_L("TSimpleContentHandler::OnStartElementL: Simulating Leave with code %d\n"), KExpectedLeaveCode); + User::Leave(KExpectedLeaveCode); + } + else + test(0); + + iNumElements++; + } + +void TSimpleContentHandler::OnEndElementL(const RTagInfo&, TInt) + { + // test.Printf(_L("\n")); + + test(!iLeaveOnStartElement); + } + +void TSimpleContentHandler::OnContentL(const TDesC8&, TInt) + { + // test.Printf(_L("\n")); + + test(!iLeaveOnStartElement); + } + +void TSimpleContentHandler::OnProcessingInstructionL(const TDesC8&, const TDesC8&, TInt) + { + // test.Printf(_L("\n")); + + test(!iLeaveOnStartElement || iNumElements==0); + } + +void TSimpleContentHandler::OnOutOfData() + { + _LIT(KUnexpectedOutOfData,"Unexpected call to TSimpleContentHandler::OnOutOfData - aborting\n"); + test.Panic(KErrAbort, KUnexpectedOutOfData); + } + +void TSimpleContentHandler::OnError(TInt aError) + { + iError = aError; + //test.Printf(_L("TSimpleContentHandler::OnError - ERROR: code=%d\n"), aError); + } + +TAny* TSimpleContentHandler::GetExtendedInterface(const TInt32) + { + // do nothing. + return NULL; + } + +void TSimpleContentHandler::OnStartPrefixMappingL(const RString&, const RString&, TInt) + { + iNumPrefixMappings++; + } + +void TSimpleContentHandler::OnEndPrefixMappingL(const RString&, TInt) + { + test(!iLeaveOnStartElement); + iNumPrefixUnmappings++; + } + +void TSimpleContentHandler::OnIgnorableWhiteSpaceL(const TDesC8&, TInt) + { + } + +void TSimpleContentHandler::OnSkippedEntityL(const RString&, TInt) + { + iNumSkippedEntities++; + } + +void TSimpleContentHandler::OnExtensionL(const RString&, TInt, TInt) + { + // Meaningless in XML + _LIT(KUnsupportedFeature,"Illegal call to TSimpleContentHandler::OnExtensionL - aborting\n"); + test.Panic(KErrNotSupported, KUnsupportedFeature); + } + + +// +// TNamespaceContentHandler +// +TNamespaceContentHandler::TNamespaceContentHandler(const TDesC8& aDefaultUri, const TDesC8& aElementPrefix, + const TDesC8& aElementUri, const TDesC8& aAttributePrefix, const TDesC8& aAttributeUri) + : TSimpleContentHandler(), iDefaultUri(aDefaultUri), iElementPrefix(aElementPrefix), iElementUri(aElementUri), + iAttributePrefix(aAttributePrefix), iAttributeUri(aAttributeUri), iState(KNothingMapped) + { + } + +void TNamespaceContentHandler::OnStartElementL(const RTagInfo& aElement, const RAttributeArray& aAttributes, TInt aError) + { + TSimpleContentHandler::OnStartElementL(aElement, aAttributes, aError); + + if(iState==KNothingMapped) + test(aElement.Prefix().DesC().Length()==0 && aElement.Uri().DesC().Length()==0); + else + if(aElement.Prefix().DesC().Length()==0) + test(aElement.Uri().DesC()==iDefaultUri); + else + test(aElement.Prefix().DesC()==iElementPrefix && aElement.Uri().DesC()==iElementUri); + + if(aAttributes.Count()) + { + const RTagInfo& attribute = aAttributes[0].Attribute(); + + if(attribute.Prefix().DesC().Length()==0) + test(attribute.Uri().DesC().Length()==0); + else + { + test(iState!=KNothingMapped); + test(attribute.Prefix().DesC()==iAttributePrefix && attribute.Uri().DesC()==iAttributeUri); + } + } + } + +void TNamespaceContentHandler::OnEndElementL(const RTagInfo& aElement, TInt aError) + { + TSimpleContentHandler::OnEndElementL(aElement, aError); + + if(iState==KNothingMapped) + test(aElement.Prefix().DesC().Length()==0 && aElement.Uri().DesC().Length()==0); + else + if(aElement.Prefix().DesC().Length()==0) + test(aElement.Uri().DesC()==iDefaultUri); + else + test(aElement.Prefix().DesC()==iElementPrefix && aElement.Uri().DesC()==iElementUri); + } + +void TNamespaceContentHandler::OnStartPrefixMappingL(const RString& aPrefix, const RString& aUri, TInt aError) + { + TSimpleContentHandler::OnStartPrefixMappingL(aPrefix, aUri, aError); + + TPtrC8 prefix = aPrefix.DesC(); + TPtrC8 uri = aUri.DesC(); + + switch(iState) + { + case KNothingMapped: + test(prefix.Length()==0 && uri==iDefaultUri); + iState = KDefaultNsMapped; + break; + + case KDefaultNsMapped: + test(prefix==iElementPrefix && uri==iElementUri); + iState = KElementNsMapped; + break; + + case KElementNsMapped: + test(prefix==iAttributePrefix && uri==iAttributeUri); + iState = KAttributeNsMapped; + break; + + case KAttributeNsMapped: + test(0); + } + } + +void TNamespaceContentHandler::OnEndPrefixMappingL(const RString& aPrefix, TInt aError) + { + TSimpleContentHandler::OnEndPrefixMappingL(aPrefix, aError); + + TPtrC8 prefix = aPrefix.DesC(); + + switch(iState) + { + case KAttributeNsMapped: + test(prefix==iAttributePrefix); + iState = KElementNsMapped; + break; + + case KElementNsMapped: + test(prefix==iElementPrefix); + iState = KDefaultNsMapped; + break; + + case KDefaultNsMapped: + test(prefix.Length()==0); + iState = KNothingMapped; + break; + + case KNothingMapped: + test(0); + } + } + + + +void TCapsContentHandler::OnStartElementL(const RTagInfo& aElement, const RAttributeArray& aAttributes, TInt aError) + { + TSimpleContentHandler::OnStartElementL(aElement, aAttributes, aError); + + // Test file should contain the following: + // + + // Expat should deliver it to us as: + // prefix, name, "HTTP://UPPERCASE.COM" + // attprefix, attname, "HTTP://STILLUPPERCASE.COM", "VALUE" + + _LIT8(KPrefix, "prefix"); + _LIT8(KName, "name"); + _LIT8(KUri, "HTTP://UPPERCASE.COM"); + _LIT8(KAttprefix, "attprefix"); + _LIT8(KAttname, "attname"); + _LIT8(KAtturi, "HTTP://STILLUPPERCASE.COM"); + _LIT8(KValue, "VALUE"); + + test(aElement.Prefix().DesC() == KPrefix); + test(aElement.LocalName().DesC() == KName); + test(aElement.Uri().DesC() == KUri); + + test(aAttributes.Count() == 1); + const RAttribute& attribute = aAttributes[0]; + const RTagInfo& nameInfo = attribute.Attribute(); + + test(nameInfo.Prefix().DesC() == KAttprefix); + test(nameInfo.LocalName().DesC() == KAttname); + test(nameInfo.Uri().DesC() == KAtturi); + test(attribute.Value().DesC() == KValue); + } +