wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_scan_list_iterator.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 02:03:13 +0200
changeset 0 c40eb8fe8501
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2005-2009 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:  Implementations for the scan list iterators
*
*/


#include "core_scan_list_iterator.h"
#include "core_scan_list.h"
#include "core_tools.h"
#include "core_am_tools.h"
#include "am_debug.h"

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_scan_list_iterator_by_tag_c::core_scan_list_iterator_by_tag_c(
    core_scan_list_c& scan_list,
    u8_t tag ) :
    scan_list_m( scan_list ),
    tag_m( tag )
    {
    DEBUG( "core_scan_list_iterator_by_tag_c::core_scan_list_iterator_by_tag_c" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_scan_list_iterator_by_tag_c::~core_scan_list_iterator_by_tag_c()
    {
    DEBUG( "core_scan_list_iterator_by_tag_c::~core_scan_list_iterator_by_tag_c" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_tag_c::first()
    {
    for( core_scan_list_c::core_scan_list_entry_s* iter = scan_list_m.scan_list_m.first(); iter; iter = scan_list_m.scan_list_m.next() )
        {
        if ( !( iter->tags & tag_m ) )
            {
            return iter->ap_data;
            }
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_tag_c::next()
    {
    for( core_scan_list_c::core_scan_list_entry_s* iter = scan_list_m.scan_list_m.next(); iter; iter = scan_list_m.scan_list_m.next() )
        {
        if ( !( iter->tags & tag_m ) )
            {
            return iter->ap_data;
            }
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_tag_c::current()
    {
    if ( scan_list_m.scan_list_m.current() )
        {
        return scan_list_m.scan_list_m.current()->ap_data;
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_scan_list_iterator_by_age_c::core_scan_list_iterator_by_age_c(
    core_scan_list_c& scan_list,
    u32_t maximum_age ) :
    scan_list_m( scan_list ),
    maximum_age_m( maximum_age )
    {
    DEBUG( "core_scan_list_iterator_by_age_c::core_scan_list_iterator_by_age_c" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_scan_list_iterator_by_age_c::~core_scan_list_iterator_by_age_c()
    {
    DEBUG( "core_scan_list_iterator_by_age_c::~core_scan_list_iterator_by_age_c" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_age_c::first()
    {
    for( core_scan_list_c::core_scan_list_entry_s* iter = scan_list_m.scan_list_m.first(); iter; iter = scan_list_m.scan_list_m.next() )
        {
        u64_t difference = ( core_am_tools_c::timestamp() - iter->timestamp ) / SECONDS_FROM_MICROSECONDS;
            
        if ( maximum_age_m == SCAN_LIST_AGE_ANY ||
             difference <= maximum_age_m )
            {
            return iter->ap_data;
            }
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_age_c::next()
    {
    for( core_scan_list_c::core_scan_list_entry_s* iter = scan_list_m.scan_list_m.next(); iter; iter = scan_list_m.scan_list_m.next() )
        {
        u64_t difference = ( core_am_tools_c::timestamp() - iter->timestamp ) / SECONDS_FROM_MICROSECONDS;
            
        if ( maximum_age_m == SCAN_LIST_AGE_ANY ||
             difference <= maximum_age_m )
            {
            return iter->ap_data;
            }
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_age_c::current()
    {
    if ( scan_list_m.scan_list_m.current() )
        {
        return scan_list_m.scan_list_m.current()->ap_data;
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_scan_list_iterator_by_tag_and_ssid_c::core_scan_list_iterator_by_tag_and_ssid_c(
    core_scan_list_c& scan_list,
    u8_t tag,
    const core_ssid_s& ssid ) :
    core_scan_list_iterator_by_tag_c( scan_list, tag ),
    ssid_m( ssid )
    {
    DEBUG( "core_scan_list_iterator_by_tag_and_ssid_c::core_scan_list_iterator_by_tag_and_ssid_c" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_scan_list_iterator_by_tag_and_ssid_c::~core_scan_list_iterator_by_tag_and_ssid_c()
    {
    DEBUG( "core_scan_list_iterator_by_tag_and_ssid_c::~core_scan_list_iterator_by_tag_and_ssid_c" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_tag_and_ssid_c::first()
    {
    core_ap_data_c* iter = core_scan_list_iterator_by_tag_c::first();
    while ( iter )
        {
        if ( iter->ssid() == ssid_m )
            {
            return iter;
            }
            
        iter = core_scan_list_iterator_by_tag_c::next();
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_tag_and_ssid_c::next()
    {
    core_ap_data_c* iter = core_scan_list_iterator_by_tag_c::next();
    while ( iter )
        {
        if ( iter->ssid() == ssid_m )
            {
            return iter;
            }
            
        iter = core_scan_list_iterator_by_tag_c::next();
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_scan_list_iterator_by_tag_and_ssid_and_bssid_c::core_scan_list_iterator_by_tag_and_ssid_and_bssid_c(
    core_scan_list_c& scan_list,
    u8_t tag,
    const core_ssid_s& ssid,
    const core_mac_address_s& bssid ) :
    core_scan_list_iterator_by_tag_and_ssid_c( scan_list, tag, ssid ),
    bssid_m( bssid )
    {
    DEBUG( "core_scan_list_iterator_by_tag_and_ssid_and_bssid_c::core_scan_list_iterator_by_tag_and_ssid_and_bssid_c" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_scan_list_iterator_by_tag_and_ssid_and_bssid_c::~core_scan_list_iterator_by_tag_and_ssid_and_bssid_c()
    {
    DEBUG( "core_scan_list_iterator_by_tag_and_ssid_and_bssid_c::~core_scan_list_iterator_by_tag_and_ssid_and_bssid_c" );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_tag_and_ssid_and_bssid_c::first()
    {
    core_ap_data_c* iter = core_scan_list_iterator_by_tag_and_ssid_c::first();
    while( iter )
        {
        if( bssid_m == BROADCAST_MAC_ADDR ||
            iter->bssid() == bssid_m )
            {
            return iter;
            }

        iter = core_scan_list_iterator_by_tag_and_ssid_c::next();
        }

    return NULL;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
core_ap_data_c* core_scan_list_iterator_by_tag_and_ssid_and_bssid_c::next()
    {
    core_ap_data_c* iter = core_scan_list_iterator_by_tag_and_ssid_c::next();
    while( iter )
        {
        if( bssid_m == BROADCAST_MAC_ADDR ||
            iter->bssid() == bssid_m )
            {
            return iter;
            }
            
        iter = core_scan_list_iterator_by_tag_and_ssid_c::next();
        }

    return NULL;
    }