diff -r 702ba9ffe210 -r d7abecc9d189 engine/src/FeedParser.cpp --- 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");