qtinternetradio/irqnwkinfoobserver/src/irqnwkinfoobserverimpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 19 Apr 2010 14:01:53 +0300
changeset 0 09774dfdd46b
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 2009 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:
*
*/
#include "irqnwkinfoobserverimpl.h"
#include "irqnwkobserverinterface.h"


// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
IRQNwkInfoObserverImpl* IRQNwkInfoObserverImpl::NewL( MIRQNwkInfoUpdate *aObserver)
{
    IRQNwkInfoObserverImpl* self = new ( ELeave ) IRQNwkInfoObserverImpl( aObserver );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
}

// ---------------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------------
//
IRQNwkInfoObserverImpl::IRQNwkInfoObserverImpl(MIRQNwkInfoUpdate *aObserver) : CActive(EPriorityLow),
                                                 iTelephony(NULL),
                                                 iCurrentNetworkInfoV1Pckg(iCurrentNetworkInfo),
                                                 iHomeOperatorInfoPckg(iHomeOperatorInfo),
                                                 iFirstTime(true),
                                                 iCurrentNetworkType(true),
                                                 iHomeNetworkType(false),
                                                 iObserver(aObserver)
{
}

// ---------------------------------------------------------------------------
// Second-phase constructor.
// ---------------------------------------------------------------------------
//
void IRQNwkInfoObserverImpl::ConstructL()
{
    iTelephony = CTelephony::NewL();
    CActiveScheduler::Add(this);
}

// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
IRQNwkInfoObserverImpl::~IRQNwkInfoObserverImpl()
{
    Cancel();
    delete iTelephony;
    iTelephony = NULL;
}

// ---------------------------------------------------------------------------
// Function : IRQNwkInfoObserverImpl::startNwkInfoMonitor()
// Function to start network monitoring
// ---------------------------------------------------------------------------
//

void IRQNwkInfoObserverImpl::startNwkInfoMonitor()
{
    if(!IsActive() && iTelephony)
    {
        //get the current network info for the first time
        iCurrentNetworkType = true;
        iHomeNetworkType = false;
        iTelephony->GetCurrentNetworkInfo(iStatus, iCurrentNetworkInfoV1Pckg);      
        SetActive(); 
    }  
}

// ---------------------------------------------------------------------------
// Function : IRQNwkInfoObserverImpl::issueRequest()
// Issue Subsequent network monitoring request
// ---------------------------------------------------------------------------
//

void IRQNwkInfoObserverImpl::issueRequest()
{
    if(iCurrentNetworkType)
    {
        if(!IsActive() && iTelephony)
        {
            //notify if current operator changes
            iTelephony->NotifyChange(iStatus,
                    CTelephony::ECurrentNetworkInfoChange,
                    iCurrentNetworkInfoV1Pckg);
            SetActive();
        }      
    }
    
    if(iHomeNetworkType)
    {
        if(!IsActive() && iTelephony)
        {
            //notify if home operator changes
            iTelephony->NotifyChange(iStatus,
                      CTelephony::ENetworkRegistrationStatusChange,
                      iHomeOperatorInfoPckg);
            SetActive();
        }  
    }
}


// ---------------------------------------------------------------------------
// From CActive.
// ---------------------------------------------------------------------------
//
void IRQNwkInfoObserverImpl::DoCancel()
{
    if(IsActive() && iTelephony)
    {
        //cancel the out standing requests if any
        iTelephony->CancelAsync(CTelephony::ECurrentNetworkInfoChangeCancel);
        iTelephony->CancelAsync(CTelephony::ENetworkRegistrationStatusChangeCancel);  
        iTelephony->CancelAsync(CTelephony::EGetCurrentNetworkInfoCancel);
        iTelephony->CancelAsync(CTelephony::EGetNetworkRegistrationStatusCancel);
    }
}

// ---------------------------------------------------------------------------
// From CActive.
// ---------------------------------------------------------------------------
//
void IRQNwkInfoObserverImpl::RunL()
{  
    if(KErrNone == iStatus.Int())
    {    
        if(iCurrentNetworkType)
        {
            //if the request was to find the current network changes
            //then the value is updated
          #ifdef __WINS__
            iCurrentNwkMCC = "0";
            iCurrentNwkMNC = "0";  
          #else
            iCurrentNwkMCC = QString::fromUtf16( iCurrentNetworkInfo.iCountryCode.Ptr(),
                                            iCurrentNetworkInfo.iCountryCode.Length());
            iCurrentNwkMNC = QString::fromUtf16( iCurrentNetworkInfo.iNetworkId.Ptr(),
                                            iCurrentNetworkInfo.iNetworkId.Length());
          #endif
            //updating mcc+mnc value
            if(iObserver)
            {
                iObserver->updateCurrentNwkInfo(iCurrentNwkMCC,iCurrentNwkMNC);
            }
            
            iHomeNetworkType = ETrue;
            iCurrentNetworkType = EFalse;
            if(iFirstTime && iTelephony)
            {
                //if first time we have check the current operator is home operator
                iTelephony->GetNetworkRegistrationStatus(iStatus,iHomeOperatorInfoPckg);      
                SetActive();
                iFirstTime = EFalse;
            }
            else
            {
                //else issue request is called for notifying home operator change
                issueRequest();  
            }      
        }
        else if(iHomeNetworkType)
        {
            //home operator (or the change in home operator is notified. 
          #ifdef __WINS__
            iHomeNetworkMCC = "0";
            iHomeNetworkMNC = "0";
            if(iObserver)
            {            
                iObserver->updateHomeNwkInfo(iHomeNetworkMCC,iHomeNetworkMNC);
            }
          #else
            //if registration status shows that user is registered in home network
            //and not in roaming status, the current operator is updated
            if(CTelephony::ERegisteredOnHomeNetwork == iHomeOperatorInfo.iRegStatus)
            {
                iHomeNetworkMCC = iCurrentNwkMCC;
                iHomeNetworkMNC = iCurrentNwkMNC;
                if(iObserver)
                {                    
                    iObserver->updateHomeNwkInfo(iHomeNetworkMCC,iHomeNetworkMNC);
                }
            }
          #endif
                //issue request to find the current network change
                iHomeNetworkType = EFalse;
                iCurrentNetworkType = ETrue;
                issueRequest();

        }    
        else
        {
            return;  
        }
    }
    //if any error network is updated to zero    
    else
    {
        iCurrentNwkMCC = "0";
        iCurrentNwkMNC = "0";  
        iHomeNetworkMCC = "0";
        iHomeNetworkMNC = "0";
        if(iObserver)
        {
            iObserver->updateCurrentNwkInfo(iCurrentNwkMCC,iCurrentNwkMNC);
            iObserver->updateHomeNwkInfo(iHomeNetworkMCC,iHomeNetworkMNC);
        }
    }
}