diff -r 000000000000 -r 3ce708148e4d devicediagnostics/diagplugins/diagdatanetworkplugin/src/diagdatanetworktestpdpengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnostics/diagplugins/diagdatanetworkplugin/src/diagdatanetworktestpdpengine.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,568 @@ +/* +* 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 module for the Diagnostics Data Network Test PDP-Engine +* +*/ + + +// INCLUDES + +// Class Declaration +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include "diagdatanetworktestpdpengine.h" // CDiagDataNetworkTestPDPEngine + +// System includes +#include // CRepository +#include // CLogFilter +#include // CDiagNetworkRegStatusWatcher +#include // LOGSTRING +#include // CDiagLogEventEraser + +// User includes +#include "diagdatanetworkprivatecrkeys.h" +#include +#include "diagdatanetworktestplugin.hrh" + +// 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 +// --------------------------------------------------------------------------- +CDiagDataNetworkTestPDPEngine* CDiagDataNetworkTestPDPEngine::NewL( + MDiagDataNetworkTestCallBackInterface& aInterface) + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::NewL()") + + CDiagDataNetworkTestPDPEngine* self = + new (ELeave) CDiagDataNetworkTestPDPEngine(aInterface); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// ---------------------------------------------------------------------------- +// Standard C++ Constructor +// NOTE that CActive(CActive::EPriorityUserInput) is called in +// CDiagPDPTestEngine::CDiagPDPTestEngine() +// ---------------------------------------------------------------------------- +// +CDiagDataNetworkTestPDPEngine::CDiagDataNetworkTestPDPEngine( + MDiagDataNetworkTestCallBackInterface& aInterface) + :iInterface(aInterface) + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::CDiagDataNetworkTestPDPEngine()") + + // Add this object to active scheduler + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Symbian OS second phase constructor +// --------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::ConstructL() + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::ConstructL()") + SetStateL( EStateUnknown ); + idialogOn = EFalse; + idialogDismissed = EFalse; + } + + +// ---------------------------------------------------------------------------- +// Destructor +// ---------------------------------------------------------------------------- +CDiagDataNetworkTestPDPEngine::~CDiagDataNetworkTestPDPEngine() + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::~CDiagDataNetworkTestPDPEngine()") + + // call CActive::DoCancel() to stop any ongoing async request + Cancel(); + + delete iLogEventEraser; + iLogEventEraser = NULL; + + delete iNetRegStatusWatcher; + iNetRegStatusWatcher = NULL; + + iPrimaryAPNIapIdArray.Close(); + iSecondaryAPNIapIdArray.Close(); + + iConnection.Close(); + iSocketServ.Close(); + if ( iWaitDialog ) + delete iWaitDialog; + } + + +// ---------------------------------------------------------------------------- +// This function reports the total steps of the engine class +// ---------------------------------------------------------------------------- +TUint CDiagDataNetworkTestPDPEngine::TotalSteps() + { + return EStateMax; + } + + +// --------------------------------------------------------------------------- +// CDiagDataNetworkTestPDPEngine::RunDataNetworkTestL() +// +// This function is the entry point to Data Network Test. +// --------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::RunDataNetworkTestL() + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::RunDataNetworkTestL()") + + delete iNetRegStatusWatcher; + iNetRegStatusWatcher = NULL; + + iNetRegStatusWatcher = CDiagNetworkRegStatusWatcher::NewL(*this); + + // start the network registration status observer + // the initial network registration status wiil be obtained via + // callback interface InitialNetworkRegistrationStatusL() + SetStateL( EStateWaitForInitialNetworkRegStatus ); + iNetRegStatusWatcher->StartObserver(); + } + + +// ---------------------------------------------------------------------------- +// This function is used to inform the intial network registration status +// ---------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::InitialNetworkRegistrationStatusL( + const TBool& aRegistered ) + { + if( aRegistered ) + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::InitialNetworkRegistrationStatusL() aRegistered == ETrue") + + StartPdpEstablishmentL(); + } + else + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::InitialNetworkRegistrationStatusL() aRegistered == EFalse") + + // intial registration status is not registered + // report the test result as Failed + ReportResultToPluginL( EFalse ); + } + } + +// ---------------------------------------------------------------------------- +// This interface is used to inform the clients of any changes in the network +// registration +// ---------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::NetworkRegistrationStatusChangeL( + const TBool& aRegistered ) + { + if(!aRegistered) + { + // device has lost network coverage, + LOGSTRING("CDiagDataNetworkTestPDPEngine::NetworkRegistrationStatusChangeL() aRegistered == EFalse") + LOGSTRING("device has lost network coverage") + + // stop the observer and fail the test + iNetRegStatusWatcher->StopObserver(); + + // cancel any ongoing asynchronous request + Cancel(); + + ReportResultToPluginL(CDiagResultsDatabaseItem::EFailed); + } + else + { + // continue the test, device is still registered + LOGSTRING("CDiagDataNetworkTestPDPEngine::NetworkRegistrationStatusChangeL() aRegistered == ETrue") + } + } + + +// ---------------------------------------------------------------------------- +// This function is used to start checking if connection parameters exist +// and then connection establishment, if necessary +// ---------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::StartPdpEstablishmentL() + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::StartPdpEstablishmentL()"); + + SetStateL( EStateCheckingConnecitonParams ); + + //TInt err = KErrGeneral; + User::LeaveIfError(iSocketServ.Connect()); + User::LeaveIfError(iConnection.Open(iSocketServ)); + + LOGSTRING("CDiagDataNetworkTestPDPEngine : socket server session opened OK "); + + // Check for Active Connections + + TUint connectionCount = 0; + TPckgBuf connectionInfo; + User::LeaveIfError(iConnection.EnumerateConnections(connectionCount)); + LOGSTRING("iConnection.EnumerateConnections"); + // if connection active report pass. + if(connectionCount > 0) + ReportResultToPluginL( ETrue ); + else + EstablishPDPContextL(); + + } + +// --------------------------------------------------------------------------- +// This function is the concrete implementation of pure virtual function +// CDiagPDPTestEngine::ReadAPNsFromCenrepL(). Here the primary and secondary APNs +// are read from the central repository. The function sets the reference argument +// aError as KErrNone if both APNs are found in the cenrep. +// --------------------------------------------------------------------------- + +void CDiagDataNetworkTestPDPEngine::ReadAPNsFromCenrepL(TInt& aError) + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::ReadAPNsFromCenrepL()"); + + TInt errPrimary = KErrGeneral; + TInt errSeondary = KErrGeneral; + + CRepository *cenRep; + cenRep = CRepository::NewL( KCRUidDiagDataNetworkTestPlugin ); + CleanupStack::PushL( cenRep ); + iCenrepPrimaryAPN.Zero(); + iCenrepSecondaryAPN.Zero(); + errPrimary = cenRep->Get( KDiagDataNetworkTestPluginPrimaryAPN,iCenrepPrimaryAPN ); + errSeondary = cenRep->Get( KDiagDataNetworkTestPluginSecondaryAPN,iCenrepSecondaryAPN); + + // check both APNs exist in Cenrep + if(errPrimary == KErrNone && errSeondary == KErrNone ) + { + aError = KErrNone; + } + else + { + aError = KErrGeneral; + } + CleanupStack::PopAndDestroy(cenRep); + cenRep = NULL; + + + LOGSTRING("CDiagDataNetworkTestPDPEngine::ReadAPNsFromCenrepL() Primary APN = "); + LOGTEXT(iCenrepPrimaryAPN) + + LOGSTRING("CDiagDataNetworkTestPDPEngine::ReadAPNsFromCenrepL() Secondary APN = "); + LOGTEXT(iCenrepSecondaryAPN) + } + +// ---------------------------------------------------------------------------- +// CDiagDataNetworkTestPDPEngine::EstablishPDPContextL +// +// This the entry point to start establishing PDP context +// ---------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::EstablishPDPContextL() + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::EstablishPDPContextL()") + + SetStateL( EStateWaitForConnectionCompletion ); + + iPref.SetDialogPreference(ECommDbDialogPrefPrompt); + //iPref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + iPref.SetDirection( ECommDbConnectionDirectionOutgoing ); + //TConnPref iPref(TConnPref::EConnPrefCommDb); + iConnection.Start(iPref, iStatus); + SetActive(); + TInt userResponse; + ShowProgressNoteL( userResponse ); + } + + +// ---------------------------------------------------------------------------- +// CDiagDataNetworkTestPDPEngine::ShowVibrationNoteL +// +// Progress Note +// ---------------------------------------------------------------------------- + +TBool CDiagDataNetworkTestPDPEngine::ShowProgressNoteL(TInt aUserResponse) + { + if ( iWaitDialog ) + { + delete iWaitDialog; + iWaitDialog = NULL; + } + + + // WAIT NOTE DIALOG + iWaitDialog = new (ELeave) CAknWaitDialog( + (REINTERPRET_CAST(CEikDialog**, &iWaitDialog)), + ETrue); + + iWaitDialog->PrepareLC(R_DATANW_PLUGIN_WAIT_NOTE); + iWaitDialog->SetCallback(this); + TBool isDialogDismissedByUser = iWaitDialog->RunLD(); + idialogOn = ETrue; + return isDialogDismissedByUser; + } + + +//********************************************************* +//********************************************************* +// CallBack from AKnWaitDialog when Cancel is pressed +//********************************************************* +//********************************************************* + +void CDiagDataNetworkTestPDPEngine::DialogDismissedL( TInt aButtonId ) +{ + LOGSTRING2("CDiagDataNetworkTestPDPEngine::DialogDismissedL() = %d",aButtonId); + + + if(aButtonId == EDataNetworkTestCancel) + { + + + if (idialogOn) + { + iConnection.Stop(RConnection::EStopAuthoritative); + // delete iWaitDilaog; + // iWaitDialog = NULL; + idialogOn = EFalse; + idialogDismissed = ETrue; + } + + TInt cancelButtonId; + TBool cancelResult = EFalse; + iPrevState = iEngineState; + SetStateL(EStateWaitDialogOn); + cancelResult= iInterface.DisplayDialog(cancelButtonId); + + iWaitDialog = NULL; + + if ( !cancelResult ) + { + SetStateL(iPrevState); + return; + } + + if(cancelButtonId == -2) + { + + SetStateL(EStateCancelTest); + TRequestStatus* status = &iStatus; + // Complete own request + User::RequestComplete( status, KErrNone ); + SetActive(); + + //ReportResultToPluginL( CDiagResultsDatabaseItem::ECancelled ); + //HandleOngoingConnectionRequestL(); + + } + else + { + SetStateL(EStateDialogDismissed); + TRequestStatus* status = &iStatus; + // since this is a Cancel to start the test again + // lets start believing that the DialogDismiss Cancel was never pressed + idialogDismissed = EFalse; + // Complete own request + User::RequestComplete( status, KErrNone ); + SetActive(); + } + } +} +// --------------------------------------------------------------------------- +// CDiagDataNetworkTestPDPEngine::RunL() +// +// Concrete implementation of CActive::DoCancel(). This function handles the asynchronous events. +// --------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::RunL() + { + switch(iEngineState) + { + case EStateWaitForConnectionCompletion: + { + HandleOngoingConnectionRequestL(); + } + break; + case EStateWaitDialogOn: + break; + case EStateCancelTest: + ReportResultToPluginL( CDiagResultsDatabaseItem::ECancelled ); + break; + case EStateDialogDismissed: + EstablishPDPContextL(); + break; + default: + break; + }; + LOGSTRING("CDiagDataNetworkTestPDPEngine::RunL()"); + } + +// --------------------------------------------------------------------------- +// CDiagDataNetworkTestPDPEngine::DoCancel() +// +// This function handles cancel request from CActive +// --------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::DoCancel() + { + if( iNetRegStatusWatcher ) + { + iNetRegStatusWatcher->StopObserver(); + } + if (iEngineState != EStateCancelTest) + iConnection.Stop(); + } + + +// --------------------------------------------------------------------------- +// CDiagDataNetworkTestPDPEngine::HandleOngoingConnectionRequestL() +// +// This function handles ongoing asynchronous connection request and issues +// new request if required. +// --------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::HandleOngoingConnectionRequestL() + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::HandleOngoingConnectionRequestL()") + + if( iStatus == KErrNone || iStatus == KErrAlreadyExists ) + { + // connection established, report SUCCESS to the plugin + LOGSTRING("Connection established") + LOGSTRING2("current IAP id = %d", iIAPiddefault) + StartLogEraseOperationL( ETrue ); // ETrue means the test has Passed + } + else + ReportResultToPluginL( EFalse ); + + } + +// ---------------------------------------------------------------------------- +// This function starts the log event erase process +// ---------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::StartLogEraseOperationL(TBool aTestResult) + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::StartLogEraseOperationL()") + + iTestResult = aTestResult; + SetStateL( EStateWaitForLogErase ); + + TUid PacketEventType = { KLogPacketDataEventType }; + + delete iLogEventEraser; + iLogEventEraser = NULL; + iLogEventEraser = CDiagLogEventEraser::NewL(*this); + + CLogFilter& LogFilter = iLogEventEraser->Filter(); + LogFilter.SetEventType(PacketEventType); + LogFilter.SetStartTime(iStartTime); + + // start the log erasing process + iLogEventEraser->StartAsyncEraseLogsL(); + } + +// ---------------------------------------------------------------------------- +// This callback interface is used to determine if the log event is to be +// deleted or not +// ---------------------------------------------------------------------------- +TBool CDiagDataNetworkTestPDPEngine::IsEventToBeDeleted( const CLogEvent& aEvent ) + { + LOGSTRING("CDiagDataNetworkTestPDPEngine::IsEventToBeDeleted()") + + TBool isEntryDeleted = EFalse; + + TBuf eventAPNName; + eventAPNName.Zero(); + eventAPNName.Copy(aEvent.RemoteParty()); + + LOGSTRING("Log event APN name = ") + LOGTEXT(eventAPNName) + + if( (eventAPNName.Compare( iCenrepPrimaryAPN )==0) || + (eventAPNName.Compare( iCenrepSecondaryAPN )==0) ) + { + // APN is matched, delete the log event entry + isEntryDeleted = ETrue; + + } + + LOGSTRING2("Log event deleted = %d", isEntryDeleted ) + return isEntryDeleted; + } + + +// ---------------------------------------------------------------------------- +// This callback interface is used to notify that log events are erased +// ---------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::CompleteEventEraseL( TInt /*aError*/) + { + ReportResultToPluginL(iTestResult); + } + + +// --------------------------------------------------------------------------- +// This function is sets the state of the engine and also reports the progress +// step +// --------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::SetStateL(TPDPEngineState aState) + { + LOGSTRING2("CDiagDataNetworkTestPDPEngine::SetStateL(), aState = %d", aState) + + iEngineState = aState; + iInterface.ReportTestProgL( iEngineState ); + } + +// --------------------------------------------------------------------------- +// This function is used to report the result of the test back to the plug-in +// class +// --------------------------------------------------------------------------- +void CDiagDataNetworkTestPDPEngine::ReportResultToPluginL(TBool aResult) + { + LOGSTRING2("CDiagDataNetworkTestPDPEngine::ReportResultToPluginL(), aResult = %d", aResult) + // Remove the waitDialog + if(idialogOn) + iWaitDialog->ProcessFinishedL(); + + // Dialog dismissed by cancel + if (idialogDismissed) + { + iInterface.ReportTestResultL( CDiagResultsDatabaseItem::ESkipped ); + return; + } + if(aResult) + { + iInterface.ReportTestResultL( CDiagResultsDatabaseItem::ESuccess ); + } + else + { + iInterface.ReportTestResultL( CDiagResultsDatabaseItem::EFailed ); + } + } + + +// End of File +