srsf/nssvascontacthdlr/src/nssvasdatasyncwatcher.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:46:30 +0200
changeset 0 bf1d17376201
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2005-2006 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:  Watches changes of the PC-Suite data sync state
*
*/


#include "nssvasdatasyncwatcher.h"
#include "rubydebug.h"

// Destructors cannot be pure virtual
MNssDataSyncWatcher::~MNssDataSyncWatcher() 
    {
    // empty
    }



///////////////////////////////////
// CNssDataSyncWatcherFactory::ConstructDataSyncWatcherL
//
// Constructs and returns the data sync watcher according to what's
// available in the system. I.e RProperty based watcher or
// shared data client based watcher
// @param aHost Observer to be notified about data sync state changes
//
// @return Constructed and already started watcher
///////////////////////////////////
MNssDataSyncWatcher* CNssDataSyncWatcherFactory::ConstructDataSyncWatcherL( 
                                        MNssDataSyncStateObserver& aHost )
    {
    RUBY_DEBUG_BLOCKL( "ConstructDataSyncWatcherL" );
    MNssDataSyncWatcher* watcher = CNssDataSyncPropertyWatcher::NewL( aHost );
    return watcher;
    }

///////////////////////////////////
// CNssDataSyncPropertyWatcher::NewL
//
// Two phased construction
///////////////////////////////////
CNssDataSyncPropertyWatcher* CNssDataSyncPropertyWatcher::NewL( MNssDataSyncStateObserver& aHost )
    {
    CNssDataSyncPropertyWatcher* self = new (ELeave) CNssDataSyncPropertyWatcher( aHost );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }
    
///////////////////////////////////
// CNssDataSyncPropertyWatcher::CNssDataSyncPropertyWatcher
//
// Constructor
///////////////////////////////////
CNssDataSyncPropertyWatcher::CNssDataSyncPropertyWatcher( MNssDataSyncStateObserver& aHost ) :
    CActive( EPriorityStandard ),
    iHost( &aHost ),
    iDataSyncStatus( EDataSyncNotRunning )
    {
    // Nothing
    }
    
///////////////////////////////////
// CNssDataSyncPropertyWatcher::ConstructL
//
// Second-pase constructor
///////////////////////////////////
void CNssDataSyncPropertyWatcher::ConstructL() 
    {
    RUBY_DEBUG_BLOCK( "CNssDataSyncPropertyWatcher::ConstructL" );
    User::LeaveIfError( iProperty.Attach( KPSUidDataSynchronizationInternalKeys, KDataSyncStatus ) );
    CActiveScheduler::Add( this );
    // initial subscription and process current property value
    RunL();
    }
    
///////////////////////////////////
// CNssDataSyncPropertyWatcher::~CNssDataSyncPropertyWatcher
//
// Destructor
///////////////////////////////////
CNssDataSyncPropertyWatcher::~CNssDataSyncPropertyWatcher()
    {
    if( IsAdded() ) 
        {
        Deque();
        }
    iProperty.Close();
    }
    
///////////////////////////////////
// CNssDataSyncPropertyWatcher::DoCancel
//
// Cancel listening now
///////////////////////////////////
void CNssDataSyncPropertyWatcher::DoCancel() 
    {
    iProperty.Cancel();
    }


///////////////////////////////////
// CNssDataSyncPropertyWatcher::runL
//
// Is called, when property changed
///////////////////////////////////
void CNssDataSyncPropertyWatcher::RunL()
    {
    RUBY_DEBUG_BLOCK( "CNssDataSyncPropertyWatcher::RunL" );
    if( iStatus != KErrNone ) 
        {
        // At least report the error
        RUBY_ERROR1( "CNssDataSyncPropertyWatcher::RunL iStatus is [%d]", iStatus.Int() );
        }
        
    // resubscribe before processing new value to prevent missing updates
    // even if some error happened
    iProperty.Subscribe( iStatus );
    SetActive();
    // property updated, get new value
    TInt dataSyncStatus;
    if ( iProperty.Get( dataSyncStatus) == KErrNotFound )
        {
        // not defined is the same as sync is not running
        dataSyncStatus = EDataSyncNotRunning;
        }
    iDataSyncStatus = static_cast<TDataSyncStatus>( dataSyncStatus );
    iHost->DataSyncStateChanged( InProgress() );

    }
    
///////////////////////////////////
// CNssDataSyncPropertyWatcher::InProgress
//
// Tells if data sync is active right now
///////////////////////////////////
TBool CNssDataSyncPropertyWatcher::InProgress()
	{
	// There can be several different "running" statuses, but only one "not running"
    // So check for not running
	return iDataSyncStatus != EDataSyncNotRunning;
	}

//  End of File