wmdrm/camese/wmdrmdladefaulthttpplugin/src/wmdrmdladefaultlicacq.cpp
changeset 0 95b198f216e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wmdrm/camese/wmdrmdladefaulthttpplugin/src/wmdrmdladefaultlicacq.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,891 @@
+/*
+* 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
+*
+*/
+
+
+#include <chttpformencoder.h>
+#include <httpstringconstants.h>
+#include <httperr.h>
+#include <http/rhttpheaders.h>
+#include <http/thttphdrfielditer.h>
+#include <stringpool.h>
+#include <escapeutils.h>
+#include <wmdrmdlatypes.h>
+#include <wmdrmdlauinotifier.h>
+#include "asf.h"
+#include "wmdrmdladefaultlicacq.h"
+#include "wmdrmdladefaulthttpplugin.h"
+#include "wmdrmdlabrowserviewhandler.h"
+#include "wmdrmdlabrowserobserver.h"
+#include "wmdrmdladefaulthttpmanager.h"
+
+#define _LOGGING_FILE L"wmdrmdladefaulthttpplugin.txt"
+#include "logfn.h"
+
+// CONSTANTS
+_LIT8( KDefaultIdentifier8, "camese" );
+_LIT8( KDefaultIdentifier, "c\0a\0m\0e\0s\0e\0" );
+_LIT8( KNonSilentIdentifier, "n\0o\0n\0s\0i\0l\0e\0n\0t" );
+
+_LIT8( KAcceptHeader8, "*/*" );
+_LIT8( KAcceptLanguageHeader8, "en-us" );
+_LIT8( KPostContentTypeHeader8, "application/x-www-form-urlencoded" );
+
+_LIT8( KDataTypeLicenseResponse, "application/vnd.ms-wmdrm.lic-resp" );
+_LIT8( KDataTypeHtml, "text/html" );
+
+_LIT8( KGetLicenseChallengeParam8, "challenge" );
+_LIT8( KGetNonSilentParam8, "nonsilent" );
+_LIT8( KLicenseStatusParam8, "License1Status" );
+
+_LIT8( KTIDHeader8, "TID=" );
+_LIT8( KQueryTag8, "?" );
+_LIT8( KNonSilentValue, "1" );
+
+_LIT8( KAmpersand, "&" );
+_LIT8( KChallenge, "nonsilent=1&challenge=" );
+
+_LIT8( KHRESULTFormat,"0x%08x" );
+const TInt KHRESULTFormatLength = 10; // '0x' + %08x
+const TUint KHRESULTBase = 0x80000000; 
+const TInt KHRESULTErrorMask = 0x01 << 31 | 0x04 << 16;
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::ConstructL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::ConstructL" );
+    iHttpManager = CWmDrmDlaDefaultHttpManager::NewL( *this );
+    iHttpManager->SetKeepAlive( ETrue );
+    iIdle =  CIdle::NewL( CActive::EPriorityIdle );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::CWmDrmDlaDefaultLicAcq
+// ---------------------------------------------------------------------------
+//
+CWmDrmDlaDefaultLicAcq::CWmDrmDlaDefaultLicAcq(
+    CWmDrmDlaDefaultHttpPlugin* aPlugin ) 
+    : iState( CWmDrmDlaDefaultLicAcq::ENotActive ), iPlugin( aPlugin )
+      
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::CWmDrmDlaDefaultLicAcq" );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::NewL
+// ---------------------------------------------------------------------------
+//
+CWmDrmDlaDefaultLicAcq* CWmDrmDlaDefaultLicAcq::NewL(
+    CWmDrmDlaDefaultHttpPlugin* aPlugin )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::NewL" );
+    CWmDrmDlaDefaultLicAcq* self 
+        = new( ELeave ) CWmDrmDlaDefaultLicAcq( aPlugin );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::~CWmDrmDlaDefaultLicAcq
+// ---------------------------------------------------------------------------
+//
+CWmDrmDlaDefaultLicAcq::~CWmDrmDlaDefaultLicAcq()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::~CWmDrmDlaDefaultLicAcq" );
+    delete iIdle;
+    delete iBrowserViewHandler;
+    delete iHttpManager;
+    delete iFormEncoder;
+    delete iPostData;
+    delete iLicenseChallenge;
+    delete iLicenseResponse;
+    delete iLicenseServerUrl16;
+    delete iLicenseServerUrl;
+    delete iHtmlData;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::SupportedFileL
+// ---------------------------------------------------------------------------
+//
+TBool CWmDrmDlaDefaultLicAcq::SupportedFileL( 
+    const RFile& aFile,
+    CWmDrmDlaUiNotifier*& aUiNotifier)
+    {
+    TInt err( KErrNone );
+    TBool supported( EFalse );
+        
+    LOGFNR( "CWmDrmDlaDefaultLicAcq::SupportedFileL", err );
+    
+    //Check that the file is valid ASF-file and that the extented content
+    //encryption object of the file includes MS test site identifier
+    CAsf* asf( NULL );
+    TRAP( err, asf = CAsf::NewL( aFile ) );
+    if ( !err )
+        {
+        supported = iPlugin->Supported( *asf->iExtendedContentEncryptionObject,
+                                        KDefaultIdentifier );
+        delete asf;
+        }
+    
+    //If file is recognized, then initialize UiNotifier and transfer its
+    //ownership to the FW
+    if ( supported )
+        {
+        iPlugin->InitializeUiNotifierL();
+        aUiNotifier = iPlugin->UiNotifier();
+        }
+    LOG2( "supported: %d", supported );     
+    return supported;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::SupportedDrmHeaderL
+// ---------------------------------------------------------------------------
+//
+TBool CWmDrmDlaDefaultLicAcq::SupportedDrmHeaderL( 
+    const TDesC8& aHeader,
+    CWmDrmDlaUiNotifier*& aUiNotifier )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::SupportedDrmHeaderL" );
+    
+    //Check that the drm header includes MS test site identifier
+    TBool supported( iPlugin->Supported( aHeader, KDefaultIdentifier8 ) );
+    //If header is recognized, then initialize UiNotifier and transfer its
+    //ownership to the FW
+    if ( supported )
+        {
+        iPlugin->InitializeUiNotifierL();
+        aUiNotifier = iPlugin->UiNotifier();
+        }
+    LOG2( "supported: %d", supported );    
+    return supported;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::SilentL
+// ---------------------------------------------------------------------------
+//
+TBool CWmDrmDlaDefaultLicAcq::SilentL( 
+    const RFile& aFile )
+    {
+    TInt err( KErrNone );
+    
+    LOGFNR( "CWmDrmDlaDefaultLicAcq::SilentL", err );
+    
+    //Check is the content silent or not by checking that the extented content
+    //encryption object of the file includes MS test site non-silent identifier
+    iNonSilent = EFalse;
+    CAsf* asf( NULL );
+    TRAP( err, asf = CAsf::NewL( aFile ) );
+    if ( !err )
+        {
+        iNonSilent = 
+            iPlugin->Supported( *asf->iExtendedContentEncryptionObject,
+                                KNonSilentIdentifier );
+        delete asf;
+        }
+    iPlugin->UiNotifier()->SetSilent( !iNonSilent );
+    LOG2( "!iNonSilent: %d", !iNonSilent );
+    return !iNonSilent;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::ProcessDrmHeaderL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::ProcessDrmHeaderL( 
+    const TDesC8& /*aDrmHeader*/ )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::ProcessDrmHeaderL" );
+    iPlugin->UiNotifier()->SetProgress( EProcessingDRMHeader );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::AcquireLicense
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::AcquireLicense( 
+    const TDesC8& aLicenseChallenge,
+    HBufC* aLicenseServerUrl,
+    TRequestStatus& aStatus )
+    {
+    TInt err( KErrNone );
+    
+    LOGFNR( "CWmDrmDlaDefaultLicAcq::AcquireLicense", err );
+    
+    iPlugin->UiNotifier()->SetProgress( ERetrievingLicense );
+    aStatus = KRequestPending;
+    iClientStatus = &aStatus;
+    
+    delete iLicenseServerUrl;
+    iLicenseServerUrl = NULL;
+    TRAP( err, 
+            iLicenseServerUrl = 
+                EscapeUtils::ConvertFromUnicodeToUtf8L( *aLicenseServerUrl ) );
+    if ( !iLicenseServerUrl )
+        {
+        CompleteClientRequest( err );
+        return;
+        }
+    delete iLicenseChallenge;
+    iLicenseChallenge = NULL;
+    iLicenseChallenge = aLicenseChallenge.Alloc();
+    if ( !iLicenseChallenge )
+        {
+        CompleteClientRequest( KErrNoMemory );
+        return;
+        }
+    TRAP( err, AcquireLicenseL() );
+    if ( err )
+        {
+        CompleteClientRequest( err );
+        return;
+        }
+    iState = CWmDrmDlaDefaultLicAcq::ESendingLicenseChallenge;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::GetLicenseResponseL
+// ---------------------------------------------------------------------------
+//
+HBufC8* CWmDrmDlaDefaultLicAcq::GetLicenseResponseL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::GetLicenseResponseL" );
+    iPlugin->UiNotifier()->SetProgress( EAddingLicense );
+    if ( iLicenseResponse )
+        {
+        return iLicenseResponse->AllocL();
+        }
+    else
+        {
+        return NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::SendLicenseStorageStatus
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::SendLicenseStorageStatus( 
+    HBufC8* aTid,
+    const TDesC& /*aUrl*/,
+    TInt aError, 
+    TRequestStatus& aStatus )
+    {
+    TInt err( KErrNone );
+    
+    LOGFNR( "CWmDrmDlaDefaultLicAcq::SendLicenseStorageStatus", err );
+    LOG2( "aError: %d", aError );
+    
+    iPlugin->UiNotifier()->SetProgress( ESendingLicenseStorageStatus );
+    aStatus = KRequestPending;
+    iClientStatus = &aStatus;
+    
+    if ( !aTid )
+        {
+        CompleteClientRequest( KErrCorrupt );
+        return;
+        }
+    
+    TRAP( err, SendLicenseStorageStatusL( *aTid, aError ) );
+    if ( err )
+        {
+        CompleteClientRequest( err );
+        return;
+        }
+    iState = CWmDrmDlaDefaultLicAcq::ESendingStorageStatus;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::SendDrmHeaderError
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::SendDrmHeaderError( 
+    const TDesC& /*aErrorUrl*/, 
+    TInt /*aError*/, 
+    TRequestStatus& aStatus )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::SendDrmHeaderError" );
+    iPlugin->UiNotifier()->SetProgress( ESendingDrmHeaderStatus );
+    aStatus = KRequestPending;
+    iClientStatus = &aStatus;
+    CompleteClientRequest( KErrNotSupported );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::GetContentUrlL
+// ---------------------------------------------------------------------------
+//
+HBufC* CWmDrmDlaDefaultLicAcq::GetContentUrlL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::GetContentUrlL" );
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::GetHtmlDataL
+// ---------------------------------------------------------------------------
+//
+HBufC* CWmDrmDlaDefaultLicAcq::GetHtmlDataL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::GetHtmlDataL" );
+    iPlugin->UiNotifier()->SetProgress( EIdle );
+    if ( iHtmlData )
+        {
+        return iHtmlData->AllocL();
+        }
+    else
+        {
+        return NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::CancelLicenseAcquisition
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::CancelLicenseAcquisition()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::CancelLicenseAcquisition" );
+    iHttpManager->Stop();
+    CompleteClientRequest( KErrCancel );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultHttpPlugin::SetIapId
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::SetIapId( TInt aIapId )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::SetIapId" );
+    LOG2( "aIapId: %d", aIapId );
+    iHttpManager->SetIapId( aIapId );
+    }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::OnGetUsernamePasswordL
+// From MHttpManagerObserver
+// This function is called when using HTTPS authentication. Authentication is 
+// not currently used in the Camese project
+// ----------------------------------------------------------------------------
+//
+TBool CWmDrmDlaDefaultLicAcq::OnGetUsernamePasswordL(
+    HBufC8*& /*aUsername*/,
+    HBufC8*& /*aPassword*/)
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::OnGetUsernamePasswordL" );
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::OnResponseHeadersL
+// From MHttpManagerObserver
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::OnResponseHeadersL(
+    const RHTTPResponse& /*aResponse*/,
+    const RHTTPHeaders& aHeaders,
+    const RStringPool& aStringPool,
+    TInt aHttpStatus )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::OnResponseHeadersL" );
+    LOG2( "iState: %d", iState );
+    LOG2( "aHttpStatus: %d", aHttpStatus );
+    //Redirection in license acquisition
+    if ( aHttpStatus >= HTTPStatus::EMultipleChoices && 
+         aHttpStatus < HTTPStatus::EBadRequest &&
+         iState == CWmDrmDlaDefaultLicAcq::ESendingLicenseChallenge )
+        {
+        HandleRedirectionHeadersL( aHeaders, aStringPool );
+        }
+    //License acquisition
+    else if ( aHttpStatus == HTTPStatus::EOk &&
+              iState != CWmDrmDlaDefaultLicAcq::ESendingStorageStatus )
+        {
+        HandleLicenseAcquistionHeaders( aHeaders, aStringPool );
+        }
+    //Sending license storage status or error
+    else
+        {
+        iHttpStatus = aHttpStatus;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::OnResponseBodyDataL
+// From MHttpManagerObserver
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::OnResponseBodyDataL( const TPtrC8 aDataChunk )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::OnResponseBodyDataL" );
+    LOG2( "iState: %d", iState );
+    LOG2( "iHttpStatus: %d", iHttpStatus );
+    //If we are acquiring license and response headers are OK,
+    //then save the response.
+    if ( iHttpStatus == HTTPStatus::EOk && 
+         iState == CWmDrmDlaDefaultLicAcq::ESendingLicenseChallenge )
+        {
+        if ( !iLicenseResponse )
+            {
+            iLicenseResponse = HBufC8::NewL( aDataChunk.Length() );
+            }
+        else
+            {
+            iLicenseResponse = 
+                iLicenseResponse->ReAllocL( iLicenseResponse->Length() + 
+                                            aDataChunk.Length() );
+            }
+        iLicenseResponse->Des().Append( aDataChunk );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::OnTransactionComplete
+// From MHttpManagerObserver
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::OnTransactionComplete( TInt aSystemError )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::OnTransactionComplete" );
+    LOG2( "iState: %d", iState );
+    LOG2( "aSystemError: %d", aSystemError );
+    LOG2( "iHttpStatus: %d", iHttpStatus );
+    TInt err( KErrNone );
+    //Transaction succeeded
+    if ( iHttpStatus == HTTPStatus::EOk && !aSystemError )
+        {
+        //If redirection happened, then start a new license acquisition
+        //asynchronously to a new location.
+        if ( iState == CWmDrmDlaDefaultLicAcq::ERedirection )
+            {
+            TCallBack callBack( CWmDrmDlaDefaultLicAcq::Redirection, 
+                                this );
+            iIdle->Start( callBack );
+            iState = CWmDrmDlaDefaultLicAcq::ESendingLicenseChallenge;
+            }
+        //If license acquisition is non-silent, then launch a browser view.
+        else if ( iState == 
+                        CWmDrmDlaDefaultLicAcq::ENonSilentLicenseAcquisition )
+            {
+            TRAP( err, LaunchBrowserViewL() );
+            if ( err )
+                {
+                CompleteClientRequest( err );
+                return;
+                }
+            iPlugin->UiNotifier()->SetProgress( EIdle );
+            iState = CWmDrmDlaDefaultLicAcq::EBrowserView;
+            }
+        //License received silently or license storage status sent succesfully.
+        else 
+            {
+            CompleteClientRequest( aSystemError );
+            }
+        }
+    //Error in transaction
+    else if ( iHttpStatus != HTTPStatus::EOk && 
+              iHttpStatus != KErrNone )
+        {
+        CompleteClientRequest( KErrCommsBreak );
+        }
+    //System error
+    else
+        {
+        CompleteClientRequest( aSystemError );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::CompleteClientRequest
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::CompleteClientRequest( TInt aError )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::CompleteClientRequest" );
+    LOG2( "aError: %d", aError );
+    if ( iClientStatus )
+        {
+        User::RequestComplete( iClientStatus, aError );
+        iClientStatus = NULL;
+        }
+    iState = CWmDrmDlaDefaultLicAcq::ENotActive;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::AcquireLicenseL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::AcquireLicenseL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::AcquireLicenseL" );
+    // Set headers
+    RArray<CWmDrmDlaDefaultHttpManager::THeader> headers;
+    CleanupClosePushL( headers );
+
+    headers.AppendL( CWmDrmDlaDefaultHttpManager::THeader( HTTP::EAccept, 
+                                                           KAcceptHeader8 ) );
+    headers.AppendL( 
+            CWmDrmDlaDefaultHttpManager::THeader( HTTP::EAcceptLanguage, 
+                                                  KAcceptLanguageHeader8 ) );
+    headers.AppendL( 
+            CWmDrmDlaDefaultHttpManager::THeader( HTTP::EContentType, 
+                                                  KPostContentTypeHeader8 ) );
+
+    // Set POST contents
+    delete iFormEncoder;
+    iFormEncoder = NULL;
+    iFormEncoder = CHTTPFormEncoder::NewL();
+
+    //If license acquisition is non-silent, then add non-silent field to
+    //request
+    if ( iNonSilent )
+        {
+        iFormEncoder->AddFieldL( KGetNonSilentParam8, KNonSilentValue );
+        }
+    
+    iFormEncoder->AddFieldL( KGetLicenseChallengeParam8, *iLicenseChallenge );
+
+    //Post a request, make sure that iLicenseResponse is NULL
+    delete iLicenseResponse;
+    iLicenseResponse = NULL;
+    iHttpManager->Post( *iLicenseServerUrl, headers, iFormEncoder );
+
+    CleanupStack::PopAndDestroy( &headers );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::SendLicenseStorageStatusL
+// ---------------------------------------------------------------------------
+//    
+void CWmDrmDlaDefaultLicAcq::SendLicenseStorageStatusL( 
+    const TDesC8& aTid, 
+    TInt aError )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::SendLicenseStorageStatusL" );
+    LOG2( "aError: %d", aError );
+    TInt licenseHRESULT( MakeHRESULT( aError ) );
+    
+    HBufC8* statusUrl = NULL;
+    TInt pos( iLicenseServerUrl->Locate( '?' ) );
+    // If no query ('?') pos is rightmost character
+    pos = (pos != KErrNotFound) ? pos : iLicenseServerUrl->Length();
+    TPtrC8 ptrUrl( iLicenseServerUrl->Left( pos ) );
+    TInt len( ptrUrl.Length() + KQueryTag8().Length() + 
+              KTIDHeader8().Length() + aTid.Length() );
+
+    statusUrl = HBufC8::NewLC( len );
+    TPtr8 url( statusUrl->Des() );
+    url.Append( ptrUrl );
+    url.Append( KQueryTag8 );
+    url.Append( KTIDHeader8 );
+    url.Append( aTid );
+
+    SendHRESULTL( *statusUrl, KLicenseStatusParam8(), licenseHRESULT );
+
+    CleanupStack::PopAndDestroy( statusUrl );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::MakeHRESULT
+// ---------------------------------------------------------------------------
+//
+TInt CWmDrmDlaDefaultLicAcq::MakeHRESULT( 
+    TInt aError )
+    {
+    TInt result( 0 );
+	
+    LOGFNR( "CWmDrmDlaDefaultLicAcq::MakeHRESULT", result );
+        
+    // If there is no error then we need to send 0x00000000
+    if ( !aError )
+        {
+        result = 0;
+        }
+    // Convert Symbian error convert to an HRESULT
+    else if ( static_cast<TUint>(aError) < KHRESULTBase )
+        {
+        result = KHRESULTErrorMask | aError; 
+        }
+    else
+        {
+        // This is already in HRESULT format so use it directly
+        result = aError;
+        }
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::SendHRESULTL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::SendHRESULTL( 
+    const TDesC8& aUrl, 
+    const TDesC8& aHeaderField, 
+    TInt aHRESULT )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::SendHRESULTL" );
+    
+    //Set headers
+    RArray<CWmDrmDlaDefaultHttpManager::THeader> headers;
+    CleanupClosePushL( headers );
+
+    headers.AppendL( CWmDrmDlaDefaultHttpManager::THeader( HTTP::EAccept,
+                                                           KAcceptHeader8 ) );
+    headers.AppendL( 
+            CWmDrmDlaDefaultHttpManager::THeader( HTTP::EAcceptLanguage,
+                                                  KAcceptLanguageHeader8 ) );
+    headers.AppendL( 
+            CWmDrmDlaDefaultHttpManager::THeader( HTTP::EContentType, 
+                                                  KPostContentTypeHeader8 ) );
+
+    HBufC8* resultStatus = HBufC8::NewLC( KHRESULTFormatLength );
+    resultStatus->Des().Format( KHRESULTFormat, aHRESULT );
+
+    //Set POST contents
+    delete iFormEncoder;
+    iFormEncoder = NULL;
+    iFormEncoder = CHTTPFormEncoder::NewL();
+
+    iFormEncoder->AddFieldL( aHeaderField, *resultStatus );
+
+    CleanupStack::PopAndDestroy( resultStatus );
+
+    //Post a request
+    iHttpManager->Post( aUrl, headers, iFormEncoder );
+
+    CleanupStack::PopAndDestroy( &headers );
+    } 
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::HandleRedirectionHeadersL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::HandleRedirectionHeadersL( 
+    const RHTTPHeaders& aHeaders,
+    const RStringPool& aStringPool )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::HandleRedirectionHeadersL" );
+    
+    //Get the redirected location
+    RStringF locationStr = aStringPool.StringF( HTTP::ELocation, 
+                                                RHTTPSession::GetTable() );
+    CleanupClosePushL( locationStr );
+    THTTPHdrVal locationValue;
+    if ( !aHeaders.GetField( locationStr, 0, locationValue ) )
+        {
+        //Set new redirected url and change state to redirection
+        delete iLicenseServerUrl;
+        iLicenseServerUrl = NULL;
+        iLicenseServerUrl = locationValue.StrF().DesC().AllocL();
+        iState = CWmDrmDlaDefaultLicAcq::ERedirection;
+        iHttpStatus = HTTPStatus::EOk;
+        }
+    else
+        {
+        iHttpStatus = KErrHttpRedirectNoLocationField;
+        }
+    CleanupStack::PopAndDestroy( &locationStr );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::HandleLicenseAcquistionHeaders
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::HandleLicenseAcquistionHeaders( 
+    const RHTTPHeaders& aHeaders,
+    const RStringPool& aStringPool )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::HandleLicenseAcquistionHeaders" );
+    
+    RStringF contentTypeNameStr = 
+        aStringPool.StringF( HTTP::EContentType, RHTTPSession::GetTable() );
+
+    // read the first part of content-type field
+    THTTPHdrVal contentTypeVal;
+    if( !aHeaders.GetField( contentTypeNameStr, 0, contentTypeVal ) )
+        {
+        //Silent license acquisition
+        if ( iState == CWmDrmDlaDefaultLicAcq::ESendingLicenseChallenge &&
+             contentTypeVal.StrF().DesC().MatchF( KDataTypeLicenseResponse ) !=
+                                                  KErrNotFound )
+            {
+            iHttpStatus = HTTPStatus::EOk;
+            }
+        //Non silent license acquisition
+        else if ( iState == CWmDrmDlaDefaultLicAcq::ESendingLicenseChallenge &&
+                  contentTypeVal.StrF().DesC().MatchF( KDataTypeHtml ) != 
+                                                       KErrNotFound )
+            {
+            iHttpStatus = HTTPStatus::EOk;
+            iNonSilent = ETrue;
+            iState = CWmDrmDlaDefaultLicAcq::ENonSilentLicenseAcquisition;
+            }
+        else
+            {
+            iHttpStatus = KErrHttpDecodeContentType;
+            }
+        }
+    else
+        {
+        iHttpStatus = KErrHttpDecodeContentType;
+        }
+    contentTypeNameStr.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::LaunchBrowserViewL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::LaunchBrowserViewL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::LaunchBrowserViewL" );
+    
+    if ( !iBrowserViewHandler )
+        {
+        iBrowserViewHandler = CWmDrmDlaBrowserViewHandler::NewL();
+        }
+    iBrowserViewHandler->LaunchBrowserViewL( this );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::Redirection
+// ---------------------------------------------------------------------------
+//
+TInt CWmDrmDlaDefaultLicAcq::Redirection( TAny* aPtr )
+    {
+    TInt err( KErrNone );
+    
+    LOGFNR( "CWmDrmDlaDefaultLicAcq::Redirection", err );
+    
+    CWmDrmDlaDefaultLicAcq* defaultLicAcq = 
+        static_cast<CWmDrmDlaDefaultLicAcq*>( aPtr );
+
+    TRAP( err, defaultLicAcq->AcquireLicenseL() );
+    if ( err )
+        {
+        defaultLicAcq->CompleteClientRequest( err );
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::PostUrlL
+// ---------------------------------------------------------------------------
+//
+const TDesC& CWmDrmDlaDefaultLicAcq::PostUrlL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::PostUrlL" );
+    delete iLicenseServerUrl16;
+    iLicenseServerUrl16 = NULL;
+    iLicenseServerUrl16 
+        = EscapeUtils::ConvertToUnicodeFromUtf8L( *iLicenseServerUrl );
+    return *iLicenseServerUrl16;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::PostContentTypeL
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWmDrmDlaDefaultLicAcq::PostContentTypeL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::PostContentTypeL" );
+    return KPostContentTypeHeader8;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::PostDataL
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWmDrmDlaDefaultLicAcq::PostDataL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::PostDataL" );
+    delete iPostData;
+    iPostData = NULL;
+    iPostData = HBufC8::NewL( KChallenge().Length() + 
+                              iLicenseChallenge->Length() );
+    TPtr8 ptr( iPostData->Des() );
+    ptr.Append( KChallenge() );
+    ptr.Append( *iLicenseChallenge );
+    return *iPostData;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::PostContentDataBoundaryL
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWmDrmDlaDefaultLicAcq::PostContentDataBoundaryL()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::PostContentDataBoundaryL" );
+    return KAmpersand;
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::IapId
+// ---------------------------------------------------------------------------
+//
+TInt CWmDrmDlaDefaultLicAcq::IapId()
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::IapId" );
+    return iHttpManager->IapId();
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::LicenseResponseReceived
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::LicenseResponseReceived( 
+    const TDesC8& aLicenseResponse )
+    {
+    TInt err( KErrNone );
+    
+    LOGFNR( "CWmDrmDlaDefaultLicAcq::LicenseResponseReceived", err );
+    
+    //Non-silent license response received, allocate the response and complete
+    //client request
+    delete iLicenseResponse;
+    iLicenseResponse = NULL;
+    iLicenseResponse = aLicenseResponse.Alloc();
+    if ( !iLicenseResponse )
+        {
+        err = KErrNoMemory;
+        }
+    CompleteClientRequest( err );
+    iPlugin->UiNotifier()->SetProgress( EProcessingDRMHeader );
+    }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaDefaultLicAcq::BrowserExit
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaDefaultLicAcq::BrowserExit( TInt aError )
+    {
+    LOGFN( "CWmDrmDlaDefaultLicAcq::BrowserExit" );
+    LOG2( "aError: %d", aError );
+    //Browser view closed in non-silent license acquisition, complete
+    //client request with the error code.
+    CompleteClientRequest( aError );
+    }