cellular/telephonysettings/xqbindings/psetwrapper/src/psetnetworkwrapper_p.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:45:17 +0300
branchRCL_3
changeset 19 7d48bed6ce0c
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
 * 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 <rmmcustomapi.h>
#include <psetcontainer.h>
#include <psetnetwork.h>
#include <gsmerror.h>
#include <PsetCSP.h>

#include "psetnetworkwrapper_p.h"
#include "logging.h"
#include "psetnetworkinfoconverter.h"

/*!
    \class PSetNetworkWrapperPrivate
    \brief Private implementation for network wrapper.
*/

/*!
  PSetNetworkWrapperPrivate::PSetNetworkWrapperPrivate
 */
PSetNetworkWrapperPrivate::PSetNetworkWrapperPrivate(
    PSetNetworkWrapper &owner,
    CPsetContainer &psetContainer)
    :
    m_owner(owner),
    m_psetNetwork(NULL),
    m_psetNetworkMode(NULL)
{
    DPRINT << ": IN ";
    
    QT_TRAP_THROWING(
        m_psetNetwork.reset(psetContainer.CreateNetworkObjectL(*this)));
    m_psetNetwork->SetNetworkModeObserver(*this);
    m_psetNetwork->SetNetSAObserver(*this);
    QT_TRAP_THROWING(
        m_psetNetworkMode.reset(psetContainer.CreateNetworkModeObjectL(*this)));
    QT_TRAP_THROWING(
        m_refreshHandler.reset(psetContainer.CreateRefreshHandlerL()));
    QT_TRAP_THROWING(m_refreshHandler->NotifyFileChangeL(
                *this,
                KCsp1Ef,
                EFileChangeNotification));
    
    QT_TRAP_THROWING(m_csp.reset(CPsetCustomerServiceProfile::NewL()));
    QT_TRAP_THROWING(m_csp->OpenCSProfileL());

    DPRINT << ": OUT ";
}

/*!
  PSetNetworkWrapperPrivate::~PSetNetworkWrapperPrivate
 */
PSetNetworkWrapperPrivate::~PSetNetworkWrapperPrivate()
{
    DPRINT << ": IN ";
    
    while (!m_networkInfoList.isEmpty()) {
        DPRINT << " delete : " << m_networkInfoList.first()->m_longName;
        delete m_networkInfoList.takeFirst();
    }
    m_networkInfoList.clear();
    
    DPRINT << ": OUT ";
}

/*!
    PSetNetworkWrapperPrivate::getAvailableNetworks.
*/
void PSetNetworkWrapperPrivate::getAvailableNetworks()
{
    DPRINT << ": IN ";
    
    QT_TRAP_THROWING(m_psetNetwork->GetAvailableNetworksL());
    
    DPRINT << ": OUT ";
}

/*!
    PSetNetworkWrapperPrivate::getNetworkSelectionMode
*/
PSetNetworkWrapper::ErrorCode 
    PSetNetworkWrapperPrivate::getNetworkSelectionMode(
    PSetNetworkWrapper::NetworkSelectionMode& mode) const
{
    DPRINT;
    
    MPsetNetworkSelect::TSelectMode selectMode = 
        MPsetNetworkSelect::ENetSelectModeAutomatic;
    int result = m_psetNetwork->GetNetworkSelectMode(selectMode);
    mode = NetworkInfoConverter::ConvertToQtType(selectMode);
    
    return ConvertToQtErrorCode(result);
}

/*!
    PSetNetworkWrapperPrivate::selectNetwork.
 */
void PSetNetworkWrapperPrivate::selectNetwork( 
    const PSetNetworkWrapper::NetworkInfo& info)
{
    DPRINT << ": IN ";
    
    QT_TRAP_THROWING(m_psetNetwork->SelectNetworkL(
        NetworkInfoConverter::ConvertToSymbianType(info)));
         
    DPRINT << ": OUT ";
}

/*!
    PSetNetworkWrapperPrivate::cancelRequest
*/
void PSetNetworkWrapperPrivate::cancelRequest()
{
    DPRINT;
    
    m_psetNetwork->CancelProcess();
}

/*!
    PSetNetworkWrapperPrivate::getNetworkAccessMode
*/
void PSetNetworkWrapperPrivate::getNetworkAccessMode() const
{
    DPRINT << ": IN ";
    
    QT_TRAP_THROWING(
        m_psetNetwork->GetCurrentNetworkModeSelectionL());
        
    DPRINT << ": OUT ";
}

/*!
    PSetNetworkWrapperPrivate::setNetworkAccessMode
*/
void PSetNetworkWrapperPrivate::setNetworkAccessMode(
    PSetNetworkWrapper::NetworkAccessMode mode)
{
    DPRINT << ": IN ";
    
    RMmCustomAPI::TNetworkModeCaps modeCaps = 
        RMmCustomAPI::KCapsNetworkModeDual;
    switch (mode) {
        case PSetNetworkWrapper::AccessModeDual:
            modeCaps = RMmCustomAPI::KCapsNetworkModeDual;
            break;
        case PSetNetworkWrapper::AccessModeUmts:
            modeCaps = RMmCustomAPI::KCapsNetworkModeUmts;
            break;
        case PSetNetworkWrapper::AccessModeGsm:
            modeCaps = RMmCustomAPI::KCapsNetworkModeGsm;
            break;
        default:
            Q_ASSERT_X(false, "switch default", "unknown enumerator");
    }
    
    QT_TRAP_THROWING(m_psetNetwork->SetNetworkModeSelectionL(
        reinterpret_cast<TUint32&>(modeCaps)));
        
    DPRINT << ": OUT ";
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleNetworkInfoReceivedL( 
    const CNetworkInfoArray* aInfoArray, 
    const TInt aResult)
{
    DPRINT << ": IN ";
    
    Q_UNUSED(aResult);
    __ASSERT_DEBUG(NULL != aInfoArray, User::Leave(KErrArgument));
    
    // delete qlist
    while (!m_networkInfoList.isEmpty()) {
        DPRINT << " delete : " << m_networkInfoList.first()->m_longName;
        delete m_networkInfoList.takeFirst();
    }
    m_networkInfoList.clear();
    
    const int itemsCount = aInfoArray->Count();

    //then insert found networks
    for(int i = 0; i < itemsCount; i++)
        {
        PSetNetworkWrapper::NetworkInfo *info = 
            new (ELeave) PSetNetworkWrapper::NetworkInfo;
        
        info->m_id.m_countryCode = QString::fromUtf16(
            aInfoArray->At(i).iId.iCountryCode.Ptr(), 
            aInfoArray->At(i).iId.iCountryCode.Length());
        info->m_id.m_networkCode =  QString::fromUtf16(
            aInfoArray->At(i).iId.iNetworkCode.Ptr(), 
            aInfoArray->At(i).iId.iNetworkCode.Length());
        info->m_status = 
            static_cast<PSetNetworkWrapper::NetworkStatus>(
                aInfoArray->At(i).iStatus);
        info->m_mode = 
            static_cast<PSetNetworkWrapper::NetworkSelectionMode>(
                aInfoArray->At(i).iMode);
        info->m_access = 
            static_cast<PSetNetworkWrapper::NetworkAccessType>(
                aInfoArray->At(i).iAccess);
        info->m_shortName = 
            QString::fromUtf16(
                aInfoArray->At(i).iShortName.Ptr(), 
                aInfoArray->At(i).iShortName.Length());
        info->m_longName = 
            QString::fromUtf16(
                aInfoArray->At(i).iLongName.Ptr(), 
                aInfoArray->At(i).iLongName.Length());
        
        m_networkInfoList.append(info);
        }
    
    QT_TRYCATCH_LEAVING(
        emit m_owner.availableNetworksGot(m_networkInfoList);
    )
    
    DPRINT << ": OUT ";
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleCurrentNetworkInfoL( 
    const MPsetNetworkSelect::TCurrentNetworkInfo& aCurrentInfo, 
    const TInt aResult)
{
    DPRINT;
    
    Q_UNUSED(aCurrentInfo);
    Q_UNUSED(aResult);
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleNetworkChangedL( 
    const MPsetNetworkSelect::TNetworkInfo& aCurrentInfo,
    const MPsetNetworkSelect::TCurrentNetworkStatus aStatus, 
    const TInt aResult)
{
    DPRINT;
    
    Q_UNUSED(aCurrentInfo);
    Q_UNUSED(aStatus);
    Q_UNUSED(aResult);
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleNetworkChangedL( 
    const MPsetNetworkSelect::TNetworkInfo& aCurrentInfo,
    const RMobilePhone::TMobilePhoneRegistrationStatus& aStatus, 
    const TInt aResult)
{
    DPRINT << ": IN ";
    
    Q_UNUSED(aResult);
    
    PSetNetworkWrapper::NetworkInfo info;      
    info.m_id.m_countryCode =  QString::fromUtf16(
        aCurrentInfo.iId.iCountryCode.Ptr(), 
        aCurrentInfo.iId.iCountryCode.Length());
    info.m_id.m_networkCode =  QString::fromUtf16(
        aCurrentInfo.iId.iNetworkCode.Ptr(), 
        aCurrentInfo.iId.iNetworkCode.Length());
    info.m_status = 
        static_cast<PSetNetworkWrapper::NetworkStatus>(
            aCurrentInfo.iStatus);
    info.m_mode = 
        static_cast<PSetNetworkWrapper::NetworkSelectionMode>(
            aCurrentInfo.iMode);
    info.m_access = 
        static_cast<PSetNetworkWrapper::NetworkAccessType>(
            aCurrentInfo.iAccess);
    info.m_shortName = 
        QString::fromUtf16(
            aCurrentInfo.iShortName.Ptr(), 
            aCurrentInfo.iShortName.Length());
    info.m_longName = 
        QString::fromUtf16(
            aCurrentInfo.iLongName.Ptr(), 
            aCurrentInfo.iLongName.Length());
    
    PSetNetworkWrapper::RegistrationStatus status;
    switch (aStatus){
        case RMobilePhone::ERegisteredOnHomeNetwork:
            status = PSetNetworkWrapper::RegisteredOnHomeNetwork;
            break;
        case RMobilePhone::ERegisteredRoaming:
            status = PSetNetworkWrapper::RegisteredRoaming;
            break;
        }
   
    QT_TRYCATCH_LEAVING(
        emit m_owner.networkChanged(info, status);
    )
    
    DPRINT << ": OUT ";
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleSearchingNetworksL( 
    MPsetNetworkInfoObserver::TServiceRequest aRequest)
{
    DPRINT << ": IN ";
    
    PSetNetworkWrapper::RequestType type =
        static_cast<PSetNetworkWrapper::RequestType>(aRequest);
    QT_TRYCATCH_LEAVING(
        emit m_owner.searchingNetworks(type);
    )
    
    DPRINT << ": OUT ";
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleRequestingSelectedNetworkL( 
    TBool aOngoing)
{
    DPRINT << ": IN ";
    
    QT_TRYCATCH_LEAVING(
        emit m_owner.requestingSelectedNetwork(
            static_cast<bool>(aOngoing));
    )
    
    DPRINT << ": OUT ";
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleCallActivatedL()
{
    DPRINT;
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleNetworkErrorL( 
    const MPsetNetworkInfoObserver::TServiceRequest aRequest,
    const TInt aError)
{
    DPRINT << ": IN ";
    
    PSetNetworkWrapper::ErrorCode error;
    switch(aError) {
        case KErrGsmNetCauseCallActive:
            error = PSetNetworkWrapper::ErrCauseCallActive;
            break;
        case KErrGsm0707NoNetworkService:
            error = PSetNetworkWrapper::ErrNoNetworkService;
            break;
        case KErrGsmOfflineOpNotAllowed:
            error = PSetNetworkWrapper::ErrOfflineOpNotAllowed;
            break;
        default:
            error = PSetNetworkWrapper::ErrNoNetworkAccess;
            break;
    }

    QT_TRYCATCH_LEAVING(
        emit m_owner.networkReqestFailed(
            error, static_cast<PSetNetworkWrapper::RequestType>(aRequest));
    )
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleNetworkSystemModeEventsL( 
    const MPsetNetworkModeObserver::TServiceRequest aRequest,
    const TUint32 aNetworkModeCaps)
{
    DPRINT;
    
    switch (aRequest) {
        case MPsetNetworkModeObserver::EServiceRequestNone:
            // TODO: what to do with this kind of event
            break;
        case MPsetNetworkModeObserver::EServiceRequestSetSelectedNetworkMode:
            // TODO: implement this
            break;
        case MPsetNetworkModeObserver::EServiceRequestGetCurrentNetworkMode: {
            PSetNetworkWrapper::NetworkAccessMode mode =
                PSetNetworkWrapper::AccessModeDual;
            if (aNetworkModeCaps & RMmCustomAPI::KCapsNetworkModeDual) {
                mode = PSetNetworkWrapper::AccessModeDual;
            } else if 
                (aNetworkModeCaps & RMmCustomAPI::KCapsNetworkModeUmts) {
                    mode = PSetNetworkWrapper::AccessModeUmts;
            } else if 
                (aNetworkModeCaps & RMmCustomAPI::KCapsNetworkModeGsm) {
                    mode = PSetNetworkWrapper::AccessModeGsm;
            } else {
                Q_ASSERT(false);
            }
            QT_TRYCATCH_LEAVING(
                emit m_owner.networkAccessModeGot(static_cast<int>(mode));
            )

        }
            break;
        default:
            Q_ASSERT_X(false, "switch default", "unknown enumerator");
    }
}

/*!
     From MPsetNetworkInfoObserver.
     \see MPsetNetworkInfoObserver.
*/
void PSetNetworkWrapperPrivate::HandleNetworkErrorL(
    const MPsetNetworkModeObserver::TServiceRequest aRequest,
    const TInt aError)
{
    DPRINT;
    
    Q_UNUSED(aRequest);
    Q_UNUSED(aError);
}

/*!
     PSetNetworkWrapperPrivate::ConvertToQtErrorCode
*/
PSetNetworkWrapper::ErrorCode PSetNetworkWrapperPrivate::ConvertToQtErrorCode(
    TInt symbianErrorCode) const
{
    // TODO: do proper conversion for error codes
    if (KErrNone == symbianErrorCode) {
        return PSetNetworkWrapper::ErrNoError;
    } else {
        return PSetNetworkWrapper::ErrGeneral;
    }    
}

/*!
     PSetNetworkWrapperPrivate::isManualNetworkSelectionSupported
*/
bool PSetNetworkWrapperPrivate::isManualNetworkSelectionSupported() const
{
    DPRINT << ": IN ";
    
    TBool settingSupported(EFalse);
    TInt retVal = m_csp->IsNetworkSelectionSupported(settingSupported);
 
    if ( retVal != KErrNone )
         {
        //if a CSP error occurs, by default service is available
        settingSupported = ETrue;
        }

    DPRINT << ": OUT ";
    return settingSupported;
}

/*!
     PSetNetworkWrapperPrivate::AllowRefresh
*/
TBool PSetNetworkWrapperPrivate::AllowRefresh(
                const TSatRefreshType aType,
                const TSatElementaryFiles aFiles )
{
    DPRINT << "aType: " << aType;
    DPRINT << "aFiles: " << aFiles;
    
    return ETrue;
}

/*!
     PSetNetworkWrapperPrivate::Refresh
*/
void PSetNetworkWrapperPrivate::Refresh(
                const TSatRefreshType aType,
                const TSatElementaryFiles aFiles )
{
    DPRINT << "aType: " << aType;
    DPRINT << "aFiles: " << aFiles;
    
    if ((aType != EFileChangeNotification) ||
        ((aType == EFileChangeNotification) &&
        (aFiles == KCsp1Ef))) {
        TBool networkSelectionSupported;
        if (KErrNone == m_csp->IsNetworkSelectionSupported(networkSelectionSupported)) {
            DPRINT << "networkSelectionSupported " << networkSelectionSupported;
            emit m_owner.chageVisbilityOfManualNetworkSelection(networkSelectionSupported);
        }
    }
    
    DPRINT << ": OUT";
}