diff -r 63be7eb3fc78 -r f28ada11abbf wlanutilities/wlansniffer/wlaninfosorting/src/wsfwlaninfosortingblacklist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanutilities/wlansniffer/wlaninfosorting/src/wsfwlaninfosortingblacklist.cpp Wed Sep 01 12:20:32 2010 +0100 @@ -0,0 +1,451 @@ +/* +* Copyright (c) 2007-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: Implementation of CWsfWlanInfoSortingBlackList +* +*/ + + + +// EXTERNAL INCLUDES +#include +#include +#include +#include + +// CLASS HEADER +#include "wsfwlaninfosortingblacklist.h" + +// INTERNAL INCLUDES +#include +#include "wsfwlaninfoarray.h" +#include "wsfwlanssidselectiondlg2.h" +#include "wsflogger.h" + + +/** +* SSID array granularity +*/ +static const TInt KIntSsidArrayGranularity = 3; + +/** +* SSID blacklist table name in DB +*/ +_LIT( KBlackListTableName,"WIZARD_BLACKLIST"); + +/** +* SSID column name in blacklist table +*/ +_LIT( KBlackListTableIdColumnName,"WIZARD_BLACKLIST_SSID"); + + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::NewLC +// ---------------------------------------------------------------------------- +// +CWsfWlanInfoSortingBlackList* CWsfWlanInfoSortingBlackList::NewLC( + RDbNamedDatabase& aDatabase ) + { + CWsfWlanInfoSortingBlackList* thisPtr = + new (ELeave) CWsfWlanInfoSortingBlackList( aDatabase ); + CleanupStack::PushL( thisPtr ); + thisPtr->ConstructL(); + return thisPtr; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::NewL +// ---------------------------------------------------------------------------- +// +CWsfWlanInfoSortingBlackList* CWsfWlanInfoSortingBlackList::NewL( + RDbNamedDatabase& aDatabase ) + { + CWsfWlanInfoSortingBlackList* thisPtr = NewLC( aDatabase ); + CleanupStack::Pop( thisPtr ); + return thisPtr; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::CWsfWlanInfoSortingBlackList +// ---------------------------------------------------------------------------- +// +CWsfWlanInfoSortingBlackList::CWsfWlanInfoSortingBlackList( + RDbNamedDatabase& aDatabase ): + iDefsDb( &aDatabase ) + { + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::~CWsfWlanInfoSortingBlackList +// ---------------------------------------------------------------------------- +// +CWsfWlanInfoSortingBlackList::~CWsfWlanInfoSortingBlackList() + { + // free the blacklist entries... + if ( iBlackListSsids ) + { + iBlackListSsids->Reset(); + } + delete iBlackListSsids; + + iBlackListSsidTable.Close(); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::ConstructL +// ---------------------------------------------------------------------------- +// +void CWsfWlanInfoSortingBlackList::ConstructL() + { + CheckTableL(); + iBlackListSsids = new (ELeave) CDesC8ArrayFlat( KIntSsidArrayGranularity ); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::BlackListItemCount +// ---------------------------------------------------------------------------- +// +TInt CWsfWlanInfoSortingBlackList::BlackListItemCount() const + { + return iBlackListSsids->Count(); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::Compare +// ---------------------------------------------------------------------------- +// +TInt CWsfWlanInfoSortingBlackList::Compare( const TWsfWlanInfo& /*aInfoLeft*/, + const TWsfWlanInfo& /*aInfoRight*/ ) + { + return 0; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::SetupOnRuleMatch +// ---------------------------------------------------------------------------- +// +TBool CWsfWlanInfoSortingBlackList::SetupOnRuleMatch( TWsfWlanInfo& aInfoLeft ) + { + // look through the ssid array - and look for a match + TInt rulePosition( 0 ); + + if ( aInfoLeft.BlackListEntry() ) + { + return ETrue; + } + + if ( iBlackListSsids->FindIsq( aInfoLeft.iSsid, rulePosition ) == 0 ) + { + // the rule matches.... + aInfoLeft.SetBlackListEntry( ETrue ); + return ETrue; + } + + return EFalse; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::MarkMatchedFilterL +// ---------------------------------------------------------------------------- +// +void CWsfWlanInfoSortingBlackList::MarkMatchedFilterL( + TWsfWlanInfo& aFilterEntry ) + { + aFilterEntry.SetBlackListEntry( ETrue ); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::EditFilterDefsL +// ---------------------------------------------------------------------------- +// +void CWsfWlanInfoSortingBlackList::EditFilterDefsL( + CWsfWlanInfoArray& aInfoArray ) + { + LOG_ENTERFN( "CWsfWlanInfoSortingBlackList::EditFilterDefsL" ); + + // ok - lets map aInfoArray contents and iBlackListSsids and build our selves + // a list of blacklist entries and current non sorted entries... + + // first loop through the aInfoArray and ... + + // make 16 bit copy of the ssid array... + TInt arrayItemCount( iBlackListSsids->Count() + aInfoArray.Count() ); + if ( !arrayItemCount ) + { + // there's nothing to edit + // just return before showing edit dialog + return; + } + + LOG_WRITE( "there are items to show" ); + CDesCArrayFlat *arrayOfItems = + new (ELeave) CDesCArrayFlat( arrayItemCount ); + CleanupStack::PushL( arrayOfItems ); + + + // go through the ssid's in aInfoArray and append them to the array + TInt wlanArrayCount( aInfoArray.Count() ); + TWsfWlanInfo* wlanInfo( NULL ); + TWsfWlanInfo* connectedWlan( NULL ); + for ( TInt loopCounter( 0 ); loopCounter < wlanArrayCount; ++loopCounter ) + { + wlanInfo = aInfoArray.At( loopCounter ); + +// formerly (custfav or hidden -> does not appear in the list): +// if ( wlanInfo->BrandId() || wlanInfo->Hidden() ) +// instead now (connected -> does not appear in the list): + if ( wlanInfo->Connected() ) + { + connectedWlan = wlanInfo; + continue; + } + HBufC* ssid = wlanInfo->GetSsidAsUnicodeLC(); + arrayOfItems->AppendL( *ssid ); + CleanupStack::PopAndDestroy( ssid ); + } + + // simple alphabetical sort + arrayOfItems->Sort(); + + LOG_WRITE( "items added, list sorted" ); + + + // now insert the already selected items onto the top + CArrayFix *selectedItems = new (ELeave) CArrayFixFlat( + arrayItemCount ); + CleanupStack::PushL( selectedItems ); + + HBufC* connectedSsid( NULL ); + if ( connectedWlan ) + { + connectedSsid = connectedWlan->GetSsidAsUnicodeLC(); + } + + TBool connectedBlacklisted( EFalse ); + + TInt blackListLength( iBlackListSsids->Count() ); + TInt index( 0 ); + for ( TInt loopCounter( 0 ); loopCounter < blackListLength; ++loopCounter ) + { + HBufC* ssidUnicode = TWsfWlanInfo::GetSsidAsUnicodeLC( + iBlackListSsids->MdcaPoint( loopCounter ) ); + + if ( !connectedWlan || ssidUnicode->Compare( *connectedSsid ) ) + { + // only add the ssid to the list if it is not connected right now + arrayOfItems->InsertL( index, *ssidUnicode ); + // these are already selected + selectedItems->AppendL( index ); + ++index; + } + else if ( connectedWlan && !ssidUnicode->Compare( *connectedSsid ) ) + { + connectedBlacklisted = ETrue; + } + + + CleanupStack::PopAndDestroy( ssidUnicode ); + } + + if ( !arrayOfItems->Count() ) + { + // there's nothing to edit + // just return before showing edit dialog + if ( connectedWlan ) + { + CleanupStack::PopAndDestroy( connectedSsid ); + } + + CleanupStack::PopAndDestroy( selectedItems ); + CleanupStack::PopAndDestroy( arrayOfItems ); + return; + } + + LOG_WRITE( "creating the dialog" ); + CWsfWlanSsidSelectionDlg2* dlg = CWsfWlanSsidSelectionDlg2::NewL( + *arrayOfItems, *selectedItems ); + dlg->PrepareLC( R_QTN_PREFERRED_FILTER_SELECTION_DIALOG2 ); + + LOG_WRITE( "launching the dialog" ); + if ( dlg->RunLD() ) + { + LOG_WRITE( "dialog closed" ); + // go throught the list of selected items... and store them... + iBlackListSsids->Reset(); + + TInt selectedCount( selectedItems->Count() ); + + for ( TInt loopCounter( 0 ); loopCounter < selectedCount; ++loopCounter ) + { + TPtrC ssid = arrayOfItems->MdcaPoint( selectedItems->At( + loopCounter ) ); + HBufC8* ssidUtf8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( + ssid ); + CleanupStack::PushL( ssidUtf8 ); + iBlackListSsids->AppendL( *ssidUtf8 ); + CleanupStack::PopAndDestroy( ssidUtf8 ); + } + + if ( connectedBlacklisted ) + { + HBufC8* ssidUtf8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( + *connectedSsid ); + CleanupStack::PushL( ssidUtf8 ); + iBlackListSsids->AppendL( *ssidUtf8 ); + CleanupStack::PopAndDestroy( ssidUtf8 ); + } + + iBlackListSsids->Sort(); + SaveDefsL(); + } + + if ( connectedWlan ) + { + CleanupStack::PopAndDestroy( connectedSsid ); + } + + CleanupStack::PopAndDestroy( selectedItems ); + CleanupStack::PopAndDestroy( arrayOfItems ); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::ReadFilterDefsL +// ---------------------------------------------------------------------------- +// +void CWsfWlanInfoSortingBlackList::ReadFilterDefsL() + { + RestoreDefsL(); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::SaveDefsL +// ---------------------------------------------------------------------------- +// +void CWsfWlanInfoSortingBlackList::SaveDefsL() + { + LOG_ENTERFN( "CWsfWlanInfoSortingBlackList::SaveDefsL" ); + + // clear the db-table + if ( iBlackListSsidTable.FirstL() != EFalse ) + { + do + { + iBlackListSsidTable.DeleteL(); + } + while ( iBlackListSsidTable.NextL() ); + } + + // and add the iBlackListSsids contents there.... + TInt ssidCount( iBlackListSsids->Count() ); + + if ( ssidCount ) + { + // there are items + CDbColSet* colSet = iBlackListSsidTable.ColSetL(); + CleanupStack::PushL( colSet ); + TDbColNo ssidColumnNumber = colSet->ColNo( + KBlackListTableIdColumnName ); + + for ( TInt i( 0 ); i < ssidCount; ++i ) + { + iBlackListSsidTable.InsertL(); + iBlackListSsidTable.SetColL( ssidColumnNumber, + iBlackListSsids->MdcaPoint( i ) ); + iBlackListSsidTable.PutL(); + } + CleanupStack::PopAndDestroy( colSet ); + } + + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::RestoreDefsL +// ---------------------------------------------------------------------------- +// +void CWsfWlanInfoSortingBlackList::RestoreDefsL() + { + LOG_ENTERFN( "CWsfWlanInfoSortingBlackList::RestoreDefsL" ); + iBlackListSsids->Reset(); + iBlackListSsidTable.Reset(); + // go through the table and fill the ssid array... + if ( iBlackListSsidTable.FirstL() ) + { + CDbColSet* colSet = iBlackListSsidTable.ColSetL(); + CleanupStack::PushL( colSet ); + TDbColNo ssidColumnNumber = colSet->ColNo( + KBlackListTableIdColumnName ); + do + { + iBlackListSsidTable.GetL(); + iBlackListSsids->AppendL( iBlackListSsidTable.ColDes8( + ssidColumnNumber ) ); + } + while ( iBlackListSsidTable.NextL() ); + + CleanupStack::PopAndDestroy( colSet ); + // sort the array... + iBlackListSsids->Sort(); + + } + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanInfoSortingBlackList::CheckTableL +// ---------------------------------------------------------------------------- +// +void CWsfWlanInfoSortingBlackList::CheckTableL() + { + LOG_ENTERFN( "CWsfWlanInfoSortingBlackList::CheckTableL" ); + + TInt tableStatus = iBlackListSsidTable.Open( *iDefsDb, + KBlackListTableName ); + if ( tableStatus == KErrNotFound ) + { + // the table does not exist... create it + CDbColSet *ssidTableColumnSet = CDbColSet::NewLC(); + + ssidTableColumnSet->AddL( TDbCol( KBlackListTableIdColumnName, + EDbColText8 ) ); + + iDefsDb->Begin(); + User::LeaveIfError( iDefsDb->CreateTable( KBlackListTableName, + *ssidTableColumnSet ) ); + iDefsDb->Commit(); + + CleanupStack::PopAndDestroy( ssidTableColumnSet ); + } + + if ( tableStatus != KErrNone ) + { + User::LeaveIfError( iBlackListSsidTable.Open( *iDefsDb, + KBlackListTableName ) ); + } + } + + + +