nwnotifier/src/nwregistrationstatusmonitor.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 15 Jul 2010 19:16:18 +0300
branchRCL_3
changeset 17 c58fd5f0c240
parent 6 1b9ee3c7442d
permissions -rw-r--r--
Revision: 201024 Kit: 2010127

/*
* Copyright (c) 2010 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 module contains the implementation of CNWRegistrationStatusMonitor 
*              class member functions.
*
*/

//  INCLUDE FILES
#include "nwregistrationstatusmonitor.h"
// System 
#include <exterror.h>
#include <mmtsy_names.h> // KMmTsyModuleName
#include <etelmmerr.h>

// ================= MEMBER FUNCTIONS =======================================

// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::CNWRegistrationStatusMonitor
// C++ default constructor can NOT contain any code, that
// might leave.
//
// -----------------------------------------------------------------------------
//
CNWRegistrationStatusMonitor::CNWRegistrationStatusMonitor() : 
    CActive( EPriorityStandard )
    {
    }
    

// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CNWRegistrationStatusMonitor::ConstructL()
    {  
    // Add to scheduler.    
    CActiveScheduler::Add( this );
    
    // Open connection to ETel
    OpenConnectionL();
    
    // Start monitoring
    IssueRequest();
    }


// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CNWRegistrationStatusMonitor* CNWRegistrationStatusMonitor::NewL()
    {
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::NewL -START") );
    
    CNWRegistrationStatusMonitor* self = new ( ELeave ) CNWRegistrationStatusMonitor();
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::NewL -END") );
    return self;
    }
 

// -----------------------------------------------------------------------------
// Destructor
// 
// -----------------------------------------------------------------------------
//
CNWRegistrationStatusMonitor::~CNWRegistrationStatusMonitor()
    {
    Cancel();     
    
    CloseConnection();
    
    delete iNoteWrapper;
    }

// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::OpenConnectionL()
// Open connection to ETel
// -----------------------------------------------------------------------------
//
void CNWRegistrationStatusMonitor::OpenConnectionL()
    {
    // Connect ETel server
    User::LeaveIfError( iTelServer.Connect() );

    // Load ETel TSY module
    User::LeaveIfError( iTelServer.LoadPhoneModule( KMmTsyModuleName ) );

    // Set this session to receive detailed errors
    User::LeaveIfError( iTelServer.SetExtendedErrorGranularity(
            RTelServer::EErrorExtended ) );

    // Opens a phone subsession by name, 
    User::LeaveIfError( iPhone.Open( iTelServer, KMmTsyPhoneName ) );
    }

// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::CloseConnection()
// Closes the connection to ETel
// -----------------------------------------------------------------------------
//
void CNWRegistrationStatusMonitor::CloseConnection()
    {
    iPhone.Close();
        
    if ( iTelServer.Handle() )
        {
        iTelServer.UnloadPhoneModule( KMmTsyModuleName );
        iTelServer.Close();
        }
    }

// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::DoCancel
// Cancels the pending async. command.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CNWRegistrationStatusMonitor::DoCancel()
    {
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::DoCancel -START") );
    
    iPhone.CancelAsyncRequest( EMobilePhoneNotifyNetworkRegistrationStatusChange );
    
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::DoCancel -END") );
    }


// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::RunL
// Receives the completion of the pending async. command,
// saves possible values from async.
// 
// -----------------------------------------------------------------------------
//
void CNWRegistrationStatusMonitor::RunL()
    {
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::RunL -START") );
    
    if( iStatus.Int() != KErrNone ) // Display only errors
        {
        // Parse error code to iResId
        ParseErrCode();
        
        if( !iNoteWrapper )
            { // Instantiate a notewrapper and pass err code to be displayed
            iNoteWrapper = CNetworkNotifierNoteWrapper::NewL( *this, iResID );
            }
        else // If note wrapper exists already, add error code -stack in wrapper
            {
            iNoteWrapper->AppendNote( iResID );
            }
        }
    else
        {
        if( iStatus.Int() == KErrBadHandle || 
            iStatus.Int() == KErrServerBusy )
            {
            // Close the session to ETel
            CloseConnection();
            // Reconnect
            OpenConnectionL();
            }
        }
    
    // Keep monitoring
    IssueRequest();
        
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::RunL -END") );
    }


// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::ParseErrorCode()
// 
// -----------------------------------------------------------------------------
//
void CNWRegistrationStatusMonitor::ParseErrCode()
    {
    switch( iStatus.Int() )
        {
        case KErrGsmMMImsiUnknownInHlr:
            {
            iResID = R_SIM_NOT_PROV_MM2;
            RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::ParseErrCode() : R_SIM_NOT_PROV_MM2") );
            break;
            }
        case KErrGsmMMIllegalMs:
            {
            iResID = R_SIM_NOT_ALLOW_MM3;
            RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::ParseErrCode() : R_SIM_NOT_ALLOW_MM3") );
            break;
            }
        case KErrGsmMMImsiUnknownInVlr:
            {
            iResID = R_CALL_FAILED_MM4;
            RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::ParseErrCode() : R_CALL_FAILED_MM4") );
            break;       
            }
        case KErrGsmMMImeiNotAccepted:
            {
            iResID = R_PHONE_NOT_ALLOW_MM5;
            RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::ParseErrCode() : R_PHONE_NOT_ALLOW_MM5") );
            break; 
            }
        case KErrGsmMMIllegalMe:
            {
            iResID = R_PHONE_NOT_ALLOW_MM6;
            RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::ParseErrCode() : R_PHONE_NOT_ALLOW_MM6") );
            break;
            }  
        case KErrMMEtelAuthenticateFailed:
            {
            RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::ParseErrCode() : R_SIM_NOT_ALLOW") );
            iResID = R_SIM_NOT_ALLOW;
            break;  
            }
        default:
            break;
        }
    }


// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::IssueRequest
// Executes the async. NotifyNetworkRegistrationStatusChange function.
// 
// -----------------------------------------------------------------------------
//
void CNWRegistrationStatusMonitor::IssueRequest()
    {
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::IssueRequest -START") );
    
    if ( !IsActive() )
        {
        iPhone.NotifyNetworkRegistrationStatusChange( iStatus, iRegistrationStatus ); 
        SetActive();
        RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::IssueRequest : NotifyChange()-request set active - pending !") );
        }
    
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::IssueRequest -END") );
    }
 

// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::PopupNoteClosed
// 
// Callback from note wrapper class : all error notes are displayed since this monitor
// class can destruct note wrapper
// -----------------------------------------------------------------------------
//
void CNWRegistrationStatusMonitor::PopupNoteClosed()
    {
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::PopupNoteClosed -START") );
    
    delete iNoteWrapper;
    iNoteWrapper = NULL;
    
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::PopupNoteClosed -END") );
    }


// -----------------------------------------------------------------------------
// CNWRegistrationStatusMonitor::RunError()
// Processes any errors.
// -----------------------------------------------------------------------------
//
TInt CNWRegistrationStatusMonitor::RunError( TInt /*aError*/ )
    {
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::RunError -START") );
    
    // Keep monitoring
    IssueRequest();
    
    RDebug::Print( _L("NW: CNWRegistrationStatusMonitor::RunError -END") );
    return KErrNone;    // Handled the error fully
    }

//  End of File