--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/diagplugins/diagusbcableplugin/src/diagusbcabletestengine.cpp Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,490 @@
+/*
+* 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 USB Cable Test Engine
+*
+*/
+
+
+// INCLUDE FILES
+
+// Class Declaration
+#include "diagusbcabletestengine.h"
+
+// System includes
+#include <DiagFrameworkDebug.h> // LOGSTRING
+#include <DiagPluginWaitingDialogWrapper.h> // CDiagPluginWaitingDialogWrapper
+#include <devdiagusbcabletestpluginrsc.rsg> // resources
+#include <UsbWatcherInternalCRKeys.h> // KUsbWatcherChangeOnConnectionSetting
+#include <aknmessagequerydialog.h> // CAknQueryDialog
+#include <centralrepository.h> // CRepository
+
+
+// User includes
+#include "diagusbcabletestplugin.hrh" // command ids
+#include "avkon.hrh" // ADO & Platformization Changes
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ==============================
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CDiagUSBCableTestEngine::NewL()
+//
+// Symbian OS default constructor
+// ---------------------------------------------------------------------------
+CDiagUSBCableTestEngine* CDiagUSBCableTestEngine::NewL(
+ MDiagUSBTestCallBackInterface& aInterface,
+ TBool aIsSinglePluginExecution)
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine::NewL()" )
+
+ CDiagUSBCableTestEngine* self =
+ new (ELeave)CDiagUSBCableTestEngine(aInterface, aIsSinglePluginExecution);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CDiagUSBCableTestEngine::CDiagUSBCableTestEngine()
+//
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CDiagUSBCableTestEngine::CDiagUSBCableTestEngine(
+ MDiagUSBTestCallBackInterface& aInterface,
+ TBool aIsSinglePluginExecution)
+ : CActive( EPriorityStandard ),
+ iInterface(aInterface),
+ iWaitingDialogWrapper( NULL ),
+ iIsSinglePluginExecution(aIsSinglePluginExecution)
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine::CDiagUSBCableTestEngine()" )
+ CActiveScheduler::Add( this );
+ }
+
+// ----------------------------------------------------------------------------
+// CDiagUSBCableTestEngine::~CDiagUSBCableTestEngine
+//
+// Destructor
+// ----------------------------------------------------------------------------
+CDiagUSBCableTestEngine::~CDiagUSBCableTestEngine()
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine::~CDiagUSBCableTestEngine()" )
+
+ Cancel();
+
+ if(iCenRep)
+ {
+ // if the cenrep was modified by us , restore the settings
+ if(iCenrepModified)
+ {
+ TInt error = iCenRep->Set( KUsbWatcherChangeOnConnectionSetting, 1);
+ iCenrepModified = EFalse;
+ }
+
+ delete iCenRep;
+ iCenRep = NULL;
+ }
+
+ if(iWaitingDialogWrapper)
+ {
+ delete iWaitingDialogWrapper; // deleting will dismiss active dialog
+ iWaitingDialogWrapper = NULL;
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CDiagUSBCableTestEngine::ConstructL()
+//
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+void CDiagUSBCableTestEngine::ConstructL()
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine::ConstructL()" )
+
+ // check if USB's "Ask on Connection" is on
+ // if ON, set if OFF, remember to turn in ON again at the end of test
+
+ TInt retval;
+ iCenRep = CRepository::NewL( KCRUidUsbWatcher );
+ iCenrepModified = EFalse;
+ iCenRep->Get( KUsbWatcherChangeOnConnectionSetting, retval);
+ if(retval)
+ {
+ //if setting is 1,set it to 0, and remember to reset it back when application exits.
+ iCenrepModified = ETrue;
+ TInt error = iCenRep->Set( KUsbWatcherChangeOnConnectionSetting, 0);
+ }
+ }
+
+
+// ----------------------------------------------------------------------------
+// CDiagUSBCableTestEngine::RunUSBCableTestL
+//
+// This function starts the USB cable test
+// ----------------------------------------------------------------------------
+void CDiagUSBCableTestEngine::RunUSBCableTestL()
+ {
+ TInt userResponse;
+
+ if ( !ConnectAndPressOkL( userResponse ) )
+ {
+ //"Connect and Press OK" dialog was dismissed internally by the framework
+ // return immediately
+ LOGSTRING( "CDiagUSBCableTestEngine Connect USB and confirm dialog was dismissed internally" )
+ return;
+ }
+
+ switch( userResponse )
+ {
+ // user selects OK for "Connect and Press OK" dialog
+ case EAknSoftkeyOk:
+ {
+ //TInt keySelect;
+ // check if cable is connected
+ if( CheckIfUSBCableDetectedL() )
+ {
+ // USB cable is detected
+ /*
+ if ( !RemoveAllCablesL( keySelect ) )
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine : Remove All Cable dialog was dismissed internally pressed" )
+ return;
+ }
+
+ if ( keySelect != EAknSoftkeyOk )
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine : EndKey has pressed" )
+ return;
+ }
+ */ // ADO & Platformization Changes
+
+ LOGSTRING( "CDiagUSBCableTestEngine : Report result Success" )
+ ReportResultToPluginL( CDiagResultsDatabaseItem::ESuccess );
+ }
+ else
+ {
+ // no cable detected
+ if ( !AskIfRetryL( userResponse ) )
+ {
+ // Retry dialog was dimissed internally by the framework
+ // return immediately
+ LOGSTRING( "CDiagUSBCableTestEngine Ask for retry dialog was dismissed internally" )
+ return;
+ }
+
+
+
+ if( userResponse == EAknSoftkeyYes )
+ {
+ // User selects Back to retry the test
+ // will come here in case of Back or Cancel key
+ TRequestStatus* status = &iStatus;
+ SetActive();
+ User::RequestComplete( status, KErrNone );
+ }
+ else
+ {
+ //Retry dialog was dismissed by Cancel / End key
+ ReportResultToPluginL(CDiagResultsDatabaseItem::EFailed);
+ LOGSTRING( "CDiagUSBCableTestEngine Retry dialog was dismissed by Cancel / End key" )
+ return;
+ }
+ }
+ }
+ break;
+
+ // user selects CANCEL softkey for "Connect and Press OK" dialog
+ case EUsbTestConnectUSBSkip:
+ case EUsbTestConnectUSBCancel:
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine User Cancelled the test execution" )
+ if(iIsSinglePluginExecution)
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine User skipped the test execution" )
+ ReportResultToPluginL(CDiagResultsDatabaseItem::ESkipped);
+ }
+ else
+ {
+ TInt aOption = 1;
+ if(iInterface.AskCancelExecutionL(userResponse,aOption))
+ {
+ if(userResponse)
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine Test cancelled by user" )
+ return;
+ }
+ else
+ {
+ // currently no way to distinguish between "No" and "Cancel" key
+ LOGSTRING( "CDiagUSBCableTestEngine : User selected No to Cancel dialog" )
+ // do a self-trigger to start again
+ TRequestStatus* status = &iStatus;
+ SetActive();
+ User::RequestComplete( status, KErrNone );
+ }
+ }
+ else
+ {
+ // though the cancel dialog should not be dismissed internally, this is
+ // just a safeguard to be sure we dont do anything
+ LOGSTRING( "CDiagUSBCableTestEngine Test cancel dialog dismissed internally" )
+ break;
+ }
+ }
+
+ }
+ break;
+
+ // user selects CANCEL End Key for "Connect and Press OK" dialog
+ default:
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine Connect USB and confirm dialog was cancelled by the end key" )
+ }
+ break;
+ };
+ }
+
+// ----------------------------------------------------------------------------
+// CDiagUSBCableTestEngine::CheckIfUSBCableDetectedL
+//
+// This function reports the result to plugin
+// ----------------------------------------------------------------------------
+TBool CDiagUSBCableTestEngine::CheckIfUSBCableDetectedL()
+ {
+ TBool bCableDetected = EFalse;
+ TInt err = iUsbManager.Connect();
+ if(err == KErrNone)
+ {
+ // get the USB service state
+ TUsbServiceState UsbServiceState;
+ err = iUsbManager.GetServiceState(UsbServiceState);
+ LOGSTRING2( "CDiagUSBCableTestEngine::USB service state: %d", UsbServiceState)
+
+ if(err == KErrNone)
+ {
+ switch(UsbServiceState)
+ {
+ case EUsbServiceStarting:
+ case EUsbServiceStarted:
+ {
+ // get the USB device state
+ TUsbDeviceState UsbDeviceState;
+ err = iUsbManager.GetDeviceState(UsbDeviceState);
+ LOGSTRING2( "CDiagUSBCableTestEngine::USB Device state: %d", UsbDeviceState)
+ if(err == KErrNone)
+ {
+ if(UsbDeviceState > EUsbDeviceStatePowered)
+ {
+ bCableDetected = ETrue;
+ }
+ else
+ {
+ bCableDetected = EFalse;
+ }
+ }
+ else
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine Error in obtaining USB Device state")
+ bCableDetected = EFalse;
+ }
+ }
+ break;
+
+ case EUsbServiceIdle:
+ case EUsbServiceStopping:
+ case EUsbServiceFatalError:
+ default:
+ {
+ bCableDetected = EFalse;
+ }
+ break;
+ };
+ }
+ else
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine Error in obtaining USB Service state")
+ bCableDetected = EFalse;
+ }
+
+ iUsbManager.Close();
+ }
+ else
+ {
+ LOGSTRING( "CDiagUSBCableTestEngine::iUsbManager.Connect() failed" )
+ bCableDetected = EFalse;
+ }
+
+ return bCableDetected;
+ }
+
+// ----------------------------------------------------------------------------
+// CDiagUSBCableTestEngine::ReportResultToPluginL
+//
+// This function reports the result to plugin
+// ----------------------------------------------------------------------------
+void CDiagUSBCableTestEngine::ReportResultToPluginL(
+ CDiagResultsDatabaseItem::TResult aResult)
+ {
+ iInterface.ReportTestResultL(aResult);
+ }
+
+// --------------------------------------------------------------------------------------------------------------
+// CDiagUSBCableTestPlugin::ConnectAndPressOkL
+// This function shows the query dialog : "Connect an USB data cable from phone to the PC. Press OK when ready."
+// --------------------------------------------------------------------------------------------------------------
+TBool CDiagUSBCableTestEngine::ConnectAndPressOkL( TInt& aUserResponse )
+ {
+ ASSERT( iWaitingDialogWrapper == NULL );
+
+ CAknQueryDialog* dialog = CAknQueryDialog::NewL( CAknQueryDialog::ENoTone );
+ CleanupStack::PushL( dialog );
+ dialog->PrepareLC( R_DIAG_USB_CABLE_TEST_CONNECT_AND_PRESS_OK );
+ if( iIsSinglePluginExecution )
+ {
+ CEikButtonGroupContainer& cba = dialog->ButtonGroupContainer();
+ cba.SetCommandSetL( R_CBA_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;
+ }
+
+// ---------------------------------------------------------------------------------------
+// CDiagUSBCableTestPlugin::RemoveAllCables
+// This function shows the query dialog : Please remove all cables
+// ---------------------------------------------------------------------------------------
+TBool CDiagUSBCableTestEngine::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;
+ }
+
+// --------------------------------------------------------------------------------------------------------------------------
+// CDiagUSBCableTestPlugin::AskIfRetryL
+// This function shows the query dialog : "USB data cable not detected. Press OK to continue or press Back to retry this test."
+// ---------------------------------------------------------------------------------------------------------------------------
+TBool CDiagUSBCableTestEngine::AskIfRetryL( TInt& aUserResponse )
+ {
+ return DisplayQueryDialogWithHeaderL( R_DIAG_USB_CABLE_TEST_NO_CABLE_DETECTED,
+ aUserResponse );
+ }
+
+// ---------------------------------------------------------------------------------------
+// CDiagUSBCableTestPlugin::DisplayQueryDialogWithHeaderL
+// This function shows the query dialog. 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 CDiagUSBCableTestEngine::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 CDiagUSBCableTestEngine::RunL()
+ {
+ if(iStatus == KErrNone)
+ {
+ RunUSBCableTestL();
+ }
+ }
+
+// ---------------------------------------------------------------------------------------
+// CDiagHeadsetCableTestEngine::DoCancel
+// Handles cancel request
+// ---------------------------------------------------------------------------------------
+void CDiagUSBCableTestEngine::DoCancel()
+ {
+ // no implementation needed
+ }
+
+// End of File
+