devicediagnostics/diagplugins/diagheadsetcableplugin/src/diagheadsetcableengine.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/diagplugins/diagheadsetcableplugin/src/diagheadsetcableengine.cpp Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,416 @@
+/*
+* 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 class module for the Diag Headset Cable Test Engine
+*
+*/
+
+
+// INCLUDE FILES
+
+// Class Declaration
+#include "diagheadsetcableengine.h"
+
+#include <StringLoader.h> // StringLoader
+#include <HeadsetStatus.h> // CHeadsetStatus
+#include <aknmessagequerydialog.h> // CAknMessageQueryDialog
+#include <DiagFrameworkDebug.h> // debug macros
+#include <devdiagheadsetcabletestpluginrsc.rsg> // resources
+#include <DiagPluginWaitingDialogWrapper.h> // CDiagPluginWaitingDialogWrapper
+
+#include "diagheadsetcabletestplugin.hrh" // command ids
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ==============================
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// Symbian OS default constructor
+// ---------------------------------------------------------------------------
+//
+CDiagHeadsetCableTestEngine* CDiagHeadsetCableTestEngine::NewL(
+ MDiagHeadsetTestCallBackInterface& aInterface,
+ TBool aIsSinglePluginExecution)
+ {
+ LOGSTRING( "CDiagHeadsetCableTestEngine instance created" )
+ CDiagHeadsetCableTestEngine* self = new (ELeave)
+ CDiagHeadsetCableTestEngine(aInterface, aIsSinglePluginExecution);
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ----------------------------------------------------------------------------
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CDiagHeadsetCableTestEngine::CDiagHeadsetCableTestEngine(
+ MDiagHeadsetTestCallBackInterface& aInterface,
+ TBool aIsSinglePluginExecution)
+ : CActive( EPriorityStandard ),
+ iInterface(aInterface),
+ iWaitingDialogWrapper( NULL ),
+ iIsSinglePluginExecution(aIsSinglePluginExecution)
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CDiagHeadsetCableTestEngine::~CDiagHeadsetCableTestEngine()
+ {
+ LOGSTRING( "CDiagHeadsetCableTestEngine instance destroyed" )
+ Cancel();
+
+ delete iWaitingDialogWrapper; // deleting will dismiss active dialog
+ iWaitingDialogWrapper = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// Symbian OS second phase constructor
+// ---------------------------------------------------------------------------
+void CDiagHeadsetCableTestEngine::ConstructL()
+ {
+ // nothting needed here
+ }
+
+// ----------------------------------------------------------------------------
+// This function starts the Headset cable test
+// ----------------------------------------------------------------------------
+void CDiagHeadsetCableTestEngine::RunHeadsetCableTestL()
+ {
+ TInt userResponse;
+ if ( !ConnectAndPressOkL( userResponse ) )
+ {
+ // "Connect Headset and Press OK" dialog was dismisses internally by framework
+ // return immediately
+ LOGSTRING( "CDiagHeadsetCableTestEngine : Connect Headset and press ok dialog dismissed internally" )
+ return;
+ }
+
+ switch( userResponse )
+ {
+ // User select OK for "Connect Headset and Press OK" dialog
+ case EAknSoftkeyOk:
+ {
+ //TInt keySelect;
+ // check if headset cable is connected
+ if( CheckIfHeadsetDetectedL() )
+ {
+ // Headset cable is detected.
+ LOGSTRING( "CDiagHeadsetCableTestEngine : Headset detected" )
+ // if ( !RemoveAllCablesL( keySelect ) )
+ // {
+ // LOGSTRING( "CDiagHeadsetCableTestEngine : Remove All Cable dialog was dismissed internally pressed" )
+ // return;
+ // }
+
+ // if ( keySelect != EAknSoftkeyOk )
+ // {
+ // LOGSTRING( "CDiagHeadsetCableTestEngine : EndKey has pressed" )
+ // return;
+ // }
+ LOGSTRING( "CDiagHeadsetCableTestEngine : Report result Success" )
+ ReportResultToPluginL(CDiagResultsDatabaseItem::ESuccess);
+ }
+ else
+ {
+ // Headset cable is not detected
+ if ( !AskIfRetryL( userResponse ) )
+ {
+ // Retry Back dialog was dismissed internally by framework internally
+ LOGSTRING( "CDiagHeadsetCableTestEngine : Ask for retry dialog dismissed internally" )
+ return;
+ }
+
+ //if( userResponse == EAknSoftkeyOk ) // ADO & Platformization Changes
+ if( userResponse == EHeadsetTestConnectHeadsetNo )
+ {
+ // User selects Ok to confirm, Test fails
+ ReportResultToPluginL(CDiagResultsDatabaseItem::EFailed);
+ }
+ // else if( userResponse == EHeadsetTestConnectHeadsetBack ) // ADO & Platformization Changes
+ else if( userResponse == EHeadsetTestConnectHeadsetYes )
+ {
+ // User selectes Back to retry the test
+ TRequestStatus* status = &iStatus;
+ SetActive();
+ User::RequestComplete( status, KErrNone );
+ }
+ else
+ {
+ // User cancels the test using Canceld end key, return immediately
+ return;
+ }
+ }
+ }
+ break;
+ // User select CANCEL softkey for "Connect Headset and Press OK" dialog
+ case EHeadsetTestConnectHeadsetSkip:
+ case EHeadsetTestConnectHeadsetCancel:
+ {
+ if(!iIsSinglePluginExecution)
+ {
+ if( iInterface.AskCancelExecutionL(userResponse) )
+ {
+ switch(userResponse)
+ {
+ case EAknSoftkeyOk:
+ {
+ //CompleteTestL( CDiagResultsDatabaseItem::ECancelled );
+ LOGSTRING( "CDiagHeadsetCableTestEngine User cancelled the test" )
+ return;
+ }
+
+ default:
+ {
+ // currently no way distinguish between Cancel and No key
+
+ // user selected "No" to cancel
+ // do a self-trigger to start again
+ TRequestStatus* status = &iStatus;
+ SetActive();
+ User::RequestComplete( status, KErrNone );
+
+ // this trigger for Cancel key is cancelled by CActive::Cancel() in destructor
+ }
+ break;
+ }
+ }
+ else
+ {
+ // though cancel dialog should not be dismissed internally by the framework
+ // this is just a safeguard to make sure we dont do anything
+ LOGSTRING( "CDiagHeadsetCableTestEngine Cancel dialog was dismissed internally" )
+ return;
+ }
+ }
+ else
+ {
+ ReportResultToPluginL( CDiagResultsDatabaseItem::ESkipped );
+ return;
+ }
+ }
+ break;
+
+ // User select CANCEL (RED End KEY) for "Connect Headset and Press OK" dialog
+ default:
+ {
+ LOGSTRING( "CDiagHeadsetCableTestEngine Connect Headset and press OK dialog was cancelled by end key." )
+ }
+ break;
+ };
+
+ }
+
+// ----------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::CheckIfHeadsetDetectedL
+//
+// This function reports the result to plugin
+// ----------------------------------------------------------------------------
+TBool CDiagHeadsetCableTestEngine::CheckIfHeadsetDetectedL()
+ {
+ TBool retval = EFalse;
+ TBool isConnected = EFalse;
+ CHeadsetStatus* aHeadsetStatus = CHeadsetStatus::NewL();
+
+ CleanupStack::PushL( aHeadsetStatus );
+ TInt err( aHeadsetStatus->HeadsetConnectedL( isConnected ) );
+ CleanupStack::PopAndDestroy( aHeadsetStatus );
+
+ if(err == KErrNone)
+ {
+ if( isConnected )
+ {
+ LOGSTRING( "CDiagHeadsetCableTestEngine Headset cable is connected" )
+ retval = ETrue; // headset is connected
+ }
+ else
+ {
+ LOGSTRING( "CDiagHeadsetCableTestEngine Headset cable is not connected" )
+ retval = EFalse; // headset is not connected
+ }
+ }
+ else
+ {
+ LOGSTRING( "CDiagHeadsetCableTestEngine some error occurred in detecting Headset cable" )
+ retval = EFalse; // some error occurred
+ }
+
+ return retval;
+ }
+
+
+
+// ----------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::ReportResultToPluginL
+//
+// This function reports the result to plugin
+// ----------------------------------------------------------------------------
+void CDiagHeadsetCableTestEngine::ReportResultToPluginL(CDiagResultsDatabaseItem::TResult aResult)
+ {
+ iInterface.ReportTestResultL( aResult );
+ }
+
+// ---------------------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::ConnectAndPressOkL
+// This function shows the query dialog "Connect your Headset charger. Press OK when ready."
+// ---------------------------------------------------------------------------------------
+TBool CDiagHeadsetCableTestEngine::ConnectAndPressOkL( TInt& aUserResponse )
+ {
+ ASSERT( iWaitingDialogWrapper == NULL );
+
+ CAknQueryDialog* dialog = CAknQueryDialog::NewL( CAknQueryDialog::ENoTone );
+ CleanupStack::PushL( dialog );
+ dialog->PrepareLC( R_DIAG_HEADSET_CABLE_TEST_CONNECT_AND_PRESS_OK );
+ if( iIsSinglePluginExecution )
+ {
+ CEikButtonGroupContainer& cba = dialog->ButtonGroupContainer();
+ cba.SetCommandSetL( R_CBA_CONNECT_AND_PRESS_OK_SINGLE_EXECUTION );
+ }
+ CleanupStack::Pop( dialog );
+
+ // dialog ownership to bepassed to iWaitingDialogWrapper
+ // CDiagPluginWaitingDialogWrapper::NewL will push dialog into clean up stack
+ iWaitingDialogWrapper = CDiagPluginWaitingDialogWrapper::NewL( dialog );
+ dialog = NULL;
+
+ TBool isDialogDismissedByUser = iWaitingDialogWrapper->RunLD( aUserResponse );
+ if ( isDialogDismissedByUser )
+ {
+ // local variable can be accessed only if it was returned due to
+ // user response. iWaitingDialogWrapper self destructs.
+ iWaitingDialogWrapper = NULL;
+ }
+
+ return isDialogDismissedByUser;
+ }
+
+// ---------------------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::RemoveAllCables
+// This function shows the query dialog : Please remove all cables
+// ---------------------------------------------------------------------------------------
+TBool CDiagHeadsetCableTestEngine::RemoveAllCablesL( TInt& aUserResponse )
+ {
+ ASSERT( iWaitingDialogWrapper == NULL );
+
+ CAknQueryDialog* dialog = CAknQueryDialog::NewL( CAknQueryDialog::ENoTone );
+
+ dialog->PrepareLC( R_DIAG_CABLE_TEST_REMOVE_ALL_CABLES );
+
+ // dialog ownership to bepassed to iWaitingDialogWrapper
+ // CDiagPluginWaitingDialogWrapper::NewL will push dialog into clean up stack
+ iWaitingDialogWrapper = CDiagPluginWaitingDialogWrapper::NewL( dialog );
+ dialog = NULL;
+
+ TBool isDialogDismissedByUser = iWaitingDialogWrapper->RunLD( aUserResponse );
+ if ( isDialogDismissedByUser )
+ {
+ // local variable can be accessed only if it was returned due to
+ // user response. iWaitingDialogWrapper self destructs.
+ iWaitingDialogWrapper = NULL;
+ }
+
+ return isDialogDismissedByUser;
+ }
+
+// ----------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::AskIfRetryL
+// This function shows the query dialog "No cable detected. Press OK to continue
+// tests or press Back to retry this test."
+// ----------------------------------------------------------------------------
+TBool CDiagHeadsetCableTestEngine::AskIfRetryL( TInt& aUserResponse )
+ {
+ return DisplayQueryDialogWithHeaderL( R_DIAG_HEADSET_CABLE_TEST_NO_CABLE_DETECTED,
+ aUserResponse );
+ }
+
+// ---------------------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::DisplayQueryDialogWithHeaderL
+// This function shows the query dialog with header. It returns ETrue,
+// if the dialog is dismissed by user. If the dialog was dismissed because of time-out,
+// it returns EFalse. The user response (softkey) is returned in the reference
+// argument aUserResponse
+// ---------------------------------------------------------------------------------------
+TBool CDiagHeadsetCableTestEngine::DisplayQueryDialogWithHeaderL(
+ TInt aDialogResourceId,
+ TInt& aUserResponse )
+ {
+ ASSERT( iWaitingDialogWrapper == NULL );
+
+ CAknMessageQueryDialog * dialog = new ( ELeave )
+ CAknMessageQueryDialog ( CAknQueryDialog::ENoTone );
+ CleanupStack::PushL( dialog );
+ dialog->PrepareLC( aDialogResourceId );
+ CleanupStack::Pop( dialog );
+
+ // dialog ownership to bepassed to iWaitingDialogWrapper
+ // CDiagPluginWaitingDialogWrapper::NewL will push dialog into clean up stack
+ iWaitingDialogWrapper = CDiagPluginWaitingDialogWrapper::NewL( dialog );
+ dialog = NULL;
+
+ TBool isDialogDismissedByUser = iWaitingDialogWrapper->RunLD( aUserResponse );
+ if ( isDialogDismissedByUser )
+ {
+ // local variable can be accessed only if it was returned due to
+ // user response. iWaitingDialogWrapper self destructs.
+ iWaitingDialogWrapper = NULL;
+ }
+
+ return isDialogDismissedByUser;
+ }
+
+
+// ---------------------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::RunL
+// RunL() function is used in this plug-in to handle internal trigger
+// ---------------------------------------------------------------------------------------
+void CDiagHeadsetCableTestEngine::RunL()
+ {
+ if(iStatus == KErrNone)
+ {
+ RunHeadsetCableTestL();
+ }
+ }
+
+// ---------------------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::DoCancel
+// Handles cancel request
+// ---------------------------------------------------------------------------------------
+void CDiagHeadsetCableTestEngine::DoCancel()
+ {
+ // no implementation needed
+ }
+
+// End of File