diff -r 000000000000 -r 5a93021fdf25 connectionutilities/ConnectionDialogs/cconndlg/src/ActiveSelectConnectionPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectionutilities/ConnectionDialogs/cconndlg/src/ActiveSelectConnectionPlugin.cpp Thu Dec 17 08:55:21 2009 +0200 @@ -0,0 +1,819 @@ +/* +* Copyright (c) 2002 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: Implementation of plugins (base & all derived). +* +*/ + + +// INCLUDE FILES +#include "ActiveSelectConnectionPlugin.h" +#include "SelectConnectionDialog.h" +#include "ConnectionDialogsLogger.h" +#include "ConnectionInfo.h" +#include "ConnectionInfoArray.h" +#include "sortsnaputils.h" +#include "cdbcols.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#else +#include +#include +#endif + +#include +#include + +// CONSTANTS + +// Category for all panics in this module +_LIT( KASCPCategory, "Select Connection Plugin" ); + +LOCAL_D const TInt KIconsGranularity = 4; +LOCAL_D const TInt KArrayGranularity = 4; +LOCAL_D const TInt KMaxEntryLength = CommsDat::KMaxTextLength*2 + 20; +/** +* For iPeriodic Timer, 60 seconds +*/ +LOCAL_C const TInt KTickDefaultInterval = 60000000; +LOCAL_C const TInt KMicrosecondsToSecondsMultiplier = 1000000; + +// background scan automatic scanning value +static const TUint KWlanBgScanIntervalAuto = 0xffffffff; + +using namespace CMManager; + + +/////////////////////////////////////////////////////////////////////////////// + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::CActiveSelectConnectionPlugin() +// --------------------------------------------------------- +// +CActiveSelectConnectionPlugin::CActiveSelectConnectionPlugin( + MEikSrvNotifierBase2* aPlugin, + const TUint32 aElementId, + TUint32 aBearerSet ) +: iBearerSet( aBearerSet ), + iReqBearerSet( aBearerSet ), + iElementId( aElementId ), + iPlugin( aPlugin ), + iDialogConn( NULL ), + iIsWLANFeatureSupported( EFalse ), + iRefreshInterval( KTickDefaultInterval ), + iHighlightedItem( -1 ), + iDefaultDestId( 0 ), + iDefaultCMId( 0 ) + { + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin* CActiveSelectConnectionPlugin::NewL() +// --------------------------------------------------------- +// +CActiveSelectConnectionPlugin* CActiveSelectConnectionPlugin::NewL( + MEikSrvNotifierBase2* aPlugin, + const TUint32 aElementId, + TUint32 aBearerSet ) + { + CLOG_ENTERFN( "CActiveSelectConnectionPlugin::NewL " ); + + CActiveSelectConnectionPlugin* self = new ( ELeave ) + CActiveSelectConnectionPlugin( aPlugin, aElementId, + aBearerSet ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + CLOG_LEAVEFN( "CActiveSelectConnectionPlugin::NewL " ); + + return self; + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::ConstructL() +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::ConstructL() + { + CLOG_ENTERFN( "CActiveSelectConnectionPlugin::ConstructL " ); + + CActiveBase::ConstructL(); + + FeatureManager::InitializeLibL(); + + iIsWLANFeatureSupported = FeatureManager::FeatureSupported( + KFeatureIdProtocolWlan ); + + FeatureManager::UnInitializeLib(); + + iBearerSet |= ECommDbBearerVirtual; // To get also VPN APs + +#ifdef __WINS__ + iBearerSet |= ECommDbBearerLAN; // To add Ethernet AP +#endif // __WINS__ + + if ( iIsWLANFeatureSupported ) + { + CLOG_WRITE( "WLAN Supported!" ); + iBearerSet |= ECommDbBearerWLAN; // To add WLan AP + iRefreshInterval = GetRefreshIntervalL(); + } + + + + iItems = new( ELeave ) CConnectionInfoArray(); + iIcons = new( ELeave ) CAknIconArray( KIconsGranularity ); + + iCmManagerExt.OpenL(); + + TInt ret = iMPM.LaunchServer(); + if ( ret != KErrAlreadyExists ) + { + User::LeaveIfError( ret ); + } + CLOG_LEAVEFN( "CActiveSelectConnectionPlugin::ConstructL " ); + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::~CActiveSelectConnectionPlugin() +// --------------------------------------------------------- +// +CActiveSelectConnectionPlugin::~CActiveSelectConnectionPlugin() + { + CLOG_ENTERFN( "~CActiveSelectConnectionPlugin" ); + Cancel(); + + if ( iItems ) + { + iItems->ResetAndDestroy(); + } + delete iItems; + iItems = NULL; + + iCmManagerExt.Close(); + iMPM.Close(); + + CLOG_LEAVEFN( "~CActiveSelectConnectionPlugin" ); + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::Cancel() +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::Cancel() + { + StopTimer(); + CActive::Cancel(); + + if( iDialogConn && !( iDialogConn->GetOkToExit() ) ) + { + CLOG_WRITEF( _L( "iDialogConn->GetOkToExit() : %b" ), iDialogConn->GetOkToExit() ); + delete iDialogConn; + iDialogConn = NULL; + } + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::DoCancel() +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::DoCancel() + { + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::RunL() +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::RunL() + { + CLOG_ENTERFN( "CActiveSelectConnectionPlugin::RunL " ); + + if( iStatus == KErrNone ) + { + BuildConnectionListL(); + iDialogConn->RefreshDialogL( iItems, iIcons, ETrue, iHighlightedItem ); + } + + CLOG_LEAVEFN( "CActiveSelectConnectionPlugin::RunL " ); + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::ShowSelectConnectionL() +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::ShowSelectConnectionL() + { + CLOG_ENTERFN( "CActiveSelectConnectionPlugin::ShowSelectConnectionL" ); + + BuildConnectionListL(); + + iDialogConn = CSelectConnectionDialog::NewL( iPlugin, iRefreshInterval, + iBearerSet, + iIsWLANFeatureSupported, + iDefaultCMId ); + + iDialogConn->PrepareAndRunLD( iItems, iIcons, EFalse, iHighlightedItem ); + + if( iRefreshInterval ) + { + StartTimerL( iRefreshInterval ); + } + + CLOG_LEAVEFN( "CActiveSelectConnectionPlugin::ShowSelectConnectionL" ); + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::BuildConnectionListL() +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::BuildConnectionListL() + { + CLOG_ENTERFN( "CActiveSelectConnectionPlugin::BuildConnectionListL " ); + + // iItems and iIcons are allocated at construction and deallocated at + // destruction. Unless memory allocation has failed, they cannot be NULL. + __ASSERT_ALWAYS( iItems, User::Panic( KASCPCategory, KErrGeneral ) ); + __ASSERT_ALWAYS( iIcons, User::Panic( KASCPCategory, KErrGeneral ) ); + + iItems->ResetAndDestroy(); + iIcons->ResetAndDestroy(); + + _LIT( KDriveZ, "z:" ); // ROM folder + // Name of the MBM file containing icons + _LIT( KManagerIconFilename, "cmmanager.mbm" ); + + TFileName iconsFileName; + + iconsFileName.Append( KDriveZ ); + iconsFileName.Append( KDC_APP_BITMAP_DIR ); + iconsFileName.Append( KManagerIconFilename ); + +// iIcons->AppendL( AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(), +// KAknsIIDQgnIndiCbHotAdd, +// iconsFileName, +// EMbmCmmanagerQgn_indi_cb_hot_add, +// EMbmCmmanagerQgn_indi_cb_hot_add_mask ) ); + + // Create color icon for marking the default connection + // + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + CGulIcon* icon = CGulIcon::NewLC(); + + AknsUtils::CreateColorIconL( AknsUtils::SkinInstance(), + KAknsIIDQgnIndiCbHotAdd, + KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG13, + bitmap, + mask, + iconsFileName, + EMbmCmmanagerQgn_indi_cb_hot_add, + EMbmCmmanagerQgn_indi_cb_hot_add_mask, + KRgbBlack ); + + icon->SetBitmap( bitmap ); + icon->SetMask( mask ); + iIcons->AppendL( icon ); + + CleanupStack::Pop( icon ); + + TCmDefConnValue defaultConnSetting; + + iCmManagerExt.ReadDefConnL( defaultConnSetting ); + if ( defaultConnSetting.iType == ECmDefConnDestination ) + { + iDefaultDestId = defaultConnSetting.iId; + } + else if ( defaultConnSetting.iType == ECmDefConnConnectionMethod ) + { + iDefaultCMId = defaultConnSetting.iId; + } + + if ( iIsWLANFeatureSupported && (iReqBearerSet & ECommDbBearerWLAN) ) + { + AddSearchForWLanItemL(); + } + + AddDestinationItemsL(); + + CLOG_WRITEF( _L( "iItems count: %d" ), iItems->Count() ); + CLOG_LEAVEFN( "CActiveSelectConnectionPlugin::BuildConnectionListL " ); + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::AddSearchForWLanItemL +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::AddSearchForWLanItemL() + { + TUint32 easyWlanId = iCmManagerExt.EasyWlanIdL(); + if ( easyWlanId ) + { + CLOG_WRITEF( _L( "easyWlanId %d" ), easyWlanId ); + + RCmConnectionMethodExt cmConnMethodExt; + TRAPD( err, cmConnMethodExt = iCmManagerExt.ConnectionMethodL( + easyWlanId ) ); + if ( err == KErrNone ) + { + CleanupClosePushL( cmConnMethodExt ); + + CGulIcon* wlanIcon = ( CGulIcon* ) + cmConnMethodExt.GetIntAttributeL( ECmBearerIcon ); + CleanupStack::PopAndDestroy(); // cmConnMethodExt + + if ( wlanIcon ) + { + CleanupStack::PushL( wlanIcon ); + iIcons->AppendL( wlanIcon ); + + // icon array took over ownership + CleanupStack::Pop( wlanIcon ); + + // +1 because it "Zero terminates" the string + TBuf nameSearch; + _LIT( KIconIdNameEmpty, "%d\t%s\t" ); + + HBufC *msg = StringLoader::LoadL( R_WLAN_EASY_WLAN ); + nameSearch = *msg; + nameSearch.ZeroTerminate(); + delete msg; + + TBuf temp; + temp.FillZ( KMaxEntryLength ); + temp.Format( KIconIdNameEmpty, iIcons->Count()-1, + nameSearch.Ptr() ); + + CConnectionInfo* conIn = CConnectionInfo::NewL( easyWlanId, + 0, temp ); + CleanupStack::PushL( conIn ); + iItems->AppendL( conIn ); + CleanupStack::Pop( conIn ); + iHighlightedItem = 0; + } + } + } + } + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::AddDestinationItemsL +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::AddDestinationItemsL() + { + /* TInt errConnect = iMPM.Connect(); + CLOG_WRITEF( _L( "errConnect = %d" ), errConnect ); + if ( errConnect == KErrNone ) + {*/ + TSortSnapUtils sortSnapUtils( iMPM ); + RArray destIdArray( KArrayGranularity ); + TRAPD( err, sortSnapUtils.GetDestIdArrayL( iCmManagerExt, destIdArray ) ); + //TRAPD( err, iCmManagerExt.AllDestinationsL( destIdArray ) ); + // Append the destinations to the list + CLOG_WRITEF( _L( "GetDestIdArrayL returned with %d" ), err ); + if ( err == KErrNone ) + { + CleanupClosePushL( destIdArray ); + + CLOG_WRITEF( _L( "destIdArray.Count() = %d" ), destIdArray.Count() ); + for ( TInt i = 0; i < destIdArray.Count(); i++ ) + { + RCmDestinationExt cmDestExt = iCmManagerExt.DestinationL( + destIdArray[i] ); + CleanupClosePushL( cmDestExt ); + if ( /*cmDestExt.ElementId() != iElementId &&*/ + !cmDestExt.MetadataL( ESnapMetadataHiddenAgent ) ) + { + CLOG_WRITEF( _L( "Destination id %d, Total number of methods %d" ), + destIdArray[i], cmDestExt.ConnectionMethodCount() ); + +#ifdef _DEBUG + for ( TInt j = 0; + j < cmDestExt.ConnectionMethodCount(); j++ ) + { + RCmConnectionMethodExt cmConnMethodExt; + TRAP( err, cmConnMethodExt = + cmDestExt.ConnectionMethodL( j ) ); + if ( err == KErrNone ) + { + CleanupClosePushL( cmConnMethodExt ); + HBufC* bufMethod = + cmConnMethodExt.GetStringAttributeL( ECmName ); + CleanupStack::PushL( bufMethod ); + TBuf nameMethod; + nameMethod = *bufMethod; + nameMethod.ZeroTerminate(); + + /*CLOG_WRITEF( _L( "ConnMethod id %d, Method name %s" ), + cmConnMethodExt.GetIntAttributeL( ECmIapId ), + nameMethod.Ptr() );*/ + + CleanupStack::PopAndDestroy( bufMethod ); + CleanupStack::PopAndDestroy(); // cmConnMethodExt + } + } +#endif + + AddDestinationItemL( cmDestExt, destIdArray[i], i == 0, + destIdArray[i] == iDefaultDestId, + sortSnapUtils ); + } + CleanupStack::PopAndDestroy(); // cmDestExt + } + CleanupStack::PopAndDestroy(); // destIdArray + } + AddUncategorizedItemL( sortSnapUtils ); +/* }*/ + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::AddDestinationItemL +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::AddDestinationItemL( + RCmDestinationExt aDestination, + TUint32 aDestId, + TBool aFirstItem, + TBool aDefaultDest, + TSortSnapUtils& aSortSnapUtils ) + { + TMpmSnapBuffer list; + + TInt errMPM = aSortSnapUtils.GetSortSnapData( aDestId, list ); + CLOG_WRITEF( _L( "errMPM = %d. list.Count() = %d" ), errMPM, list.Count() ); + + if ( errMPM == KErrNone ) + { + for ( TInt numCM = 0; numCM < list.Count(); numCM++ ) + { + RCmConnectionMethodExt cmConnMethodExt; + TRAPD( err, cmConnMethodExt = iCmManagerExt.ConnectionMethodL( + list.iIapId[numCM] ) ); + + CLOG_WRITEF( _L( "Trapped err = %d" ), err ); + + if ( err == KErrNone ) + { + CleanupClosePushL( cmConnMethodExt ); + if ( iBearerSet & cmConnMethodExt.GetIntAttributeL( + ECmCommsDBBearerType ) ) + { + HBufC* bufBest = cmConnMethodExt.GetStringAttributeL( + ECmName ); + + CleanupStack::PopAndDestroy(); // cmConnMethodExt + CleanupStack::PushL( bufBest ); + + _LIT( KIconIdNameBest, "%d\t%s\t\"%s\"" ); + _LIT( KIconIdNameBestDefaultConn, "%d\t%s\t\"%s\"\t0" ); + + TBuf nameBest; + nameBest = *bufBest; + nameBest.ZeroTerminate(); + CleanupStack::PopAndDestroy( bufBest ); + + TBuf nameDest; + HBufC* name = aDestination.NameLC(); + nameDest = *name; + nameDest.ZeroTerminate(); + CleanupStack::PopAndDestroy( name ); + + CGulIcon* destIcon = aDestination.IconL(); + if ( destIcon ) + { + CleanupStack::PushL( destIcon ); + iIcons->AppendL( destIcon ); + + // icon array took over ownership + CleanupStack::Pop( destIcon ); + + TBuf temp; + temp.FillZ( KMaxEntryLength ); + if ( aDefaultDest ) + { + temp.Format( KIconIdNameBestDefaultConn, + iIcons->Count()-1, + nameDest.Ptr(), nameBest.Ptr() ); + } + else + { + temp.Format( KIconIdNameBest, + iIcons->Count()-1, + nameDest.Ptr(), nameBest.Ptr() ); + } + + CConnectionInfo* conIn = + CConnectionInfo::NewL( 0, aDestId, temp ); + CleanupStack::PushL( conIn ); + iItems->AppendL( conIn ); + CleanupStack::Pop( conIn ); + + if ( aFirstItem || + aDestination.MetadataL( ESnapMetadataHighlight ) ) + { // It sets the highlight to the + // first Destination (Internet), + // but if it finds another with + // the bit set, then it changes + iHighlightedItem = iItems->Count()-1; + } + } + + numCM = list.Count(); // break; + } + else + { + CleanupStack::PopAndDestroy(); // cmConnMethodExt + } + } + } + } + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::AddUncategorizedItemL +// --------------------------------------------------------- +// +void CActiveSelectConnectionPlugin::AddUncategorizedItemL(TSortSnapUtils& aSortSnapUtils ) + { + TMpmSnapBuffer list; + + TInt errMPM = aSortSnapUtils.GetSortSnapData( 0, list ); + CLOG_WRITEF( _L( "Uncategorized: errMPM = %d. list.Count() = %d" ), errMPM, list.Count() ); + + if ( errMPM == KErrNone ) + { + TUint numOfUncatToBeListed = 0; + + for ( TInt numCM = 0; numCM < list.Count(); numCM++ ) + { + RCmConnectionMethodExt cmConnMethodExt; + TRAPD( err, cmConnMethodExt = iCmManagerExt.ConnectionMethodL( + list.iIapId[numCM] ) ); + if ( err == KErrNone ) + { + CleanupClosePushL( cmConnMethodExt ); + if ( iBearerSet & cmConnMethodExt.GetIntAttributeL( + ECmCommsDBBearerType ) ) + { + numOfUncatToBeListed++; + } + CleanupStack::PopAndDestroy(); // cmConnMethodExt + } + } + + if ( ( iBearerSet & ECommDbBearerWLAN ) && iIsWLANFeatureSupported ) + { + numOfUncatToBeListed += CountAdhocWlanIapsL(); + } + + if ( numOfUncatToBeListed > 0 ) + { + CGulIcon* uncatIcon = + ( CGulIcon* )iCmManagerExt.UncategorizedIconL(); + if ( uncatIcon ) + { + CleanupStack::PushL( uncatIcon ); + iIcons->AppendL( uncatIcon ); + CleanupStack::Pop( uncatIcon ); // icon array took over ownership + + // +1 because it "Zero terminates" the string + TBuf nameUncat; + TBuf numUncat; + + HBufC *bufUncat = StringLoader::LoadL( R_LIST_UNCATEGORIZED ); + nameUncat = *bufUncat; + nameUncat.ZeroTerminate(); + delete bufUncat; + + HBufC *bufNumOfUncat; + if ( numOfUncatToBeListed == 1 ) + { + bufNumOfUncat = StringLoader::LoadL( R_CONN_METHODS_ONE ); + } + else + { + bufNumOfUncat = StringLoader::LoadL( R_CONN_METHODS_MANY, + numOfUncatToBeListed ); + } + + numUncat = *bufNumOfUncat; + numUncat.ZeroTerminate(); + delete bufNumOfUncat; + + TBuf temp; + _LIT( KIconIdNameNumber, "%d\t%s\t%s" ); + + temp.FillZ( KMaxEntryLength ); + temp.Format( KIconIdNameNumber, iIcons->Count()-1, nameUncat.Ptr(), + numUncat.Ptr() ); + + CConnectionInfo* conIn = CConnectionInfo::NewL( 0, 0, temp ); + CleanupStack::PushL( conIn ); + iItems->AppendL( conIn ); + CleanupStack::Pop( conIn ); + if ( iHighlightedItem < 0 ) + { + iHighlightedItem = 0; + } + } + } + } + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::GetElementIDL +// --------------------------------------------------------- +// +TUint32 CActiveSelectConnectionPlugin::GetElementIDL( TUint32 aIAPId, + TUint32 aDestinationId ) + { + TUint32 retval = 0; + TInt err; + + if ( aDestinationId ) + { + RCmDestinationExt cmDestExt; + TRAP( err, cmDestExt = iCmManagerExt.DestinationL( aDestinationId ) ); + if ( err == KErrNone ) + { + retval = cmDestExt.ElementId(); + cmDestExt.Close(); + } + } + else if ( aIAPId ) + { + RCmConnectionMethodExt cmConnMethodExt; + TRAP( err, cmConnMethodExt = iCmManagerExt.ConnectionMethodL( + aIAPId ) ); + if ( err == KErrNone ) + { + CleanupClosePushL( cmConnMethodExt ); + retval = cmConnMethodExt.GetIntAttributeL( ECmElementID ); + CleanupStack::PopAndDestroy(); // cmConnMethodExt + } + } + + return retval; + } + + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::GetRefreshIntervalL() +// --------------------------------------------------------- +// +TInt CActiveSelectConnectionPlugin::GetRefreshIntervalL( ) + { + CLOG_ENTERFN( "CActiveSelectConnectionPlugin::GetRefreshInterval" ); + + TInt variant( KTickDefaultInterval ); + + + CMDBSession* session = CMDBSession::NewL(KCDLatestVersion); + CleanupStack::PushL( session ); + + //session->OpenTransactionL(); + TMDBElementId tableId = 0; + + tableId = CCDWlanDeviceSettingsRecord::TableIdL( *session); + + CCDWlanDeviceSettingsRecord* record = new(ELeave) + CCDWlanDeviceSettingsRecord(tableId); + CleanupStack::PushL(record); + + record->iWlanDeviceSettingsType = KWlanUserSettings; + + if(record->FindL( *session )) + { + record->LoadL( *session ); + + // In case iBgScanInterval is -1 (= automatic) then just use + // KTickDefaultInterval as refresh interval + if ( record->iBgScanInterval != KWlanBgScanIntervalAuto + && record->iBgScanInterval > 0 ) + { + variant = record->iBgScanInterval; + variant = variant * KMicrosecondsToSecondsMultiplier; + } + } + CleanupStack::PopAndDestroy( record ); + + //session->CommitTransactionL(); + + CleanupStack::PopAndDestroy( session ); + + TUint32 variantToLog = variant; + + CLOG_WRITEF( _L( "Refresh interval (microseconds) : %d" ), variantToLog ); + + CLOG_LEAVEFN( "CActiveSelectConnectionPlugin::GetRefreshInterval" ); + + return variant; + } + +// --------------------------------------------------------- +// CActiveSelectConnectionPlugin::CountAdhocWlanIapsL() +// --------------------------------------------------------- +// +TInt CActiveSelectConnectionPlugin::CountAdhocWlanIapsL() + { + CLOG_ENTERFN( "CActiveSelectExplicit::CountAdhocWlanIapsL " ); + + // Creating a session with the latest version + CMDBSession* db = CMDBSession::NewLC( CMDBSession::LatestVersion() ); + db->SetAttributeMask( ECDProtectedWrite ); + + // Create wlan service record set (RArray (or RPtrArray?)) + CMDBRecordSet* wlanSet = + new (ELeave)CMDBRecordSet( CCDWlanServiceRecord::TableIdL( *db ) ); + CleanupStack::PushL( wlanSet ); + + // Create wlan service record + CCDWlanServiceRecord* wlanRecord = + new (ELeave)CCDWlanServiceRecord( CCDWlanServiceRecord::TableIdL( *db ) ); + + CleanupStack::PushL( wlanRecord ); + + // Set ConnectionMode field in wlan service record (see wlancontainer.h) + // This works with EWlanOperatingModeAdhoc, fails with EWlanConnectionModeAdhoc + wlanRecord->iWlanConnMode.SetL( EWlanOperatingModeAdhoc ); + + // Append wlan service record to wlan service record set (currently empty) + wlanSet->iRecords.AppendL( wlanRecord ); + CleanupStack::Pop( wlanRecord ); // ownership moved to RPointerArray + + TInt wlanRecordCount( 0 ); + + // Find matcing wlan service records + if( wlanSet->FindL( *db ) ) + { + wlanRecordCount = wlanSet->iRecords.Count(); + + for ( TInt i = 0; i < wlanRecordCount; i++ ) + { + // Load the current record again to be sure all fields are up to date + wlanRecord->SetElementId( wlanSet->iRecords[i]->ElementId() ); + + // Load will only look at ElementId and updates the rest of the fields + wlanRecord->LoadL( *db ); + + if ( wlanRecord->iWLanSSID.IsNull() ) + { + // Count active Easy WLAN using adhoc out + wlanRecordCount--; + break; + } + } + + CLOG_WRITEF( _L("wlanSet record count = %d"), wlanRecordCount ); + } + else + { + CLOG_WRITEF( _L("no matcing wlan records found." )); + } + + CleanupStack::PopAndDestroy( wlanSet ); + CleanupStack::PopAndDestroy( db ); + + CLOG_LEAVEFN( "CActiveSelectExplicit::CountAdhocWlanIapsL" ); + + return ( wlanRecordCount ); + } + +// End of File