engine/src/FeedEngine.cpp
branch3rded
changeset 343 9c56bf585696
parent 219 3aa0b93477b5
child 390 d7abecc9d189
equal deleted inserted replaced
281:1cae65a87b5e 343:9c56bf585696
    51 	iFeedTimer.ConstructL();
    51 	iFeedTimer.ConstructL();
    52 	
    52 	
    53 	TInt err = KErrNone;
    53 	TInt err = KErrNone;
    54 	TInt feedCount = 0;
    54 	TInt feedCount = 0;
    55 	
    55 	
       
    56 	DBEnsureFileSizeFieldExists();
       
    57 	
    56 	TRAP(err, feedCount = DBGetFeedCountL());
    58 	TRAP(err, feedCount = DBGetFeedCountL());
    57     if (err == KErrNone && feedCount > 0)
    59     if (err == KErrNone && feedCount > 0)
    58     	{
    60     	{
    59 		DP("Loading feeds from DB");
    61 		DP("Loading feeds from DB");
    60 		TRAP(err, DBLoadFeedsL());
    62 		TRAP(err, DBLoadFeedsL());
    99 	{
   101 	{
   100 	}
   102 	}
   101 
   103 
   102 CFeedEngine::~CFeedEngine()
   104 CFeedEngine::~CFeedEngine()
   103 	{
   105 	{
       
   106 	DP("~CFeedEngine BEGIN");
   104 	iObservers.Close();
   107 	iObservers.Close();
   105 	
   108 	
   106 	iFeedsUpdating.Close();
   109 	iFeedsUpdating.Close();
   107 	iSortedFeeds.ResetAndDestroy();
   110 	iSortedFeeds.ResetAndDestroy();
   108 	iSearchResults.ResetAndDestroy();
   111 	iSearchResults.ResetAndDestroy();
   110 	delete iParser;
   113 	delete iParser;
   111 	delete iFeedClient;
   114 	delete iFeedClient;
   112 	delete iOpmlParser;
   115 	delete iOpmlParser;
   113 	//
   116 	//
   114 	delete iRepository;
   117 	delete iRepository;
       
   118 	DP("~CFeedEngine END");
   115 	}
   119 	}
   116 
   120 
   117 /**
   121 /**
   118  * Returns the current internal state of the feed engine4
   122  * Returns the current internal state of the feed engine4
   119  */
   123  */
   297 		}
   301 		}
   298 	}
   302 	}
   299 
   303 
   300 void CFeedEngine::NewShowL(CShowInfo& aItem)
   304 void CFeedEngine::NewShowL(CShowInfo& aItem)
   301 	{
   305 	{
       
   306 	DP1("CFeedEngine::NewShowL BEGIN, aItem.Title()=%S", &aItem.Title());
   302 	HBufC* description = HBufC::NewLC(KMaxDescriptionLength);
   307 	HBufC* description = HBufC::NewLC(KMaxDescriptionLength);
   303 	TPtr ptr(description->Des());
   308 	TPtr ptr(description->Des());
   304 	ptr.Copy(aItem.Description());
   309 	ptr.Copy(aItem.Description());
   305 	PodcastUtils::CleanHtmlL(ptr);
   310 	PodcastUtils::CleanHtmlL(ptr);
   306 
   311 
   323 		{
   328 		{
   324 		iPodcastModel.ShowEngine().AddDownloadL(aItem);
   329 		iPodcastModel.ShowEngine().AddDownloadL(aItem);
   325 		}
   330 		}
   326 	
   331 	
   327 	showsAdded++;
   332 	showsAdded++;
       
   333 	DP("CFeedEngine::NewShowL END");
   328 	}
   334 	}
   329 
   335 
   330 void CFeedEngine::GetFeedImageL(CFeedInfo *aFeedInfo)
   336 void CFeedEngine::GetFeedImageL(CFeedInfo *aFeedInfo)
   331 	{
   337 	{
   332 	DP("GetFeedImage");
   338 	DP("GetFeedImage");
   339 	relPath.Copy(aFeedInfo->Title());
   345 	relPath.Copy(aFeedInfo->Title());
   340 	relPath.Append('\\');
   346 	relPath.Append('\\');
   341 
   347 
   342 	TFileName fileName;
   348 	TFileName fileName;
   343 	PodcastUtils::FileNameFromUrl(aFeedInfo->ImageUrl(), fileName);
   349 	PodcastUtils::FileNameFromUrl(aFeedInfo->ImageUrl(), fileName);
       
   350 	fileName.Trim();
       
   351 	
       
   352 	if (fileName.Length() == 0)
       
   353 		User::Leave(KErrNotFound);
       
   354 	
   344 	relPath.Append(fileName);
   355 	relPath.Append(fileName);
   345 	PodcastUtils::EnsureProperPathName(relPath);
   356 	PodcastUtils::EnsureProperPathName(relPath);
   346 	
   357 	
   347 	// complete file path is base dir + rel path
   358 	// complete file path is base dir + rel path
   348 	filePath.Append(relPath);
   359 	filePath.Append(relPath);
   399 	HBufC* descBuf = HBufC::NewLC(KMaxLineLength);
   410 	HBufC* descBuf = HBufC::NewLC(KMaxLineLength);
   400 	TPtr descPtr(descBuf->Des());
   411 	TPtr descPtr(descBuf->Des());
   401 	descPtr.Copy(aItem.Description());
   412 	descPtr.Copy(aItem.Description());
   402 	PodcastUtils::SQLEncode(descPtr);
   413 	PodcastUtils::SQLEncode(descPtr);
   403 	
   414 	
   404 	_LIT(KSqlStatement, "insert into feeds (url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror) values (\"%S\",\"%S\", \"%S\", \"%S\", \"%S\", \"%S\", \"%Ld\", \"%Ld\", \"%u\", \"%u\", \"%u\", \"%d\")");
   415 	_LIT(KSqlStatement, "insert into feeds (url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror, filesize) values (\"%S\",\"%S\", \"%S\", \"%S\", \"%S\", \"%S\", \"%Ld\", \"%Ld\", \"%u\", \"%u\", \"%u\", \"%d\", \"%d\")");
   405 	iSqlBuffer.Format(KSqlStatement,
   416 	iSqlBuffer.Format(KSqlStatement,
   406 			&aItem.Url(), titleBuf, descBuf, &aItem.ImageUrl(), &aItem.ImageFileName(), &aItem.Link(),
   417 			&aItem.Url(), titleBuf, descBuf, &aItem.ImageUrl(), &aItem.ImageFileName(), &aItem.Link(),
   407 			aItem.BuildDate().Int64(), aItem.LastUpdated().Int64(), aItem.Uid(), EAudioPodcast, aItem.CustomTitle(), aItem.LastError());
   418 			aItem.BuildDate().Int64(), aItem.LastUpdated().Int64(), aItem.Uid(), EAudioPodcast, aItem.CustomTitle(), aItem.LastError(), aItem.FeedFileSize());
   408 
   419 
   409 	CleanupStack::PopAndDestroy(descBuf);
   420 	CleanupStack::PopAndDestroy(descBuf);
   410 	CleanupStack::PopAndDestroy(titleBuf);
   421 	CleanupStack::PopAndDestroy(titleBuf);
   411 	
   422 	
   412 	sqlite3_stmt *st;
   423 	sqlite3_stmt *st;
   512 	
   523 	
   513 	HBufC* descBuf = HBufC::NewLC(KMaxLineLength);
   524 	HBufC* descBuf = HBufC::NewLC(KMaxLineLength);
   514 	TPtr descPtr(descBuf->Des());
   525 	TPtr descPtr(descBuf->Des());
   515 	descPtr.Copy(aItem.Description());
   526 	descPtr.Copy(aItem.Description());
   516 	PodcastUtils::SQLEncode(descPtr);
   527 	PodcastUtils::SQLEncode(descPtr);
   517 	
   528 	_LIT(KSqlStatement, "update feeds set url=\"%S\", title=\"%S\", description=\"%S\", imageurl=\"%S\", imagefile=\"%S\", link=\"%S\", built=\"%Lu\", lastupdated=\"%Lu\", feedtype=\"%u\", customtitle=\"%u\", lasterror=\"%d\", filesize=\"%d\" where uid=\"%u\"");
   518 	_LIT(KSqlStatement, "update feeds set url=\"%S\", title=\"%S\", description=\"%S\", imageurl=\"%S\", imagefile=\"%S\", link=\"%S\", built=\"%Lu\", lastupdated=\"%Lu\", feedtype=\"%u\", customtitle=\"%u\", lasterror=\"%d\" where uid=\"%u\"");
       
   519 	iSqlBuffer.Format(KSqlStatement,
   529 	iSqlBuffer.Format(KSqlStatement,
   520 			&aItem.Url(), titleBuf, descBuf, &aItem.ImageUrl(), &aItem.ImageFileName(), &aItem.Link(),
   530 			&aItem.Url(), titleBuf, descBuf, &aItem.ImageUrl(), &aItem.ImageFileName(), &aItem.Link(),
   521 			aItem.BuildDate().Int64(), aItem.LastUpdated().Int64(), EAudioPodcast, aItem.CustomTitle(), aItem.LastError(), aItem.Uid());
   531 			aItem.BuildDate().Int64(), aItem.LastUpdated().Int64(), EAudioPodcast, aItem.CustomTitle(), aItem.LastError(), aItem.FeedFileSize(), aItem.Uid());
   522 
   532 
   523 	CleanupStack::PopAndDestroy(descBuf);
   533 	CleanupStack::PopAndDestroy(descBuf);
   524 	CleanupStack::PopAndDestroy(titleBuf);
   534 	CleanupStack::PopAndDestroy(titleBuf);
   525 	
   535 	
   526 	sqlite3_stmt *st;
   536 	sqlite3_stmt *st;
   719 	{
   729 	{
   720 	}
   730 	}
   721 
   731 
   722 void CFeedEngine::DownloadInfo(CHttpClient* /*aHttpClient */, int /*aTotalBytes*/)
   732 void CFeedEngine::DownloadInfo(CHttpClient* /*aHttpClient */, int /*aTotalBytes*/)
   723 	{	
   733 	{	
       
   734 	
       
   735 	}
       
   736 
       
   737 void CFeedEngine::DBEnsureFileSizeFieldExists()
       
   738 	{
       
   739 	DP("DBEnsureFileSizeFieldExists BEGIN");
       
   740 	sqlite3_stmt *st;
       
   741 	int rc = sqlite3_prepare_v2(&iDB,"alter table feeds add column filesize int" , -1, &st, (const char**) NULL);
       
   742 	DP1("    rc=%d", rc);
       
   743 	 
       
   744 	if( rc==SQLITE_OK )
       
   745 		{
       
   746 		Cleanup_sqlite3_finalize_PushL(st);
       
   747 		rc = sqlite3_step(st);
       
   748 		DP1("    rc=%d", rc);
       
   749 		CleanupStack::PopAndDestroy(); // st
       
   750 		}
       
   751 
       
   752 	DP("DBEnsureFileSizeFieldExists END");
   724 	}
   753 	}
   725 
   754 
   726 EXPORT_C void CFeedEngine::ImportFeedsL(const TDesC& aFile)
   755 EXPORT_C void CFeedEngine::ImportFeedsL(const TDesC& aFile)
   727 	{
   756 	{
   728 	TFileName opmlPath;
   757 	TFileName opmlPath;
   937 	{
   966 	{
   938 	DP("DBLoadFeeds BEGIN");
   967 	DP("DBLoadFeeds BEGIN");
   939 	iSortedFeeds.Reset();
   968 	iSortedFeeds.Reset();
   940 	CFeedInfo *feedInfo = NULL;
   969 	CFeedInfo *feedInfo = NULL;
   941 	
   970 	
   942 	_LIT(KSqlStatement, "select url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror from feeds");
   971 	_LIT(KSqlStatement, "select url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror, filesize from feeds");
   943 	iSqlBuffer.Format(KSqlStatement);
   972 	iSqlBuffer.Format(KSqlStatement);
   944 
   973 
   945 	sqlite3_stmt *st;
   974 	sqlite3_stmt *st;
   946 	 
   975 	 
   947 	TLinearOrder<CFeedInfo> sortOrder( CFeedEngine::CompareFeedsByTitle);
   976 	TLinearOrder<CFeedInfo> sortOrder( CFeedEngine::CompareFeedsByTitle);
   979 				feedInfo->SetImageFileNameL(imagefile, &iPodcastModel);
  1008 				feedInfo->SetImageFileNameL(imagefile, &iPodcastModel);
   980 				}
  1009 				}
   981 			
  1010 			
   982 			const void *linkz = sqlite3_column_text16(st, 5);
  1011 			const void *linkz = sqlite3_column_text16(st, 5);
   983 			TPtrC16 link((const TUint16*)linkz);
  1012 			TPtrC16 link((const TUint16*)linkz);
   984 			feedInfo->SetDescriptionL(link);
  1013 			feedInfo->SetLinkL(link);
   985 					
  1014 					
   986 			sqlite3_int64 built = sqlite3_column_int64(st, 6);
  1015 			sqlite3_int64 built = sqlite3_column_int64(st, 6);
   987 			TTime buildtime(built);
  1016 			TTime buildtime(built);
   988 			feedInfo->SetBuildDate(buildtime);
  1017 			feedInfo->SetBuildDate(buildtime);
   989 
  1018 
   997 				feedInfo->SetCustomTitle();
  1026 				feedInfo->SetCustomTitle();
   998 				}
  1027 				}
   999 			
  1028 			
  1000 			sqlite3_int64 lasterror = sqlite3_column_int(st, 11);
  1029 			sqlite3_int64 lasterror = sqlite3_column_int(st, 11);
  1001 			feedInfo->SetLastError(lasterror);
  1030 			feedInfo->SetLastError(lasterror);
  1002 			
  1031 		
       
  1032 			TInt filesize = sqlite3_column_int(st, 12);
       
  1033 			feedInfo->SetFeedFileSize(filesize);
       
  1034 
  1003 			TLinearOrder<CFeedInfo> sortOrder( CFeedEngine::CompareFeedsByTitle);
  1035 			TLinearOrder<CFeedInfo> sortOrder( CFeedEngine::CompareFeedsByTitle);
  1004 
  1036 
  1005 			iSortedFeeds.InsertInOrder(feedInfo, sortOrder);
  1037 			iSortedFeeds.InsertInOrder(feedInfo, sortOrder);
  1006 			
  1038 			
  1007 			CleanupStack::Pop(feedInfo);
  1039 			CleanupStack::Pop(feedInfo);
  1020 
  1052 
  1021 CFeedInfo* CFeedEngine::DBGetFeedInfoByUidL(TUint aFeedUid)
  1053 CFeedInfo* CFeedEngine::DBGetFeedInfoByUidL(TUint aFeedUid)
  1022 	{
  1054 	{
  1023 	DP("CFeedEngine::DBGetFeedInfoByUid BEGIN");
  1055 	DP("CFeedEngine::DBGetFeedInfoByUid BEGIN");
  1024 	CFeedInfo *feedInfo = NULL;
  1056 	CFeedInfo *feedInfo = NULL;
  1025 	_LIT(KSqlStatement, "select url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror from feeds where uid=%u");
  1057 	_LIT(KSqlStatement, "select url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror, filesize from feeds where uid=%u");
  1026 	iSqlBuffer.Format(KSqlStatement, aFeedUid);
  1058 	iSqlBuffer.Format(KSqlStatement, aFeedUid);
  1027 
  1059 
  1028 	sqlite3_stmt *st;
  1060 	sqlite3_stmt *st;
  1029 	
  1061 	
  1030 	int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st,	(const void**) NULL);
  1062 	int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st,	(const void**) NULL);
  1053 			TPtrC16 image((const TUint16*)imagez);
  1085 			TPtrC16 image((const TUint16*)imagez);
  1054 			feedInfo->SetImageUrlL(image);
  1086 			feedInfo->SetImageUrlL(image);
  1055 
  1087 
  1056 			const void *imagefilez = sqlite3_column_text16(st, 4);
  1088 			const void *imagefilez = sqlite3_column_text16(st, 4);
  1057 			TPtrC16 imagefile((const TUint16*)imagefilez);
  1089 			TPtrC16 imagefile((const TUint16*)imagefilez);
  1058 			feedInfo->SetDescriptionL(imagefile);
  1090 			feedInfo->SetImageFileNameL(imagefile, &iPodcastModel);
  1059 			
  1091 			
  1060 			const void *linkz = sqlite3_column_text16(st, 5);
  1092 			const void *linkz = sqlite3_column_text16(st, 5);
  1061 			TPtrC16 link((const TUint16*)linkz);
  1093 			TPtrC16 link((const TUint16*)linkz);
  1062 			feedInfo->SetDescriptionL(link);
  1094 			feedInfo->SetLinkL(link);
  1063 					
  1095 					
  1064 			sqlite3_int64 built = sqlite3_column_int64(st, 6);
  1096 			sqlite3_int64 built = sqlite3_column_int64(st, 6);
  1065 			TTime buildtime(built);
  1097 			TTime buildtime(built);
  1066 			feedInfo->SetBuildDate(buildtime);
  1098 			feedInfo->SetBuildDate(buildtime);
  1067 
  1099 
  1074 				feedInfo->SetCustomTitle();
  1106 				feedInfo->SetCustomTitle();
  1075 			}
  1107 			}
  1076 			
  1108 			
  1077 			TInt lasterror = sqlite3_column_int(st, 11);
  1109 			TInt lasterror = sqlite3_column_int(st, 11);
  1078 			feedInfo->SetLastError(lasterror);
  1110 			feedInfo->SetLastError(lasterror);
  1079 						
  1111 	
       
  1112 			TInt filesize = sqlite3_column_int(st, 12);
       
  1113 			feedInfo->SetFeedFileSize(filesize);
       
  1114 		
  1080 			CleanupStack::Pop(feedInfo);
  1115 			CleanupStack::Pop(feedInfo);
  1081 			}
  1116 			}
  1082 		else
  1117 		else
  1083 			{
  1118 			{
  1084 			User::Leave(KErrNotFound);
  1119 			User::Leave(KErrNotFound);