devicediagnostics/diagplugins/diagdatanetworkplugin/src/diagdatanetworktestpdpengine.cpp
changeset 0 3ce708148e4d
child 54 9360ca28b668
--- /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 <logfilterandeventconstants.hrh>
+#endif
+#include "diagdatanetworktestpdpengine.h"   // CDiagDataNetworkTestPDPEngine
+
+// System includes
+#include <centralrepository.h>              // CRepository
+#include <logcli.h>                         // CLogFilter   
+#include <DiagNetworkRegStatusWatcher.h>    // CDiagNetworkRegStatusWatcher
+#include <DiagFrameworkDebug.h>             // LOGSTRING
+#include <diaglogeventeraser.h>             // CDiagLogEventEraser
+
+// User includes
+#include "diagdatanetworkprivatecrkeys.h"
+#include <devdiagdatanetworktestpluginrsc.rsg>
+#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<TConnectionInfo> 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<KCommsDbSvrMaxFieldLength> 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
+