diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanssidlistdb.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanssidlistdb.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,295 @@ +/* +* 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 the License "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 implementing a file-based storage for SSID lists. +* +*/ + + +#include +#include +#include "wlanssidlistdb.h" + +/** + * Path to SSID list database on disk. + */ +_LIT( KWlanSSidListDbFile, "c:\\private\\101f8ec5\\ssidlist.db" ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanSsidListDb::CWlanSsidListDb() + { + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanSsidListDb::ConstructL() + { + /** + * Open a session to the file server. + */ + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + /** + * Make sure the private directory exists. + */ + fs.MkDirAll( KWlanSSidListDbFile ); + + /** + * Create a permanent file store for SSID lists. + */ + CFileStore* store = CPermanentFileStore::ReplaceLC( + fs, + KWlanSSidListDbFile, + EFileWrite ); + store->SetTypeL(KPermanentFileStoreLayoutUid); + + /** + * Create the root stream. It's not really used for anything + * since the file store is reset at every boot. + */ + RStoreWriteStream stream; + TStreamId streamId = stream.CreateLC( *store ); + stream.CommitL(); + store->SetRootL( streamId ); + store->CommitL(); + + CleanupStack::PopAndDestroy(); // stream + CleanupStack::PopAndDestroy(); // file store + CleanupStack::PopAndDestroy( &fs ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanSsidListDb* CWlanSsidListDb::NewL() + { + CWlanSsidListDb* self = new (ELeave)CWlanSsidListDb(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CWlanSsidListDb::~CWlanSsidListDb() + { + iSsidListMap.Close(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanSsidListDb::WriteListL( + TUint aIap, + const CWlanSsidList& aSsidList ) + { + TWlanSsidListMapEntry listEntry( aIap ); + + /** + * Locate the mapping entry. + */ + TInt entryIdx( -1 ); + for( TInt idx( 0 ); entryIdx < 0 && idx < iSsidListMap.Count(); ++idx ) + { + if( iSsidListMap[idx].iIap == aIap ) + { + entryIdx = idx; + } + } + + /** + * Handle an empty SSID list. + */ + if( !aSsidList.Count() ) + { + if( entryIdx >= 0 ) + { + DeleteListL( aIap ); + } + + return; + } + + /** + * Open a session to the file server. + */ + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + /** + * Open the file store for writing. + */ + CFileStore* store = CPermanentFileStore::OpenLC( + fs, + KWlanSSidListDbFile, + EFileWrite ); + + /** + * Create a stream for writing the SSID list data. + */ + RStoreWriteStream stream; + if( entryIdx < 0 ) + { + listEntry.iStreamId = stream.CreateLC( *store ); + } + else + { + stream.ReplaceLC( *store, iSsidListMap[entryIdx].iStreamId ); + } + aSsidList.ExternalizeL( stream ); + stream.CommitL(); + store->CommitL(); + + if( entryIdx < 0 ) + { + /** + * Store the mapping into the internal list if a new entry. + */ + iSsidListMap.Append( listEntry ); + } + + CleanupStack::PopAndDestroy(); // stream + CleanupStack::PopAndDestroy(); // file store + CleanupStack::PopAndDestroy( &fs ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanSsidListDb::ReadListL( + TUint aIap, + CWlanSsidList& aSsidList ) + { + /** + * Locate the mapping entry. + */ + TInt entryIdx( -1 ); + for( TInt idx( 0 ); entryIdx < 0 && idx < iSsidListMap.Count(); ++idx ) + { + if( iSsidListMap[idx].iIap == aIap ) + { + entryIdx = idx; + } + } + if( entryIdx < 0 ) + { + User::Leave( KErrNotFound ); + } + + /** + * Open a session to the file server. + */ + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + /** + * Open the file store for reading. + */ + CFileStore* store = CPermanentFileStore::OpenLC( + fs, + KWlanSSidListDbFile, + EFileRead ); + + /** + * Create a stream for writing the SSID list data. + */ + RStoreReadStream stream; + stream.OpenLC( + *store, + iSsidListMap[entryIdx].iStreamId ); + aSsidList.InternalizeL( stream ); + + CleanupStack::PopAndDestroy(); // stream + CleanupStack::PopAndDestroy(); // file store + CleanupStack::PopAndDestroy( &fs ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CWlanSsidListDb::DeleteListL( + TUint aIap ) + { + /** + * Locate the mapping entry. + */ + TInt entryIdx( -1 ); + for( TInt idx( 0 ); entryIdx < 0 && idx < iSsidListMap.Count(); ++idx ) + { + if( iSsidListMap[idx].iIap == aIap ) + { + entryIdx = idx; + } + } + if( entryIdx < 0 ) + { + User::Leave( KErrNotFound ); + } + + /** + * Open a session to the file server. + */ + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + /** + * Open the file store for writing. + */ + CFileStore* store = CPermanentFileStore::OpenLC( + fs, + KWlanSSidListDbFile, + EFileWrite ); + + /** + * Delete the stream. + */ + store->DeleteL( iSsidListMap[entryIdx].iStreamId ); + store->CommitL(); + + CleanupStack::PopAndDestroy(); // file store + CleanupStack::PopAndDestroy( &fs ); + + /** + * Remove the mapping entry from the internal list. + */ + iSsidListMap.Remove( entryIdx ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +TBool CWlanSsidListDb::IsListAttached( + TUint aIap ) + { + for( TInt idx( 0 ); idx < iSsidListMap.Count(); ++idx ) + { + if( iSsidListMap[idx].iIap == aIap ) + { + return ETrue; + } + } + + return EFalse; + }