src/NPRStoryXmlParser.cpp
changeset 0 0049171ecffb
--- /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<CNPRStory>* aStoryArray)
+	{
+	CNPRStoryXmlParser* self = new (ELeave) CNPRStoryXmlParser(aStoryArray);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+CNPRStoryXmlParser* CNPRStoryXmlParser::NewL(RPointerArray<CNPRStory>* aStoryArray)
+	{
+	CNPRStoryXmlParser* self = CNPRStoryXmlParser::NewLC(aStoryArray);
+	CleanupStack::Pop(); // self;
+	return self;
+	}
+
+CNPRStoryXmlParser::CNPRStoryXmlParser(RPointerArray<CNPRStory>* 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;
+	}