engine/src/FeedParser.cpp
branch3rded
changeset 390 d7abecc9d189
parent 343 9c56bf585696
--- a/engine/src/FeedParser.cpp	Sat Nov 13 15:05:16 2010 +0000
+++ b/engine/src/FeedParser.cpp	Mon Nov 22 15:41:41 2010 +0000
@@ -54,6 +54,11 @@
 	iMaxItems = aMaxItems;
 	iStoppedParsing = EFalse;
 	iEncoding = ELatin1;
+	if (iNewestShow)
+		delete iNewestShow;
+	iNewestShow = 0;
+	
+	iNewFeed = (iActiveFeed->LastUpdated() == 0) ? ETrue : EFalse;
 
 	TEntry entry;
 	User::LeaveIfError(iRfs.Entry(feedFileName, entry));
@@ -73,6 +78,8 @@
 	HBufC* charset = HBufC::NewLC(KMaxParseBuffer);
 	charset->Des().Copy(aDocParam.CharacterSetName().DesC());
 	iEncoding = EUtf8;
+	iFeedDirection = EFeedUnknown;
+	iPreviousPubDate = 0;
 	if (charset->CompareF(_L("utf-8")) == 0) {
 		DP("setting UTF8");
 		iEncoding = EUtf8;
@@ -87,6 +94,18 @@
 void CFeedParser::OnEndDocumentL(TInt /*aErrorCode*/)
 	{
 	//DP("OnEndDocumentL()");
+	if (iNewFeed)
+		{
+		// if the feed adds at bottom, this 
+		if (iNewestShow)
+			{
+			iNewestShow->SetPlayState(ENeverPlayed);
+			iCallbacks.ParserShowUpdatedL(*iNewestShow);
+			delete iNewestShow;
+			iNewestShow = 0;
+			}
+		}
+	
 	iCallbacks.ParsingCompleteL(iActiveFeed);
 	}
 
@@ -302,11 +321,42 @@
 					iActiveShow->SetPubDate(now);
 					}
 				
+				if (iFeedDirection == EFeedUnknown)
+					{
+					if (iPreviousPubDate.Int64() != 0) {
+						if (iActiveShow->PubDate() > iPreviousPubDate)
+							{
+							DP("Feed adds at bottom");
+							iFeedDirection = EFeedAddsAtBottom;
+							}
+						else
+							{
+							DP("Feed adds at top");
+							iFeedDirection = EFeedAddsAtTop;
+							}
+					}
+					iPreviousPubDate = iActiveShow->PubDate();
+					}
+				
 				if (iUid)
 					{
 					iActiveShow->SetUid(iUid);
 					}
+				
+				if (iNewFeed)
+					{
+					// set all played, except for the newest one
+					iActiveShow->SetPlayState(EPlayed);
+					
+					if (!iNewestShow || iActiveShow->PubDate() > iNewestShow->PubDate())
+						{
+						if (iNewestShow)
+							delete iNewestShow;
 						
+						iNewestShow = new CShowInfo(iActiveShow);
+						}
+					}
+					
 				iCallbacks.NewShowL(*iActiveShow);
 				
 				delete iActiveShow;				
@@ -316,7 +366,8 @@
 				
 				iItemsParsed++;
 				DP2("iItemsParsed: %d, iMaxItems: %d", iItemsParsed, iMaxItems);
-				if (iItemsParsed >= iMaxItems) 
+				// we stop parsing after iMaxItems, but not if feed builds at bottom
+				if (iItemsParsed >= iMaxItems && iFeedDirection != EFeedAddsAtBottom) 
 					{
 					iStoppedParsing = ETrue;
 					DP("*** Too many items, aborting parsing");