src/NPRStoryXmlParser.cpp
changeset 0 0049171ecffb
equal deleted inserted replaced
-1:000000000000 0:0049171ecffb
       
     1 /*
       
     2  ============================================================================
       
     3  Name	: NPRStoryXmlParser.cpp
       
     4  Author	: John Kern
       
     5  
       
     6  Copyright (c) 2009 Symbian Foundation Ltd
       
     7  This component and the accompanying materials are made available
       
     8  under the terms of the License "Eclipse Public License v1.0"
       
     9  which accompanies this distribution, and is available
       
    10  at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
    11 
       
    12  Initial Contributors:
       
    13  - Symbian Foundation Ltd - initial contribution
       
    14  - Symsource
       
    15  
       
    16  Contributors:
       
    17  - John Kern
       
    18  - Symsource
       
    19  
       
    20  Description : Story xml parser
       
    21  ============================================================================
       
    22  */
       
    23 
       
    24 #include "NPRDocument.h"
       
    25 #include "NPRStoryXmlParser.h"
       
    26 #include "NPRStory.h"
       
    27 
       
    28 CNPRStoryXmlParser* CNPRStoryXmlParser::NewLC(RPointerArray<CNPRStory>* aStoryArray)
       
    29 	{
       
    30 	CNPRStoryXmlParser* self = new (ELeave) CNPRStoryXmlParser(aStoryArray);
       
    31 	CleanupStack::PushL(self);
       
    32 	self->ConstructL();
       
    33 	return self;
       
    34 	}
       
    35 
       
    36 CNPRStoryXmlParser* CNPRStoryXmlParser::NewL(RPointerArray<CNPRStory>* aStoryArray)
       
    37 	{
       
    38 	CNPRStoryXmlParser* self = CNPRStoryXmlParser::NewLC(aStoryArray);
       
    39 	CleanupStack::Pop(); // self;
       
    40 	return self;
       
    41 	}
       
    42 
       
    43 CNPRStoryXmlParser::CNPRStoryXmlParser(RPointerArray<CNPRStory>* aStoryArray)
       
    44 :iStoryArray(aStoryArray)
       
    45 	{
       
    46 	// No implementation required
       
    47 	}
       
    48 
       
    49 CNPRStoryXmlParser::~CNPRStoryXmlParser()
       
    50 	{
       
    51 	delete iTagName;
       
    52 	}
       
    53 
       
    54 
       
    55 void CNPRStoryXmlParser::ConstructL()
       
    56 	{
       
    57 	iState = ENPRNewsStateIdle;
       
    58 	}
       
    59 
       
    60 void CNPRStoryXmlParser::OnStartDocumentL(
       
    61 		const RDocumentParameters& /* aDocParam */, 
       
    62 		TInt aErrorCode )
       
    63 	{
       
    64 	User::LeaveIfError(aErrorCode);
       
    65 	}
       
    66 
       
    67 void CNPRStoryXmlParser::OnEndDocumentL(TInt aErrorCode)
       
    68 	{
       
    69 	User::LeaveIfError(aErrorCode);
       
    70 	}
       
    71 
       
    72 HBufC* CNPRStoryXmlParser::Copy8To16LC(const TDesC8& aDes)
       
    73         {
       
    74         HBufC* buf16 = HBufC::NewLC(aDes.Length());
       
    75         buf16->Des().Copy(aDes);
       
    76         return buf16;
       
    77         }
       
    78 
       
    79 void CNPRStoryXmlParser::OnStartElementL(
       
    80 		const RTagInfo& aElement, 
       
    81 		const RAttributeArray& aAttributes, 
       
    82 		TInt  aErrorCode	)
       
    83 	{
       
    84 	User::LeaveIfError(aErrorCode);
       
    85 	const TDesC8& tagName = aElement.LocalName().DesC();
       
    86 	if (tagName.CompareF(_L8("story"))==0)
       
    87 		{
       
    88 		iStory = ETrue;
       
    89 		if(iTagName)
       
    90 			{
       
    91 			delete iTagName;
       
    92 			}
       
    93 		iState = ENPRNewsStateStory;
       
    94 		iCurrentStory = CNPRStory::NewL(); 
       
    95 		// find the story Id attribute
       
    96 		TInt count = aAttributes.Count();
       
    97 		for (TInt i = 0 ; i < count ; i++)
       
    98 			{
       
    99 			 const RAttribute& attribute = aAttributes[i];
       
   100 			 const RTagInfo& nameInfo = attribute.Attribute();
       
   101 
       
   102 			 const TDesC8& localName8 = nameInfo.LocalName().DesC();
       
   103 			 const TDesC8& value8 = attribute.Value().DesC();
       
   104 
       
   105 			 HBufC* localName16 = Copy8To16LC(localName8);
       
   106 			 HBufC* value16 = Copy8To16LC(value8);
       
   107 			 if (localName16->CompareF(_L("id")) == 0 )
       
   108 				 {
       
   109 				 TLex lex(value16->Des());
       
   110 				 TInt v = 0;
       
   111 				 lex.Val(v);
       
   112 				 iCurrentStory->SetStoryId( v );
       
   113 				 }
       
   114 			 CleanupStack::PopAndDestroy(2); // value16 and localName16
       
   115 			}
       
   116 		}
       
   117 	else if(iStory)
       
   118 		{
       
   119 		if(!iTagName && ((iState != ENPRNewsStateText) || (iState != ENPRNewsStateParagraph)))
       
   120 			{
       
   121 			iTagName = tagName.AllocL();
       
   122 			}
       
   123 		
       
   124 		if (iTagName->CompareF(_L8("title"))==0 && iState == ENPRNewsStateStory)
       
   125 			{
       
   126 			iState = ENPRNewsStateTitle;
       
   127 			}
       
   128 		else if (iTagName->CompareF(_L8("teaser"))==0 && iState == ENPRNewsStateStory)
       
   129 			{
       
   130 			iState = ENPRNewsStateTeaser;
       
   131 			}
       
   132 		else if (iTagName->CompareF(_L8("thumbnail"))==0 && iState == ENPRNewsStateStory)
       
   133 			{
       
   134 			iState = ENPRNewsStateThumbnail;
       
   135 			}
       
   136 		else if (iTagName->CompareF(_L8("text"))== 0 && iState == ENPRNewsStateStory)
       
   137 			{
       
   138 			iState = ENPRNewsStateText;
       
   139 			}	
       
   140 		else if (tagName.CompareF(_L8("paragraph"))== 0 && iTagName->CompareF(_L8("text"))==0)
       
   141 			{
       
   142 			iState = ENPRNewsStateParagraph;
       
   143 			}
       
   144 		else
       
   145 			{
       
   146 			iState = ENPRNewsStateIdle;
       
   147 			}
       
   148 		}
       
   149 	}
       
   150 
       
   151 void CNPRStoryXmlParser::OnEndElementL(const RTagInfo& aElement, TInt aErrorCode )
       
   152 	{
       
   153 	User::LeaveIfError(aErrorCode);
       
   154 	const TDesC8& tagName = aElement.LocalName().DesC();
       
   155 	
       
   156 	TBool result = EFalse;
       
   157 	
       
   158 	if (tagName.CompareF(_L8("story"))== 0 && iState == ENPRNewsStateStory)
       
   159 		{
       
   160 		iStory = EFalse;
       
   161 		iState = ENPRNewsStateIdle;
       
   162 		iStoryArray->AppendL(iCurrentStory);
       
   163 		iCurrentStory = NULL;
       
   164 		} 
       
   165 	else if(iTagName)
       
   166 		{//TO DO we can have a switch here
       
   167 		if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateTitle)
       
   168 			{ 
       
   169 			result = ETrue;
       
   170 			}
       
   171 		else if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateTeaser)
       
   172 			{
       
   173 			result = ETrue;
       
   174 			}	
       
   175 		else if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateThumbnail)
       
   176 			{
       
   177 			result = ETrue;
       
   178 			}	
       
   179 		else if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateText)
       
   180 			{
       
   181 			result = ETrue;
       
   182 			}	
       
   183 		else if (tagName.CompareF(_L8("paragraph"))== 0 && iTagName->CompareF(_L8("text"))==0)
       
   184 			{
       
   185 			iState = ENPRNewsStateText;
       
   186 			}	
       
   187 		else if (iTagName->CompareF(tagName)== 0 && iState == ENPRNewsStateIdle)
       
   188 			{
       
   189 			result = ETrue;
       
   190 			}
       
   191 		}
       
   192 	
       
   193 	if(result)
       
   194 		{
       
   195 		if(iTagName)
       
   196 			{
       
   197 			delete iTagName;
       
   198 			iTagName = NULL;
       
   199 			}
       
   200 		iState = ENPRNewsStateStory;
       
   201 		}
       
   202 	}
       
   203 
       
   204 void CNPRStoryXmlParser::OnContentL(const TDesC8&  aBytes, TInt aErrorCode)
       
   205 	{
       
   206 	User::LeaveIfError(aErrorCode);
       
   207 	
       
   208 	switch(iState)
       
   209 		{
       
   210 		case ENPRNewsStateTitle:
       
   211 			{
       
   212 			iCurrentStory->SetTitleL(aBytes);
       
   213 			break;
       
   214 			}
       
   215 		case ENPRNewsStateTeaser:
       
   216 			{
       
   217 			iCurrentStory->SetTeaserL(aBytes);
       
   218 			break; 
       
   219 			}
       
   220 		case ENPRNewsStateParagraph:
       
   221 			{
       
   222 			iCurrentStory->SetTextL(aBytes);
       
   223 			break;
       
   224 			}
       
   225 		default:
       
   226 			iState = iState; // for debugging. 
       
   227 			break;
       
   228 		}
       
   229 	}
       
   230 
       
   231 void CNPRStoryXmlParser::OnStartPrefixMappingL(
       
   232 		const RString& /* aPrefix */, 
       
   233 		const RString& /* aUri */, 
       
   234 		TInt aErrorCode)
       
   235 	{
       
   236 	User::LeaveIfError(aErrorCode);
       
   237 	}
       
   238 
       
   239 void CNPRStoryXmlParser::OnEndPrefixMappingL(const RString& /* aPrefix */, TInt aErrorCode)
       
   240 	{
       
   241 	User::LeaveIfError(aErrorCode);
       
   242 	}
       
   243 
       
   244 void CNPRStoryXmlParser::OnIgnorableWhiteSpaceL(const TDesC8& /* aBytes */, TInt /* aErrorCode*/)
       
   245 	{
       
   246 	}
       
   247 
       
   248 void CNPRStoryXmlParser::OnSkippedEntityL(const RString& /* aName */, TInt aErrorCode)
       
   249 	{
       
   250 	User::LeaveIfError(aErrorCode);
       
   251 	}
       
   252 
       
   253 void CNPRStoryXmlParser::OnProcessingInstructionL(
       
   254 		const TDesC8& /* aTarget */ , 
       
   255 		const TDesC8& /* aData */ , 
       
   256 		TInt aErrorCode)
       
   257 	{
       
   258 	User::LeaveIfError(aErrorCode);
       
   259 	}
       
   260 
       
   261 void CNPRStoryXmlParser::OnError(TInt aErrorCode)
       
   262 	{
       
   263 	User::LeaveIfError(aErrorCode);
       
   264 	}
       
   265 
       
   266 TAny* CNPRStoryXmlParser::GetExtendedInterface(const TInt32 /* aUid */) 
       
   267 	{
       
   268 	return NULL;
       
   269 	}