diff -r 000000000000 -r 95b198f216e5 wmdrm/camese/wmdrmdladefaulthttpplugin/src/wmdrmdladefaulthttpmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wmdrm/camese/wmdrmdladefaulthttpplugin/src/wmdrmdladefaulthttpmanager.cpp Thu Dec 17 08:52:27 2009 +0200 @@ -0,0 +1,749 @@ +/* +* 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: Implements generic HTTP GET and POST functionality +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include "wmdrmdladefaulthttpmanager.h" + +#define _LOGGING_FILE L"wmdrmdladefaulthttpplugin.txt" +#include "logfn.h" + +/** + * HTTP_STRING macro + * To use HTTP_STRING macro you need a variable 'pool' defined (of + * RStringPool type). + * @param aStringId - an ID for string from HTTP Client's string table + * (e.g. 'HTTP::EAccept') + */ +#define HTTP_STRING(aStringId)pool.StringF(aStringId, RHTTPSession::GetTable()) + +/** + * SET_HTTP_PROPERTY macro + * Sets value for a property of HTTP session + * @param info - RHTTPConnectionInfo + * @param pool - RStringPool + * @param property - property ID, a value from HTTP string table + * @param value - value to set + */ +#define SET_HTTP_PROPERTY(info, pool, property, value) \ + info.SetPropertyL( HTTP_STRING(property), THTTPHdrVal(value)) + + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::NewL +// ---------------------------------------------------------------------------- +CWmDrmDlaDefaultHttpManager* CWmDrmDlaDefaultHttpManager::NewL( + MWmDrmDlaDefaltHttpManagerObserver& aObserver ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::NewL(1)" ); + CWmDrmDlaDefaultHttpManager* self = + new(ELeave) CWmDrmDlaDefaultHttpManager( aObserver, 0 ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::NewL +// ---------------------------------------------------------------------------- +CWmDrmDlaDefaultHttpManager* CWmDrmDlaDefaultHttpManager::NewL( + MWmDrmDlaDefaltHttpManagerObserver& aObserver, + TUint32 aIapNumber ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::NewL(2)" ); + CWmDrmDlaDefaultHttpManager* self = + new(ELeave) CWmDrmDlaDefaultHttpManager( aObserver, aIapNumber ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::~CWmDrmDlaDefaultHttpManager +// ---------------------------------------------------------------------------- +CWmDrmDlaDefaultHttpManager::~CWmDrmDlaDefaultHttpManager() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::~CWmDrmDlaDefaultHttpManager" ); + Stop(); + } + +// ---------------------------------------------------------------------------- +// CpHttpManager::Get +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::Get( + const TDesC8& aUrl, + const RArray& aHeaders) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::Get" ); + // Disallow clients to call this method before it has completed asynch + // request + ASSERT( !iTransactionOpen ); + + iOperation = EGet; + iDataSupplier = NULL; + + TRAPD( err, DoStartL( aUrl, aHeaders ) ); + if ( err ) + { + HandleDownloadComplete( err ); + } + } + +// ---------------------------------------------------------------------------- +// CpHttpManager::Post +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::Post( + const TDesC8& aUrl, + const RArray& aHeaders, + MHTTPDataSupplier* aDataSupplier ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::Post" ); + // Disallow clients to call this method before it has completed asynch + // request + ASSERT( !iTransactionOpen ); + ASSERT( aDataSupplier ); + + iOperation = EPost; + iDataSupplier = aDataSupplier; + + TRAPD( err, DoStartL( aUrl, aHeaders ) ); + if ( err ) + { + HandleDownloadComplete( err ); + } + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::Stop +// This method should be used instead of Cancel. +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::Stop() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::Stop" ); + // Make sure Stop was not called from a callback + ASSERT( !iInCallback ); + + if ( IsActive() ) + { + // We are still establishing the connection, cancel the active object + Cancel(); + } + else + { + // The active object is not active - we are past the setup phase + if ( iTransactionOpen ) + { + iHttpTransaction.Cancel(); + + // Only generate the callback if there was a transaction going on, + // otherwise the client will get a callback without previously + // calling StartL + HandleDownloadComplete( KErrCancel ); + } + } + + CleanupConnection(); + DeleteUsernamePassword(); + iState = EConstructed; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::MoreDataAvailableL +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::MoreDataAvailableL() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::MoreDataAvailableL" ); + iHttpTransaction.NotifyNewRequestBodyPartL(); + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::SetKeepAlive +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::SetKeepAlive( TBool aKeepAlive ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::SetKeepAlive" ); + iKeepAlive = aKeepAlive; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::KeepAlive +// ---------------------------------------------------------------------------- +TBool CWmDrmDlaDefaultHttpManager::KeepAlive() const + { + LOGFN( "CWmDrmDlaDefaultHttpManager::KeepAlive" ); + return iKeepAlive; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::GetConnectionInfoL +// Note: TConnectionInfo& aConnectionInfo creates a PC-Lint warning to make it +// const but aConnectionInfo is being changed after it has been put into a +// package and GetConnectionInfo is called on the connection +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::GetConnectionInfoL( + TConnectionInfo& aConnectionInfo ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::GetConnectionInfoL" ); + if ( (iState != EOpen) && (iState != ESubmit) ) + { + User::Leave( KErrNotReady ); + } + + TUint count( 0 ); + User::LeaveIfError( iConnection.EnumerateConnections( count ) ); + + if ( !count ) + { + User::Leave( KErrNotReady ); + } + + TPckg pkg( aConnectionInfo ); + User::LeaveIfError( iConnection.GetConnectionInfo( 1, pkg ) ); + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::SetIapId +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::SetIapId( TInt aIapId ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::SetIapId" ); + iIapNumber = aIapId; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::IapId +// ---------------------------------------------------------------------------- +TInt CWmDrmDlaDefaultHttpManager::IapId() + { + return iIapNumber; + } + +// ============================== PRIVATE METHODS ============================== + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::MHFRunL +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::MHFRunL( + RHTTPTransaction aTransaction, + const THTTPEvent& aEvent ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::MHFRunL" ); + RHTTPResponse response; + TPtrC8 dataChunk; + + // Either ESucceeded or EFailed will eventually occur + switch ( aEvent.iStatus ) + { + case THTTPEvent::EGotResponseHeaders: + response = aTransaction.Response(); + + iInCallback = ETrue; + iObserver.OnResponseHeadersL( + response, + response.GetHeaderCollection(), + iHttpSession.StringPool(), + response.StatusCode() ); + + break; + + case THTTPEvent::EGotResponseBodyData: + // A member variable is used to store the body to avoid two + // potential problems: + // - OnResponseBodyDataL leaves + // - Stop is called from within OnResponseBodyDataL + iBody = aTransaction.Response().Body(); + User::LeaveIfNull( iBody ); + + iBody->GetNextDataPart( dataChunk ); + + iInCallback = ETrue; + iObserver.OnResponseBodyDataL( dataChunk ); + + // Verify that iBody wasn't already released + // for example by calling Stop within ResponseBodyDataL + if ( iBody ) + { + iBody->ReleaseData(); + iBody = NULL; + } + + break; + + case THTTPEvent::ESucceeded: + case THTTPEvent::EFailed: + // Deal with both the same as iError will either be negative or + // KErrNone + // If the user cancelled the credentials dialog then make sure we + // return KErrCancel + HandleDownloadComplete( iCredentialsOk ? iError : KErrCancel ); + break; + + default: + // This will capture system and HTTP lib errors + // For positive codes iError will remain to KErrNone + if ( aEvent.iStatus < KErrNone ) + { + iError = aEvent.iStatus; + } + break; + } + + iInCallback = EFalse; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::MHFRunError +// ---------------------------------------------------------------------------- +TInt CWmDrmDlaDefaultHttpManager::MHFRunError( + TInt aError, + RHTTPTransaction /*aTransaction*/, + const THTTPEvent& /*aEvent*/ ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::MHFRunError" ); + HandleDownloadComplete( aError ); + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::GetCredentialsL +// This function is NOT currently used as authentication is not current used in +// this project at the current time +// ---------------------------------------------------------------------------- +TBool CWmDrmDlaDefaultHttpManager::GetCredentialsL( + const TUriC8& /*aURI*/, + RString aRealm, + RStringF aAuthenticationType, + RString& aUsername, + RString& aPassword ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::GetCredentialsL" ); + iCredentialsOk = EFalse; + RStringPool pool = aRealm.Pool(); + if ( aAuthenticationType == HTTP_STRING( HTTP::EBasic ) ) + { + DeleteUsernamePassword(); + + // Get the username/password + iInCallback = ETrue; + iCredentialsOk = + iObserver.OnGetUsernamePasswordL( iUsername, iPassword ); + iInCallback = EFalse; + + // authentication = iCredentialsOk && iUsername && iPassword + // no authentication = !iCredentialsOk && !iUsername && !iPassword + ASSERT( (iCredentialsOk && iUsername && iPassword) || + (!iCredentialsOk && !iUsername && !iPassword ) ); + + if (iCredentialsOk) + { + aUsername = pool.OpenStringL( *iUsername ); + aPassword = pool.OpenStringL( *iPassword ); + } + } + + // If the authentication type is not Basic, we simply return EFalse. + return iCredentialsOk; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::RunL +// Overrides CActive::RunL +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::RunL() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::RunL" ); + User::LeaveIfError( iStatus.Int() ); + + switch (iState) + { + case EStart: + InitializeL(); + break; + case EInitialize: + Open(); + break; + case EOpen: + SubmitL(); + break; + default: + // Panic if called while in ESubmit + ASSERT( 0 ); + break; + } + + // Do not advance the state if the transaction was submitted + // MHFRunL will be called by the HTTP stack while the transaction + // progresses + if ( iState != ESubmit ) + { + // Go to the next state if not finished + CompleteSelf(); + } + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::DoCancel +// Called while the state machine is still active. Possible states: +// +// - EStart and EInitialize: iStatus is already completed and CActive::Cancel +// will not block +// - ESubmit: this method won't be called since the AO is not active. +// - EOpen: RConnection::Close will be called from CleanupTransaction, +// which will complete the RConnection::Start asynchronous call. +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::DoCancel() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::DoCancel" ); + ASSERT( iState != ESubmit ); + + // Cleanup and generate the callback + HandleDownloadComplete( KErrCancel ); + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::RunError +// Overrides CActive::RunError +// ---------------------------------------------------------------------------- +TInt CWmDrmDlaDefaultHttpManager::RunError( TInt aError ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::RunError" ); + LOG2( "aError: %d", aError ); + // Cleanup and generate the callback + HandleDownloadComplete( aError ); + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CpHttpManager::CWmDrmDlaDefaultHttpManager +// ---------------------------------------------------------------------------- +CWmDrmDlaDefaultHttpManager::CWmDrmDlaDefaultHttpManager( + MWmDrmDlaDefaltHttpManagerObserver& aObserver, + TUint32 aIapNumber ) : + CActive( CActive::EPriorityStandard ), + iObserver( aObserver ), + iState( EConstructed ), + iIapNumber( aIapNumber ), + iKeepAlive( EFalse ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::CWmDrmDlaDefaultHttpManager" ); + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------------------------------- +// CpHttpManager::ConstructL +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::ConstructL() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::ConstructL" ); + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::InitializeL +// Handler for the EStart state. +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::InitializeL() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::InitializeL" ); + User::LeaveIfError( iSocketServer.Connect() ); + User::LeaveIfError( iConnection.Open( iSocketServer, KAfInet ) ); + iState = EInitialize; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::OpenL +// Handler for the EInitialize state. +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::Open() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::Open" ); + // Override dialog preferences + // Use if IAP is provided, override the default one + if ( iIapNumber ) + { + iCommDbPrefs.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + iCommDbPrefs.SetIapId( iIapNumber ); + } + + // Start RConnection using specified CommDb preferences overrides + // This is async call, thus - signal CWmDrmDlaDefaultHttpManager is active + // (SetActive()) + iCommDbPrefs.SetDirection( ECommDbConnectionDirectionOutgoing ); + iConnection.Start( iCommDbPrefs, iStatus ); + + SetActive(); + iState = EOpen; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::SubmitL +// Handler for the EOpen state. +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::SubmitL() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::SubmitL" ); + + TConnectionInfo info; + GetConnectionInfoL( info ); + iIapNumber = info.iIapId; + + // Open session + iHttpSession.OpenL(); + RStringPool pool = iHttpSession.StringPool(); + + // Associate HTTP session with connection + RHTTPConnectionInfo connInfo = iHttpSession.ConnectionInfo(); + + // Specify socket server + SET_HTTP_PROPERTY( connInfo, pool, HTTP::EHttpSocketServ, + iSocketServer.Handle() ); + // Specify connectionn to use + TInt connPtr = reinterpret_cast(&iConnection); + SET_HTTP_PROPERTY( connInfo, pool, HTTP::EHttpSocketConnection, connPtr ); + + // Install HTTP authentication filter + InstallAuthenticationL( iHttpSession ); + + CHttpCookieFilter::InstallFilterL( iHttpSession ); + + RHTTPFilterCollection filterColl = iHttpSession.FilterCollection(); + filterColl.RemoveFilter( + iHttpSession.StringPool().StringF( + HTTP::ERedirect, RHTTPSession::GetTable() ) ); + + CHttpUAProfFilterInterface::InstallFilterL( iHttpSession ); + + // Parse URI + TUriParser8 srcAddress; + User::LeaveIfError( srcAddress.Parse( *iSrcAddress ) ); + + // Open HTTP transaction + iHttpTransaction = iHttpSession.OpenTransactionL( srcAddress, *this, + HTTP_STRING( (EGet == iOperation) ? HTTP::EGET : HTTP::EPOST ) ); + iTransactionOpen = ETrue; + + // Set the data supplier if a POST operation + if ( EPost == iOperation ) + { + iHttpTransaction.Request().SetBody( *iDataSupplier ); + } + + + TInt pos = iSrcAddress->Locate( '?' ); + + // If no query ('?') pos is rightmost character + pos = (pos != KErrNotFound) ? pos : iSrcAddress->Length(); + TPtrC8 ptrUrl = iSrcAddress->Left( pos ); + + // Only print if there is a ('?') and something to print after it + if ( pos < iSrcAddress->Length() ) + { + TPtrC8 ptrQs = iSrcAddress->Mid( pos ); + } + // Set HTTP headers for the transaction + RHTTPHeaders hdr = iHttpTransaction.Request().GetHeaderCollection(); + TInt nofheaders = iHdrValues.Count(); + + for ( TInt i = 0; i < nofheaders; i++ ) + { + TInt field = iHdrFields[i]; + const TDesC8& fieldStr = HTTP_STRING( field ).DesC(); + HBufC8* pValue = iHdrValues[i]; + SetHeaderL( hdr, field, *pValue ); + } + + // Submit HTTP transaction + // This will set in motion the HTTP download + iHttpTransaction.SubmitL(); + iState = ESubmit; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::DoStartL +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::DoStartL( + const TDesC8& aUrl, + const RArray& aHeaders ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::DoStartL" ); + CleanupTransaction(); + + // Store callers URL + iSrcAddress = aUrl.AllocL(); + + // Store headers + TInt nofheaders = aHeaders.Count(); + for ( TInt i = 0; i < nofheaders; i++ ) + { + iHdrFields.AppendL( aHeaders[i].iField ); + iHdrValues.AppendL( aHeaders[i].iVal.AllocL() ); + } + + if ( (iState == EOpen) && iKeepAlive ) + { + TConnectionInfo connectionInfo; + GetConnectionInfoL(connectionInfo); + if ( connectionInfo.iIapId != iIapNumber && + iIapNumber != 0 && connectionInfo.iIapId != 0 ) + { + CleanupConnection(); + iState = EStart; + } + } + else + { + iState = EConstructed == iState ? EStart : EOpen; + } + + iError = KErrNone; + iCredentialsOk = ETrue; + + CompleteSelf(); + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::HandleDownloadComplete +// Close HTTP connection and clean up instance variables. +// +// Must be called to complete client's request and cleanup, either on +// successful download, or some error condition +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::HandleDownloadComplete( TInt aError ) + { + LOGFN( "CWmDrmDlaDefaultHttpManager::HandleDownloadComplete" ); + LOG2( "aError: %d", aError ); + CleanupTransaction(); + + iInCallback = ETrue; + iObserver.OnTransactionComplete( aError ); + iInCallback = EFalse; + + if ( iDataSupplier ) + { + iDataSupplier->ReleaseData(); + iDataSupplier = NULL; + } + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::CleanupTransaction +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::CleanupTransaction() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::CleanupTransaction" ); + if ( iBody ) + { + iBody->ReleaseData(); + iBody = NULL; + } + + // Release HTTP transaction & session resources + delete iSrcAddress; + iSrcAddress = NULL; + + TInt nofheaders = iHdrValues.Count(); + for ( TInt i = 0; i < nofheaders; i++ ) + { + delete iHdrValues[i]; + } + + // set to empty + iHdrValues.Reset(); + iHdrFields.Reset(); + + iHttpTransaction.Close(); + iHttpSession.Close(); + + if ( !iKeepAlive ) + { + CleanupConnection(); + iState = ESubmit == iState ? EConstructed : iState; + } + else if ( ESubmit == iState ) + { + // end of a transaction + iState = EOpen; + } + else + { + // do nothing. This is to get rid of a PC-Lint warning + } + + iTransactionOpen = EFalse; + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::CleanupConnection +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::CleanupConnection() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::CleanupConnection" ); + iConnection.Close(); + iSocketServer.Close(); + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::CompleteSelf +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::CompleteSelf() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::CompleteSelf" ); + if ( !IsActive() ) // else already waiting + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::SetHeaderL +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::SetHeaderL( + RHTTPHeaders& aHeaders, + TInt aHdrField, + const TDesC8& aHdrValue ) const + { + RStringPool pool = iHttpSession.StringPool(); + RStringF valStr = pool.OpenFStringL( aHdrValue ); + CleanupClosePushL( valStr ); + THTTPHdrVal val( valStr ); + aHeaders.SetFieldL( HTTP_STRING( aHdrField ), val ); + CleanupStack::PopAndDestroy( &valStr ); // Close + } + +// ---------------------------------------------------------------------------- +// CWmDrmDlaDefaultHttpManager::DeleteUsernamePassword +// This function is NOT currently used as authentication is not current used in +// this project at the current time +// ---------------------------------------------------------------------------- +void CWmDrmDlaDefaultHttpManager::DeleteUsernamePassword() + { + LOGFN( "CWmDrmDlaDefaultHttpManager::DeleteUsernamePassword" ); + delete iUsername; + iUsername = NULL; + delete iPassword; + iPassword = NULL; + } + +// End of File