omadrm/drmengine/ro/inc/DRMProtectedRoParser.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 31 Mar 2010 22:01:10 +0300
branchRCL_3
changeset 13 a20e54f39dd4
parent 12 8a03a285ab14
child 20 29f3cf766061
permissions -rw-r--r--
Revision: 201011 Kit: 201013

/*
* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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:  ?Description
*
*/



#ifndef DRMPROTECTEDROPARSER_H
#define DRMPROTECTEDROPARSER_H

//  INCLUDES
#include <e32std.h>
#include <xml/parser.h>
#include <xml/contenthandler.h>
#include <xml/xmlparsererrors.h>
#include <xml/attribute.h>
#include "DRMRightsClient.h"

using namespace Xml;

// FORWARD DECLARATIONS
class CDRMRights;

// CLASS DECLARATION

/**
*  Parser for protected rights objects
*
*  @lib DrmParsers.dll
*  @since Series 60 3.0
*/
NONSHARABLE_CLASS(CDrmProtectedRoParser): public CBase, public MContentHandler
    {
    public:

        class CParsedProtectedRo;

        enum TParserType
            {
            EXmlParser,
            EWbxmlParser
            };

        static const TInt KMaxElementCount = 40;
        static const TInt KMaxElementNesting = 16;

    public:  // Constructors and destructor

        /**
        * Two-phased constructor.
        */
        IMPORT_C static CDrmProtectedRoParser* NewL();

        /**
        * Destructor.
        */
        IMPORT_C ~CDrmProtectedRoParser();

    public: // New functions

        /**
        * ?member_description.
        * @since Series ?XX ?SeriesXX_version
        * @param ?arg1 ?description
        * @return ?description
        */
        void ParseL(
            const TDesC8& aProtectedRo,
            CParsedProtectedRo*& aResultRights);

        IMPORT_C void ParseAndStoreL(
            const TDesC8& aProtectedRo,
            RPointerArray<CDRMRights>& aResultRights);

        IMPORT_C HBufC8* GetRiUrlL(
            const TDesC8& aProtectedRo);

        IMPORT_C HBufC8* GetDomainIdL(
            const TDesC8& aProtectedRo);

        IMPORT_C HBufC8* GetRiIdL(
            const TDesC8& aProtectedRo);

    public: // Functions from base classes

        /**
        * From ?base_class ?member_description.
        * @param aDocParam Specifies the various parameters of the document.
        * @arg   aDocParam.iCharacterSetName The character encoding of the document.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnStartDocumentL(
            const RDocumentParameters& aDocParam,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnEndDocumentL(
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aElement is a handle to the element's details.
        * @param aAttributes contains the attributes for the element.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnStartElementL(
            const RTagInfo& aElement,
            const RAttributeArray& aAttributes,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aElement is a handle to the element's details.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnEndElementL(
            const RTagInfo& aElement,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aBytes is the 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 is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnContentL(
            const TDesC8& aBytes,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aPrefix is the Namespace prefix being declared.
        * @param aUri is the Namespace URI the prefix is mapped to.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnStartPrefixMappingL(
            const RString& aPrefix,
            const RString& aUri,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aPrefix is the Namespace prefix that was mapped.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnEndPrefixMappingL(
            const RString& aPrefix,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aBytes are the ignored bytes from the document being parsed.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnIgnorableWhiteSpaceL(
            const TDesC8& aBytes,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aName is the name of the skipped entity.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnSkippedEntityL(
            const RString& aName,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @param aTarget is the processing instruction target.
        * @param aData is the processing instruction data. If empty none was supplied.
        * @param aErrorCode is the error code.
        *        If this is not KErrNone then special action may be required.
        */
        void OnProcessingInstructionL(
            const TDesC8& aTarget,
            const TDesC8& aData,
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        */
        void OnOutOfData();


        /**
        * From ?base_class ?member_description.
        * @param aError is the error code
        */
        void OnError(
            TInt aErrorCode);

        /**
        * From ?base_class ?member_description.
        * @return               0 if no interface matching the uid is found.
                Otherwise, the this pointer cast to that interface.
        * @param aUid the uid identifying the required interface.
        */
        TAny* GetExtendedInterface(
            const TInt32 aUid);

    protected:  // New functions

        /**
        * ?member_description.
        * @since Series ?XX ?SeriesXX_version
        * @param ?arg1 ?description
        * @return ?description
        */
        TInt MatchStackState(void);

        /**
        * ?member_description.
        * @since Series ?XX ?SeriesXX_version
        * @param ?arg1 ?description
        * @return ?description
        */
        HBufC8* GetAttributeValueL(
            const RAttributeArray& aAttrList,
            const TDesC8& aAttrName);

        /**
        * Find the next start and end position of an XML element
        * in the given data
        * @since Series 60 3.0
        * @param aElement Element to look for
        * @param aData Input data
        * @param aStart return parameter for the beginning of the element
        * @param aEnd return parameter for the end of the element
        * @return EFalse if no element could be found, ETrue otherwise
        */
        TBool GetElementStartEnd(
            const TDesC8& aElement,
            const TDesC8& aData,
            TInt& aStart,
            TInt& aEnd);

        /**
        * Handle a parsed domain RO which could not be added to the rights DB
        * because the device is not part of the domain.
        * @since Series 60 3.0
        * @param aDomainRoData domain RO as XML data
        * @param aDomainRo parsed domain RO
        */
        void HandleUnregisteredDomainRoL(
            const TDesC8& aContentId,
            const TDesC8& aDomainRoData,
            CParsedProtectedRo* aDomainRo);

        /**
        * Adds ROAP namespace URI to aProtectedRo if not already present
        * @since Series 60 3.0
        * @param aProtectedRo protected RO element
        * @return protected RO element, if namespace was not added NULL
        */
        HBufC8* CDrmProtectedRoParser::AddRoapNamespaceL(
            TDesC8& aProtectedRo ) const;

    private:

        /**
        * C++ default constructor.
        */
        CDrmProtectedRoParser(void);

        void ConstructL(void);

    private:  // Data
        // The XML parser
        CParser* iParser;

        // Result of parsing the protected RO element
        CParsedProtectedRo* iRights;

        // Expected element names
        RString iElements[KMaxElementCount];

        // Parsing stack
        TInt iElementStack[KMaxElementNesting];

        // Depth of the parsing stack
        TInt iElementStackDepth;

        // Content between elements
        HBufC8* iContent;

    };

#endif      // DRMPROTECTEDROPARSER_H

// End of File