diff -r 000000000000 -r dd21522fd290 browserutilities/feedsengine/FeedsServer/FeedHandler/src/FeedHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/feedsengine/FeedsServer/FeedHandler/src/FeedHandler.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,126 @@ +/* +* 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 top-level handler of Feeds. It takes a buffer and uses an +* appropriate feeds parser to create a Feed instance. +* +*/ + + +#include "CleanupLibXml2.h" +#include "FeedHandler.h" +#include "LeakTracker.h" +#include "RssFeedParser.h" +#include "AtomFeedParser.h" +#include "XmlUtils.h" + + +// ----------------------------------------------------------------------------- +// CFeedHandler::NewL +// +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CFeedHandler* CFeedHandler::NewL(CXmlUtils& aXmlUtils) + { + CFeedHandler* self = new (ELeave) CFeedHandler(aXmlUtils); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CFeedHandler::CFeedHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CFeedHandler::CFeedHandler(CXmlUtils& aXmlUtils): + iLeakTracker(CLeakTracker::EFeedHandler), iXmlUtils(aXmlUtils) + { + } + + +// ----------------------------------------------------------------------------- +// CFeedHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CFeedHandler::ConstructL() + { + } + + +// ----------------------------------------------------------------------------- +// CFeedHandler::~CFeedHandler +// Deconstructor. +// ----------------------------------------------------------------------------- +// +CFeedHandler::~CFeedHandler() + { + } + + +// ----------------------------------------------------------------------------- +// CFeedHandler::ParseFeedL +// +// Creates a Feed instance from the buffer. This method may modify aBuffer. +// ----------------------------------------------------------------------------- +// +void CFeedHandler::ParseL(TDesC8& aBuffer, const TDesC& aContentType, + const TDesC& aCharSet, MFeedParserObserver& aObserver) + { + CFeedParser* parser = NULL; + RXmlEngDocument document; + TBool feedParsed = EFalse; + + // Parse the buffer. + document = iXmlUtils.ParseBufferL(aBuffer, aCharSet); + CleanupClosePushL(document); + + // If this is an RSS document then use the RSS parser to create a feed. + if (CRssFeedParser::IsFeedSupported(iXmlUtils, document, aContentType)) + { + parser = CRssFeedParser::NewL(iXmlUtils); + CleanupStack::PushL(parser); + + parser->ParseFeedL(document, aObserver); + feedParsed = ETrue; + + CleanupStack::PopAndDestroy(parser); + } + + // If this is an Atom document then use the Atom parser to create a feed. + else if (CAtomFeedParser::IsFeedSupported(iXmlUtils, document, aContentType)) + { + parser = CAtomFeedParser::NewL(iXmlUtils); + CleanupStack::PushL(parser); + + parser->ParseFeedL(document, aObserver); + feedParsed = ETrue; + + CleanupStack::PopAndDestroy(parser); + } + + if (!feedParsed) + { + User::Leave(KErrNotSupported); + } + + // Clean up. + CleanupStack::PopAndDestroy(/*document*/); + }