browserutilities/feedsengine/FeedsServer/FeedHandler/src/FeedHandler.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /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*/);
+    }