diff -r 000000000000 -r dd21522fd290 browserutilities/feedsengine/FeedsServer/Client/src/FeedsServerFeed.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/feedsengine/FeedsServer/Client/src/FeedsServerFeed.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,201 @@ +/* +* Copyright (c) 2005 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 client side connection to a feed on the FeedsSever. +* +*/ + + +#include "FeedsServerClient.h" +#include "FeedsServerFeed.h" +#include "FeedRequestHandlers.h" +#include "ClientRequestHandlers.h" + + + +#include "Logger.h" + +// ----------------------------------------------------------------------------- +// RFeed::RFeed +// +// C++ default constructor can NOT contain any code that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RFeed::RFeed(MFeedObserver& aObserver): + iObserver(aObserver), iFeed(NULL), iActiveRequests(3), iPendingFetchFeed(EFalse), + iFeedsServer( NULL ) + { + CFeedRequestHandler *feedReqHandler = NULL; + + TRAP_IGNORE( + { + feedReqHandler = CFeedRequestHandler::NewL(); + + CleanupStack::PushL(feedReqHandler); + iActiveRequests.AppendL(feedReqHandler); + CleanupStack::Pop(feedReqHandler); + }); + } + + +// ----------------------------------------------------------------------------- +// RFeed::Open +// +// Opens a session to the given feed on the server. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RFeed::Open(RFeedsServer &aFeedsServer) + { + // TODO: Create an empty feed which can be returned when something happens + // and a valid feed isn't available. + + iFeedsServer = &aFeedsServer; + RFeedsInterface *feedsInterface = iFeedsServer->iActiveRequests[0]->GetFeedInterface(); + iActiveRequests[0]->SetFeedInterface(feedsInterface); + iFeedsServer->SetServerFeed(*this); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// RFeed::Close +// +// Closes the connection to the server. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RFeed::Close() + { + + iFeedsServer = NULL; + iActiveRequests.ResetAndDestroy(); + delete iFeed; + iFeed = NULL; + + iPendingFetchFeed = EFalse; + } + + +// ----------------------------------------------------------------------------- +// RFolderItem::RequestHandlerCompletedL +// +// Notifies the observer that the request is completed. +// ----------------------------------------------------------------------------- +// +void RFeed::RequestHandlerCompletedL(CTransaction& aTrans, TInt aStatus) + { + switch (aTrans.Type()) + { + case CTransaction::EFetchFeed: + iPendingFetchFeed = EFalse; + if (aStatus == KErrNone) + { + delete iFeed; + iFeed = NULL; + iFeed = CFeed::NewL(iActiveRequests[0]->GetFeedInterface()->Feed()); + } + // Notify the observer that the request has completed. + iObserver.FeedRequestCompleted(aStatus); + break; + + case CTransaction::EUpdateItemStatus: + // TODO: Notify the observer. + break; + } + } + + +// ----------------------------------------------------------------------------- +// RFeed::FetchFeedL +// +// Fetches the given feed. FeedRequestCompleted is called upon completion. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RFeed::FetchFeedL(const TDesC& aUrl, TInt /*aFolderListId*/, TBool aForceUpdate, TBool aNoCache) + { + iActiveRequests[0]->SetOperationRequested(ETrue); + iActiveRequests[0]->GetFeedInterface()->FetchL(aUrl, aForceUpdate, aNoCache); + } + +// ----------------------------------------------------------------------------- +// RFeed::FetchFeedL +// +// Fetches the given feed -- using the feed's id.. FeedRequestCompleted is +// called upon completion. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RFeed::FetchFeedL(TInt aFeedId, TBool aForceUpdate, TBool aNoCache) + { + RFeedsInterface *feedsInterface = iActiveRequests[0]->GetFeedInterface(); + + CFeedsEntity* entity = feedsInterface->SearchFeed(aFeedId, feedsInterface->RootFolder()); + if (entity) + { + iActiveRequests[0]->SetOperationRequested(ETrue); + feedsInterface->FetchL(*entity, aForceUpdate, aNoCache); + } + } + +// ----------------------------------------------------------------------------- +// RFeed::NetworkConnectionNeededL() +// ----------------------------------------------------------------------------- +// +void RFeed::NetworkConnectionNeededL( TInt* aConnectionPtr, TInt& aSockSvrHandle, + TBool& aNewConn, TApBearerType& aBearerType ) + { + iActiveRequests[0]->SetOperationRequested(EFalse); + iObserver.NetworkConnectionNeededL( aConnectionPtr, aSockSvrHandle, aNewConn, aBearerType ); + } + +// ----------------------------------------------------------------------------- +// RFeed::UpdateFeedItemStatusL +// +// Request the feeds server to update the feed's item status. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RFeed::UpdateFeedItemStatusL(const RArray& aItemIds, + const RArray& aItemStatus, TInt aUnreadCount) + { + // Just return if there isn't an active feed. + if (iFeed == NULL) + { + return; + } + + iActiveRequests[0]->GetFeedInterface()->UpdateFeedItemStatusL(aItemIds, (const RArray &)aItemStatus, aUnreadCount); + } + + +// ----------------------------------------------------------------------------- +// RFeed::HasCurrentFeed +// +// Returns ETrue if it has an available current feed. +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool RFeed::HasCurrentFeed() const + { + return (iActiveRequests[0]->GetFeedInterface()->Feed() != NULL); + } + + +// ----------------------------------------------------------------------------- +// RFeed::Feed +// +// Once fetched, it returns the CFeed. This method panics the client if it is +// called before the feed item is available. +// ----------------------------------------------------------------------------- +// +EXPORT_C const CFeed& RFeed::Feed() const + { + return *iFeed; + }