--- /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 <http.h>
+#include <cookiefilterinterface.h>
+#include <uaproffilter_interface.h>
+#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<CWmDrmDlaDefaultHttpManager::THeader>& 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<CWmDrmDlaDefaultHttpManager::THeader>& 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<TConnectionInfo> 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<TInt>(&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<CWmDrmDlaDefaultHttpManager::THeader>& 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