diff -r 000000000000 -r dd21522fd290 browserutilities/feedsengine/FeedsUI/TestHarness/src/TestHarness.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/feedsengine/FeedsUI/TestHarness/src/TestHarness.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,1415 @@ +/* +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). +* 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: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: The Feeds project test harness. +* +*/ + + +#include "LeakTracker.h" +#include "Logger.h" +#include "StatusPane.h" +#include "TestHarness.h" +#include +#include "FeedsWaitDialog.h" + +#include + +//const TInt NTFolderListId = 270501633; +// default id: browser +const TInt NTFolderListId = 0; +// The pair is used testing feed with same name, url, different folder list Id should have 2 entries in database +// The default.xml should contain the same feed with folder list Id as 0 +_LIT(KNewTitle, "Slashdot"); +_LIT(KUrl, "http://rss.slashdot.org/Slashdot/slashdot"); +// +//_LIT(KNewTitle, "New"); +_LIT(KRenamedTitle, "Renamed"); +//_LIT(KUrl, "http://xml.newsisfree.com/feeds/39/1439.xml"); +_LIT(KChangedUrl, "http://www.theshiftedlibrarian.com/rss.xml"); +// http://www.microsite.reuters.com/rss/topNews +// http://dictionary.reference.com/wordoftheday/wotd.rss + +// ----------------------------------------------------------------------------- +// CTestHarness::NewL +// +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CTestHarness* CTestHarness::NewL(MTestHarnessObserver& aObserver) + { + CTestHarness* self = new (ELeave) CTestHarness(aObserver); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::CTestHarness +// +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CTestHarness::CTestHarness(MTestHarnessObserver& aObserver): + iObserver(aObserver), iFeedsServer(*this, NTFolderListId), iRootFolder(*this, NTFolderListId, ETrue), iFeed(*this), + iIsConnected(EFalse), iWaitDialog(NULL) + { + LEAK_TRACKER_INCREMENT(CLeakTracker::ETestHarness); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::ConstructL +// +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CTestHarness::ConstructL() + { + _LIT(KInfoPath, "\\logs\\feeds\\info.txt"); + _LIT(KStatusPath, "\\logs\\feeds\\status.txt"); + TInt err; + + // Connect to the file server. + User::LeaveIfError(iFs.Connect()); + + // If need be create the log dir. + err = iFs.MkDirAll(KInfoPath); + if (err != KErrAlreadyExists) + { + User::LeaveIfError(err); + } + + // Create the log file. + User::LeaveIfError(iLogFile.Replace(iFs, KInfoPath, EFileWrite)); + User::LeaveIfError(iStatusFile.Replace(iFs, KStatusPath, EFileWrite)); + + iConMgr = CInternetConnectionManager::NewL(ETrue); + + // Create the WaitDialog + if (iWaitDialog == NULL) + { + iWaitDialog = CFeedsWaitDialog::NewL( *this ); + } + + // Connect to the server. + ConnectToServerL(); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::~CTestHarness +// +// Deconstructor. +// ----------------------------------------------------------------------------- +// +CTestHarness::~CTestHarness() + { + LEAK_TRACKER_DECREMENT(CLeakTracker::ETestHarness); + + delete iIdle; + + delete iDirPath; + delete iCurrentFeedUrl; + + //++pK: Check for NULL + if( iConMgr != NULL ) + { + iConMgr->Disconnect(); + } + delete iConMgr; + + delete iWaitDialog; + + DisconnectFromServer(); + + iLogFile.Close(); + iStatusFile.Close(); + iFs.Close(); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::Start +// +// Start the test harness. +// ----------------------------------------------------------------------------- +// +void CTestHarness::Start(TTestSuite aSuite, TInt aStartAt) + { +#if !defined( __WINS__ ) && !defined( __WINSCW__ ) +#define REMOTE +#endif + +#ifdef REMOTE + _LIT(KCanned, "http://waplabdc.nokia-boston.com/browser/users/rss/feeds_canned_rss/"); + _LIT(KCannedAtom, "http://waplabdc.nokia-boston.com/browser/users/rss/feeds_canned_atom/"); + //_LIT(KLive, "http://waplabdc.nokia-boston.com/browser/users/rss/live.opml"); +#else + _LIT(KCanned, "file://c:/feeds_canned_rss/"); + _LIT(KCannedAtom, "file://c:/feeds_canned_atom/"); + //_LIT(KLive, "file://c:/live.opml"); +#endif + + TInt err = KErrNone; + + iOperation = EParser; + + switch (aSuite) + { + case ECanned: + TRAP(err, TestFeedsL(KCanned, 0, 2530)); + break; + + case ECannedShort: + TRAP(err, TestFeedsL(KCanned, 0, 100)); + break; + + case ECannedStartAt: + TRAP(err, TestFeedsL(KCanned, aStartAt, aStartAt)); + break; + + case ECannedAtom: + TRAP(err, TestFeedsL(KCannedAtom, 0, 350)); + break; + + case ELive: + //TRAP(err, TestFolderL(KLive)); + break; + } + + if (err != KErrNone) + { + FEED_LOG1(_L("Feeds"), _L("Feeds_Errors.log"), + EFileLoggingModeAppend, _L("Warning!!! CTestHarness::Start failed, error[%d]."), err); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::TestFeedL +// +// Tests a single Feed. +// ----------------------------------------------------------------------------- +// +void CTestHarness::TestFeedL(const TDesC& aPath) + { + // Update the status pane to show some feedback to the user. + TPtr ptr(const_cast(aPath.Ptr()), aPath.Length(), aPath.Length()); + + if (ptr.Length() > 20) + { + ptr.Set(const_cast(aPath.Ptr()) + + (aPath.Length() - 20), 20, 20); + } + StatusPane::SetTitleL(ptr); + + // Save the feed's url. + delete iCurrentFeedUrl; + iCurrentFeedUrl = NULL; + + iCurrentFeedUrl = aPath.AllocL(); + + // Schedule the test to run after the call stack unrolls. + iIdle = CIdle::NewL(CActive::EPriorityIdle); + iIdle->Start(TCallBack(RunTest, this)); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::TestFeedsL +// +// Tests all feeds in the given folder, where the feeds must be named XX.xml where +// XX are consecutive integers (ie 1.xml, 2.xml, etc.). +// ----------------------------------------------------------------------------- +// +void CTestHarness::TestFeedsL(const TDesC& aDirPath, TInt aStartIndex, TInt aEndIndex) + { + iDirPath = aDirPath.AllocL(); + iFeedIndex = aStartIndex; + iEndFileIndex = aEndIndex; + iTestingFeedSeries = TRUE; + + TestNextFeedInSeriesL(); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::TestNextFeedInSeriesL +// +// Tests a single Feed given the current value of iFeedIndex. See TestFeedsL. +// ----------------------------------------------------------------------------- +// +void CTestHarness::TestNextFeedInSeriesL() + { + TBuf16<100> path; + + // Test the next Feed. + if (iFeedIndex <= iEndFileIndex) + { + path.Format(_L("%S%d.xml"), iDirPath, iFeedIndex); + iFeedIndex++; + + TestFeedL(path); + } + // Otherwise we're all done. + else + { + _LIT(KDone, "Done!"); + + iTestingFeedSeries = FALSE; + + // All done... + iObserver.Completed(); + StatusPane::SetTitleL(KDone()); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::FeedRequestCompleted +// +// Called when the asynchronous request is complete. +// ----------------------------------------------------------------------------- +// +// TODO: Trap the leaving methods. +void CTestHarness::FeedRequestCompleted(TInt aStatus) + { + // Close the wait dialog. + iWaitDialog->Close(); + + if (aStatus == KErrNone) + { + switch( iOperation ) + { + case EFetchFeed: + { + iFeed.Feed().Debug_PrintInfo( iFeed.Feed().Url(), iLogFile ); + iFeed.Feed().Debug_Print(); + + // Extract out the intial item status + RArray itemIds(20); + RArray itemStatus(20); + + itemIds.Reset(); + itemStatus.Reset(); + + TRAP_IGNORE(iFeed.Feed().ItemStatusL( itemIds, itemStatus )); + + // update folder item for unread count + TInt unreadCount = 0; + for (TInt i = 0; i < itemStatus.Count(); i++) + { + if ( itemStatus[i] == EUnreadItem || itemStatus[i] == ENewItem ) + { + unreadCount++; + } + } + + // unread count from folder item should be same as from feed + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("")); + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, + _L("=============================================================================================================")); + + if( !CheckRootFolderItem() ) + { + return; + } + + CFolderItem* item = const_cast (iRootFolder.RootFolderItem().Search( iFeed.Feed().Title() )); + + FEED_LOG2(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, + _L("Folder Item: %d originally has unread count: %d"), item->Id(), item->UnreadCount()); + FEED_LOG2(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("Feed: %d has unread count: %d"), iFeed.Feed().Id(), unreadCount); + + item->SetUnreadCount( unreadCount ); + } + break; + + case EParser: + { + iFeed.Feed().Debug_PrintInfo(*iCurrentFeedUrl, iLogFile); + iFeed.Feed().Debug_Print(); + + delete iCurrentFeedUrl; + iCurrentFeedUrl = NULL; + + // Start the next local-feed test. + if (iTestingFeedSeries == TRUE) + { + TRAPD(err, TestNextFeedInSeriesL()); + if (err != KErrNone) + { + FEED_LOG(_L("Feeds"), _L("Feeds_Errors.log"), + EFileLoggingModeAppend, _L("Warning!!! Failed to start the next test!")); + } + } + + #if 0 + // Start the next folder-feed test. + else if (iTestingFolder == TRUE) + { + TRAP(err, TestNextFeedInFolderL()); + if (err != KErrNone) + { + FEED_LOG(_L("Feeds"), _L("Feeds_Errors.log"), + EFileLoggingModeAppend, _L("Warning!!! Failed to start the next test!")); + } + } + #endif + } + break; + + default: + break; + } + } + // Otherwise show an error. + else + { + // If the server terminated, reconnect to it. + if (aStatus == KErrServerTerminated) + { + DisconnectFromServer(); + TRAP_IGNORE(ConnectToServerL()); + + // TODO: Show the FolderView. + } + + ShowServerError(aStatus); + + if( iOperation == EParser ) + { + TUint8* asciiBuf = new TUint8[iCurrentFeedUrl->Length() + 50]; + + if (asciiBuf != NULL) + { + TPtr8 asciiPtr(asciiBuf, 0, iCurrentFeedUrl->Length() + 50); + TPtrC16 ucs2Ptr(*iCurrentFeedUrl); + + asciiPtr.Copy(_L8("Feed Completed[")); + asciiPtr.AppendNum(aStatus); + asciiPtr.Append(_L8("]: ")); + asciiPtr.Append(ucs2Ptr); + asciiPtr.Append(_L8("\r\n")); + asciiPtr.ZeroTerminate(); + + iStatusFile.Write(asciiPtr); + + delete asciiBuf; + } + } + } + } + + +// ----------------------------------------------------------------------------- +// CFeedsViewMgr::NetworkConnectionNeededL +// +// Request to create a network connection. +// ----------------------------------------------------------------------------- +// +void CTestHarness::NetworkConnectionNeededL(TInt* aConnectionPtr, + TInt& aSockSvrHandle, TBool& aNewConn, TApBearerType& aBearerType) + { + iConMgr->SetRequestedAP( 0 ); + + // Open a connection. + iConMgr->StartConnectionL(ETrue); + + // Set the connection, server handler, and bearer type. + aNewConn = ETrue; + *aConnectionPtr = (TInt) &iConMgr->Connection(); + aSockSvrHandle = (TInt) iConMgr->SocketServer().Handle(); + aBearerType = iConMgr->CurrentBearerTypeL(); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::RunTest +// +// Runs the next test. +// ----------------------------------------------------------------------------- +// +TInt CTestHarness::RunTest(TAny* aPtr) + { + CTestHarness* self = static_cast(aPtr); + + // Start fetching the feed: 2nd param is the folder list ID, 0 is the default folder list ID + TRAP_IGNORE(self->iFeed.FetchFeedL(*(self->iCurrentFeedUrl), NTFolderListId, EFalse, ETrue)); + + return EFalse; + } + + +#if 0 +// ----------------------------------------------------------------------------- +// CTestHarness::Completed +// +// Called upon completion of the get folder task. +// ----------------------------------------------------------------------------- +// +void CTestHarness::Completed(TInt /*aStatusCode*/, CFolderItem* aFolder) + { + // Delete the task. + if (iGetFolderTask != NULL) + { + iGetFolderTask->AutoDelete(); + iGetFolderTask = NULL; + } + + if (aFolder != NULL) + { + iFolder = aFolder; + + if (iTestingFolder == TRUE) + { + TRAPD(err, TestNextFeedInFolderL()); + if (err != KErrNone) + { + FEED_LOG(_L("Feeds"), _L("Feeds_Errors.log"), + EFileLoggingModeAppend, _L("Warning!!! Failed to start the next test!")); + } + } + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::TestFolderL +// +// Tests all feeds in the OPML file. +// ----------------------------------------------------------------------------- +// +void CTestHarness::TestFolderL(const TDesC& aPath) + { + // Start the task + iGetFolderTask = CGetFolderTask::NewL(aPath, *this); + iGetFolderTask->StartTaskL(); + iGetFolderTask->EnableAutoDeleteL(); + + iTestingFolder = TRUE; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::TestNextFeedInFolderL +// +// Tests a single Feed given the current value of iFeedIndex. See TestFolderL. +// ----------------------------------------------------------------------------- +// +void CTestHarness::TestNextFeedInFolderL() + { + const CFolderItem* nextItem = NULL; + const TDesC* url = NULL; + + while (iFeedIndex < iFolder->FolderItemCount()) + { + // Get the next Feed. + nextItem = iFolder->FolderItem(iFeedIndex); + iFeedIndex++; + + // Ignore Folders + if (nextItem->IsFolder() == TRUE) + { + continue; + } + + // Get the Feed's url. + url = nextItem->SourceUrl(); + + // Ignore Items without urls + if (url == NULL) + { + continue; + } + + // Test the next Feed. + TestFeedL(*url); + return; + } + + // Otherwise we're all done. + if (iFeedIndex == iFolder->FolderItemCount()) + { + _LIT(KDone, "Done!"); + + iTestingFolder = FALSE; + + // All done... + iObserver.Completed(); + StatusPane::SetTitleL(KDone()); + } + } +#endif + + +// ----------------------------------------------------------------------------- +// CTestHarness::DebugPrintTablesL +// +// Debug print database tables. +// ----------------------------------------------------------------------------- +// +void CTestHarness::DebugPrintTablesL() + { + // Import the feeds. + iFeedsServer.DebugPrintTablesL(); + + iOperation = EPrintDBTables; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::FetchRootFolderItemL +// ----------------------------------------------------------------------------- +// +void CTestHarness::FetchRootFolderItemL() + { + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_OPENING_FEED ); + + // Fetch the feeds. + iRootFolder.FetchRootFolderItemL(); + + iOperation = EFetchRootFolderItem; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::WatchFolderListL +// ----------------------------------------------------------------------------- +// +void CTestHarness::WatchFolderListL() + { + iRootFolder.WatchFolderListL(); + + iOperation = EWatchFolderList; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::ImportOPMLL +// +// Import OPML file. +// ----------------------------------------------------------------------------- +// +void CTestHarness::ImportOPMLL( const TDesC& aPath, TBool aClearFolderList ) + { + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_OPENING_FEED ); + + // Import the feeds. + iRootFolder.ImportOPMLL( aPath, aClearFolderList ); + + iOperation = EImportOPML; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::UpdateAllL +// ----------------------------------------------------------------------------- +// +void CTestHarness::UpdateAllL() + { + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_UPDATING_ALL_WAIT_DIALOG ); + + iRootFolder.UpdateAllL(); + + iOperation = EUpdateAll; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::AddFolderItemL +// ----------------------------------------------------------------------------- +// +void CTestHarness::AddFolderItemL( TBool aIsFolder ) + { + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_OPENING_FEED ); + + if( !CheckRootFolderItem() ) + { + return; + } + + if( aIsFolder ) + { + iRootFolder.AddFolderItemL( KNewTitle(), KNullDesC, ETrue, iRootFolder.RootFolderItem() ); + } + else + { + iRootFolder.AddFolderItemL( KNewTitle(), KUrl(), EFalse, iRootFolder.RootFolderItem() ); + } + + iOperation = EAddFolderItem; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::ChangeFolderItemL +// ----------------------------------------------------------------------------- +// +void CTestHarness::ChangeFolderItemL() + { + const CFolderItem* folderItem = NULL; + + if( !CheckRootFolderItem() ) + { + return; + } + + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_OPENING_FEED ); + + TInt count = iRootFolder.RootFolderItem().FolderItemCount(); + + if( count != 0 ) + { + // Copy the folder items under root into a temp array. + folderItem = iRootFolder.RootFolderItem().FolderItemAt( 0 ); + if( folderItem->IsFolder() ) + { + iRootFolder.ChangeFolderItemL( *folderItem, KRenamedTitle(), KNullDesC ); + } + else + { + iRootFolder.ChangeFolderItemL( *folderItem, KRenamedTitle(), KChangedUrl ); + } + + iOperation = EChangeFolderItem; + } + else + { + FolderItemRequestCompleted( KErrNotFound ); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::DeleteFolderItemsL +// ----------------------------------------------------------------------------- +// +void CTestHarness::DeleteFolderItemsL() + { + const CFolderItem* folderItem = NULL; + + if( !CheckRootFolderItem() ) + { + return; + } + + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_OPENING_FEED ); + + TInt count = iRootFolder.RootFolderItem().FolderItemCount(); + + if( count != 0 ) + { + // Copy the folder items under root into a temp array. + folderItem = iRootFolder.RootFolderItem().FolderItemAt( 0 ); + iMovedItems.Reset(); + User::LeaveIfError( iMovedItems.Append( folderItem ) ); + iRootFolder.DeleteFolderItemsL( iMovedItems ); + + iOperation = EDeleteFolderItems; + } + else + { + FolderItemRequestCompleted( KErrNotFound ); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::DeleteAllFolderItemsL +// ----------------------------------------------------------------------------- +// +void CTestHarness::DeleteAllFolderItemsL() + { + const CFolderItem* folderItem = NULL; + + if( !CheckRootFolderItem() ) + { + return; + } + + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_OPENING_FEED ); + + TInt count = iRootFolder.RootFolderItem().FolderItemCount(); + + if( count != 0 ) + { + iMovedItems.Reset(); + // Copy the folder items under root into a temp array. + for( int i=0; iIsFolder() ) + { + dest = folderItem; + } + else + { + User::LeaveIfError( iMovedItems.Append( folderItem ) ); + } + } + + if( dest != NULL && count != 0 ) + { + // Move the items to the "New Folder". + iRootFolder.MoveFolderItemsToL( iMovedItems, *dest ); + + iOperation = EMoveFolderItemsTo; + } + else + { + FolderItemRequestCompleted( KErrNotFound ); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::MoveFolderItemsL +// +// Moves the items to a different position in its parent folder. +// ----------------------------------------------------------------------------- +// +void CTestHarness::MoveFolderItemsL() + { + const CFolderItem* folderItem = NULL; + TInt targetIndex; + + if( !CheckRootFolderItem() ) + { + return; + } + + // Copy the marked items into a temp array. + TInt count = iRootFolder.RootFolderItem().FolderItemCount(); + + // Get the target index. + targetIndex = count; + + iMovedItems.Reset(); + TInt min = 2 < count ? 2 : count; + // Copy the 1st two folder items under root into a temp array. + for( int i=0; iId(), index); + } + else + { + FEED_LOG1(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("Error: Folder item: %d is not found in RootFolder"), iMovedItems[i]->Id()); + } + } + + // Move the items to the the taget index. + iRootFolder.MoveFolderItemsL( iMovedItems, targetIndex ); + + iOperation = EMoveFolderItems; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::UpdateFolderItemsL +// ----------------------------------------------------------------------------- +// +void CTestHarness::UpdateFolderItemsL() + { + const CFolderItem* folderItem = NULL; + + if( !CheckRootFolderItem() ) + { + return; + } + + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_OPENING_FEED ); + + iMovedItems.Reset(); + + // Copy the feed into a temp array. + TInt count = iRootFolder.RootFolderItem().FolderItemCount(); + for( int i = 0; i < count; i++ ) + { + folderItem = iRootFolder.RootFolderItem().FolderItemAt( i ); + // has to be feed + if( !folderItem->IsFolder() ) + { + User::LeaveIfError( iMovedItems.Append( folderItem ) ); + } + } + + if( iMovedItems.Count() != 0 ) + { + iRootFolder.UpdateFolderItemsL( iMovedItems ); + + iOperation = EUpdateFolderItems; + } + else + { + FolderItemRequestCompleted( KErrNotFound ); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::FetchFeedL +// ----------------------------------------------------------------------------- +// +void CTestHarness::FetchFeedL() + { + const CFolderItem* folderItem = NULL; + TBool found = EFalse; + + if( !CheckRootFolderItem() ) + { + return; + } + + // TODO: Start the background indicator. + iWaitDialog->ShowWaitDialogL( R_FEEDS_OPENING_FEED ); + + TInt count = iRootFolder.RootFolderItem().FolderItemCount(); + + // Copy the folder items under root into a temp array. + for( int i=0; iIsFolder() ) + { + // aForceUpdate, aNoCache is EFalse by default + iFeed.FetchFeedL( folderItem->FeedId() ); + + iOperation = EFetchFeed; + found = ETrue; + break; + } + } + + if( !found ) + { + FeedRequestCompleted( KErrNotFound ); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::UpdateFeedItemStatusL +// ----------------------------------------------------------------------------- +// +void CTestHarness::UpdateFeedItemStatusL() + { + if( iFeed.HasCurrentFeed() ) + { + RArray ids(20); + RArray status(20); + RArray itemIds(20); + RArray itemStatus(20); + TInt unreadCount = 0; + + ids.Reset(); + status.Reset(); + itemIds.Reset(); + itemStatus.Reset(); + + CleanupClosePushL(ids); + CleanupClosePushL(status); + CleanupClosePushL(itemIds); + CleanupClosePushL(itemStatus); + + // Extract out the intial item status + iFeed.Feed().ItemStatusL( itemIds, itemStatus ); + + if (itemStatus.Count() != 0) + { + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("")); + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, + _L("=============================================================================================================")); + + for (TInt i = 0; i < itemStatus.Count(); i++) + { + if ( itemStatus[i] == EUnreadItem || itemStatus[i] == ENewItem ) + { + unreadCount++; + } + } + + // Build new status arrays that only contains items that changed. + TInt counter = 0; + for (TInt i = 0; i < itemStatus.Count(); i++) + { + if( itemStatus[i] == ENewItem || itemStatus[i] == EUnreadItem ) + { + itemStatus[i] = EReadItem; + + ids.AppendL(itemIds[i]); + status.AppendL(itemStatus[i]); + + FEED_LOG1(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("Article: %d changed status to ERead"), itemIds[i]); + + // In current UI, status can only change from New -> Read, or Unread -> Read + if ( itemStatus[i] == EReadItem ) + { + unreadCount--; + } + + // only change 3 items + if( counter == 2 ) + { + break; + } + counter++; + } + } + + // Write the item status out to the server. + iFeed.UpdateFeedItemStatusL(ids, status, unreadCount); + + iOperation = EFetchFeed; + + FEED_LOG2(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("Feed: %d has updated unread count: %d"), iFeed.Feed().Id(), unreadCount); + } + + CleanupStack::PopAndDestroy(/*itemStatus*/); + CleanupStack::PopAndDestroy(/*itemIds*/); + CleanupStack::PopAndDestroy(/*status*/); + CleanupStack::PopAndDestroy(/*ids*/); + } + else + { + FeedRequestCompleted( KErrNotFound ); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::UpdateSettingsL() +// ----------------------------------------------------------------------------- +// +void CTestHarness::UpdateSettingsL( TBool aOn ) + { + TFeedsServerSettings settings; + TInt freq = 0; + TUint32 autoUpdatingAP( 0 ); + TBool isAutoUpdating = EFalse; + + // turn on + if( aOn ) + { + freq = 2; + isAutoUpdating = ETrue; + autoUpdatingAP = 6; + } + // else: turn off + + settings.SetAutoUpdate( isAutoUpdating ); + settings.SetAutoUpdateFreq( freq ); + settings.SetAutoUpdateAP( autoUpdatingAP ); + + // Pass the updated settings to the server. + iFeedsServer.UpdateSettingsL( settings ); + + FEED_LOG3(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("Set: autoUpdate: %d, freq: %d, AP: %d"), isAutoUpdating, freq, autoUpdatingAP); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::FetchServerSettingsSyncL +// +// Returns Feeds Server related settings synchronously. +// ----------------------------------------------------------------------------- +// +void CTestHarness::FetchServerSettingsSyncL() + { + const TFeedsServerSettings settings = iFeedsServer.FetchServerSettingsSyncL(); + TBool isAutoUpdating = settings.AutoUpdate(); + TInt freq = settings.AutoUpdateFreq(); + TInt autoUpdatingAP = settings.AutoUpdateAP(); + + FEED_LOG3(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("FetchServerSettingsSyncL: autoUpdate: %d, freq: %d, AP: %d"), isAutoUpdating, freq, autoUpdatingAP); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::FetchServerSettingsL +// +// Returns Feeds Server related settings asynchronously. +// ----------------------------------------------------------------------------- +// +void CTestHarness::FetchServerSettingsL() + { + iFeedsServer.FetchServerSettingsL(); + + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("Called FetchServerSettingsL.")); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::SettingsChanged +// +// Notifies from the feeds server that the settings have changed. +// ----------------------------------------------------------------------------- +// +void CTestHarness::SettingsChanged( TInt aStatus ) + { + if( aStatus == KErrNone ) + { + const TFeedsServerSettings settings = iFeedsServer.Settings(); + TBool isAutoUpdating = settings.AutoUpdate(); + TInt freq = settings.AutoUpdateFreq(); + TInt autoUpdatingAP = settings.AutoUpdateAP(); + + FEED_LOG3(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("SettingsChanged: autoUpdate: %d, freq: %d, AP: %d"), isAutoUpdating, freq, autoUpdatingAP); + } + else + { + FEED_LOG1(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("SettingsChanged Error: %d"), aStatus); + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::DisconnectL +// +// Disconnect mannual update connection. +// ----------------------------------------------------------------------------- +// +void CTestHarness::DisconnectL() + { + iFeedsServer.DisconnectManualUpdateConnectionL(); + + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), EFileLoggingModeAppend, _L("Disconnected")); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::ConnectToServerL +// +// Connect to the server. +// ----------------------------------------------------------------------------- +// +void CTestHarness::ConnectToServerL() + { + if (!iIsConnected) + { + User::LeaveIfError( iFeedsServer.Connect() ); + User::LeaveIfError( iRootFolder.Open(iFeedsServer) ); + User::LeaveIfError( iFeed.Open(iFeedsServer) ); + + iIsConnected = ETrue; + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::DisconnectFromServer +// +// Disconnect from the server. +// ----------------------------------------------------------------------------- +// +void CTestHarness::DisconnectFromServer() + { + iFeed.Close(); + iRootFolder.Close(); + iFeedsServer.Close(); + + iIsConnected = EFalse; + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::FolderItemRequestCompleted +// +// Called when the asynchronous request is complete. +// ----------------------------------------------------------------------------- +// +// TODO: Trap the leaving methods. +void CTestHarness::FolderItemRequestCompleted(TInt aStatus) + { + // Close the wait dialog. + iWaitDialog->Close(); + + // Show the view if everything went ok. + if (aStatus == KErrNone) + { + // Set the updated folder + TInt count = iRootFolder.RootFolderItem().FolderItemCount(); + + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("")); + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, + _L("=============================================================================================================")); + FEED_LOG1(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("\tFolderItems: %d"), count); + FEED_LOG(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, + _L("=============================================================================================================")); + + for( int i=0; i 0) + { + FEED_LOG1(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("\t\tTitle: %S"), &aFolderItem.Name()); + } + + if( !aFolderItem.IsFolder() ) + { + // url + if (aFolderItem.SourceUrl().Length() > 0) + { + FEED_LOG1(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("\t\tLink: %S"), &aFolderItem.SourceUrl()); + } + + // unread count + FEED_LOG1(_L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("\t\tUnreadCount: %d"), aFolderItem.UnreadCount()); + + // article titles + TInt count = aFolderItem.MiniItemsCount(); + if (count > 0) + { + for( int i=0; iTitle() ); + FEED_LOG1( _L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("\t\tArticleTitle: %S"), &title ); + FEED_LOG1( _L("Feeds"), _L("Feeds_Test.log"), + EFileLoggingModeAppend, _L("\t\tArticleId: %d"), miniItem->Id() ); + } + } + } + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::DialogDismissedL +// +// Called when the user presses the cancel button. +// ----------------------------------------------------------------------------- +// +void CTestHarness::DialogDismissedL() + { + // Cancel all activities that can be cancelled. + iFeedsServer.CancelAllL(); + } + + +// ----------------------------------------------------------------------------- +// CTestHarness::CheckRootFolderItem +// ----------------------------------------------------------------------------- +// +TBool CTestHarness::CheckRootFolderItem() + { + if( iRootFolder.HasRootFolderItem() ) + { + return ETrue; + } + else + { + FolderItemRequestCompleted( KErrNotFound ); + + return EFalse; + } + }