--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wmdrm/camese/wmdrmdla/src/wmdrmdlahttpmeteringpluginfw.cpp Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,467 @@
+/*
+* 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: HTTP plugin framework implementation
+*
+*/
+
+
+#include <wmdrmdlatypes.h>
+#include <wmdrmdlahttpplugin.h>
+#include <wmdrmdlauinotifier.h>
+#include "wmdrmdlahttpmeteringpluginfw.h"
+#include "wmdrmdlahttpfwpluginresolver.h"
+#include "wmdrmdlaui.h"
+
+#define _LOGGING_FILE L"wmdrmdla.txt"
+#include "logfn.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::ConstructL()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::ConstructL" );
+ iIdle = CIdle::NewL( CActive::EPriorityIdle );
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::CWmDrmDlaHttpMeteringPluginFw
+// ---------------------------------------------------------------------------
+//
+CWmDrmDlaHttpMeteringPluginFw::CWmDrmDlaHttpMeteringPluginFw()
+ : CActive( EPriorityStandard ),
+ iState( CWmDrmDlaHttpMeteringPluginFw::EIdle )
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::CWmDrmDlaHttpMeteringPluginFw" );
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::NewL
+// ---------------------------------------------------------------------------
+//
+CWmDrmDlaHttpMeteringPluginFw* CWmDrmDlaHttpMeteringPluginFw::NewL()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::NewL" );
+ CWmDrmDlaHttpMeteringPluginFw* self =
+ CWmDrmDlaHttpMeteringPluginFw::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::NewLC
+// ---------------------------------------------------------------------------
+//
+CWmDrmDlaHttpMeteringPluginFw* CWmDrmDlaHttpMeteringPluginFw::NewLC()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::NewLC" );
+ CWmDrmDlaHttpMeteringPluginFw* self =
+ new( ELeave ) CWmDrmDlaHttpMeteringPluginFw;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::~CWmDrmDlaHttpMeteringPluginFw
+// ---------------------------------------------------------------------------
+//
+CWmDrmDlaHttpMeteringPluginFw::~CWmDrmDlaHttpMeteringPluginFw()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::~CWmDrmDlaHttpMeteringPluginFw" );
+ CancelMetering();
+ delete iHttpPlugin;
+ delete iUiNotifier;
+ delete iIdle;
+ delete iMeteringChallenge;
+ delete iMeteringUrl;
+ delete iMeteringResponse;
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::ProcessMeteringCertificate
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::ProcessMeteringCertificate(
+ const TDesC8& aCertificate,
+ TRequestStatus& aStatus )
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::ProcessMeteringCertificate" );
+
+ TRequestStatus *status = &aStatus;
+ aStatus = KRequestPending;
+ if ( iState != CWmDrmDlaHttpMeteringPluginFw::EIdle )
+ {
+ User::RequestComplete( status, KErrInUse );
+ return;
+ }
+
+ iClientStatus = &aStatus;
+ iCertificate = &aCertificate;
+ iState = CWmDrmDlaHttpMeteringPluginFw::EResolvingHttpPlugin;
+ CompleteSelf();
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::CancelMetering
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::CancelMetering()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::CancelMetering" );
+ if ( iHttpPlugin )
+ {
+ iHttpPlugin->CancelMetering();
+ }
+ Cancel();
+ if ( iUiNotifier )
+ {
+ TRAP_IGNORE( iUiNotifier->HandleErrorL( KErrCancel ) );
+ }
+ CompleteClientRequest( KErrCancel );
+ Reset();
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::SetIapId
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::SetIapId( TInt aIapId )
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::SetIapId" );
+ LOG2( "aIapId: %d", aIapId );
+ iIapId = aIapId;
+ if ( iHttpPlugin )
+ {
+ iHttpPlugin->SetIapId( iIapId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::DoCancel()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::DoCancel" );
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::RunL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::RunL()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::RunL" );
+ LOG2( "iState: %d", iState );
+ LOG2( "iStatus.Int(): %d", iStatus.Int() );
+ if ( iStatus.Int() != KErrNone )
+ {
+ HandleErrorL( iStatus.Int() );
+ }
+
+ switch ( iState )
+ {
+ case CWmDrmDlaHttpMeteringPluginFw::EResolvingHttpPlugin:
+ ResolvingHttpPluginHandlerL();
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::ERetrievingMeteringChallenge:
+ RetrievingMeteringChallenge();
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::EProcessingMeteringChallenge:
+ ProcessingMeteringChallenge();
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::ERetrievingMeteringResponse:
+ RetrievingMeteringResponse();
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::EProcessingMeteringResponse:
+ ProcessingMeteringResponse();
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::EMeteringFinished:
+ MeteringFinished();
+ break;
+
+ default:
+ ASSERT( EFalse );
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CWmDrmDlaHttpMeteringPluginFw::RunError( TInt aError )
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::RunError" );
+ LOG2( "aError: %d", aError );
+ CompleteClientRequest( aError );
+ Reset();
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::UserCancellation
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::UserCancellation()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::UserCancellation");
+ TCallBack callBack( CWmDrmDlaHttpMeteringPluginFw::AsyncCancel,
+ this );
+ iIdle->Start( callBack );
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::CompleteSelf
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::CompleteSelf()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::CompleteSelf" );
+ if ( !IsActive() )
+ {
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, KErrNone );
+ SetActive();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHandlerImpl::CompleteClientRequest
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::CompleteClientRequest( TInt aError )
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::CompleteClientRequest" );
+ LOG2( "aError: %d", aError );
+ if ( iClientStatus )
+ {
+ User::RequestComplete( iClientStatus, aError );
+ iClientStatus = NULL;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::::Reset
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::Reset()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::Reset" );
+ delete iHttpPlugin;
+ iHttpPlugin = NULL;
+ delete iUiNotifier;
+ iUiNotifier = NULL;
+ delete iMeteringChallenge;
+ iMeteringChallenge = NULL;
+ delete iMeteringUrl;
+ iMeteringUrl = NULL;
+ delete iMeteringResponse;
+ iMeteringResponse = NULL;
+ iCertificate = NULL;
+ iState = CWmDrmDlaHttpMeteringPluginFw::EIdle;
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::ResolvingHttpPluginHandlerL
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::ResolvingHttpPluginHandlerL()
+ {
+ TInt err( KErrNone );
+
+ LOGFNR( "CWmDrmDlaHttpMeteringPluginFw::ResolvingHttpPluginHandlerL", err );
+
+ TRAP( err, ResolveHttpPluginWithCertificateL( *iCertificate ) );
+ if ( err )
+ {
+ HandleErrorL( err );
+ }
+ iState = CWmDrmDlaHttpMeteringPluginFw::ERetrievingMeteringChallenge;
+ CompleteSelf();
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::RetrievingMeteringChallengeL
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::RetrievingMeteringChallenge()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::RetrievingMeteringChallenge" );
+ delete iMeteringChallenge;
+ iMeteringChallenge = NULL;
+ delete iMeteringUrl;
+ iMeteringUrl = NULL;
+ SetActive();
+ iState = CWmDrmDlaHttpMeteringPluginFw::EProcessingMeteringChallenge;
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, KErrNotSupported );
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::ProcessingMeteringChallengeL
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::ProcessingMeteringChallenge()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::ProcessingMeteringChallenge" );
+ iHttpPlugin->ProcessMeteringChallenge( *iMeteringChallenge,
+ *iMeteringUrl,
+ iStatus );
+ SetActive();
+ iState = CWmDrmDlaHttpMeteringPluginFw::ERetrievingMeteringResponse;
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::RetrievingMeteringResponseL
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::RetrievingMeteringResponse()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::RetrievingMeteringResponse" );
+ delete iMeteringResponse;
+ iMeteringResponse = NULL;
+ iHttpPlugin->GetMeteringResponse( iMeteringResponse, iStatus );
+ SetActive();
+ iState = CWmDrmDlaHttpMeteringPluginFw::EProcessingMeteringResponse;
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::ProcessingMeteringResponseL
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::ProcessingMeteringResponse()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::ProcessingMeteringResponse" );
+ SetActive();
+ iState = CWmDrmDlaHttpMeteringPluginFw::EMeteringFinished;
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, KErrNotSupported );
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::MeteringFinishedL
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::MeteringFinished()
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::MeteringFinished" );
+ LOG2( "iPartialMetering: %d", iPartialMetering );
+ if ( iPartialMetering )
+ {
+ iState = CWmDrmDlaHttpMeteringPluginFw::ERetrievingMeteringChallenge;
+ CompleteSelf();
+ }
+ else
+ {
+ iHttpPlugin->MeteringFinished();
+ CompleteClientRequest( KErrNone );
+ Reset();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::::ResolveHttpPluginWithCertificateL
+// ---------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::ResolveHttpPluginWithCertificateL(
+ const TDesC8& aCertificate )
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::ResolveHttpPluginL" );
+
+ delete iHttpPlugin;
+ iHttpPlugin = NULL;
+ delete iUiNotifier;
+ iUiNotifier = NULL;
+
+ WmDrmDlaHttpFwPluginResolver::ResolveHttpPluginWithCertificateL(
+ aCertificate, iHttpPlugin, iUiNotifier );
+
+ //Set cancel observer for ui plugin
+ if ( iUiNotifier )
+ {
+ iUiNotifier->SetCancelObserver( this );
+ }
+ //Set iap for http plugin
+ if ( iIapId )
+ {
+ iHttpPlugin->SetIapId( iIapId );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::HandleErrorL
+// ----------------------------------------------------------------------------
+//
+void CWmDrmDlaHttpMeteringPluginFw::HandleErrorL( TInt aError )
+ {
+ TInt err( KErrNone );
+
+ LOGFNR( "CWmDrmDlaHttpMeteringPluginFw::HandleErrorL", err );
+ LOG2( "iState: %d", iState );
+ LOG2( "aError: %d", aError );
+
+ if ( iUiNotifier )
+ {
+ TRAP( err, iUiNotifier->HandleErrorL( aError ) );
+ }
+
+ switch ( iState )
+ {
+ case CWmDrmDlaHttpMeteringPluginFw::ERetrievingMeteringChallenge:
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::EProcessingMeteringChallenge:
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::ERetrievingMeteringResponse:
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::EProcessingMeteringResponse:
+ break;
+
+ case CWmDrmDlaHttpMeteringPluginFw::EMeteringFinished:
+ break;
+
+ default:
+ break;
+ }
+
+ User::Leave( aError );
+ }
+
+// ---------------------------------------------------------------------------
+// CWmDrmDlaHttpMeteringPluginFw::AsyncCancel
+// ---------------------------------------------------------------------------
+//
+TInt CWmDrmDlaHttpMeteringPluginFw::AsyncCancel( TAny* aPtr )
+ {
+ LOGFN( "CWmDrmDlaHttpMeteringPluginFw::AsyncCancel");
+ CWmDrmDlaHttpMeteringPluginFw* meteringFw =
+ static_cast<CWmDrmDlaHttpMeteringPluginFw*>( aPtr );
+ meteringFw->CancelMetering();
+ return EFalse;
+ }