videofeeds/mrssplugin/inc/CIptv3XmlContentHandler.h
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/mrssplugin/inc/CIptv3XmlContentHandler.h	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,558 @@
+/*
+* Copyright (c) 2007-2008 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:    XML Parser handler*
+*/
+
+
+
+
+#ifndef CIPTV3XMLCONTENTHANDLER_H
+#define CIPTV3XMLCONTENTHANDLER_H
+
+#include <e32std.h>
+#include <xml/contenthandler.h>
+
+class MIptvEpgVodCallback;
+class CIptvEpgCategory;
+class CIptvEpgContent;
+class CIptvRssPlugin;
+class CIptvMediaContent;
+class CIptvTerminalVideoSupport;
+
+// This is for MContentHandler XML parser.
+using namespace Xml;
+
+/**
+ *  XML Parser handler
+ *
+ *  Implements parser callbacks and support functions.
+ *  Stores interpreted XML content using given callback (SetVodCallback).
+ *
+ *  @lib IptvRssPlugin.dll
+ *  @since S60 v3.1 rel3
+ */
+class CIptvXmlContentHandler : public CBase,
+                               public MContentHandler
+    {
+
+public:
+
+    /**
+     * RSS Parser states.
+     */
+    enum TParserState
+        {
+        EIptvRssIdleState,
+        EIptvRssState,
+        EIptvRssChannelState,
+        EIptvRssChannelDescriptionState,
+        EIptvRssChannelLinkState,
+        EIptvRssChannelTitleState,
+        EIptvRssChannelImageState,
+        EIptvRssChannelImageUrlState,
+        EIptvRssItemState,
+        EIptvRssItemDescriptionState,
+        EIptvRssItemLinkState,
+        EIptvRssItemTitleState,
+        EIptvRssItemGuidState,
+        EIptvRssItemEnclosureState,
+        EIptvRssItemPubDate,
+        EIptvRssItemMediaGroupState,
+        EIptvRssItemMediaContentState,
+        EIptvRssItemMediaThumbnailState,
+        EIptvRssItemAuthorState,
+        EIptvRssItemMediaCopyrightState,
+        EIptvRssItemRatingState,
+        EIptvRssItemMediaCategoryState,
+        EIptvRssItemMediaCategoryEnclosureState
+        };
+
+    /**
+     * Parent rating interpretation scheme.
+     */
+    enum TMediaRatingScheme
+        {
+        EMediaRatingNotSet,
+        EMediaRatingSimple,
+        EMediaRatingNum,
+        EMediaRatingIcra,
+        EMediaRatingMpaa,
+        EMediaRatingVChip
+        };
+
+    /**
+     * Control interpretation of categories and channels.
+     */
+    enum TCategoryState
+        {
+        ENoChannel,             // Initial value
+        EChannelNoItem,         // Inside first channel, no items found yet
+        EItemsWithCategory,     // Inside first channel, all items found
+                                //   contains a category
+        EItemsNoCategory,       // Inside first channel, all items found do
+                                //   not contain a category
+        EItemsBoth,             // Inside channel, both itmes with and
+                                //   without category found
+        ESkipFurtherChannels,   // A channel with categories processed.
+                                //   No more channels will be accepted.
+        ESkipFurtherCategories  // A channel without categories processed.
+                                //   No categories inside further channels
+                                //   will be accepted.
+        };
+
+    /**
+     * Category state transition events.
+     */
+    enum TCategoryStateEvent
+        {
+        EChannelFound,
+        EChannelCompleted,
+        EItemFound,
+        ECategoryFound,
+        EItemCompleted
+        };
+
+    static CIptvXmlContentHandler* NewL(CIptvRssPlugin& aPlugin);
+
+    ~CIptvXmlContentHandler();
+
+    /**
+     * Set callback for storing XML parse results.
+     *
+     * @param aVodCallback Pointer to callback interface.
+     */
+    void SetVodCallback( MIptvEpgVodCallback* aVodCallback );
+
+// From base class MContentHandler
+
+    /**
+     * Callback to indicate the start of the document.
+     *
+     * @param aDocParam     Specifies the various parameters of the document.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnStartDocumentL(
+        const RDocumentParameters& aDocParam,
+        TInt aErrorCode );
+
+    /**
+     * Callback to indicate the end of the document.
+     *
+     * @param aErrorCode    Parser error code.
+     */
+    void OnEndDocumentL( TInt aErrorCode );
+
+    /**
+     * Callback to indicate an element parsing start.
+     *
+     * @param aElement      Handle to the element's details.
+     * @param aAttributes   Contains the attributes for the element.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnStartElementL( const RTagInfo& aElement,
+                          const RAttributeArray& aAttributes,
+                          TInt aErrorCode );
+
+    /**
+     * Callback to indicate the element parsing completion.
+     *
+     * @param aElement      Handle to the element's details.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnEndElementL( const RTagInfo& aElement, TInt aErrorCode );
+
+    /**
+     * Callback that sends the content of the element.
+     * Not all the content may be returned in one go. The data may be sent in
+     * chunks. When an OnEndElementL is received this means there is no more
+     * content to be sent.
+     *
+     * @param aBytes        Raw content data for the element.
+     *                      The client is responsible for converting the data
+     *                      to the required character set if necessary.
+     *                      In some instances the content may be binary and
+     *                      must not be converted.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnContentL( const TDesC8& aBytes, TInt aErrorCode );
+
+    /**
+     * Notification of the beginning of the scope of a prefix-URI Namespace
+     * mapping.
+     * This method is always called before the corresponding OnStartElementL
+     * method.
+     *
+     * @param aPrefix       Namespace prefix being declared.
+     * @param aUri          Namespace URI the prefix is mapped to.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnStartPrefixMappingL( const RString& aPrefix,
+                                const RString& aUri,
+                                TInt aErrorCode );
+
+    /**
+     * Notification of the end of the scope of a prefix-URI mapping.
+     * This method is called after the corresponding DoEndElementL method.
+     *
+     * @param aPrefix       Namespace prefix that was mapped.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnEndPrefixMappingL( const RString& aPrefix, TInt aErrorCode );
+
+    /**
+     * Notification of ignorable whitespace in element content.
+     *
+     * @param aBytes        Ignored bytes from the document being parsed.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnIgnorableWhiteSpaceL( const TDesC8& aBytes, TInt aErrorCode );
+
+    /**
+     * Notification of a skipped entity. If the parser encounters an
+     * external entity it does not need to expand it - it can return the
+     * entity as aName for the client to deal with.
+     *
+     * @param aName         Name of the skipped entity.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnSkippedEntityL( const RString& aName, TInt aErrorCode );
+
+    /**
+     * Notification of a processing instruction.
+     *
+     * @param aTarget       Processing instruction target.
+     * @param aData         Processing instruction data. If empty none was
+     *                      supplied.
+     * @param aErrorCode    Parser error code.
+     */
+    void OnProcessingInstructionL( const TDesC8& aTarget,
+                                   const TDesC8& aData,
+                                   TInt aErrorCode );
+
+    /**
+     * Notification of XML file parsing is failure.
+     *
+     * @param aErrorCode    Parser error code.
+     */
+    void OnError( TInt aErrorCode );
+
+    /**
+     * Obtains the interface matching the specified uid.
+     *
+     * @param aUid          Uid identifying the required interface.
+     * @return              0 if no interface matching the uid is found.
+     *                      Otherwise, the this pointer cast to that
+     *                      interface.
+     */
+    TAny* GetExtendedInterface( const TInt32 aUid );
+
+private:
+
+    CIptvXmlContentHandler( CIptvRssPlugin& aPlugin );
+
+    void ConstructL();
+
+    /**
+     * Handles item copyright value.
+     */
+    void CompleteCopyright();
+
+    /**
+     * Handles parent rating value.
+     */
+    void CompleteRating();
+
+    /**
+     * Handles item category value.
+     */
+    void CompleteCategoryL();
+
+    /**
+     * Handles item category value.
+     * @param aName Name canditate for this category.
+     */
+    void CompleteCategoryL( const HBufC* aName );
+
+    /**
+     * Handles item author value.
+     */
+    void CompleteAuthor();
+
+    /**
+     * Handles item and category description value.
+     */
+    void CompleteDescription();
+
+    /**
+     * Handles item and category title value.
+     */
+    void CompleteTitle();
+
+    /**
+     * Handles item url link value.
+     */
+    void CompleteLink();
+
+    /**
+     * Handles item publish time value.
+     */
+    void CompletePubDate();
+
+    /**
+     * Handles item guid value.
+     */
+    void CompleteGuid();
+
+    /**
+     * Handles element attributes.
+     *
+     * @param aAttributeList  Parses element attributes..
+     */
+    void HandleEnclosureL(
+        const RAttributeArray& aAttributeList );
+
+    /**
+     * Create a new category descriptor.
+     *
+     * @return              New empty category descriptor.
+     */
+    CIptvEpgCategory* CreateCategoryL() const;
+
+    /**
+     * Set a category for current item.
+     * When category has been used for some other item it already exists and
+     * is restored, Otherwise a new one is created and a key value given.
+     *
+     * @param aName         Name canditate to new category.
+     */
+    void SetItemCategoryL( const HBufC* aName );
+
+    /**
+     * Set channel as default category for current Item.
+     * When channel category has already been used, restore it,
+     * Otherwise save it and give a key value.
+     */
+    void SetChannelCategoryL();
+
+    /**
+     * Stores all categories used by current itam to database.
+     */
+    void AddCategories();
+
+    /**
+     * Add current content to dabase and link it to categories.
+     */
+    void AddContentL();
+
+    /**
+     * Create a new itme content descriptor.
+     */
+    void CreateContentL();
+
+    /**
+     * Adjust download type according to Mime type.
+     *
+     * @param aContent      Item descriptor.
+     */
+    void SetDownloadTypeFromMimeType(
+        CIptvMediaContent& aContent ) const;
+
+    /**
+     * Item containing thumbnails is added to download queue.
+     *
+     * @param contentKey    Item identifier in database.
+     * @param aThumbnailUrl Url to download thumbnail images.
+     */
+    void AddContentToDlQueueL(
+        TUint32 contentKey,
+        const TDesC& aThumbnailUrl );
+
+    /**
+     * Service thumbnail is added to download queue.
+     *
+     * @param aThumbnailUrl Url to download thumbnail images.
+     */
+    void AddServiceToDlQueueL(
+        const TDesC& aThumbnailUrl );
+
+    /**
+     * Priorize item by type.
+     */
+    void PriorizeL();
+
+    /**
+     * Advances category state according to given event and decides whether
+     * current object should be processed.
+     *
+     * @param aEvent        State transition event.
+     * @return              Process or skip current object.
+     */
+    TBool SetCategoryState( TCategoryStateEvent aEvent );
+
+private: // Data members
+
+    /**
+     * Calling class.
+     */
+    CIptvRssPlugin& iPlugin;
+
+    /**
+     * Callback for storing XML parse results.
+     * Not own.
+     */
+    MIptvEpgVodCallback* iVodCallback;
+
+    /**
+     * Descriptor of current channel.
+     * Own.
+     */
+    CIptvEpgCategory* iChannelCategory;
+
+    /**
+     * Category index key of current channel descriptor.
+     * Value 0 means that channel has not been associated to any item
+     * as category.
+     */
+    TUint32 iChannelCategoryKey;
+
+    /**
+     * Category index keys for current content.
+     */
+    RArray<TUint32> iCurrentCategoryKeys;
+
+    /**
+     * Descriptor of current item content.
+     * Own.
+     */
+    CIptvEpgContent* iContent;
+
+    /**
+     * Xml parsing state.
+     */
+    TParserState iState;
+
+    /**
+     * Current xml content.
+     * Own.
+     */
+    HBufC* iBuffer;
+
+    /**
+     * Indicates that we have accepted a channel thumbnail image as
+     * service image to be downloaded.
+     */
+    TBool iServiceThumbnailAdded;
+
+    /**
+     * Indicates that we have found rss content from current feed.
+     */
+    TBool iRSSContentFound;
+
+    /**
+     * Total number of categories handled from xml.
+     */
+    TInt iCategoryCount;
+
+    /**
+     * Total number of content items handled from xml.
+     */
+    TInt iContentCount;
+
+    /**
+     * Media group descriptor found and we are prosessing group.
+     */
+    TBool iMediaGroup;
+
+    /**
+     * Current element name has media prefix.
+     */
+    TBool iMediaPrefix;
+
+    /**
+     * Description has been set with Media group or prefix value.
+     * This shall not be overwritten by other values.
+     */
+    TBool iMediaDescriptionFixed;
+
+    /**
+     * Title has been set with Media group or prefix value.
+     * This shall not be overwritten by other values.
+     */
+    TBool iMediaTitleFixed;
+
+    /**
+     * Rating has been set with Media group or prefix value.
+     * This shall not be overwritten by other values.
+     */
+    TBool iMediaRatingFixed;
+
+    /**
+     * Copyrigth has been set with Media group or prefix value.
+     * This shall not be overwritten by other values.
+     */
+    TBool iMediaCopyrightFixed;
+
+    /**
+     * Rating has been set with Media group or prefix value.
+     * This shall not be overwritten by other values.
+     */
+    TBool iMediaThumbnailFixed;
+
+    /**
+     * Yahoo service is used.
+     */
+    TBool iYahoo;
+
+    /**
+     * Attribute set of current item.
+     * Own.
+     */
+    RPointerArray<CIptvMediaContent> iMediaContents;
+
+    /**
+     * Priorized content set.
+     * Not own.
+     */
+    RPointerArray<CIptvMediaContent> iMediaContentSet;
+
+    /**
+     * CIptvTerminalVideoSupport.
+     * Own
+     */
+    CIptvTerminalVideoSupport* iTerminalVideoSupport;
+
+    /**
+     * Scheme to interpret current parent rating descriptor.
+     */
+    TMediaRatingScheme iMediaRatingScheme;
+
+    /**
+     * State to control handling of channel and item specific categories.
+     */
+    TCategoryState iCategoryState;
+
+    /**
+     * There is a specific category descriptor in current item.
+     */
+    TBool iCategoryFound;
+
+    /**
+     * Table to hold all valid categories.
+     * Own.
+     */
+    RPointerArray<CIptvEpgCategory> iCategoryTable;
+
+    };
+
+#endif // CIPTV3XMLCONTENTHANDLER_H