browserutilities/feedsengine/FeedsServer/Client/src/FeedsServerFeed.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /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<TInt>& aItemIds,
+        const RArray<TItemStatus>& aItemStatus, TInt aUnreadCount)
+    {
+    // Just return if there isn't an active feed.
+    if (iFeed == NULL)
+        {
+        return;
+        }
+     
+    iActiveRequests[0]->GetFeedInterface()->UpdateFeedItemStatusL(aItemIds, (const RArray<TFeedItemStatus> &)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;
+    }