diff -r 6757f1e2efd2 -r 5b858729772b devicediagnostics/diagplugins/diagbrowserplugin/src/diagbrowserpluginmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnostics/diagplugins/diagbrowserplugin/src/diagbrowserpluginmodel.cpp Wed Sep 01 12:31:32 2010 +0100 @@ -0,0 +1,848 @@ +/* +* Copyright (c) 2007 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: This is the model class for the Browser Test Plugin, which +* tests HTTP functionality. +* +*/ + + +// System Include Files +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include // CRepository +#include // RCmManager +#include // RCmDestination +#include // RCmConnectionMethod +#include // Connection Manager Defs +#include // Connection Manager Defs +#include // RSocketServ, RConnection +#include // RStringPool +#include // HTTP Strings +#include // RHTTPConnectionInfo +#include // RHTTPSession +#include // RHTTPTransaction +#include // THTTPEvent +#include // TUriParser8 +#include // CLogEvent +#include // CLogFilter +#include // CDiagResultsDatabaseItem +#include // Debugging Macros +#include // CDiagLogEventEraser +#include +// User Include Files +#include "diagbrowserpluginmodel.h" // CDiagBrowserPluginModel +#include "diagbrowserpluginmodelobserver.h" // CDiagBrowserPluginModelObserver +#include "diagbrowserpluginprivatecrkeys.h" // CenRep keys +#include "diagbrowserplugin.pan" // Panic +#include "diagbrowserplugin.hrh" + +#include +// Local Constants +const TInt KConnArrayGranularity = ( 3 ); +const TInt KMicroSecondsInMilliseconds = ( 1000 ); +const TInt KHttpResponseCodeOk = ( 200 ); +#ifdef __WINS__ +const TInt KEmulatorDynamicIpApId = ( 11 ); +#endif // __WINS__ + + +// ============================ GLOBAL FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// Static two-phase constructor. +// --------------------------------------------------------------------------- +// +CDiagBrowserPluginModel* CDiagBrowserPluginModel::NewL( + MDiagBrowserPluginModelObserver& aObserver ) + { + LOGSTRING( "CDiagBrowserPluginModel::NewL()" ) + + CDiagBrowserPluginModel* self = new( ELeave ) CDiagBrowserPluginModel( + aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CDiagBrowserPluginModel::~CDiagBrowserPluginModel() + { + LOGSTRING( "CDiagBrowserPluginModel::~CDiagBrowserPluginModel()" ) + + // Stop any outstanding requests. + Cancel(); + + // Free memory reserved by the model. + delete iTimer; + delete iLogEraser; + delete iWaitDialog; + // Close any open sessions. + iHttpTransaction.Close(); + iHttpSession.Close(); + iConnection.Close(); + iSocketServ.Close(); + } + +// --------------------------------------------------------------------------- +// Initiates the browser test. +// --------------------------------------------------------------------------- +// +void CDiagBrowserPluginModel::RunBrowserTestL() + { + LOGSTRING( "CDiagBrowserPluginModel::RunBrowserTestL()" ) + + // Mark the start time for removing the logs. + iStartTime.UniversalTime(); + iRetryCount = 0; + iTimerCalled = 0; + // Read Central Repository keys. + if ( !ReadCenRepKeysL() ) + { + HandleTestEndL( CDiagResultsDatabaseItem::EFailed ); + return; + } + + /* Read APN data. + GetConnectionMethodL( iPrimaryConnection ); + GetConnectionMethodL( iSecondaryConnection );*/ + //iTimeoutValue = 30000; + // Open the connection. + if ( !OpenAndStartConnectionL() ) + { + HandleTestEndL( CDiagResultsDatabaseItem::EFailed ); + return; + } + } + +// --------------------------------------------------------------------------- +// Returns the total number of execution steps. +// --------------------------------------------------------------------------- +TUint CDiagBrowserPluginModel::TotalSteps() + { + LOGSTRING( "CDiagBrowserPluginModel::TotalSteps()" ) + return EDiagBrowserStateMax; + } + +// --------------------------------------------------------------------------- +// The default constructor. +// --------------------------------------------------------------------------- +// +CDiagBrowserPluginModel::CDiagBrowserPluginModel( + MDiagBrowserPluginModelObserver& aObserver ) +: CActive( EPriorityStandard ), + iObserver( aObserver ) + { + LOGSTRING( "CDiagBrowserPluginModel::CDiagBrowserPluginModel()" ) + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// The second phase constructor. +// --------------------------------------------------------------------------- +// +void CDiagBrowserPluginModel::ConstructL() + { + LOGSTRING( "CDiagBrowserPluginModel::ConstructL()" ) + + // Open the connection to the Socket Server. + User::LeaveIfError( iSocketServ.Connect() ); + User::LeaveIfError( iConnection.Open( iSocketServ ) ); + idialogOn = EFalse; idialogDismissed = EFalse; + } + +// --------------------------------------------------------------------------- +// Reads and stores the browser test's Central Repository Keys. +// --------------------------------------------------------------------------- +// +TBool CDiagBrowserPluginModel::ReadCenRepKeysL() + { + LOGSTRING( "CDiagBrowserPluginModel::ReadCenRepKeysL()" ) + + // Create a Central Repository object. + CRepository* repository = CRepository::NewLC( + KCRUidDiagBrowserTestPlugin ); + + // Get the data. + /* if ( repository->Get( KDiagBrowserApnPrimary, + iPrimaryConnection.iApn ) != KErrNone || + repository->Get( KDiagBrowserApnSecondary, + iSecondaryConnection.iApn ) != KErrNone || + repository->Get( KDiagBrowserProxyAddress, + iProxyAddress ) != KErrNone || + repository->Get( KDiagBrowserProxyPort, + iProxyPort ) != KErrNone ||*/ + if( repository->Get( KDiagBrowserResponseTimeout, + iTimeoutValue ) != KErrNone || + repository->Get( KDiagBrowserUri, + iUri ) != KErrNone ) + { + LOGSTRING( "CDiagBrowserPluginModel::ReadCenRepKeysL() - CenRep read" + L" failed." ) + + CleanupStack::PopAndDestroy( repository ); + return EFalse; + } + + /* LOGSTRING3( + "CDiagBrowserPluginModel::ReadCenRepKeysL() - Primary APN '%S'" + L" Secondary APN '%S'", + &iPrimaryConnection.iApn, + &iSecondaryConnection.iApn ) + + LOGSTRING3( + "CDiagBrowserPluginModel::ReadCenRepKeysL() - Proxy '%S:%d'", + &iProxyAddress, + iProxyPort )*/ + + LOGSTRING3( + "CDiagBrowserPluginModel::ReadCenRepKeysL() - Timeout %d, Uri '%S'", + iTimeoutValue, + &iUri ) + + CleanupStack::PopAndDestroy( repository ); + return ETrue; + } + +// --------------------------------------------------------------------------- +// Finds the connection method that corresponds to the data supplied in the +// argument. +// --------------------------------------------------------------------------- +// +void CDiagBrowserPluginModel::GetConnectionMethodL( + TBrowserConnectionMethodData& aData ) + { + LOGSTRING( "CDiagBrowserPluginModel::GetConnectionMethodL()" ) + + // Look for matching connection methods. + RCmManager connManager; + connManager.OpenLC(); + + // Get a list of all the destinations. + RArray< TUint32 > connArray = RArray< TUint32 >( KConnArrayGranularity ); + CleanupClosePushL( connArray ); + connManager.AllDestinationsL( connArray ); + + // Look through all the destinations' connection methods and see if any of + // them match the CenRep data. + for ( TInt i = 0; i < connArray.Count() && !aData.iIsValid ; i++ ) + { + RCmDestination destination = connManager.DestinationL( + connArray[ i ] ); + CleanupClosePushL( destination ); + + LOGSTRING4( "CDiagBrowserPluginModel::GetConnectionMethodL() -" + L" Destination %d / %d, %d method(s)", + i + 1, + connArray.Count(), + destination.ConnectionMethodCount() ) + + // Don't use any hidden destinations, because they are not visible to + // the user. + if ( destination.IsHidden() ) + { + LOGSTRING( "CDiagBrowserPluginModel::GetConnectionMethodL() -" + L" Skipping hidden destination" ) + CleanupStack::PopAndDestroy(); // destination + continue; + } + for ( TInt j = 0; + j < destination.ConnectionMethodCount() && !aData.iIsValid; + j++ ) + { + RCmConnectionMethod method = destination.ConnectionMethodL( j ); + CleanupClosePushL( method ); + + // This call is trapped because not all connection methods support + // the data we're querying, and the leave should not be propagated + // up because that would not be a reason for test failure. + TRAP_IGNORE( CheckConnectionMatchL( method, aData ) ) + CleanupStack::PopAndDestroy(); // method + } + + CleanupStack::PopAndDestroy(); // destination + } + + // Get a list of all the uncategorized connection methods. + connArray.Reset(); + connManager.ConnectionMethodL( connArray ); + LOGSTRING2( "CDiagBrowserPluginModel::GetConnectionMethodL() -" + L" Checking %d uncategorized method(s)", + connArray.Count() ) + + // Look through all the uncategorized connection methods and see if any + // of them match match the CenRep data. + for ( TInt i = 0; i < connArray.Count() && !aData.iIsValid; i++ ) + { + RCmConnectionMethod method = connManager.ConnectionMethodL( + connArray[ i ] ); + CleanupClosePushL( method ); + + // This call is trapped because not all connection methods support + // the data we're querying, and the leave should not be propagated + // up because that would not be a reason for test failure. + TRAP_IGNORE( CheckConnectionMatchL( method, aData ) ) + CleanupStack::PopAndDestroy(); // method + } + + CleanupStack::PopAndDestroy(); // connArray + CleanupStack::PopAndDestroy(); // connManager + } + +// --------------------------------------------------------------------------- +// Checks if the connection method matches the data supplied in the argument. +// --------------------------------------------------------------------------- +// +void CDiagBrowserPluginModel::CheckConnectionMatchL( + const RCmConnectionMethod& aMethod, + TBrowserConnectionMethodData& aData ) const + { + LOGSTRING( "CDiagBrowserPluginModel::CheckConnectionMatchL()" ) + + HBufC* name = aMethod.GetStringAttributeL( + CMManager::ECmName ); + CleanupStack::PushL( name ); + +#ifdef __WINS__ + HBufC* apn = HBufC::NewL( 1 ); +#else + HBufC* apn = aMethod.GetStringAttributeL( + CMManager::EPacketDataAPName ); +#endif // __WINS__ + CleanupStack::PushL( apn ); + + TInt type = aMethod.GetIntAttributeL( + CMManager::ECmBearerType ); + + TBool hidden = aMethod.GetBoolAttributeL( + CMManager::ECmHidden ); + + HBufC* proxy = aMethod.GetStringAttributeL( + CMManager::ECmProxyServerName ); + CleanupStack::PushL( proxy ); + + TInt port = aMethod.GetIntAttributeL( + CMManager::ECmProxyPortNumber ); + + TUint apId = aMethod.GetIntAttributeL( + CMManager::ECmIapId ); + + LOGSTRING4( + "CDiagBrowserPluginModel::CheckConnectionMatchL() - CM" + L" Name '%S', Type '0x%08x', Hidden '%d'", name, type, hidden ) + + LOGSTRING5( "CDiagBrowserPluginModel::CheckConnectionMatchL() - CM" + L" APN '%S', Proxy '%S:%d', Id %d", apn, proxy, port, apId ) + +#ifdef __WINS__ + if ( apId == KEmulatorDynamicIpApId ) +#else + if ( apn->Compare( aData.iApn ) == 0 && + proxy->Compare( iProxyAddress ) == 0 && + port == iProxyPort && + type == KUidPacketDataBearerType && + !hidden ) +#endif // __WINS__ + { + aData.iApId = apId; + aData.iMethodName.Copy( *name ); + aData.iIsValid = ETrue; + + LOGSTRING2( "CDiagBrowserPluginModel::CheckConnectionMatchL() - Found" + L" AP with id %d.", aData.iApId ) + } + + CleanupStack::PopAndDestroy( proxy ); + CleanupStack::PopAndDestroy( apn ); + CleanupStack::PopAndDestroy( name ); + } + +// --------------------------------------------------------------------------- +// Starts or resets the connection timeout timer. +// --------------------------------------------------------------------------- +// +void CDiagBrowserPluginModel::StartConnectionTimerL() + { + LOGSTRING( "CDiagBrowserPluginModel::StartConnectionTimerL()" ) + + // Create the timer, or cancel an existing timer. + if ( !iTimer ) + { + iTimer = CPeriodic::NewL( EPriorityHigh ); + } + else + { + iTimer->Cancel(); + } + + // Start the timer. + iTimer->Start( + TTimeIntervalMicroSeconds32( + iTimeoutValue * KMicroSecondsInMilliseconds ), + TTimeIntervalMicroSeconds32( 0 ), + TCallBack( TimerExpired, this ) ); + iTimerCalled++; + } + +// --------------------------------------------------------------------------- +// Updates the plugin's state and reports progress to the observer. +// --------------------------------------------------------------------------- +// +void CDiagBrowserPluginModel::SetStateL( TDiagBrowserState aTargetState ) + { + LOGSTRING3( "CDiagBrowserPluginModel::SetStateL( %d ) - iState %d", + aTargetState, + iState ) + + // Check for bad state transitions. + switch ( aTargetState ) + { + case EDiagBrowserStateConnectingBearer: + __ASSERT_ALWAYS( iState == EDiagBrowserStateInitial, + Panic( EDiagBrowserPluginBadState ) ); + break; + + case EDiagBrowserStateConnectingServer: + __ASSERT_ALWAYS( iState == EDiagBrowserStateConnectingBearer, + Panic( EDiagBrowserPluginBadState ) ); + break; + + case EDiagBrowserStateErasingLog: + __ASSERT_ALWAYS( iState != EDiagBrowserStateInitial, + Panic( EDiagBrowserPluginBadState ) ); + break; + + default: + Panic( EDiagBrowserPluginBadState ); + } + + // Update the state. Send progress to the observer. + iState = aTargetState; + iObserver.TestProgressL( aTargetState ); + } + +// --------------------------------------------------------------------------- +// Callback function for handling timer events. +// --------------------------------------------------------------------------- +// +TInt CDiagBrowserPluginModel::TimerExpired( TAny* aPtr ) + { + LOGSTRING2( "CDiagBrowserPluginModel::TimerExpired( 0x%x )", aPtr ) + + __ASSERT_ALWAYS( aPtr, Panic( EDiagBrowserPluginInternal ) ); + + CDiagBrowserPluginModel* myThis = + static_cast< CDiagBrowserPluginModel* >( aPtr ); + + // Stop the timer to prevent further undesired callbacks. + myThis->iTimer->Cancel(); + myThis->TimerCleanUp(); + // Try to continue test execution by retrying the secondary connection. + //TRAPD( error, myThis->RetryConnectionL() ); + return KErrNone; + } +void CDiagBrowserPluginModel::TimerCleanUp() +{ + + if (iState == EDiagBrowserStateConnectingBearer) + { + if(iTimerCalled<=1) + StartConnectionTimerL(); + else + iConnection.Stop( RConnection::EStopAuthoritative ); + } + else if (iState == EDiagBrowserStateConnectingServer) + iHttpTransaction.Cancel(); + +} +// --------------------------------------------------------------------------- +// Opens the network connection. This may be called multiple times if a +// retry is necessary. +// --------------------------------------------------------------------------- +TBool CDiagBrowserPluginModel::OpenAndStartConnectionL() + { + LOGSTRING( "CDiagBrowserPluginModel::OpenAndStartConnectionL()" ) + + // Check if there is a valid connection to use. + /*if ( !iPrimaryConnection.iIsValid && !iSecondaryConnection.iIsValid ) + { + LOGSTRING( "CDiagBrowserPluginModel::OpenAndStartConnectionL() - No" + L" valid connections." ) + return EFalse; + } + */ + + // Reset the connection. + iHttpTransaction.Close(); + iHttpSession.Close(); + iConnection.Stop(); + iState = EDiagBrowserStateInitial; + + iConnectionPrefs.SetDialogPreference(ECommDbDialogPrefPrompt);//ECommDbDialogPrefDoNotPrompt ECommDbDialogPrefPrompt + LOGSTRING("SetDialogPreference( ECommDbDialogPrefPrompt)"); + iConnectionPrefs.SetDirection( ECommDbConnectionDirectionOutgoing ); + //iConnectionPrefs.SetIapId( iapID ); + //iConnectionPrefs.SetBearerSet(ECommDbBearerGPRS); + iConnection.Start( iConnectionPrefs, iStatus ); + SetActive(); + ShowProgressNoteL(); + // Start the timer and set the state to notify progress. + StartConnectionTimerL(); + SetStateL( EDiagBrowserStateConnectingBearer ); + return ETrue; + } + +// --------------------------------------------------------------------------- +// Handles ending the test by deleting the logs, if necessary, and informing +// the observer. +// --------------------------------------------------------------------------- +void CDiagBrowserPluginModel::HandleTestEndL( + CDiagResultsDatabaseItem::TResult aResult ) + { + LOGSTRING2( "CDiagBrowserPluginModel::HandleTestEndL( %d )", aResult ) + + // Store the result, to return when log deletion completes. + iResult = aResult; + + // Delete the logs, if necessary. + if ( iState != EDiagBrowserStateInitial ) + { + if ( !iLogEraser ) + { + iLogEraser = CDiagLogEventEraser::NewL( *this ); + } + + // Set the filter for log erasing. + TUid eventType; + TTime now; + eventType.iUid = KLogPacketDataEventType; + now.UniversalTime(); + + CLogFilter& filter = iLogEraser->Filter(); + filter.SetEventType( eventType ); + filter.SetStartTime( iStartTime ); + filter.SetEndTime( now ); + + // Erase the logs from the test, asynchronously. + SetStateL( EDiagBrowserStateErasingLog ); + iLogEraser->StartAsyncEraseLogsL(); + } + else + { + iObserver.TestEndL( iResult ); + } + + + // clear the dialogue only if dialog is running. + if(idialogOn) + iWaitDialog->ProcessFinishedL(); + } +// ---------------------------------------------------------------------------- +// CDiagDataNetworkTestPDPEngine::ShowVibrationNoteL +// +// Progress Note +// ---------------------------------------------------------------------------- + +void CDiagBrowserPluginModel::ShowProgressNoteL() + { + if ( iWaitDialog ) + { + delete iWaitDialog; + iWaitDialog = NULL; + } + + + // WAIT NOTE DIALOG + iWaitDialog = new (ELeave) CAknWaitDialog( + (REINTERPRET_CAST(CEikDialog**, &iWaitDialog)), + ETrue); + + iWaitDialog->PrepareLC(R_BROWSER_PLUGIN_WAIT_NOTE); + iWaitDialog->SetCallback(this); + iWaitDialog->RunLD(); + idialogOn = ETrue; + LOGSTRING("CDiagBrowserPluginModel::ShowProgressNoteL()"); + + } + +//********************************************************* +// CallBack from AKnWaitDialog when Cancel is pressed +//********************************************************* + +void CDiagBrowserPluginModel::DialogDismissedL( TInt aButtonId ) + { + LOGSTRING2("CDiagBrowserPluginModel::DialogDismissedL() = %d",aButtonId); + + if (aButtonId == EBrowserTestCancel && idialogOn) + { + // cancel the tests based on which point the dialog is dismissed + LOGSTRING2("CDiagBrowserPluginModel::DialogDismissed @ iState= %d",iState); + if (iState == EDiagBrowserStateConnectingBearer) + iConnection.Stop( RConnection::EStopAuthoritative ); + else if (iState == EDiagBrowserStateConnectingServer) + iHttpTransaction.Cancel(); + iWaitDialog = NULL; + idialogOn = EFalse; + idialogDismissed = ETrue; + } + } +// --------------------------------------------------------------------------- +// Attempts to continue test execution by retrying with the secondary +// connection. +// --------------------------------------------------------------------------- +void CDiagBrowserPluginModel::RetryConnectionL() + { + LOGSTRING( "CDiagBrowserPluginModel::RetryConnectionL()" ); + + if (iRetryCount < 1 && !idialogDismissed) + { + if ( OpenAndStartConnectionL() ) + { + iRetryCount++; + return; + } + } + HandleTestEndL( CDiagResultsDatabaseItem::EFailed ); + } + +// --------------------------------------------------------------------------- +// From class CActive. +// Active object run handler. +// --------------------------------------------------------------------------- +void CDiagBrowserPluginModel::RunL() + { + LOGSTRING( "CDiagBrowserPluginModel::RunL()" ) + + __ASSERT_ALWAYS( iState == EDiagBrowserStateConnectingBearer, + Panic( EDiagBrowserPluginBadState ) ); + + // Stop the timer. + if ( iTimer ) + { + iTimer->Cancel(); + } + + if (iStatus == KErrConnectionTerminated ) + { + HandleTestEndL( CDiagResultsDatabaseItem::ESkipped ); + return; + } + // Check if the connection succeeded. + if ( iStatus != KErrNone ) + { + LOGSTRING2( + "CDiagBrowserPluginModel::RunL() - connection failed. Error %d", + iStatus.Int() ) + LOGSTRING( "retry if possible()" ); + // Retry, if possible. + //RetryConnectionL(); + HandleTestEndL( CDiagResultsDatabaseItem::EFailed ); + return; + } + + // Open the HTTP Session. + iHttpSession.OpenL(); + + // Associate the HTTP session with the open connection. + RStringPool pool = iHttpSession.StringPool(); + RHTTPConnectionInfo connInfo = iHttpSession.ConnectionInfo(); + connInfo.SetPropertyL( pool.StringF( HTTP::EHttpSocketServ, + RHTTPSession::GetTable() ), + THTTPHdrVal( iSocketServ.Handle() ) ); + TInt connectionPtr = reinterpret_cast< TInt >( &iConnection ); + connInfo.SetPropertyL( pool.StringF( HTTP::EHttpSocketConnection, + RHTTPSession::GetTable() ), + THTTPHdrVal( connectionPtr ) ); + + // Copy the URI to an 8-bit descriptor. Directly getting an 8-bit + // descriptor from Central Repository does not seem to work properly. + TBuf8< KMaxStringLength > uri8; + uri8.Copy( iUri ); + + TUriParser8 uriParser; + if ( uriParser.Parse( uri8 ) != KErrNone ) + { + LOGSTRING2( + "CDiagBrowserPluginModel::RunL() - parsing the uri '%S' failed.", + &iUri ) + HandleTestEndL( CDiagResultsDatabaseItem::EFailed ); + return; + } + + // Create an HTTP transaction, setting the model as the callback object. + iHttpTransaction = iHttpSession.OpenTransactionL( uriParser, *this ); + iHttpTransaction.SubmitL(); + LOGSTRING2( "CDiagBrowserPluginModel::RunL() - HTTP transaction submitted" + L" for '%S'", + &iUri ) + + // Start the timer and set the state to notify progress. + StartConnectionTimerL(); + SetStateL( EDiagBrowserStateConnectingServer ); + } + +// --------------------------------------------------------------------------- +// From class CActive. +// Handles leaves in the active object's RunL function. +// --------------------------------------------------------------------------- +TInt CDiagBrowserPluginModel::RunError( TInt aError ) + { + LOGSTRING2( "CDiagBrowserPluginModel::RunError aError( %d )", aError ) + + // Try to continue test execution by retrying the secondary connection. + //TRAPD( error, RetryConnectionL() ); + //return error; + TInt err(KErrNone); + TRAP( err, HandleTestEndL( CDiagResultsDatabaseItem::EFailed )); + LOGSTRING2( "CDiagBrowserPluginModel::RunError err( %d )", err ) + return KErrNone; + } + +// --------------------------------------------------------------------------- +// From class CActive. +// Active object cancel. +// --------------------------------------------------------------------------- +void CDiagBrowserPluginModel::DoCancel() + { + LOGSTRING( "CDiagBrowserPluginModel::DoCancel()" ) + + // Does not have an asynchronous cancel, but this functions as Cancel. + iConnection.Stop( RConnection::EStopAuthoritative ); + } + +// --------------------------------------------------------------------------- +// From class MHTTPTransactionCallback. +// Called when an event occurs on an HTTP transaction. +// --------------------------------------------------------------------------- +void CDiagBrowserPluginModel::MHFRunL( RHTTPTransaction aTransaction, + const THTTPEvent& aEvent ) + { + LOGSTRING2( "CDiagBrowserPluginModel::MHFRunL() - aEvent.iStatus %d", + aEvent.iStatus ) + + __ASSERT_ALWAYS( iState == EDiagBrowserStateConnectingServer, + Panic( EDiagBrowserPluginBadState ) ); + __ASSERT_ALWAYS( aTransaction.Id() == iHttpTransaction.Id(), + Panic( EDiagBrowserPluginTransaction ) ); + + // Failed status. + if ( aEvent == THTTPEvent::EFailed ) + { + LOGSTRING( "CDiagBrowserPluginModel::MHFRunL() - Response failed." ) + //RetryConnectionL(); + //return; + HandleTestEndL( CDiagResultsDatabaseItem::EFailed ); + } + + // Skip non-success / non-failure statuses. + if ( aEvent != THTTPEvent::EGotResponseHeaders && + aEvent != THTTPEvent::EGotResponseBodyData && + aEvent != THTTPEvent::EResponseComplete && + aEvent != THTTPEvent::ESucceeded && + aEvent != THTTPEvent::ERequestComplete ) + { + LOGSTRING( "CDiagBrowserPluginModel::MHFRunL() - Unused event." ) + return; + } + + // Stop the request, so we don't get any further callbacks. + iHttpTransaction.Cancel(); + + // Get the HTTP response code and check it. + RHTTPResponse response = aTransaction.Response(); + if ( response.StatusCode() != KHttpResponseCodeOk ) + { + LOGSTRING2( "CDiagBrowserPluginModel::MHFRunL() - status code is %d", + response.StatusCode() ) + HandleTestEndL( CDiagResultsDatabaseItem::EFailed ); + } + else + { + LOGSTRING( + "CDiagBrowserPluginModel::MHFRunL() - connection succeeded" ) + HandleTestEndL( CDiagResultsDatabaseItem::ESuccess ); + } + } + +// --------------------------------------------------------------------------- +// From class MHTTPTransactionCallback. +// Called when an error occurs on an HTTP transaction. +// --------------------------------------------------------------------------- +TInt CDiagBrowserPluginModel::MHFRunError( TInt aError, + RHTTPTransaction aTransaction, + const THTTPEvent& /* aEvent */ ) + { + LOGSTRING2( "CDiagBrowserPluginModel::MHFRunError( %d )", aError ) + + __ASSERT_ALWAYS( iState == EDiagBrowserStateConnectingServer, + Panic( EDiagBrowserPluginBadState ) ); + __ASSERT_ALWAYS( aTransaction.Id() == iHttpTransaction.Id(), + Panic( EDiagBrowserPluginTransaction ) ); + + // Try to continue test execution by retrying the secondary connection. + TRAPD( error, RetryConnectionL() ); + return error; + } + +// --------------------------------------------------------------------------- +// From class MDiagLogEventEraserObserver. +// This function checks if the log event needs to be deleted. +// --------------------------------------------------------------------------- +TBool CDiagBrowserPluginModel::IsEventToBeDeleted( const CLogEvent& aEvent ) + { + LOGSTRING( "CDiagBrowserPluginModel::IsEventToBeDeleted()" ) + + if ( ( iPrimaryConnection.iUsed && aEvent.RemoteParty().Compare( + iPrimaryConnection.iMethodName ) == 0 ) || + ( iSecondaryConnection.iUsed && aEvent.RemoteParty().Compare( + iSecondaryConnection.iMethodName ) == 0 ) ) + { + // The name matches, so delete the log entry. + return ETrue; + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// From class MDiagLogEventEraserObserver. +// This function notifies that the erase operation is complete. +// --------------------------------------------------------------------------- +void CDiagBrowserPluginModel::CompleteEventEraseL( TInt aError ) + { + LOGSTRING2( + "CDiagBrowserPluginModel::CompleteEventEraseL( %d )", aError ) + + __ASSERT_ALWAYS( iState == EDiagBrowserStateErasingLog, + Panic( EDiagBrowserPluginBadState ) ); + + // The error code is ignored, because it's not part of the criteria for + // the test to pass. We are deleting logs asynchronously, so the browser + // portion of the test has already stored a result in iResult. + iState = EDiagBrowserStateInitial; + + // dialog dismissed with Cancel + + if (idialogDismissed) + iResult = CDiagResultsDatabaseItem::ESkipped; + + LOGSTRING2( "CDiagBrowserPluginModel::dialogDismissed = %d)", idialogDismissed) + iObserver.TestEndL( iResult ); + } + +// End of File