--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchserver/src/cchwlanextension.cpp Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,279 @@
+/*
+* 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:
+* class implementation for CCchWlanExtension
+*
+*/
+
+
+// INCLUDE FILES
+#include "cchwlanextension.h"
+#include "cchprivatecrkeys.h"
+#include "cchlogger.h"
+
+#include <centralrepository.h>
+#include <wlanmgmtclient.h>
+#include <StringLoader.h>
+#include <WlanCdbCols.h>
+
+// CONSTANTS
+
+const TUint32 KWlanScanRateDeactive = 0; //scan not active
+const TUint32 KWlanScanRateActive = 300; //value used when cch activates 1st scan
+
+const TInt KRetryTimeout( 100000 ); // 0,1s delay for comms db begintransaction retry (microseconds)
+const TInt KRetryCount( 6 ); // Maximum number of retries
+
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// CCchWlanExtension::NewL()
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+CCchWlanExtension* CCchWlanExtension::NewL( )
+ {
+ CCchWlanExtension* self = new( ELeave ) CCchWlanExtension( );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCchWlanExtension::ConstructL()
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+void CCchWlanExtension::ConstructL()
+ {
+ CCHLOGSTRING2( "CCchWlanExtension::ConstructL[0x%x]: IN", this );
+ // Create connection to the Access Points setting data.
+ iAPCommsDatabase = CCommsDatabase::NewL( EDatabaseTypeIAP );
+
+ // Create connection to the WLAN setting data.
+ iWLANCommsDatabase = CCommsDatabase::NewL();
+
+ iCchRepository = CRepository::NewL( KCRUidCch );
+ CCHLOGSTRING( "CCchWlanExtension::ConstructL: OUT" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCchWlanExtension::CCchWlanExtension()
+// Constructor.
+// ---------------------------------------------------------------------------
+CCchWlanExtension::CCchWlanExtension( ) :
+ iLastSavedScanInterval( 0 )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CGSUiVoIPExtension::~CCchWlanExtension()
+// Destructor.
+// ---------------------------------------------------------------------------
+CCchWlanExtension::~CCchWlanExtension()
+ {
+ delete iWLANCommsDatabase;
+ delete iAPCommsDatabase;
+ delete iCchRepository;
+ }
+
+// ---------------------------------------------------------------------------
+// CCchWlanExtension::ForceEnableWlanScanL
+// ---------------------------------------------------------------------------
+void CCchWlanExtension::ForceEnableWlanScanL()
+ {
+ CCHLOGSTRING( "CCchWlanExtension::ForceEnableWlanScanL: IN" );
+ TInt scanRate = CheckAvailabilityStatusL();
+ if( KWlanScanRateDeactive != scanRate )
+ {
+ CCHLOGSTRING( "CCchWlanExtension::Forced to disable/enable wlan scan" );
+ SetAvailabilitySwitchL( KWlanScanRateDeactive );
+ SetAvailabilitySwitchL( iLastSavedScanInterval );
+ }
+ else
+ {
+ CCHLOGSTRING( "CCchWlanExtension::Normal wlan scan enable" );
+ EnableWlanScanL();
+ }
+
+ CCHLOGSTRING( "CCchWlanExtension::ForceEnableWlanScanL: OUT" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCchWlanExtension::EnableWlanScanL
+// ---------------------------------------------------------------------------
+void CCchWlanExtension::EnableWlanScanL()
+ {
+ CCHLOGSTRING( "CCchWlanExtension::EnableWlanScanL: IN" );
+ TInt err( KErrNone );
+ TInt wlanActivation( 0 );
+ err = iCchRepository->Get(
+ KCCHWasWlanScanActivatedBeforeServiceEnabling,
+ wlanActivation );
+ User::LeaveIfError( err );
+ TInt scanRate = CheckAvailabilityStatusL();
+ // Activate the WLAN scan setting if needed.
+ if( KErrNone == err )
+ {
+ if( ECCHWlanScanNotDefined == wlanActivation )
+ {
+ if( KWlanScanRateDeactive < scanRate )
+ {
+ iCchRepository->Set( KCCHWasWlanScanActivatedBeforeServiceEnabling,
+ ECCHWlanScanWasEnabled );
+ CCHLOGSTRING( "CCchWlanExtension::EnableWlanScanL; scan was enabled by user" );
+ }
+ else
+ {
+ iCchRepository->Set( KCCHWasWlanScanActivatedBeforeServiceEnabling,
+ ECCHWlanScanWasNotEnabled );
+
+ CCHLOGSTRING( "CCchWlanExtension::EnableWlanScanL; scan was enabled by CCH" );
+ }
+ }
+ }
+ if( KWlanScanRateDeactive == scanRate )
+ {
+ SetAvailabilitySwitchL( iLastSavedScanInterval );
+ }
+
+ CCHLOGSTRING( "CCchWlanExtension::EnableWlanScanL: OUT" );
+ }
+// ---------------------------------------------------------------------------
+// CCchWlanExtension::DisableWlanScanL
+// ---------------------------------------------------------------------------
+void CCchWlanExtension::DisableWlanScanL()
+ {
+ CCHLOGSTRING( "CCchWlanExtension::DisableWlanScanL: IN" );
+ // Deactivate the WLAN scan setting if needed.
+ TInt err( KErrNone );
+ TInt wlanActivation( 0 );
+ err = iCchRepository->Get(
+ KCCHWasWlanScanActivatedBeforeServiceEnabling,
+ wlanActivation );
+ User::LeaveIfError( err );
+ TInt scanRate = CheckAvailabilityStatusL();
+ CCHLOGSTRING2( "CCchWlanExtension::DisableWlanScanL: ERROR:%d", err );
+ if( KErrNone == err )
+ {
+ CCHLOGSTRING2( "CCchWlanExtension::DisableWlanScanL: activation:%d", wlanActivation );
+ if ( KWlanScanRateDeactive < scanRate )
+ {
+ CCHLOGSTRING( "CCchWlanExtension::DisableWlanScanL: scan is active" );
+ if( ECCHWlanScanNotDefined != wlanActivation )
+ {
+ if( ECCHWlanScanWasNotEnabled == wlanActivation )
+ {
+ CCHLOGSTRING( "CCchWlanExtension::DisableWlanScanL: disabling wlan scan" );
+ SetAvailabilitySwitchL( KWlanScanRateDeactive );
+ }
+ err = iCchRepository->Set( KCCHWasWlanScanActivatedBeforeServiceEnabling,
+ ECCHWlanScanNotDefined );
+ User::LeaveIfError( err );
+ }
+ }
+ }
+ CCHLOGSTRING( "CCchWlanExtension::DisableWlanScanL: OUT" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCchWlanExtension::CheckAvailabilityStatusL
+// Checks WLAN availability setting status.
+// ---------------------------------------------------------------------------
+//
+TUint32 CCchWlanExtension::CheckAvailabilityStatusL()
+ {
+ CCHLOGSTRING( "CCchWlanExtension::CheckAvailabilityStatusL: IN" );
+ TUint32 scanRate( KErrNone );
+ // Open WLAN setting table and get availability data.
+ CCommsDbTableView* view =
+ iWLANCommsDatabase->OpenViewMatchingUintLC
+ (
+ TPtrC( WLAN_DEVICE_SETTINGS ),
+ TPtrC( WLAN_DEVICE_SETTINGS_TYPE ),
+ KWlanUserSettings
+ );
+
+ User::LeaveIfError( view->GotoFirstRecord() );
+ view->ReadUintL( TPtrC( WLAN_BG_SCAN_INTERVAL ), scanRate );
+ //ignore leave if there is no such column WLAN_SAVED_BG_SCAN_INTERVAL
+ TRAP_IGNORE( view->ReadUintL( TPtrC( WLAN_SAVED_BG_SCAN_INTERVAL ),
+ iLastSavedScanInterval ) );
+
+ if( 0 == iLastSavedScanInterval )
+ {
+ iLastSavedScanInterval = KWlanScanRateActive;
+ }
+ CCHLOGSTRING3(
+ "CCchWlanExtension::CheckAvailabilityStatusL: interval: %d, saved: %d",
+ scanRate, iLastSavedScanInterval );
+ CleanupStack::PopAndDestroy( view );
+ CCHLOGSTRING( "CCchWlanExtension::CheckAvailabilityStatusL: OUT" );
+ // Return scan rate value.
+ return scanRate;
+ }
+
+// -----------------------------------------------------------------------------
+// CCchWlanExtension::SetAvailabilitySwitchL
+// Sets WLAN availability switch based on scan rate given.
+// -----------------------------------------------------------------------------
+void CCchWlanExtension::SetAvailabilitySwitchL( TUint32 aScanRate )
+ {
+ CCHLOGSTRING( "CCchWlanExtension::SetAvailabilitySwitchL: IN" );
+ // Open WLAN setting table and record.
+ CCommsDbTableView* view = iWLANCommsDatabase->OpenViewMatchingUintLC
+ (
+ TPtrC( WLAN_DEVICE_SETTINGS ),
+ TPtrC( WLAN_DEVICE_SETTINGS_TYPE ),
+ KWlanUserSettings
+ );
+
+ User::LeaveIfError( view->GotoFirstRecord() );
+ User::LeaveIfError( view->UpdateRecord() );
+
+ // Set new WLAN availability setting value to comms database.
+ view->WriteUintL( TPtrC( WLAN_BG_SCAN_INTERVAL ), aScanRate );
+
+ TInt round( 0 );
+ TInt err( KErrNone );
+ do
+ {
+ // Complete transaction procedure.
+ err = view->PutRecordChanges();
+
+ if ( KErrNone != err )
+ {
+ User::After( round * KRetryTimeout );
+ round++;
+ }
+ }
+ while ( KErrNone != err && round < KRetryCount);
+
+ if ( KErrNone != err )
+ {
+ CCHLOGSTRING( "CCchWlanExtension::SetAvailabilitySwitchL: PutRecordChanges was unsuccessful" );
+ User::Leave( err );
+ }
+
+ CleanupStack::PopAndDestroy( view );
+
+ // Notifying WLAN Engine about changes in settings.
+ CWlanMgmtClient* wlanMgmtClient = CWlanMgmtClient::NewL();
+ wlanMgmtClient->NotifyChangedSettings();
+ delete wlanMgmtClient;
+ CCHLOGSTRING( "CCchWlanExtension::SetAvailabilitySwitchL: OUT" );
+ }
+
+// End of file