internetradio2.0/irnetworkcontroller/src/irfilteredapreader.cpp
changeset 14 896e9dbc5f19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/irnetworkcontroller/src/irfilteredapreader.cpp	Wed Aug 18 09:40:26 2010 +0300
@@ -0,0 +1,357 @@
+/*
+* Copyright (c) 2007 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:  Used to read in only access points with the desired characteristics.
+*
+*/
+
+
+#include <commdb.h>
+#include <e32cmn.h>
+
+#include "irdebug.h"
+#include "irfilteredapreader.h"
+
+_LIT( KDynIpAddress, "0.0.0.0" );
+_LIT( KEasyWLAN, "Easy WLAN" );
+
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::NewL
+// ---------------------------------------------------------------------------
+//
+CIRFilteredApReader* CIRFilteredApReader::NewL( TInt aFilterFlags )
+    {
+    IRLOG_DEBUG2( "CIRFilteredApReader::NewL - Filter flags = %d", aFilterFlags );
+    CIRFilteredApReader* self = CIRFilteredApReader::NewLC( aFilterFlags );
+    CleanupStack::Pop( self );
+    IRLOG_DEBUG( "CIRFilteredApReader::NewL - Exiting." );    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::NewLC
+// ---------------------------------------------------------------------------
+//
+CIRFilteredApReader* CIRFilteredApReader::NewLC( TInt aFilterFlags )
+    {
+    IRLOG_DEBUG2( "CIRFilteredApReader::NewLC - Filter flags = %d", aFilterFlags );
+    CIRFilteredApReader* self = new( ELeave ) CIRFilteredApReader( aFilterFlags );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    IRLOG_DEBUG( "CIRFilteredApReader::NewL - Exiting." );    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::FirstRecordL
+// ---------------------------------------------------------------------------
+//
+CCDIAPRecord* CIRFilteredApReader::FirstRecordL()
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::FirstRecordL - Entering" );    
+    CCDIAPRecord* record( NULL );
+    iWapTableIndex = 0;
+    if ( iWapTable->iRecords.Count() > 0 )
+        {
+        TBool loaded( EFalse );
+        TRAPD( err, loaded = LoadCurrentApDetailsL() ); // may leave because of access rights etc.
+        if ( err == KErrNone && loaded && FilterL() )
+            {
+            record = static_cast<CCDIAPRecord*>( CCDRecordBase::CreateCopyRecordL( *iIapRecord ) );
+            record->SetRecordId( iIapRecord->RecordId() );
+            IRLOG_INFO2( "CIRFilteredApReader::FirstRecordL - %S accepted.", &record->iRecordName.GetL() );
+            }
+        else if ( err != KErrNone || !loaded )
+            {
+            IRLOG_ERROR3( "CIRFilteredApReader::FirstRecordL - Loading AP details failed ( err=%d, loaded=%d ).",
+                          err, loaded );            
+            record = NextRecordL();
+            }
+        else
+            {
+            IRLOG_INFO2( "CIRFilteredApReader::FirstRecordL - %S filtered out.", &iIapRecord->iRecordName.GetL() );
+            record = NextRecordL();            
+            }
+        }        
+    IRLOG_DEBUG( "CIRFilteredApReader::FirstRecordL - Exiting." );    
+    return record;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::NextRecordL
+// ---------------------------------------------------------------------------
+//
+CCDIAPRecord* CIRFilteredApReader::NextRecordL()
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::NextRecordL - Entering" );    
+    CCDIAPRecord* record( NULL );
+    
+    while ( !record && MoveToNextRecord() )
+        {
+        TBool loaded( EFalse );
+        TRAPD( err, loaded = LoadCurrentApDetailsL() ); // may leave because of access rights etc.
+        if ( err == KErrNone && loaded && FilterL() )
+            {
+            record = static_cast<CCDIAPRecord*>( CCDRecordBase::CreateCopyRecordL( *iIapRecord ) );
+            record->SetRecordId( iIapRecord->RecordId() );            
+            IRLOG_INFO2( "CIRFilteredApReader::FirstRecordL - %S accepted.", &record->iRecordName.GetL() );            
+            }
+        else if ( err != KErrNone || !loaded )
+            {
+            IRLOG_ERROR3( "CIRFilteredApReader::NextRecordL - Loading AP details failed ( err=%d, loaded=%d ).",
+                          err, loaded );            
+            }
+        else
+            {
+            IRLOG_INFO2( "CIRFilteredApReader::NextRecordL - %S filtered out.", &iIapRecord->iRecordName.GetL() );
+            }
+        }
+    IRLOG_DEBUG( "CIRFilteredApReader::NextRecordL - Exiting." );    
+    return record;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::CIRFilteredApReader
+// ---------------------------------------------------------------------------
+//
+CIRFilteredApReader::CIRFilteredApReader( TInt aFilterFlags ) 
+    : iFilterFlags( aFilterFlags )  
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::CIRFilteredApReader" );                
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CIRFilteredApReader::ConstructL()
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::ConstructL - Entering" );                
+    iDbSession = CMDBSession::NewL( CMDBSession::LatestVersion() );
+    
+    iWapTable = new ( ELeave ) CMDBRecordSet<CCDWAPAccessPointRecord>( KCDTIdWAPAccessPointRecord );
+    iWapTable->LoadL( *iDbSession );
+    IRLOG_DEBUG( "CIRFilteredApReader::ConstructL - Exiting." );    
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::~CIRFilteredApReader
+// ---------------------------------------------------------------------------
+//
+CIRFilteredApReader::~CIRFilteredApReader()
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::~CIRFilteredApReader - Entering" );    
+    delete iDbSession;
+    delete iWapTable;
+    delete iWapIpBearerRecord;
+    delete iIapRecord;
+    IRLOG_DEBUG( "CIRFilteredApReader::~CIRFilteredApReader - Exiting." );    
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::CurrentRecordL
+// ---------------------------------------------------------------------------
+//
+CCDWAPAccessPointRecord* CIRFilteredApReader::CurrentRecordL() const
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::CurrentRecordL - Entering" );    
+    if ( iWapTableIndex >= iWapTable->iRecords.Count() )
+        {
+        IRLOG_FATAL( "CIRFilteredApReader::CurrentRecordL - WAP table overflow!" );
+        User::Leave( KErrCorrupt );
+        }
+    IRLOG_DEBUG( "CIRFilteredApReader::CurrentRecordL - Exiting" );    
+    return static_cast<CCDWAPAccessPointRecord*>( iWapTable->iRecords[iWapTableIndex] );
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::MoveToNextRecord
+// ---------------------------------------------------------------------------
+//
+TBool CIRFilteredApReader::MoveToNextRecord()
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::MoveToNextRecord - Entering" );    
+    TBool retMe( EFalse );
+    if ( ++iWapTableIndex < iWapTable->iRecords.Count() )
+        {
+        IRLOG_INFO2( "CIRFilteredApReader::MoveToNextRecord - Current record %d", iWapTableIndex );        
+        retMe = ETrue;
+        }
+    else
+        {
+        IRLOG_INFO( "CIRFilteredApReader::MoveToNextRecord - No more records" );        
+        }
+    IRLOG_DEBUG( "CIRFilteredApReader::MoveToNextRecord - Exiting" );    
+    return retMe;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::LoadCurrentApDetailsL
+// ---------------------------------------------------------------------------
+//
+TBool CIRFilteredApReader::LoadCurrentApDetailsL()
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::LoadCurrentApDetailsL - Entering" );    
+    delete iWapIpBearerRecord;
+    iWapIpBearerRecord = NULL;
+    
+    delete iIapRecord;
+    iIapRecord = NULL;
+    
+    // Load record from WAPIPBearer
+    iWapIpBearerRecord = static_cast<CCDWAPIPBearerRecord*>( 
+            CCDRecordBase::RecordFactoryL( KCDTIdWAPIPBearerRecord ) );
+
+    iWapIpBearerRecord->iWAPAccessPointId.SetL( CurrentRecordL()->RecordId() );
+    TBool res = iWapIpBearerRecord->FindL( *iDbSession );
+    
+    if ( res )
+        {
+        iIapRecord = static_cast<CCDIAPRecord*>(
+                 CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+        iIapRecord->SetRecordId( iWapIpBearerRecord->iWAPIAP );
+        iIapRecord->LoadL( *iDbSession );
+        }
+    IRLOG_DEBUG2( "CIRFilteredApReader::LoadCurrentApDetailsL - returning %d", res );    
+    return res;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::FilterL
+// ---------------------------------------------------------------------------
+//
+TBool CIRFilteredApReader::FilterL() const
+    {
+    IRLOG_DEBUG2( "CIRFilteredApReader::FilterL - Service type %S", &iIapRecord->iServiceType.GetL() );    
+    TBool retMe( ETrue );
+    
+    // The WAP check needs to be done only for CSD, GPRS, CDMA and LAN (  because of Easy WLAN )
+    // APs. 
+    if ( iIapRecord->iServiceType.GetL().Compare( TPtrC( KCDTypeNameDialOutISP ) ) == 0 ||
+         iIapRecord->iServiceType.GetL().Compare( TPtrC( KCDTypeNameOutgoingWCDMA ) ) == 0 ||
+//         iIapRecord->iServiceType.GetL().Compare( 
+//         TPtrC( KCDTypeNameCDMA2000PacketService ) ) == 0 ||
+         iIapRecord->iServiceType.GetL().Compare( TPtrC( KCDTypeNameLANService) ) == 0 )
+        {
+        if ( iFilterFlags & KIRFilterWAPMandatory )
+            {
+            retMe = FilterWAPMandatoryL();
+            }
+        if ( retMe && iFilterFlags & KIRFilterWAPOnly )
+            {
+            retMe = FilterWAPOnlyL();
+            }
+        if ( retMe && iFilterFlags & KIRFilterEasyWLAN )
+            {
+            retMe = FilterEasyWlanL();            
+            }
+        }
+    IRLOG_DEBUG2( "CIRFilteredApReader::FilterL - Returning %d", retMe );    
+    return retMe;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::FilterWAPMandatoryL
+// ---------------------------------------------------------------------------
+//
+TBool CIRFilteredApReader::FilterWAPMandatoryL() const
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::FilterWAPMandatoryL - Entering" );    
+    TBool retMe( EFalse );
+    
+    // First check the WAP_GATEWAY_ADDRESS of WAP_IP_BEARER table.
+    if ( iWapIpBearerRecord->iWAPGatewayAddress.IsNull() || 
+         iWapIpBearerRecord->iWAPGatewayAddress.GetL().Length() == 0 ||
+         iWapIpBearerRecord->iWAPGatewayAddress.GetL().Compare( KDynIpAddress ) == 0 )
+        {
+        retMe = ETrue;
+        }
+    IRLOG_INFO3( "CIRFilteredApReader::FilterWAPMandatoryL - Returning %d for %S", retMe, &iIapRecord->iRecordName.GetL() );
+    return retMe;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::FilterWAPOnlyL
+// ---------------------------------------------------------------------------
+//
+TBool CIRFilteredApReader::FilterWAPOnlyL() const
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::FilterWAPOnlyL - Entering" );    
+    TBool retMe( EFalse );
+
+    IRLOG_DEBUG2( "CIRFilteredApReader::FilterWAPOnlyL - Service type %S", &iIapRecord->iServiceType.GetL() );
+    if ( iIapRecord->iServiceType.GetL().Compare( TPtrC( KCDTypeNameDialOutISP ) ) == 0 )
+        {
+        CCDDialOutISPRecord* dialOutRecord = static_cast<CCDDialOutISPRecord*>( 
+                    CCDRecordBase::RecordFactoryL( KCDTIdDialOutISPRecord ) );
+        CleanupStack::PushL( dialOutRecord );
+        dialOutRecord->SetRecordId( iIapRecord->iService );
+        dialOutRecord->LoadL( *iDbSession );
+        if ( dialOutRecord->iType != EIspTypeWAPOnly )
+            {
+            retMe = ETrue;
+            }
+        CleanupStack::PopAndDestroy( dialOutRecord );
+        }
+    else if ( iIapRecord->iServiceType.GetL().Compare( TPtrC( KCDTypeNameOutgoingWCDMA ) ) == 0 )
+        {
+        CCDWCDMAPacketServiceRecord* gprsRecord = static_cast<CCDWCDMAPacketServiceRecord*>( 
+                CCDRecordBase::RecordFactoryL( KCDTIdOutgoingGprsRecord ) );
+        CleanupStack::PushL( gprsRecord );
+        gprsRecord->SetRecordId( iIapRecord->iService );
+        gprsRecord->LoadL( *iDbSession );
+        if ( gprsRecord->iGPRSAPType != EIspTypeWAPOnly )
+            {
+            retMe = ETrue;
+            }
+        CleanupStack::PopAndDestroy( gprsRecord );
+        }
+//    else if ( iIapRecord->iServiceType.GetL().Compare( 
+//    TPtrC( KCDTypeNameCDMA2000PacketService ) ) == 0 )
+//        {
+//        CCDCDMA2000PacketServiceRecord* cdmaRecord = static_cast<CCDCDMA2000PacketServiceRecord*>(
+//        CCDRecordBase::RecordFactoryL( KCDTIdCDMA2000PacketServiceRecord ) );
+//        CleanupStack::PushL( cdmaRecord );
+//        cdmaRecord->SetRecordId( iIapRecord->iService );
+//        cdmaRecord->LoadL( *iDbSession );
+//        if ( cdmaRecord->iApType != EIspTypeWAPOnly )
+//            {
+//            retMe = ETrue;
+//            }
+//        CleanupStack::PopAndDestroy( cdmaRecord );
+//        }
+    else
+        {
+        retMe = ETrue;
+        }
+    
+    IRLOG_INFO3( "CIRFilteredApReader::FilterWAPOnlyL - Returning %d for %S", retMe, &iIapRecord->iRecordName.GetL() );    
+    return retMe; 
+    }
+
+// ---------------------------------------------------------------------------
+// CIRFilteredApReader::FilterEasyWlanL
+// ---------------------------------------------------------------------------
+//
+TBool CIRFilteredApReader::FilterEasyWlanL() const
+    {
+    IRLOG_DEBUG( "CIRFilteredApReader::FilterEasyWlanL - Entering" );    
+    TBool retMe( EFalse );
+    if ( iIapRecord->iRecordName.GetL().Compare( KEasyWLAN ) != 0 )
+        {
+        retMe = ETrue;
+        }
+    IRLOG_INFO3( "CIRFilteredApReader::FilterEasyWlanL - Returning %d for %S", retMe, &iIapRecord->iRecordName.GetL() );    
+    return retMe;
+    }