wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_virtual_traffic_stream_list.cpp
changeset 0 c40eb8fe8501
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_virtual_traffic_stream_list.cpp	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,314 @@
+/*
+* Copyright (c) 2006-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:  Class for storing virtual traffic streams.
+*
+*/
+
+/*
+* %version: 1 %
+*/
+
+#include "core_virtual_traffic_stream_list.h"
+#include "core_tools.h"
+#include "core_am_tools.h"
+#include "am_debug.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+core_virtual_traffic_stream_list_c::core_virtual_traffic_stream_list_c() :
+    ts_list_m( ),
+    next_stream_id_m( 0 )
+    {
+    DEBUG( "core_virtual_traffic_stream_list_c::core_virtual_traffic_stream_list_c()" );
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+core_virtual_traffic_stream_list_c::~core_virtual_traffic_stream_list_c()
+    {
+    DEBUG( "core_virtual_traffic_stream_list_c::~core_virtual_traffic_stream_list_c()" );
+
+    for( entry_s* iter = ts_list_m.first(); iter; iter = ts_list_m.next() )
+        {
+        delete iter->traffic_stream;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+u32_t core_virtual_traffic_stream_list_c::count() const
+    {
+    return ts_list_m.count();
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+core_error_e core_virtual_traffic_stream_list_c::add_traffic_stream(
+    const core_virtual_traffic_stream_c& stream )
+    {
+    entry_s* entry = new entry_s;
+    if( entry )
+        {        
+        entry->traffic_stream = new core_virtual_traffic_stream_c(
+            stream.requested_tid(),
+            stream.tid(),
+            stream.user_priority(),
+            stream.is_automatic_stream(),
+            stream.params(),
+            stream.id(),
+            stream.status() );
+        if( entry->traffic_stream )
+            {
+            ts_list_m.append( entry );
+            }
+        else
+            {
+            DEBUG( "core_virtual_traffic_stream_list_c::add_traffic_stream() - unable to create core_virtual_traffic_stream_c" );
+
+            delete entry;
+            entry = NULL;
+
+            return core_error_no_memory;
+            }
+        }
+    else
+        {
+        DEBUG( "core_virtual_traffic_stream_list_c::update_traffic_stream() - unable to create entry_s" );
+
+        return core_error_no_memory;
+        }
+
+    return core_error_ok;         
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+core_error_e core_virtual_traffic_stream_list_c::add_traffic_stream(
+    u8_t requested_tid,
+    u8_t tid,
+    u8_t user_priority,
+    bool_t is_automatic_stream,
+    const core_traffic_stream_params_s& params,
+    u32_t& stream_id,
+    core_traffic_stream_status_e stream_status )
+    {
+    entry_s* entry = new entry_s;
+    if( entry )
+        {
+        stream_id = next_stream_id_m++;
+        entry->traffic_stream = new core_virtual_traffic_stream_c(
+            requested_tid,
+            tid,
+            user_priority,
+            is_automatic_stream,
+            params,
+            stream_id,
+            stream_status );
+        if( entry->traffic_stream )
+            {
+            ts_list_m.append( entry );
+            }
+        else
+            {
+            DEBUG( "core_virtual_traffic_stream_list_c::add_traffic_stream() - unable to create core_virtual_traffic_stream_c" );
+
+            delete entry;
+            entry = NULL;
+
+            return core_error_no_memory;
+            }
+        }
+    else
+        {
+        DEBUG( "core_virtual_traffic_stream_list_c::update_traffic_stream() - unable to create entry_s" );
+
+        return core_error_no_memory;
+        }
+
+    return core_error_ok;         
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid(
+    u8_t tid )
+    {
+    DEBUG1( "core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid() - removing an entry with TID %u",
+        tid );
+
+    core_type_list_iterator_c<entry_s> ts_iter( ts_list_m );
+    for( entry_s* iter = ts_iter.first(); iter; iter = ts_iter.next() )
+        {
+        if( iter->traffic_stream->tid() == tid )
+            {
+            DEBUG( "core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid() - matching entry found" );
+
+            ts_iter.remove();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void core_virtual_traffic_stream_list_c::remove_traffic_stream_by_id(
+    u32_t stream_id )
+    {
+    DEBUG1( "core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid() - removing an entry with stream ID %u",
+        stream_id );
+
+    core_type_list_iterator_c<entry_s> ts_iter( ts_list_m );
+    for( entry_s* iter = ts_iter.first(); iter; iter = ts_iter.next() )
+        {
+        if( iter->traffic_stream->id() == stream_id )
+            {
+            DEBUG( "core_virtual_traffic_stream_list_c::remove_traffic_stream_by_tid() - matching entry found" );
+
+            ts_iter.remove();
+            }
+        }   
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+core_access_class_traffic_mode_e core_virtual_traffic_stream_list_c::traffic_mode_by_ac(
+    core_access_class_e access_class )
+    {
+    core_type_list_iterator_c<entry_s> ts_iter( ts_list_m );
+    for( entry_s* iter = ts_iter.first(); iter; iter = ts_iter.next() )
+        {
+        if( iter->traffic_stream->access_class() == access_class &&
+            !iter->traffic_stream->is_automatic_stream() )
+            {
+            return core_access_class_traffic_mode_manual;
+            }
+        }   
+
+    return core_access_class_traffic_mode_automatic;
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void core_virtual_traffic_stream_list_c::print_contents()
+    {
+    core_type_list_iterator_c<entry_s> ts_iter( ts_list_m );
+    for( entry_s* iter = ts_iter.first(); iter; iter = ts_iter.next() )
+        {
+        DEBUG1( "core_virtual_traffic_stream_list_c::print_contents() - stream ID: %u",
+            iter->traffic_stream->id() );
+        DEBUG1( "core_virtual_traffic_stream_list_c::print_contents() - requested TID: %u",
+            iter->traffic_stream->requested_tid() );
+        DEBUG1( "core_virtual_traffic_stream_list_c::print_contents() - current TID: %u",
+            iter->traffic_stream->tid() );
+        DEBUG1( "core_virtual_traffic_stream_list_c::print_contents() - UP: %u",
+            iter->traffic_stream->user_priority() );
+        if( iter->traffic_stream->is_automatic_stream() )
+            {
+            DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - automatic: yes" );
+            }
+        else
+            {
+            DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - automatic: no" );
+            }
+        switch( iter->traffic_stream->params().direction )
+            {
+            case core_traffic_stream_direction_uplink:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - direction: uplink" );
+                break;
+            case core_traffic_stream_direction_downlink:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - direction: downlink" );
+                break;
+            case core_traffic_stream_direction_bidirectional:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - direction: bi-directional" );
+                break;
+            }
+        switch ( iter->traffic_stream->status() )
+            {
+            case core_traffic_stream_status_undefined:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_undefined" );
+                break;            
+            case core_traffic_stream_status_active:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_active" );
+                break;
+            case core_traffic_stream_status_inactive_not_required:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_not_required" );
+                break;
+            case core_traffic_stream_status_inactive_deleted_by_ap:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_deleted_by_ap" );
+                break;
+            case core_traffic_stream_status_inactive_no_bandwidth:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_no_bandwidth" );
+                break;
+            case core_traffic_stream_status_inactive_invalid_parameters:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_invalid_parameters" );
+                break;
+            case core_traffic_stream_status_inactive_other:
+                DEBUG( "core_virtual_traffic_stream_list_c::print_contents() - status: core_traffic_stream_status_inactive_other" );
+                break;
+            }
+        DEBUG( "core_virtual_traffic_stream_list_c::print_contents()" );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+u8_t core_virtual_traffic_stream_list_c::next_tid()
+    {
+    bool_t tid_array[MAX_TRAFFIC_STREAM_TID] =
+        { false_t, false_t, false_t, false_t, false_t,false_t,false_t,false_t };
+    for( entry_s* iter = ts_list_m.first(); iter; iter = ts_list_m.next() )
+        {
+        if( iter->traffic_stream->requested_tid() != TRAFFIC_STREAM_TID_NONE )
+            {
+            /**
+             * Both active and inactive streams that were requested
+             * with a certain TID.
+             */            
+            tid_array[iter->traffic_stream->requested_tid()] = true_t;            
+            }
+        else if( iter->traffic_stream->tid() != TRAFFIC_STREAM_TID_NONE ) 
+            {
+            /**
+             * Active streams.
+             */
+            tid_array[iter->traffic_stream->tid()] = true_t;            
+            }
+        }
+    u8_t tid( 0 );
+    while( tid < MAX_TRAFFIC_STREAM_TID )
+        {
+        if( !tid_array[tid] )
+            {
+            return tid;
+            }
+        else
+            {
+            ++tid;
+            }
+        }
+
+    return MAX_TRAFFIC_STREAM_TID;
+    }