browserutilities/feedsengine/FeedsServer/Server/src/UpdateFeedTask.cpp
changeset 0 dd21522fd290
child 13 10e98eab6f85
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/feedsengine/FeedsServer/Server/src/UpdateFeedTask.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,352 @@
+/*
+* 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:  A task to update a Feed.
+*
+*/
+
+
+#include "FeedAttributes.h"
+#include "FeedHandler.h"
+#include "FeedsServer.h"
+#include "LeakTracker.h"
+#include "Logger.h"
+#include "PackedFeed.h"
+#include "UpdateFeedTask.h"
+#include "UrlHandlerFactory.h"
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUpdateFeedTask* CUpdateFeedTask::NewL(CFeedsServer& aFeedsServer, 
+        const TDesC& aUrl,TInt aFeedId, MUpdateFeedTaskObserver& aObserver)
+    {
+    CUpdateFeedTask* self = new (ELeave) CUpdateFeedTask(aFeedsServer, aObserver);
+    
+    CleanupStack::PushL(self);
+    self->ConstructL(aUrl,aFeedId);
+    CleanupStack::Pop();
+
+    return self;
+    }
+    
+        
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUpdateFeedTask* CUpdateFeedTask::NewL(CFeedsServer& aFeedsServer, const TDesC& aUrl,TInt aFeedId,
+        TDesC8* aFeedBuffer, MUpdateFeedTaskObserver& aObserver)
+    {
+    CUpdateFeedTask* self = new (ELeave) CUpdateFeedTask(aFeedsServer, aObserver);
+    
+    CleanupStack::PushL(self);
+    self->ConstructL(aUrl,aFeedId);
+    CleanupStack::Pop();
+
+    self->iFileBuffer = aFeedBuffer;
+    return self;
+    }
+
+        
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::CUpdateFeedTask
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CUpdateFeedTask::CUpdateFeedTask(CFeedsServer& aFeedsServer, MUpdateFeedTaskObserver& aObserver):
+        CTask(aFeedsServer), iLeakTracker(CLeakTracker::EUpdateFeedTask), iObserver(aObserver)
+    {
+    }
+        
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::ConstructL(const TDesC& aUrl,TInt aFeedId)
+    {
+    BaseConstructL(ETrue);
+    iFeedId = aFeedId;
+    iUrl = aUrl.AllocL();        
+    iPackedFeed = CPackedFeed::NewL();
+    iIdle = CIdle::NewL(CActive::EPriorityIdle);
+    }        
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::~CUpdateFeedTask
+// Deconstructor.
+// -----------------------------------------------------------------------------
+//
+CUpdateFeedTask::~CUpdateFeedTask()
+    {
+    delete iUrl;
+    delete iIdle;
+    delete iUrlHandler;
+
+    delete iFileBuffer;
+    delete iPackedFeed;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::StartTaskL.
+//
+// Starts the task.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::StartTaskL()
+    {
+    // If the feed was already provided then get ready to parse the buffer.
+    if (iFileBuffer != NULL)
+        {
+        FEED_LOG(_L("Feeds"), _L("Feeds.log"), 
+            EFileLoggingModeAppend, _L("Processing Feed: External Buffer"));
+            
+        // Parse the buffer, but to be consistent with the asynchronous 
+        // behavior of using an UrlHandlers the buffer isn't parsed until 
+        // after the callstack unrolls.
+        iIdle->Start(TCallBack(DelayedParse, this));
+        }
+
+    // If the feed is coming from a UrlHandler, then start the load.
+    else if (iUrl != NULL)
+        {
+        FEED_LOG1(_L("Feeds"), _L("Feeds.log"), 
+            EFileLoggingModeAppend, _L("Processing Feed: %S"), iUrl);
+
+        iUrlHandler = UrlHandlerFactory::NewUrlHandlerL( iObserver.HttpConnection(), *iUrl );
+        iUrlHandler->LoadUrlL(*iUrl, *this);
+        }
+                
+    // Otherwise, panic
+    else
+        {
+        // TODO:
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::StartWait
+//
+// Notifies the observer that the UrlHandler is about to start a lengthy operation.
+// In response the observer could display somekind of status indicator.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::StartWait()
+    {
+    iObserver.StartWait();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::LoadCompleted
+//
+// Passes the status code and responseBody to the observer.  The observer
+// adopts aResponseBody.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::LoadCompleted(TInt aStatusCode, TDesC8* aResponseBody,
+        const TDesC& aContentType, const TDesC& aCharSet)
+    {
+    TInt err;
+    
+    // Parse the buffer
+    if (aResponseBody != NULL)
+        {
+        // TODO: Just pass iPackedFeed instead and remove the
+        //         whole observer interface altogether.
+        TRAP(err, iFeedsServer.FeedHandler().ParseL(*aResponseBody, 
+                aContentType, aCharSet, *this));
+        if (err != KErrNone)
+            {
+            delete iPackedFeed;
+            iPackedFeed = NULL;
+            TRAP_IGNORE(iFeedsServer.ResetXmlUtilsL());
+            }
+        else
+            {
+            iPackedFeed->Trim();
+            }
+
+        delete aResponseBody;
+        
+        // Pass the feed to the observer.
+        iObserver.Completed(iPackedFeed, *iUrl,iFeedId, err);
+        iPackedFeed = NULL;
+        }
+    
+    // The load failed, exit cleanly.
+    else
+        {
+        // Pass the status to the observer.
+        iObserver.Completed(NULL, *iUrl,iFeedId, aStatusCode);
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::FeedBeginsL
+//
+// The beginning of a feed was found.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::FeedBeginsL()
+    {
+    iPackedFeed->FeedBeginsL();
+    
+    // Add the oringal url too.  
+    iPackedFeed->AddAttributeL(EFeedAttributeFeedUrl, *iUrl);
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::FeedEndsL
+//
+// The end of a feed was found.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::FeedEndsL()
+    {
+    iPackedFeed->FeedEndsL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::ItemBeginsL
+//
+// The beginning of a item was found.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::ItemBeginsL()
+    {
+    iPackedFeed->ItemBeginsL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::ItemEndsL
+//
+// The end of a item was found.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::ItemEndsL()
+    {
+    iPackedFeed->ItemEndsL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::EnclosureBeginsL
+//
+// The beginning of a enclosure was found.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::EnclosureBeginsL()
+    {
+    iPackedFeed->EnclosureBeginsL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::EnclosureEndsL
+//
+// The end of a enclosure was found.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::EnclosureEndsL()
+    {
+    iPackedFeed->EnclosureEndsL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::AddAttributeL
+//
+// A attribute was found.  This attribute should be applied to
+// the enclosing entity (Feed, Item, or Enclosure).
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::AddAttributeL(TInt aAttribute, const TDesC& aValue)
+    {
+    if (aValue.Length() > 0)
+        {
+        iPackedFeed->AddAttributeL(aAttribute, aValue);
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::OtherTitleL
+//
+// An unimportant element was found.  The client can use this information for 
+// feed validation.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::OtherTitleL()
+    {
+    iPackedFeed->OtherTitleL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::OtherDescriptionL
+//
+// An unimportant element was found.  The client can use this information for 
+// feed validation.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::OtherDescriptionL()
+    {
+    iPackedFeed->OtherDescriptionL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpdateFeedTask::OtherLinkL
+//
+// An unimportant element was found.  The client can use this information for 
+// feed validation.
+// -----------------------------------------------------------------------------
+//
+void CUpdateFeedTask::OtherLinkL()
+    {
+    iPackedFeed->OtherLinkL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CFileHandler::DelayedParse
+// 
+// Parses the buffer to the observer now that the callstack has unrolled.
+// -----------------------------------------------------------------------------
+//
+TInt CUpdateFeedTask::DelayedParse(TAny* aPtr)
+    {
+    CUpdateFeedTask*  self = static_cast<CUpdateFeedTask*>(aPtr);
+    
+    self->LoadCompleted(KErrNone, self->iFileBuffer, KNullDesC, KNullDesC);
+    self->iFileBuffer = NULL;
+    
+    return EFalse;
+    }