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 <f32file.h>
+#include <s32file.h>
+#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;
+ }