diff -r 000000000000 -r 0049171ecffb src/NPRStoryXmlParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/NPRStoryXmlParser.cpp Fri Jul 24 08:46:02 2009 +0100 @@ -0,0 +1,269 @@ +/* + ============================================================================ + Name : NPRStoryXmlParser.cpp + Author : John Kern + + Copyright (c) 2009 Symbian Foundation Ltd + This component and the accompanying materials are made available + under the terms of the License "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: + - Symbian Foundation Ltd - initial contribution + - Symsource + + Contributors: + - John Kern + - Symsource + + Description : Story xml parser + ============================================================================ + */ + +#include "NPRDocument.h" +#include "NPRStoryXmlParser.h" +#include "NPRStory.h" + +CNPRStoryXmlParser* CNPRStoryXmlParser::NewLC(RPointerArray* aStoryArray) + { + CNPRStoryXmlParser* self = new (ELeave) CNPRStoryXmlParser(aStoryArray); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CNPRStoryXmlParser* CNPRStoryXmlParser::NewL(RPointerArray* aStoryArray) + { + CNPRStoryXmlParser* self = CNPRStoryXmlParser::NewLC(aStoryArray); + CleanupStack::Pop(); // self; + return self; + } + +CNPRStoryXmlParser::CNPRStoryXmlParser(RPointerArray* aStoryArray) +:iStoryArray(aStoryArray) + { + // No implementation required + } + +CNPRStoryXmlParser::~CNPRStoryXmlParser() + { + delete iTagName; + } + + +void CNPRStoryXmlParser::ConstructL() + { + iState = ENPRNewsStateIdle; + } + +void CNPRStoryXmlParser::OnStartDocumentL( + const RDocumentParameters& /* aDocParam */, + TInt aErrorCode ) + { + User::LeaveIfError(aErrorCode); + } + +void CNPRStoryXmlParser::OnEndDocumentL(TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +HBufC* CNPRStoryXmlParser::Copy8To16LC(const TDesC8& aDes) + { + HBufC* buf16 = HBufC::NewLC(aDes.Length()); + buf16->Des().Copy(aDes); + return buf16; + } + +void CNPRStoryXmlParser::OnStartElementL( + const RTagInfo& aElement, + const RAttributeArray& aAttributes, + TInt aErrorCode ) + { + User::LeaveIfError(aErrorCode); + const TDesC8& tagName = aElement.LocalName().DesC(); + if (tagName.CompareF(_L8("story"))==0) + { + iStory = ETrue; + if(iTagName) + { + delete iTagName; + } + iState = ENPRNewsStateStory; + iCurrentStory = CNPRStory::NewL(); + // find the story Id attribute + TInt count = aAttributes.Count(); + for (TInt i = 0 ; i < count ; i++) + { + const RAttribute& attribute = aAttributes[i]; + const RTagInfo& nameInfo = attribute.Attribute(); + + const TDesC8& localName8 = nameInfo.LocalName().DesC(); + const TDesC8& value8 = attribute.Value().DesC(); + + HBufC* localName16 = Copy8To16LC(localName8); + HBufC* value16 = Copy8To16LC(value8); + if (localName16->CompareF(_L("id")) == 0 ) + { + TLex lex(value16->Des()); + TInt v = 0; + lex.Val(v); + iCurrentStory->SetStoryId( v ); + } + CleanupStack::PopAndDestroy(2); // value16 and localName16 + } + } + else if(iStory) + { + if(!iTagName && ((iState != ENPRNewsStateText) || (iState != ENPRNewsStateParagraph))) + { + iTagName = tagName.AllocL(); + } + + if (iTagName->CompareF(_L8("title"))==0 && iState == ENPRNewsStateStory) + { + iState = ENPRNewsStateTitle; + } + else if (iTagName->CompareF(_L8("teaser"))==0 && iState == ENPRNewsStateStory) + { + iState = ENPRNewsStateTeaser; + } + else if (iTagName->CompareF(_L8("thumbnail"))==0 && iState == ENPRNewsStateStory) + { + iState = ENPRNewsStateThumbnail; + } + else if (iTagName->CompareF(_L8("text"))== 0 && iState == ENPRNewsStateStory) + { + iState = ENPRNewsStateText; + } + else if (tagName.CompareF(_L8("paragraph"))== 0 && iTagName->CompareF(_L8("text"))==0) + { + iState = ENPRNewsStateParagraph; + } + else + { + iState = ENPRNewsStateIdle; + } + } + } + +void CNPRStoryXmlParser::OnEndElementL(const RTagInfo& aElement, TInt aErrorCode ) + { + User::LeaveIfError(aErrorCode); + const TDesC8& tagName = aElement.LocalName().DesC(); + + TBool result = EFalse; + + if (tagName.CompareF(_L8("story"))== 0 && iState == ENPRNewsStateStory) + { + iStory = EFalse; + iState = ENPRNewsStateIdle; + iStoryArray->AppendL(iCurrentStory); + iCurrentStory = NULL; + } + else if(iTagName) + {//TO DO we can have a switch here + if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateTitle) + { + result = ETrue; + } + else if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateTeaser) + { + result = ETrue; + } + else if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateThumbnail) + { + result = ETrue; + } + else if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateText) + { + result = ETrue; + } + else if (tagName.CompareF(_L8("paragraph"))== 0 && iTagName->CompareF(_L8("text"))==0) + { + iState = ENPRNewsStateText; + } + else if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateIdle) + { + result = ETrue; + } + } + + if(result) + { + if(iTagName) + { + delete iTagName; + iTagName = NULL; + } + iState = ENPRNewsStateStory; + } + } + +void CNPRStoryXmlParser::OnContentL(const TDesC8& aBytes, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + + switch(iState) + { + case ENPRNewsStateTitle: + { + iCurrentStory->SetTitleL(aBytes); + break; + } + case ENPRNewsStateTeaser: + { + iCurrentStory->SetTeaserL(aBytes); + break; + } + case ENPRNewsStateParagraph: + { + iCurrentStory->SetTextL(aBytes); + break; + } + default: + iState = iState; // for debugging. + break; + } + } + +void CNPRStoryXmlParser::OnStartPrefixMappingL( + const RString& /* aPrefix */, + const RString& /* aUri */, + TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +void CNPRStoryXmlParser::OnEndPrefixMappingL(const RString& /* aPrefix */, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +void CNPRStoryXmlParser::OnIgnorableWhiteSpaceL(const TDesC8& /* aBytes */, TInt /* aErrorCode*/) + { + } + +void CNPRStoryXmlParser::OnSkippedEntityL(const RString& /* aName */, TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +void CNPRStoryXmlParser::OnProcessingInstructionL( + const TDesC8& /* aTarget */ , + const TDesC8& /* aData */ , + TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +void CNPRStoryXmlParser::OnError(TInt aErrorCode) + { + User::LeaveIfError(aErrorCode); + } + +TAny* CNPRStoryXmlParser::GetExtendedInterface(const TInt32 /* aUid */) + { + return NULL; + }