wmdrm/camese/wmdrmdladefaulthttpplugin/inc/wmdrmdladefaultlicacq.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:  WMDRM DLA Default Http License Acquisition
*
*/


#ifndef C_WMDRMDLADEFAULTLICACQ_H
#define C_WMDRMDLADEFAULTLICACQ_H

#include "wmdrmdlabrowserobserver.h"
#include "wmdrmdladefaulthttpmanagerobserver.h"

class CWmDrmDlaDefaultHttpPlugin;
class CWmDrmDlaUiNotifier;
class CWmDrmDlaDefaultHttpManager;
class CWmDrmDlaBrowserViewHandler;
class CHTTPFormEncoder;

/**
 * WMDRM DLA Default Http License Acquisition
 * Reference implementation to demonstrate how to handle license acquisition
 * with the MS test site.
 * 
 * @lib wmdrmdladefaulthttpplugin.lib
 * @since S60 v9.1
 */
NONSHARABLE_CLASS( CWmDrmDlaDefaultLicAcq ) 
    : public CBase, 
      public MWmDrmDlaBrowserObserver,
      public MWmDrmDlaDefaltHttpManagerObserver
    {

public:

    static CWmDrmDlaDefaultLicAcq* NewL( CWmDrmDlaDefaultHttpPlugin* aPlugin );
    ~CWmDrmDlaDefaultLicAcq();

    /**
     * Check if file is supported by this plugin
     *
     * @param aFile WMDRM file
     * @param aUiNotifer If file is supported, contains initialized UI Notifier
     *                   upon completion. Will be deleted by the caller after 
     *                   the plugin has been deleted.
     * @return ETrue if file is supported by this plugin
     * @leave with standard Symbian error code in case of error
     */
     TBool SupportedFileL( const RFile& aFile, 
                           CWmDrmDlaUiNotifier*& aUiNotifier );

    /**
     * Check if DRM Header is supported by this plugin
     *
     * @param aHeader DRM Header
     * @param aUiNotifer If header is supported, contains initialized UI
     *                   Notifier upon completion. Will be deleted by the
     *                   caller after the plugin has been deleted.
     * @return ETrue if header is supported by this plugin
     * @leave with standard Symbian error code in case of error
     */
    TBool SupportedDrmHeaderL( const TDesC8& aHeader, 
                               CWmDrmDlaUiNotifier*& aUiNotifier );

    /**
     * Check if license acquisition should be silent for this file
     *
     * @param aFile WMDRM file
     * @return ETrue if file is supported by this plugin
     * @leave with standard Symbian error code in case of error
     */
    TBool SilentL( const RFile& aFile );

    /**
     * Process DRM Header. This method is used only to pass DRM Header to the
     * plugin. The framework does not require the plugin to do anything 
     *
     * @param aDrmHeader DRM Header
     * @leave with standard Symbian error code in case of fatal error (the 
     * framework does not proceed with license acquisition if this method
     * leaves)
     */
    void ProcessDrmHeaderL( const TDesC8& aDrmHeader );

    /**
     * Acquire License. 
     *
     * @param aLicenseChallenge License challenge based on which license
     *                          will be acquired.
     * @param aLicenseServerUrl URL where license challenge is sent
     * @param aStatus Request status, will contain error code upon completion
     * including but not limited to:
     * - KErrCancel if user cancelled the license acquisition at any point
     * - KErrCommsBreak if network connection was lost during communication 
     *                  with server
     * - KErrGeneral if unspecified error happened
     */
    void AcquireLicense( const TDesC8& aLicenseChallenge, 
                         HBufC* aLicenseServerUrl,
                         TRequestStatus& aStatus );

    /**
     * Get downloaded License. 
     *
     * @leave standard Symbian error code in case of error.
     * @return Buffer containing license data. Will be deleted by the caller.
     */
    HBufC8* GetLicenseResponseL();

    /**
     * Send license storage status. 
     *
     * @param aTid Transaction ID parsed from the license response, can be NULL
     * @param aUrl URL where license storage status is sent
     * @param aError License storage status.
     * @param aStatus Request status, will contain error code upon completion
     * including but not limited to:
     * - KErrCommsBreak if network connection was lost during communication
     *                  with server
     * - KErrGeneral if unspecified error happened
     */
    void SendLicenseStorageStatus( HBufC8* aTid, const TDesC& aUrl,
                                   TInt aError, TRequestStatus& aStatus );
    
    /**
     * Send error code to server if drm header parsing failed.
     *
     * @param   aErrorUrl   URL where error code is sent
     * @param   aError      Error code
     * @param aStatus Request status, will contain error code upon completion
     * including but not limited to:
     * - KErrCommsBreak if network connection was lost during communication
     *                  with server
     * - KErrGeneral if unspecified error happened
     */
    void SendDrmHeaderError( const TDesC& aErrorUrl, TInt aError, 
                             TRequestStatus& aStatus );

    /**
     * Get content url. Called only if framework fails to parse content URL 
     * from the license response. Needs to be implemented only if the supported
     * service uses non-standard way to pass the Content URL, otherwise this
     * can return NULL.
     *
     * @return Content URL, can be NULL. Will be deleted by the caller.
     */
    HBufC* GetContentUrlL();

    /**
     * Get HTML data returned by license server. 
     *
     * @return HTML data, can be NULL. Will be deleted by the caller.
     */
    HBufC* GetHtmlDataL();

    /*
     * Cancel license acquisition
     */
    void CancelLicenseAcquisition();

    /**
     * Sets the IAP to be used in the HTTP transactions
     *
     * @param   aIapId  Internet Access Point id
     */
    void SetIapId( TInt aIapId );

public: // From MWmDrmDlaBrowserObserver
    
    const TDesC& PostUrlL();
    const TDesC8& PostContentTypeL();
    const TDesC8& PostDataL();
    const TDesC8& PostContentDataBoundaryL();
    TInt IapId();
    void LicenseResponseReceived( const TDesC8& aLicenseResponse );
    void BrowserExit( TInt aError );

private: // From MWmDrmDlaDefaltHttpManagerObserver
    
    TBool OnGetUsernamePasswordL( HBufC8*& aUsername, HBufC8*& aPassword );
    void OnResponseHeadersL( const RHTTPResponse& aResponse, 
                             const RHTTPHeaders& aHeaders,
                             const RStringPool& aStringPool, 
                             TInt aHttpStatus );
    void OnResponseBodyDataL( const TPtrC8 aDataChunk );
    void OnTransactionComplete( TInt aSystemError );
    
private:

    CWmDrmDlaDefaultLicAcq( CWmDrmDlaDefaultHttpPlugin* aPlugin );
    void ConstructL();
    
    void CompleteClientRequest( TInt aError );
    
    void AcquireLicenseL();
    void SendLicenseStorageStatusL( const TDesC8& aTid, TInt aError );
    TInt MakeHRESULT( TInt aError );
    void SendHRESULTL( const TDesC8& aUrl, const TDesC8& aHeaderField, 
                       TInt aHRESULT );
    
    void HandleRedirectionHeadersL( const RHTTPHeaders& aHeaders,
                                    const RStringPool& aStringPool );
    void HandleLicenseAcquistionHeaders( const RHTTPHeaders& aHeaders,
                                         const RStringPool& aStringPool );
    
    void LaunchBrowserViewL();
    
    static TInt Redirection( TAny* aPtr );
    
private: // data
    
    enum TLicAcqState
        {
        ENotActive,
        ESendingLicenseChallenge,
        ENonSilentLicenseAcquisition,
        ERedirection,
        ESendingStorageStatus,
        EBrowserView
        };
    
    TLicAcqState iState;
    CWmDrmDlaDefaultHttpManager* iHttpManager;
    CHTTPFormEncoder* iFormEncoder;
    CIdle* iIdle;
    CWmDrmDlaBrowserViewHandler* iBrowserViewHandler;
    TInt iHttpStatus;
    TBool iNonSilent;
    HBufC8* iLicenseChallenge;
    HBufC8* iPostData;
    HBufC8* iLicenseResponse;
    HBufC* iLicenseServerUrl16;
    HBufC8* iLicenseServerUrl;
    HBufC* iHtmlData;
    
    //Not owned
    CWmDrmDlaDefaultHttpPlugin* iPlugin;
    TRequestStatus* iClientStatus;
    
    };

#endif // C_WMDRMDLADEFAULTLICACQ_H