sipplugins/sippsystemstatemonitor/src/siprfsmonitorao.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 12 Mar 2010 15:44:11 +0200
branchRCL_3
changeset 9 1e1cc61f56c3
parent 0 307788aac0a8
permissions -rw-r--r--
Revision: 201007 Kit: 201008

/*
* Copyright (c) 2007 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 FILES
#include "siprfsmonitorao.h"
#include <sipsystemstatemonitorpskeys.h>
#include <sipsystemstateobserver.h>

_LIT_SECURITY_POLICY_PASS( KSIPRfsAlwaysPass );

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::NewL
// -----------------------------------------------------------------------------
//
CSipRfsMonitorAo* CSipRfsMonitorAo::NewL()
    {
    CSipRfsMonitorAo* self = new( ELeave )CSipRfsMonitorAo();
    CleanupStack::PushL ( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::ConstructL
// -----------------------------------------------------------------------------
//
void CSipRfsMonitorAo::ConstructL ()
    {
    TInt err = iProperty.Define( KPSSipRfsUid, KSipRfsState, RProperty::EInt,
				   KSIPRfsAlwaysPass, KSIPRfsAlwaysPass);
    if ( KErrNone != err && KErrAlreadyExists != err && 
            KErrPermissionDenied != err )
        {
        User::Leave( err );
        }
    User::LeaveIfError( iProperty.Attach(KPSSipRfsUid, KSipRfsState));
    iProperty.Subscribe( iStatus );
    SetActive();

    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::CSipRfsMonitorAo
// -----------------------------------------------------------------------------
//
CSipRfsMonitorAo::CSipRfsMonitorAo():
    CActive(EPriorityStandard)
    {
    CActiveScheduler::Add( this );
    iCount = 0;
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::~CSipRfsMonitorAo
// -----------------------------------------------------------------------------
//
CSipRfsMonitorAo::~CSipRfsMonitorAo()
    {
    CActive::Cancel();
    iProperty.Close();
	iProperty.Delete(KPSSipRfsUid,KSipRfsState);
    iObservers.Close();
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::AddObserverL
// -----------------------------------------------------------------------------
//
void CSipRfsMonitorAo::AddObserverL( 
    MSipSystemStateObserver& aObserver )
    {
    iObservers.InsertInAddressOrderL( &aObserver );
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::RemoveObserver
// -----------------------------------------------------------------------------
//    
void CSipRfsMonitorAo::RemoveObserver(
    MSipSystemStateObserver& aObserver )
    {
    TInt index = iObservers.Find( &aObserver );
    if ( index >= 0 )
        {
        iObservers.Remove( index ); 
        }
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::NotifyObservers
// -----------------------------------------------------------------------------
//
void CSipRfsMonitorAo::NotifyObservers()
    {
    for ( TInt i = iObservers.Count()-1; i >= 0; i-- )
        {
        iObservers[i]->SystemVariableUpdated( 
            CSipSystemStateMonitor::ERfsState, 
            0,
            iState);
        }           
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::State
// -----------------------------------------------------------------------------
//
CSipSystemStateMonitor::TRfsState CSipRfsMonitorAo::State() const
    {
    return iState;
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::EventProcessingCompleted
// -----------------------------------------------------------------------------
//
void CSipRfsMonitorAo::EventProcessingCompleted(
        MSipSystemStateObserver& aObserver )
    {
    if (iState == CSipSystemStateMonitor::ERfsStarted)
        {
            TInt index = iObservers.Find( &aObserver );
            if ( index >= 0 )
            {
                iCount++;
                if( iObservers.Count() == iCount)
                {
                    iProperty.Set(KPSSipRfsUid, KSipRfsState, ESipRfsEventProcessingCompleted );
                    iCount = 0;
                }
            }
        }
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::RunL
// -----------------------------------------------------------------------------
//
void CSipRfsMonitorAo::RunL()
    {
    TInt state ( 0 );  
    if ( KErrNone == iProperty.Get( state ) )
        {
        if (MappedState(state))
            NotifyObservers();
        }
    iProperty.Subscribe( iStatus );
    SetActive();
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::RunError
// -----------------------------------------------------------------------------
//     
TInt CSipRfsMonitorAo::RunError( TInt /*aError*/ )
    {
    return KErrNone; // RunL cannot leave at the moment
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::DoCancel
// -----------------------------------------------------------------------------
//  
void CSipRfsMonitorAo::DoCancel()
    {
    iProperty.Cancel();
    }

// -----------------------------------------------------------------------------
// CSipRfsMonitorAo::MappedState
// -----------------------------------------------------------------------------
//
TBool CSipRfsMonitorAo::MappedState(TInt aState)
    {
    TBool ret = ETrue;
    switch(aState)
        {
        case CSipSystemStateMonitor::ERfsStarted:
            iState = CSipSystemStateMonitor::ERfsStarted;
            break;
        case CSipSystemStateMonitor::ERfsFailed:
            iState = CSipSystemStateMonitor::ERfsFailed;
            break;
        case CSipSystemStateMonitor::ERfsCompleted:
            iState = CSipSystemStateMonitor::ERfsCompleted;
            break;
        default:
            ret = EFalse;
        }
    return ret;
    }