--- a/engine/src/FeedParser.cpp Sat Oct 23 17:30:22 2010 +0100
+++ b/engine/src/FeedParser.cpp Sat Nov 13 13:54:36 2010 +0000
@@ -24,6 +24,7 @@
#include <xml/stringdictionarycollection.h>
#include <utf.h>
#include <tinternetdate.h>
+#include <e32hashtab.h>
#include "debug.h"
#include "podcastutils.h"
@@ -54,6 +55,10 @@
iStoppedParsing = EFalse;
iEncoding = ELatin1;
+ TEntry entry;
+ User::LeaveIfError(iRfs.Entry(feedFileName, entry));
+ iFileSize = entry.iSize;
+
ParseL(*parser, iRfs, feedFileName);
CleanupStack::PopAndDestroy(parser);
@@ -159,6 +164,7 @@
}
break;
case EStateItem:
+ iUid = 0;
// <channel> <item> <title>
if (str.CompareF(KTagTitle) == 0) {
iFeedState=EStateItemTitle;
@@ -197,6 +203,9 @@
} else if (str.CompareF(KTagPubDate) == 0) {
//DP("LastBuildDate BEGIN");
iFeedState = EStateItemPubDate;
+ // <channel> <item> <guid>
+ } else if (str.CompareF(KTagGuid) == 0) {
+ iFeedState = EStateItemGuid;
}
break;
default:
@@ -245,18 +254,21 @@
TBuf8<128> temp;
temp.Copy(iBuffer);
+ DP2("iFileSize=%d, iActiveFeed->FeedFileSize()=%d", iFileSize, iActiveFeed->FeedFileSize());
+
TRAPD(parseError, internetDate.SetDateL(temp));
if(parseError == KErrNone) {
if (TTime(internetDate.DateTime()) > iActiveFeed->BuildDate()) {
DP("Successfully parsed build date");
iActiveFeed->SetBuildDate(TTime(internetDate.DateTime()));
- } else {
+ } else if (iFileSize == iActiveFeed->FeedFileSize()){
DP("*** Nothing new, aborting parsing");
iStoppedParsing = ETrue;
}
} else {
DP("Failed to parse last build date");
}
+ iActiveFeed->SetFeedFileSize(iFileSize);
iFeedState = EStateChannel;
}
break;
@@ -273,9 +285,7 @@
case EStateItem:
if (str.CompareF(KTagItem) == 0)
{
-
// check if we have a valid pubdate
-
if (iActiveShow->PubDate().Int64() == 0)
{
// set pubDate to present time
@@ -292,6 +302,10 @@
iActiveShow->SetPubDate(now);
}
+ if (iUid)
+ {
+ iActiveShow->SetUid(iUid);
+ }
iCallbacks.NewShowL(*iActiveShow);
@@ -302,11 +316,11 @@
iItemsParsed++;
DP2("iItemsParsed: %d, iMaxItems: %d", iItemsParsed, iMaxItems);
-// if (iItemsParsed >= iMaxItems)
-// {
-// iStoppedParsing = ETrue;
-// DP("*** Too many items, aborting parsing");
-// }
+ if (iItemsParsed >= iMaxItems)
+ {
+ iStoppedParsing = ETrue;
+ DP("*** Too many items, aborting parsing");
+ }
iFeedState=EStateChannel;
}
@@ -314,57 +328,64 @@
case EStateItemPubDate:
DP1("PubDate END: iBuffer='%S'", &iBuffer);
if (str.CompareF(KTagPubDate) == 0) {
- // hack for feeds that don't always write day as two digits
- TChar five(iBuffer[5]);
- TChar six(iBuffer[6]);
+ DP1("iBuffer.Length()=%d", iBuffer.Length());
- if (five.IsDigit() && !six.IsDigit()) {
- TBuf<KMaxStringBuffer> fix;
- fix.Copy(iBuffer.Left(4));
- fix.Append(_L(" 0"));
- fix.Append(iBuffer.Mid(5));
- iBuffer.Copy(fix);
- }
- // end hack
+ if (iBuffer.Length() > 6)
+ {
+ // hack for feeds that don't always write day as two digits
+ TChar five(iBuffer[5]);
+ TChar six(iBuffer[6]);
+
+ if (five.IsDigit() && !six.IsDigit()) {
+ TBuf<KMaxStringBuffer> fix;
+ fix.Copy(iBuffer.Left(4));
+ fix.Append(_L(" 0"));
+ fix.Append(iBuffer.Mid(5));
+ iBuffer.Copy(fix);
+ }
+ // end hack
+ }
- // hack for feeds that write out months in full
-
- if (iBuffer[11] != ' ') {
- TPtrC midPtr = iBuffer.Mid(8);
+ if (iBuffer.Length() > 11)
+ {
+ // hack for feeds that write out months in full
- int spacePos = midPtr.Find(_L(" "));
-
- if (spacePos != KErrNotFound) {
- //DP1("Month: %S", &midPtr.Left(spacePos));
+ if (iBuffer[11] != ' ') {
+ TPtrC midPtr = iBuffer.Mid(8);
+
+ int spacePos = midPtr.Find(_L(" "));
- TBuf16<KBufferLength> newBuffer;
- newBuffer.Copy(iBuffer.Left(11));
- newBuffer.Append(_L(" "));
- newBuffer.Append(iBuffer.Mid(11+spacePos));
- //DP1("newBuffer: %S", &newBuffer);
- iBuffer.Copy(newBuffer);
+ if (spacePos != KErrNotFound) {
+ //DP1("Month: %S", &midPtr.Left(spacePos));
+
+ TBuf16<KBufferLength> newBuffer;
+ newBuffer.Copy(iBuffer.Left(11));
+ newBuffer.Append(_L(" "));
+ newBuffer.Append(iBuffer.Mid(11+spacePos));
+ //DP1("newBuffer: %S", &newBuffer);
+ iBuffer.Copy(newBuffer);
+ }
}
- }
-
- // hack for feeds that write days and months as UPPERCASE
- TChar one(iBuffer[1]);
- TChar two(iBuffer[2]);
- TChar nine(iBuffer[9]);
- TChar ten(iBuffer[10]);
+
+ // hack for feeds that write days and months as UPPERCASE
+ TChar one(iBuffer[1]);
+ TChar two(iBuffer[2]);
+ TChar nine(iBuffer[9]);
+ TChar ten(iBuffer[10]);
+
+ one.LowerCase();
+ two.LowerCase();
+ nine.LowerCase();
+ ten.LowerCase();
+
+ iBuffer[1] = one;
+ iBuffer[2] = two;
+ iBuffer[9] = nine;
+ iBuffer[10] = ten;
+ }
- one.LowerCase();
- two.LowerCase();
- nine.LowerCase();
- ten.LowerCase();
-
- iBuffer[1] = one;
- iBuffer[2] = two;
- iBuffer[9] = nine;
- iBuffer[10] = ten;
-
TBuf8<128> temp;
temp.Copy(iBuffer);
-
TInternetDate internetDate;
TRAPD(parseError, internetDate.SetDateL(temp));
if(parseError == KErrNone) {
@@ -386,6 +407,10 @@
}
iFeedState=EStateItem;
break;
+ case EStateItemGuid:
+ iUid = DefaultHash::Des16(iBuffer);
+ iFeedState=EStateItem;
+ break;
case EStateItemTitle:
//DP1("title: %S", &iBuffer);
iActiveShow->SetTitleL(iBuffer);