homesync/contentmanager/cmserver/cmscheduler/src/cmcommsdbnotifier.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:00 +0200
changeset 0 7f85d04be362
permissions -rw-r--r--
Revision: 200947 Kit: 200951

/*
* Copyright (c) 2008 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:  Checks if wlan scan state changes and informs observer of it
*
*/


//  Include Files
#include <commdb.h>
#include <d32dbms.h>
#include <WlanCdbCols.h>
#include <wlanmgmtclient.h>
#include "cmcommsdbnotifier.h"
#include "cmscheduler.h"
#include "msdebug.h"

// Two-phased constructor.
CCmCommsDbNotifier* CCmCommsDbNotifier::NewL( CCmScheduler& aScheduler )
    {
    CCmCommsDbNotifier* self = new (ELeave) CCmCommsDbNotifier( aScheduler );

    CleanupStack::PushL( self );
    CActiveScheduler::Add( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
}

void CCmCommsDbNotifier::ConstructL()
    {
    // open comms database
    iDb = CCommsDatabase::NewL();
    // assign notification request
    RequestNotification();
    }

// --------------------------------------------------------------------------
// CCmCommsDbNotifier::CCmCommsDbNotifier
// C++ default constructor can NOT contain any code, that
// might leave.
// --------------------------------------------------------------------------
//
CCmCommsDbNotifier::CCmCommsDbNotifier( CCmScheduler& aScheduler ) :
    CActive( CActive::EPriorityStandard )
    {
    LOG(_L("[Cm Scheduler]\t CCmCommsDbNotifier::CCmCommsDbNotifier()"));

    // Scheduler reads scan interval on construction, so we can
    // assume it's off
    // now
    iScanState = 0;
    iScheduler = &aScheduler;
    }

// Destructor
CCmCommsDbNotifier::~CCmCommsDbNotifier()
    {
    LOG(_L("[Cm Scheduler]\t CCmCommsDbNotifier::~CCmCommsDbNotifier()"));

    Cancel();

    delete iDb;
    }

// --------------------------------------------------------------------------
// CCmCommsDbNotifier::RequestNotification
// Requests database notification
// --------------------------------------------------------------------------
//
void CCmCommsDbNotifier::RequestNotification()
    {
    LOG(_L("[Cm Scheduler]\t CCmCommsDbNotifier::RequestNotification()"));
    if ( !IsActive() )
        {
        iDb->RequestNotification( iStatus );
        SetActive();
        }
    }


// --------------------------------------------------------------------------
// CCmCommsDbNotifier::DoCancel
// --------------------------------------------------------------------------
//
void CCmCommsDbNotifier::DoCancel()
    {
    // cancel possible requests
    iDb->CancelRequestNotification();
    }

// ---------------------------------------------------------------------------
// CCmCommsDbNotifier::RunL
// Called when change in database occurs
// ---------------------------------------------------------------------------
//
void CCmCommsDbNotifier::RunL()
    {
    LOG(_L("[Cm Scheduler]\t CCmCommsDbNotifier::RunL()"));

    if ( iScheduler &&
         iStatus.Int() == RDbNotifier::ECommit &&
         HasScanStateChangedL() )
        {
        iScheduler->WlanScanStateChanged( iScanState );
        }

    // Assign new request
    RequestNotification();
    }

// --------------------------------------------------------------------------
// CCmCommsDbNotifier::RunError
// Called if RunL leaves
// --------------------------------------------------------------------------
//
#ifdef _DEBUG
TInt CCmCommsDbNotifier::RunError( TInt aError )
#else // _DEBUG
TInt CCmCommsDbNotifier::RunError( TInt /*aError*/ )
#endif // _DEBUG

    {
    TRACE(Print(_L("[Cm Scheduler]\t \
    CCmCommsDbNotifier::RunError errorcode = %d"), aError));

    return KErrNone;
    }

// --------------------------------------------------------------------------
// CCmCommsDbNotifier::HasScanStateChangedL
// Checks if wlan scanning interval has been changed
// --------------------------------------------------------------------------
//
TBool CCmCommsDbNotifier::HasScanStateChangedL()
    {
    LOG(_L("[Cm Scheduler]\t CCmCommsDbNotifier::HasScanStateChangedL"));

    TBool status( EFalse );

    TUint32 scanState = WlanScanStateL();

    if ( iScanState != scanState )
        {
        // value changed
        iScanState = scanState;
        status = ETrue;
        }
    else
        {
        // value not changed
        status = EFalse;
        }

    return status;
    }

// --------------------------------------------------------------------------
// CCmCommsDbNotifier::WlanScanStateL
// Returns state of wlan scan interval setting
// --------------------------------------------------------------------------
//
TUint32 CCmCommsDbNotifier::WlanScanStateL()
    {
    TUint32 scanState( 0 );

#ifndef __WINS__

    // open wlan table
    CCommsDbTableView* view = iDb->OpenViewMatchingUintLC
        (
        TPtrC( WLAN_DEVICE_SETTINGS ),
        TPtrC( WLAN_DEVICE_SETTINGS_TYPE ), KWlanUserSettings
        );

    User::LeaveIfError( view->GotoFirstRecord() );

    // read scanning interval
    view->ReadUintL( TPtrC( WLAN_BG_SCAN_INTERVAL ),
                     scanState );

    TRACE(Print(_L("[Cm Scheduler]\t CCmCommsDbNotifier::prev: %d, \
                scan :%d"), iScanState, scanState ));


    CleanupStack::PopAndDestroy( view );

#endif

    return scanState;
    }

// End of file