diff -r 000000000000 -r 3ce708148e4d devicediagnostics/diagplugins/diagnetcoverageplugin/src/diagnetcoverageplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnostics/diagplugins/diagnetcoverageplugin/src/diagnetcoverageplugin.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,599 @@ +/* +* 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: Diagnostics Framework Plug-in to test network coverage on + the currently locked channel. +* +*/ + + +// CLASS DECLARATION +#include "diagnetcoverageplugin.h" + +// SYSTEM INCLUDE FILES +#include +#include // StringLoader + +#include // MDiagTestObserver +#include // TDiagTestExecParam +#include // CDiagResultsDbItemBuilder +#include // CDiagResultDetailBasic +#include // LOGSTRING +#include + +// USER INCLUDE FILES +#include "diagnetcoveragepluginprivatecrkeys.h" + + +// ADO & Platformization Changes +#include // debug macros +#include // MDiagEngineCommon +#include +#include // ADO & Platformization Changes +#include // ADO & Platformization Changes +#include +#include + + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +static const TInt KTotalTestSteps = 2; +_LIT( KDiagNetCoveragePluginResourceFileName, "z:DevDiagNetCoveragePluginRsc.rsc" ); + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS ============================== + +// ========================= MEMBER FUNCTIONS ================================ + +// ---------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::CDiagNetCoveragePlugin() +// +// Constructor +// ---------------------------------------------------------------------------- +// +CDiagNetCoveragePlugin::CDiagNetCoveragePlugin( CDiagPluginConstructionParam* aParam ) + : CDiagTestPluginBase( aParam ), + iNetworkInfoV1(), + iSignalStrengthV1(), + iNetworkInfoV1Pckg( iNetworkInfoV1 ), + iSignalStrengthV1Pckg( iSignalStrengthV1 ) + { + } + + +// --------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::NewL() +// +// Symbian OS default constructor +// --------------------------------------------------------------------------- +MDiagPlugin* CDiagNetCoveragePlugin::NewL( TAny* aInitParams ) + { + + LOGSTRING( "CDiagNetCoveragePlugin::NewL" ) + + ASSERT( aInitParams != NULL ); + + CDiagPluginConstructionParam* param = + static_cast( aInitParams ); + + CleanupStack::PushL( param ); + CDiagNetCoveragePlugin* self = new( ELeave ) CDiagNetCoveragePlugin( param ); + CleanupStack::Pop( param ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + + +// --------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::ConstructL() +// +// Symbian OS two-phased constructor +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::ConstructL() + { + LOGSTRING("CDiagNetCoveragePlugin::ConstructL"); + + BaseConstructL( KDiagNetCoveragePluginResourceFileName ); + + ReadThresholdValuesL(); + idialogOn = EFalse; + } + + +// ---------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::~CDiagNetCoveragePlugin +// +// Destructor +// ---------------------------------------------------------------------------- +CDiagNetCoveragePlugin::~CDiagNetCoveragePlugin() + { + // Base class will call StopAndCleanup(), which callso + // Cancel() -> DoCancel() + // DoStopAndCleanupL() + if ( iWaitDialog ) + delete iWaitDialog; + } + + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagNetCoveragePlugin::IsVisible() +// --------------------------------------------------------------------------- +TBool CDiagNetCoveragePlugin::IsVisible() const + { + return ETrue; + } + +// --------------------------------------------------------------------------- +// From MDiagTestPlugin +// CDiagNetCoveragePlugin::RunMode() +// --------------------------------------------------------------------------- +MDiagTestPlugin::TRunMode CDiagNetCoveragePlugin::RunMode() const + { + return EAutomatic; + } + +// --------------------------------------------------------------------------- +// From MDiagTestPlugin +// CDiagNetCoveragePlugin::TotalSteps() +// --------------------------------------------------------------------------- +TUint CDiagNetCoveragePlugin::TotalSteps() const + { + return KTotalTestSteps; + } + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagNetCoveragePlugin::GetPluginNameL +// --------------------------------------------------------------------------- +HBufC* CDiagNetCoveragePlugin::GetPluginNameL( TNameLayoutType aLayoutType ) const + { + switch ( aLayoutType ) + { + case ENameLayoutListSingle: + return StringLoader::LoadL ( R_DIAG_NET_COVERAGE_PLUGIN_NAME ); + + case ENameLayoutHeadingPane: + return StringLoader::LoadL ( R_QTN_DIAG_MSG_TITLE_VOICE_NETWORK ); + + case ENameLayoutPopupInfoPane: + return StringLoader::LoadL ( R_QTN_DIAG_MSG_INFO_VOICE_NETWORK ); + + case ENameLayoutTitlePane: + return StringLoader::LoadL ( R_QTN_DIAG_TITLE_TEST_VOICE_NETWORK ); + + case ENameLayoutListSingleGraphic: + return StringLoader::LoadL ( R_QTN_DIAG_LST_TEST_VOICE_NETWORK ); + + default: + LOGSTRING2( "CDiagNetCoveragePlugin::GetPluginNameL: " + L"ERROR: Unsupported layout type %d", aLayoutType ) + __ASSERT_DEBUG( 0, User::Invariant() ); + return StringLoader::LoadL ( R_DIAG_NET_COVERAGE_PLUGIN_NAME ); + } + } + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagNetCoveragePlugin::Uid +// --------------------------------------------------------------------------- +TUid CDiagNetCoveragePlugin::Uid() const + { + return KDiagNetCoveragePluginUid; + } + + +// --------------------------------------------------------------------------- +// From CActive +// CDiagNetCoveragePlugin::RunL +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::RunL() + { + ReportTestProgressL( iProgressCounter++ ); + + switch (iState) + { + case EStateWaitForBandType: + CheckNetworkAccessL(); + break; + + case EStateWaitForSignalStrength: + CheckSignalStrengthL(); + break; + + case EStateTestCancel: + CompleteTestL( CDiagResultsDatabaseItem::ESkipped ); + break; + default: + // Unsupported state + ASSERT(0); + break; + } + + } + +// --------------------------------------------------------------------------- +// From CActive +// CDiagNetCoveragePlugin::DoCancel +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::DoCancel() + { + LOGSTRING("CDiagNetCoveragePlugin::DoCancel"); + + TInt result; + + // Cancel request to CTelephony + switch ( iState ) + { + case EStateWaitForBandType: + result = iTelephony->CancelAsync( CTelephony::EGetCurrentNetworkInfoCancel ); + ASSERT( result == KErrNone ); + break; + + case EStateWaitForSignalStrength: + result = iTelephony->CancelAsync( CTelephony::EGetSignalStrengthCancel ); + ASSERT( result == KErrNone ); + break; + + default: + // No cancel needed + if (result == KErrNone) + LOGSTRING("docancel() result"); + break; + } + + } + +// --------------------------------------------------------------------------- +// From CDiagTestPluginBase +// CDiagNetCoveragePlugin::DoRunTestL() +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::DoRunTestL() + { + LOGSTRING("CDiagNetCoveragePlugin::DoRunTestL"); + + // ADO & Platformization Changes + if(!(ExecutionParam().Engine().ExecutionPlanL().CurrentExecutionItem().AsDependency())) + { + + + TInt aButtonId; + + ShowMessageQueryL(R_DIAG_MESSAGEQUERY_TITLE_NETCOVERAGE,aButtonId); + + if(aButtonId == ENetcoverageTestCancel) + { + CompleteTestL( CDiagResultsDatabaseItem::ESkipped ); + return; + } + + if(aButtonId == ENetcoverageTestSkip) + { + TInt confirmResult = 0; + + CAknDialog* dlg = ExecutionParam().Engine(). + CreateCommonDialogLC( EDiagCommonDialogConfirmSkipAll, NULL ); + + if ( !RunWaitingDialogL(dlg, confirmResult ) ) + { + return; + } + + if (confirmResult) + { + return; + } + } + } + // Changes Ends + + iProgressCounter = 1; + iNetworkType = ETypeUnknown; + iNetworkBand = EBandUnknown; + + // ones to use because they are less strict + iNetworkBand = EBand1800_1900_2100; + ObtainBandTypeAsyncL(); + // Wait note display only if itz not a dependency execution. + if(!(ExecutionParam().Engine().ExecutionPlanL().CurrentExecutionItem().AsDependency())) + ShowProgressNoteL(); + } + +// --------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::DoStopAndCleanupL() +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::DoStopAndCleanupL() + { + LOGSTRING("CDiagNetCoveragePlugin::DoStopAndCleanupL"); + + delete iTelephony; + iTelephony = NULL; + idialogOn = EFalse; + iState = EStateTestCompleted; + } + +// --------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::ObtainBandTypeAsyncL() +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::ObtainBandTypeAsyncL() + { + LOGSTRING("CDiagNetCoveragePlugin::ObtainBandTypeAsyncL"); + + ASSERT( iTelephony == NULL ); + + iTelephony = CTelephony::NewL(); + iTelephony->GetCurrentNetworkInfo( iStatus, iNetworkInfoV1Pckg ); + iState = EStateWaitForBandType; + + SetActive(); + } + +// --------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::ReadThresholdValuesL() +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::ReadThresholdValuesL() + { + LOGSTRING("CDiagNetCoveragePlugin::ReadThresholdValuesL"); + + CRepository* repository = CRepository::NewLC( KCRUidNetworkCoverage ); + + LOGSTRING("CDiagNetCoveragePlugin::ReadThresholdValuesL:"); + User::LeaveIfError( repository->Get(KPhoneDoctorGSM850SigStrThreshold, + iThresholdValues[ETypeGSM][EBand900_850]) ); + LOGSTRING2("\tKPhoneDoctorGSM850SigStrThreshold=%.2f",iThresholdValues[ETypeGSM][EBand900_850]); + User::LeaveIfError( repository->Get(KPhoneDoctorGSM1900SigStrThreshold, + iThresholdValues[ETypeGSM][EBand1800_1900_2100]) ); + LOGSTRING2("\tKPhoneDoctorGSM1900SigStrThreshold=%.2f",iThresholdValues[ETypeGSM][EBand1800_1900_2100]); + User::LeaveIfError( repository->Get(KPhoneDoctorUMTS850SigStrThreshold, + iThresholdValues[ETypeUMTS][EBand900_850]) ); + LOGSTRING2("\tKPhoneDoctorUMTS850SigStrThreshold=%.2f",iThresholdValues[ETypeUMTS][EBand900_850]); + User::LeaveIfError( repository->Get(KPhoneDoctorUMTS1900SigStrThreshold, + iThresholdValues[ETypeUMTS][EBand1800_1900_2100]) ); + LOGSTRING2("\tKPhoneDoctorUMTS1900SigStrThreshold=%.2f",iThresholdValues[ETypeUMTS][EBand1800_1900_2100]); + + CleanupStack::PopAndDestroy(repository); + } + + +// --------------------------------------------------------------------------- +// From CActive +// CDiagNetCoveragePlugin::CheckNetworkAccessL +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::CheckNetworkAccessL() + { + if ( iStatus != KErrNone) + { + LOGSTRING2("CDiagNetCoveragePlugin::CheckNetworkAccessL: " + L"Error obtaining network access type %d", iStatus.Int() ); + if (idialogOn) + iWaitDialog->ProcessFinishedL(); + CompleteTestL( CDiagResultsDatabaseItem::EFailed ); + } + else + { + LOGSTRING("CDiagNetCoveragePlugin::CheckNetworkAccessL: Got Network Access Type"); + // Set network band + switch (iNetworkInfoV1.iAccess) + { + // This is used when there is no network activity and therefore no RAT active. + case CTelephony::ENetworkAccessUnknown: + LOGSTRING(" ENetworkAccessUnknown"); + +#ifdef __WINS__ + // Fake network type for testing purposes + iNetworkType = ETypeGSM; +#else + if (idialogOn) + iWaitDialog->ProcessFinishedL(); + CompleteTestL( CDiagResultsDatabaseItem::EFailed ); +#endif + break; + + // The access technology is GSM. + case CTelephony::ENetworkAccessGsm: + // FALL THROUGH + + // The access technology is GSM COMPACT. However GSM COMPACT systems + // which use GSM frequency bands but with the CBPCCH broadcast channel + // are considered as a separate access technology from GSM. + case CTelephony::ENetworkAccessGsmCompact: + + LOGSTRING(" ENetworkAccessGsm"); + iNetworkType = ETypeGSM; + break; + + // The access technology is UTRAN (UMTS Network). + case CTelephony::ENetworkAccessUtran: + + LOGSTRING(" ENetworkAccessUtran"); + iNetworkType = ETypeUMTS; + break; + + default: // Unexpected + ASSERT(0); + break; + + } + + // If test did not fail, obtain signal strength + if ( iState == EStateWaitForBandType ) + { + iTelephony->GetSignalStrength(iStatus,iSignalStrengthV1Pckg); + iState = EStateWaitForSignalStrength; + SetActive(); + } + } + } + +// --------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::CheckSignalStrengthL +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::CheckSignalStrengthL() + { + CDiagResultsDatabaseItem::TResult result = CDiagResultsDatabaseItem::EFailed; + + LOGSTRING2("CDiagNetCoveragePlugin::CheckSignalStrengthL Status %d",iStatus.Int()); + + if (iStatus.Int() == KErrNone) + { + + TReal sigStrength = -iSignalStrengthV1.iSignalStrength; + + LOGSTRING3("CDiagNetCoveragePlugin::CheckSignalStrengthL: Got Signal Strength=%d bars, %.2f DBm", + (TInt)iSignalStrengthV1.iBar, + sigStrength); + LOGSTRING3("CDiagNetCoveragePlugin::CheckSignalStrengthL: Network type = %d, band = %d",iNetworkType,iNetworkBand); + + TReal threshold = iThresholdValues[iNetworkType][iNetworkBand]; + LOGSTRING2("CDiagNetCoveragePlugin::CheckSignalStrengthL: Threshold is %.2f",threshold); + + // Use band/type to index into threshold array and check + // signal strength. If there is no signal, Dbm will be 0, which is actually + // quite high, so check bars to cover this scenario. + if ( ( sigStrength >= threshold ) && ( iSignalStrengthV1.iBar ) ) + { + result = CDiagResultsDatabaseItem::ESuccess; + } + } + else + { + LOGSTRING2("CDiagNetCoveragePlugin::CheckSignalStrengthL: Signal strength error %d",iStatus.Int()); + } + + + if (idialogOn) + iWaitDialog->ProcessFinishedL(); + + CompleteTestL( result ); + + // End of Test + } + +// --------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::Panic +// --------------------------------------------------------------------------- +void CDiagNetCoveragePlugin::Panic(TInt aPanicCode) + { + _LIT(KDiagNetCoverageCategory,"Diag-NetCoverage"); + User::Panic(KDiagNetCoverageCategory, aPanicCode); + } + + +// ---------------------------------------------------------------------------- +// CDiagNetCoveragePlugin::ShowProgressNoteL +// +// wait Note +// ---------------------------------------------------------------------------- + +void CDiagNetCoveragePlugin::ShowProgressNoteL() + { + if ( iWaitDialog ) + { + delete iWaitDialog; + iWaitDialog = NULL; + } + + // WAIT NOTE DIALOG + iWaitDialog = new (ELeave) CAknWaitDialog( + (REINTERPRET_CAST(CEikDialog**, &iWaitDialog)), + ETrue); + iWaitDialog->PrepareLC(R_NETWORK_PLUGIN_WAIT_NOTE); + iWaitDialog->SetCallback(this); + iWaitDialog->RunLD(); + idialogOn = ETrue; + LOGSTRING("CDiagNetCoveragePlugin::ShowProgressNoteL()"); + } + +void CDiagNetCoveragePlugin::DialogDismissedL( TInt aButtonId ) + { + LOGSTRING2("CDiagNetCoveragePlugin::DialogDismissedL() = %d",aButtonId); + + if (aButtonId == ENetcoverageTestCancel && idialogOn) + { + // cancel the tests based on which Async Call the dialog is dismissed + + LOGSTRING2("CDiagNetCoveragePlugin::DialogDismissed @ iState= %d",iState); + if (iState == EStateWaitForBandType) + iTelephony->CancelAsync(CTelephony::EGetCurrentNetworkInfoCancel); + else if (iState == EStateWaitForSignalStrength) + iTelephony->CancelAsync(CTelephony::EGetSignalStrengthCancel); + iState = EStateTestCancel; + idialogOn = EFalse; + iWaitDialog = NULL; + + } + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +TBool CDiagNetCoveragePlugin::ShowMessageQueryL( TInt aResourceId, TInt &aButtonId ) + { + LOGSTRING( "CDiagNetCoveragePlugin::ShowMessageQueryL IN" ) + CAknMessageQueryDialog* dlg = NULL; + TBool result = EFalse; + + // Create CAknMessageQueryDialog instance + dlg = new ( ELeave ) CAknMessageQueryDialog(); + + dlg->PrepareLC( aResourceId ); + + CEikButtonGroupContainer& cba = dlg->ButtonGroupContainer(); + + switch ( aResourceId ) + { + case R_DIAG_MESSAGEQUERY_TITLE_NETCOVERAGE: + { + if ( SinglePluginExecution() ) + { + cba.SetCommandSetL( R_CBA_NETCOVERAGE_SINGLE_EXECUTION ); + } + else + { + cba.SetCommandSetL( R_CBA_NETCOVERAGE_GROUP_EXECUTION ); + } + } + break; + + default: + break; + } + + result = RunWaitingDialogL( dlg, aButtonId ); + + LOGSTRING3( "CDiagNetCoveragePlugin::ShowMessageQueryL() OUT aButtonId=%d result=%d", aButtonId, result ); + return result; + } + + +// End of File +