diff -r 000000000000 -r dd21522fd290 browserutilities/feedsengine/FeedsServer/Server/src/UpdateFeedTask.cpp --- /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(aPtr); + + self->LoadCompleted(KErrNone, self->iFileBuffer, KNullDesC, KNullDesC); + self->iFileBuffer = NULL; + + return EFalse; + }