wmdrm/camese/wmdrmdla/inc/wmdrmdlahandlerimpl.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:27 +0200
changeset 0 95b198f216e5
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2008 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:  Implementation class for WMDRM DLA Handler
*
*/


#ifndef C_WMDRMDLAHANDLERIMPL_H
#define C_WMDRMDLAHANDLERIMPL_H

#include <e32base.h>
#include <f32file.h>
#include <wmdrmdlatypes.h>

class CWmDrmDlaHttpLicAcqPluginFw;
class CWmDrmDlaHttpMeteringPluginFw;
class CWmDrmDlaRequest;

/**
 *  Implementation class for WMDRM DLA Handler
 *
 *  @since S60 v9.1
 */
NONSHARABLE_CLASS( CWmDrmDlaHandlerImpl ) : public CActive
    {

public:

    static CWmDrmDlaHandlerImpl* NewL();
    static CWmDrmDlaHandlerImpl* NewLC();

    /**
    * Destructor.
    */
    virtual ~CWmDrmDlaHandlerImpl();

    /**
     * Checks if license acquisition for file is silent
     *
     * @param   aFile wmdrm file
     * @return  ETrue if license acquisition is silent
     * @leave   KErrNotFound if there is no handler for the file
     */
    TBool SilentL( const RFile& aFile );

    /**
     * Acquire license based on the file handle
     *
     * @param   aFile wmdrm file
     * @param   aContentUrl contains content URL on return. Can be NULL.
     * If it's not NULL, it must be freed by caller.  
     * @param   aHtmlData contains HTML data returned by license server
     *                    on return. Can be NULL.
     * If it's not NULL, it must be freed by caller.  
     */
    void AcquireLicenseL( const RFile& aFile, HBufC*& aContentUrl, 
                          HBufC*& aHtmlData );

    /**
     * Acquire license based on the file handle, asynchronous version
     *
     * @param   aFile wmdrm file
     * @param   aContentUrl contains content URL on completion. Can be NULL.
     * If it's not NULL, it must be freed by caller.  
     * @param   aHtmlData contains HTML data returned by license server
     *                    on completion. Can be NULL.
     * If it's not NULL, it must be freed by caller.  
     * @param   aStatus Request status. On completion contains the error code.
     */
    void AcquireLicense( const RFile& aFile, HBufC*& aContentUrl, 
                         HBufC*& aHtmlData, TRequestStatus& aStatus );

    /**
     * Acquire license based on the DRM Header
     *
     * @param   aDrmHeader DRM Header
     * @param   aErrorUrl URL where error code is sent. Can be NULL.
     * @param   aContentUrl contains content URL on return. Can be NULL.
     * If it's not NULL, it must be freed by caller.  
     * @param   aHtmlData contains HTML data returned by license server
     *                    on return. Can be NULL.
     * If it's not NULL, it must be freed by caller.  
     */
    void AcquireLicenseFromDrmHeaderL( const TDesC8& aDrmHeader, 
                                       HBufC* aErrorUrl,
                                       HBufC*& aContentUrl, 
                                       HBufC*& aHtmlData );

    /**
     * Acquire license based on the DRM Header, asynchronous version
     *
     * @param   aDrmHeader DRM Header
     * @param   aErrorUrl URL where error code is sent. Can be NULL.
     * @param   aContentUrl contains content URL on completion. Can be NULL.
     * If it's not NULL, it must be freed by caller.  
     * @param   aHtmlData contains HTML data returned by license server
     *                    on completion. Can be NULL.
     * If it's not NULL, it must be freed by caller.  
     * @param   aStatus Request status. On completion contains the error code.
     */
    void AcquireLicenseFromDrmHeader( const TDesC8& aDrmHeader, 
                                      HBufC* aErrorUrl,
                                      HBufC*& aContentUrl, 
                                      HBufC*& aHtmlData, 
                                      TRequestStatus& aStatus );

    /*
     * Cancels current and all queued license acquisition requests
     */
    void CancelLicenseAcquisition();
    
    /**
     * Handles metering certificate OTA
     *
     * @param   aCertificate metering certificate
     */
    void ProcessMeteringCertificateL( const TDesC8& aCertificate );

    /**
     * Handles metering certificate OTA, asynchronous version
     *
     * @param   aCertificate metering certificate
     * @param   aStatus Request status. On completion contains the error code.
     */
    void ProcessMeteringCertificate( const TDesC8& aCertificate, 
                                     TRequestStatus& aStatus );

    /*
     * Cancels current and all queued metering requests
     */
    void CancelMetering();
    
    /**
     * Sets the IAP to be used in the HTTP transactions
     *
     * @param   aIapId  Internet Access Point id
     */
    void SetIapId( TInt aIapId );
    
protected: // from base class CActive

    /**
    * From CActive Cancels async request.
    */
    void DoCancel();

    /**
    * From CActive Called when async request completes.
    */
    void RunL();

    /**
    * From CActive Called if RunL leaves.
    */
    TInt RunError( TInt aError );

private:

    CWmDrmDlaHandlerImpl();
    void ConstructL();

    void CompleteSelf();
    void CompleteClientRequest( TInt aError );
    void CompleteSyncRequest( TInt aError );
    
    /*
     * Takes next request to handling.
     * If synchronous request is available, it will be handled first.
     * Otherwise next async request is taken from the queue and handled.
     * If there aren't any requests, state is set to idle
     */
    void NextRequest();
    
    //State handlers
    
    /*
     * Completes current request and retrieves next one, 
     * if available, to handling
     */
    void Completed( TInt aError );
	
    /*
     * Makes asynchronous call to CWmDrmDlaHttpPluginFw to 
     * acquire license from drm header
     */
    void AcquiringLicenseFromDrmHeader();
    
    /*
     * Makes asynchronous call to CWmDrmDlaHttpPluginFw to
     * acquire license from file
     */
    void AcquiringLicense();
    
    /*
     * Makes asynchronous call to CWmDrmDlaHttpPluginFw to
     * process metering certificate
     */
    void ProcessingMeteringCertificate();
    
private: // data

    enum TDlaHandlerState
        {
        EIdle,
        EAcquiringLicense,
        EAcquiringLicenseFromDrmHeader,
        EProcessingMeteringCertificate,
        ECompleted
        };

    TDlaHandlerState iState;
    CWmDrmDlaHttpLicAcqPluginFw* iLicenseAcquisitionFw;
    CWmDrmDlaHttpMeteringPluginFw* iMeteringFw;
    RPointerArray<CWmDrmDlaRequest> iRequests;
    CWmDrmDlaRequest* iCurrentRequest;
    CWmDrmDlaRequest* iSyncRequest;
    TInt iSyncReturnValue;
    CActiveSchedulerWait* iWait;
    };

#endif // C_WMDRMDLAHANDLERIMPL_H