diff -r 5f8e5adbbed9 -r 29cda98b007e engine/inc/FeedEngine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/inc/FeedEngine.h Thu Feb 25 14:29:19 2010 +0000 @@ -0,0 +1,167 @@ +/* +* Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB +* +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* EmbedDev AB - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef FEEDENGINE_H_ +#define FEEDENGINE_H_ + +#include "HttpClientObserver.h" +#include "HttpClient.h" +#include "FeedParser.h" +#include "FeedInfo.h" +#include "ShowInfo.h" +#include +#include "Constants.h" +#include "FeedEngineObserver.h" +#include "FeedTimer.h" +#include "sqlite3.h" + +class CPodcastModel; +class COpmlParser; + +_LIT(KOpmlFeed, " "); +_LIT(KOpmlHeader, "\n\n\n Podcast Feed List\n\n\n "); +_LIT(KOpmlFooter, " \n\n"); + +_LIT(KSearchUrl, "http://www.digitalpodcast.com/podcastsearchservice/v2b/search/?appid=SymbianPodcatcher&keywords=%S&format=rssopml&sort=rel&searchsource=all&contentfilter=noadult&start=0&results=20"); +_LIT(KSearchResultsFileName, "searchresults.opml"); + +const TInt KMaxUidBufLen = 20; +const TInt KMaxTitleLength = 512; +const TInt KMaxDescriptionLength = 1024; +const TInt KMaxURLLength = 512; +const TInt KMaxLineLength = 4096; +const TInt KMaxSearchString = 30; + +enum TClientState { + EIdle, + EUpdatingFeed, + EUpdatingImage, + ESearching +}; + +class CFeedEngine : public CBase, public MHttpClientObserver, public MFeedParserObserver +{ +public: + static CFeedEngine* NewL(CPodcastModel& aPodcastModel); + virtual ~CFeedEngine(); + +public: + IMPORT_C TBool AddFeedL(const CFeedInfo& item); + IMPORT_C void ImportFeedsL(const TDesC& aFile); + IMPORT_C TBool ExportFeedsL(TFileName& aFile); + IMPORT_C void RemoveFeedL(TUint aUid); + IMPORT_C TBool UpdateFeedL(TUint aFeedUid); + IMPORT_C void UpdateAllFeedsL(TBool aAutoUpdate = EFalse); + IMPORT_C void CancelUpdateAllFeeds(); + IMPORT_C const RFeedInfoArray& GetSortedFeeds(); + IMPORT_C CFeedInfo* GetFeedInfoByUid(TUint aFeedUid); + IMPORT_C void GetStatsByFeed(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed); + IMPORT_C void GetDownloadedStats(TUint &aNumShows, TUint &aNumUnplayed); + + IMPORT_C void AddObserver(MFeedEngineObserver *observer); + IMPORT_C void RemoveObserver(MFeedEngineObserver *observer); + + void RunFeedTimer(); + + IMPORT_C void UpdateFeed(CFeedInfo *aItem); + /** + * Returns the current internal state of the feed engine4 + */ + IMPORT_C TClientState ClientState(); + + /** + * Returns the current updating client UID if clientstate is != ENotUpdateing + * @return TUint + */ + IMPORT_C TUint ActiveClientUid(); + + IMPORT_C void SearchForFeedL(TDesC& aSearchString); + IMPORT_C void AddSearchResultL(CFeedInfo *item); + IMPORT_C const RFeedInfoArray& GetSearchResults(); + + IMPORT_C void OpmlParsingComplete(TUint aNumFeedsAdded); +protected: + + static TInt CompareFeedsByTitle(const CFeedInfo &a, const CFeedInfo &b); + +private: + void ConstructL(); + CFeedEngine(CPodcastModel& aPodcastModel); + + // from HttpClientObserver + void Connected(CHttpClient* aClient); + void Disconnected(CHttpClient* aClient); + void Progress(CHttpClient* aHttpClient, TInt aBytes, TInt aTotalBytes); + void DownloadInfo(CHttpClient* aClient, TInt aSize); + void CompleteL(CHttpClient* aClient, TInt aError); + void FileError(TUint /*aError*/) { } + // from FeedParser + void NewShowL(CShowInfo& aItem); + void ParsingCompleteL(CFeedInfo *aItem); + + void GetFeedImageL(CFeedInfo *aFeedInfo); + + void UpdateNextFeedL(); + void NotifyFeedUpdateComplete(TInt aError); + void NotifyOpmlParsingComplete(TUint aNumFeedsAdded); + + +private: + void DBLoadFeedsL(); + TBool DBRemoveFeed(TUint aUid); + TBool DBAddFeedL(const CFeedInfo& aTtem); + CFeedInfo* DBGetFeedInfoByUidL(TUint aFeedUid); + TUint DBGetFeedCount(); + TBool DBUpdateFeed(const CFeedInfo& aItem); + void DBGetStatsByFeed(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed); + + +private: + CHttpClient* iFeedClient; + TClientState iClientState; + CFeedTimer iFeedTimer; + + CPodcastModel& iPodcastModel; + + // RSS parser + CFeedParser* iParser; + + // the list of feeds + RFeedInfoArray iSortedFeeds; + + CFeedInfo *iActiveFeed; + TFileName iUpdatingFeedFileName; + TFileName iSearchResultsFileName; + RFeedInfoArray iFeedsUpdating; + + // observers that will receive callbacks, not owning + RArray iObservers; + + TBool iCatchupMode; + TUint iCatchupCounter; + + sqlite3& iDB; + + TBuf iSqlBuffer; + + COpmlParser* iOpmlParser; + RFeedInfoArray iSearchResults; + TBool iAutoUpdatedInitiator; +}; +#endif /*FEEDENGINE_H_*/ +