/*

Copyright (c) 1997-1999  Microsoft Corporation

Module Name:
    sdpbw.cpp

Abstract:


Author:

*/
#include "sdppch.h"

#include "sdpbw.h"
#include "sdpltran.h"


// line transition states
enum BANDWIDTH_TRANSITION_STATES
{
    BANDWIDTH_START,
    BANDWIDTH_TYPE,
    BANDWIDTH_VALUE
};


// table for bandwidth line transitions

const LINE_TRANSITION g_BandwidthStartTransitions[] =   {   
    {CHAR_COLON,    BANDWIDTH_TYPE}  
};

const LINE_TRANSITION g_BandwidthTypeTransitions[]  =   {   
    {CHAR_NEWLINE,  BANDWIDTH_VALUE} 
};


/* no transitions */
const LINE_TRANSITION *g_BandwidthValueTransitions  =   NULL;  


LINE_TRANSITION_INFO g_BandwidthTransitionInfo[] = {
    LINE_TRANSITION_ENTRY(BANDWIDTH_START,  g_BandwidthStartTransitions),

    LINE_TRANSITION_ENTRY(BANDWIDTH_TYPE,   g_BandwidthTypeTransitions),

    LINE_TRANSITION_ENTRY(BANDWIDTH_VALUE,  g_BandwidthValueTransitions)
};



SDP_LINE_TRANSITION g_BandwidthTransition(
                        g_BandwidthTransitionInfo, 
                        sizeof(g_BandwidthTransitionInfo)/sizeof(LINE_TRANSITION_INFO)
                        );



SDP_BANDWIDTH::SDP_BANDWIDTH(
    )
    : SDP_VALUE(SDP_INVALID_BANDWIDTH_FIELD, BANDWIDTH_STRING, &g_BandwidthTransition)
{
}


void    
SDP_BANDWIDTH::InternalReset(
	)
{
	m_Modifier.Reset();
	m_Bandwidth.Reset();
}


HRESULT 
SDP_BANDWIDTH::SetBandwidth(
    IN          BSTR    Modifier,
    IN          ULONG   Value
    )
{
    // set the modifier field
    BAIL_ON_FAILURE(m_Modifier.SetBstr(Modifier));

    // set the modifier field
    m_Bandwidth.SetValueAndFlag(Value);

    // if the field/separator char arrays are empty, fill them
    if ( 2 != m_FieldArray.GetSize() )
    {
        ASSERT(0 == m_FieldArray.GetSize());
        ASSERT(0 == m_SeparatorCharArray.GetSize());

        try
        {
            m_FieldArray.SetAtGrow(0, &m_Modifier);
            m_SeparatorCharArray.SetAtGrow(0, CHAR_COLON);

            m_FieldArray.SetAtGrow(1, &m_Bandwidth);
            m_SeparatorCharArray.SetAtGrow(1, CHAR_NEWLINE);
        }
        catch(...)
        {
            m_FieldArray.RemoveAll();
            m_SeparatorCharArray.RemoveAll();

            return E_OUTOFMEMORY;
        }
    }

    return S_OK;
}




BOOL
SDP_BANDWIDTH::GetField(
        OUT SDP_FIELD   *&Field,
        OUT BOOL        &AddToArray
    )
{
    // add in all cases by default
    AddToArray = TRUE;

    switch(m_LineState)
    {
    case BANDWIDTH_TYPE:
        {
            Field = &m_Modifier;
        }

        break;

    case BANDWIDTH_VALUE:
        {
            Field = &m_Bandwidth;
        }

        break;

    default:
        {
            SetLastError(m_ErrorCode);
            return FALSE;
        }

        break;
    };

    return TRUE;
}