internetradio2.0/irnetworkcontroller/src/irfilteredapreader.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 18 Aug 2010 09:40:26 +0300
changeset 14 896e9dbc5f19
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
* 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;
    }