engine/src/FeedParser.cpp
branch3rded
changeset 343 9c56bf585696
parent 277 03ad04f315db
child 390 d7abecc9d189
--- 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);