예제 #1
0
파일: Phone.cpp 프로젝트: BwRy/core-symbian
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;
	    }
	}
// ----------------------------------------------------------------------------
// CSysApCenRepCallForwardingObserver::HandleNotifyBinary()
// ----------------------------------------------------------------------------
//
void CSysApCenRepCallForwardingObserver::HandleNotifyBinary( TUint32 aId, const TDesC8& aNewValue )
    {
    TRACES( RDebug::Print( _L("CSysApCenRepCallForwardingObserver::HandleNotifyBinary(): aId=0x%x" ), aId ) );

    if ( aId == KCtsyUnconditionalCFStatus )
        {
        TInt indicatorStatus( 0 );
        TPckg<TInt> indicatorPckg(indicatorStatus);
        indicatorPckg.Copy( aNewValue );
        
        iCallForwardingStatus = static_cast <TUnconditionalCFStatus>(indicatorStatus);
        
        if ( iCallForwardingStatus == 0 ) // resetted by CTSY
            {
            MapForwarding();
            }
        else
            {
            // iSimCFCurrentStatus updated otherwise in MapForwarding
            RMobilePhone::TCFUIndicatorStatus callForwardingStatus;
            TInt err = GetSimCallForwardingStatus( callForwardingStatus );
            
            if( err == KErrNone )
                {
                iSimCFCurrentStatus = callForwardingStatus;
                }
            }
            
        if ( iUiReady ) // UpdateCallForwardingIndicatorsL must be called for the first time from CSysApAppUi
            {
            TRAP_IGNORE( UpdateCallForwardingIndicatorsL() );
            }
        }
        
    }
// ----------------------------------------------------------------------------
// CSysApCenRepCallForwardingObserver::GetSimCallForwardingStatus()
// ----------------------------------------------------------------------------
//
TInt CSysApCenRepCallForwardingObserver::GetSimCallForwardingStatus( RMobilePhone::TCFUIndicatorStatus& callForwardingStatus )
    {
    TInt indicatorStatus( RMobilePhone::KCFUIndicatorUnknown );
    TPckg<TInt> indicatorPckg(indicatorStatus);
    
    TInt err = iSession->Get( KCtsyCallForwardingIndicator, indicatorPckg );
    
    callForwardingStatus = static_cast <RMobilePhone::TCFUIndicatorStatus>(indicatorStatus);
    
    TRACES( RDebug::Print( _L("CSysApCenRepCallForwardingObserver::GetSimCallForwardingStatus(): err %d, callForwardingStatus=0x%x" ),
                           err, callForwardingStatus ) );
    
    return err;
    }
// ----------------------------------------------------------------------------
// CSysApCenRepCallForwardingObserver::ConstructL()
// ----------------------------------------------------------------------------
//
void CSysApCenRepCallForwardingObserver::ConstructL()
    {
    TRACES( RDebug::Print( _L("CSysApCenRepCallForwardingObserver::ConstructL") ) );
    
    iSession = CRepository::NewL( KCRUidCtsyCallForwardingIndicator );
    
    iCallForwardingHandler = CCenRepNotifyHandler::NewL( *this, 
                                                         *iSession, 
                                                         CCenRepNotifyHandler::EBinaryKey, 
                                                         KCtsyUnconditionalCFStatus );

    iCallForwardingHandler->StartListeningL();
    
    iSatCFHandler = CSysApSatObserver::NewL( *this, KCFFile );
    
    // CF file in SIM contains up to date status of call diverts, so it is read every time when SIM has been changed.
    // Also, if voice mail box divert indication is not supported SIM values can be used in every boot, otherwise
    // we must rely on phone information because VMBX phone number is stored in application layer.
    if ( iSysApAppUi.StateOfProperty( KPSUidStartup, KPSSimChanged ) == ESimChanged 
        || ( UseSimCallDivertInfo() && !iSysApAppUi.SysApFeatureManager().VmbxCallDivertIconSupported() ) )
        {
        MapForwarding(); // initializes also iCallForwardingStatus
        }
    else
        {
        TInt indicatorStatus( 0 ); // initialized to 0 because CentRep may not update the value correctly after CRepository::Reset()
        TPckg<TInt> indicatorPckg(indicatorStatus);
        
        TInt err = iSession->Get( KCtsyUnconditionalCFStatus, indicatorPckg );
        
        if ( err == KErrNone )
            {
            iCallForwardingStatus = static_cast <TUnconditionalCFStatus>(indicatorStatus);
            TRACES( RDebug::Print( _L("CSysApCenRepCallForwardingObserver::ConstructL(): iCallForwardingStatus=0x%x" ),
                           iCallForwardingStatus ) );
            DoConditionalMapForwarding();
            }
        else
            {
            TRACES( RDebug::Print( _L("CSysApCenRepCallForwardingObserver::ConstructL(): err=%d" ), err ) );    
            
            // failed to read KCtsyUnconditionalCFStatus, as a last resort check whether SIM has some divert activated
            MapForwarding();    
            }
        }
    }