wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanssidlistdb.cpp
changeset 0 c40eb8fe8501
--- /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;
+    }