upnpmediaserver/avobjects/src/upnpdlnaprotocolinfo.cpp
author Sampo Huttunen <sampo.huttunen@nokia.com>
Wed, 24 Nov 2010 09:39:46 +0200
branchIOP_Improvements
changeset 45 a6c41ca11adf
parent 38 5360b7ddc251
permissions -rw-r--r--
Updated the SIS package, there was some BC issue with the earlier version. Also updated the platform UID to S^3 version.

/** @file
* Copyright (c) 2005-2008 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:  ProtocolInfo DLNA functionality class 
*
*/


#include "upnpdlnaprotocolinfo.h"
#include "upnpdlnaprotocolinfocons.h"
#include "upnpprotocolinfolocal.h"

#include <e32base.h>
#include <e32cons.h>

using namespace UpnpDlnaProtocolInfo;


//-----------------------------------------------------------------
//  CProtocolInfoDlna::CProtocolInfoDlna()
//  Constructor of the class
//-----------------------------------------------------------------
CUpnpDlnaProtocolInfo::CUpnpDlnaProtocolInfo(): CUpnpProtocolInfo(),
                                            iDlnaCi( KErrNotFound ) 
    {    
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::~CProtocolInfoDlna()
//  Destructor of the class
//-----------------------------------------------------------------
CUpnpDlnaProtocolInfo::~CUpnpDlnaProtocolInfo()
    {    
    delete iDlnaPn; 
    delete iDlnaPs; 
    delete iOtherParams;
    delete iFlagsParam;
    delete iOpParam;
    }


//-----------------------------------------------------------------
// CProtocolInfoDlna::NewL
// Factory method for creating instance of class. aInputString must contain protocolInfo string.
//-----------------------------------------------------------------
EXPORT_C CUpnpDlnaProtocolInfo* CUpnpDlnaProtocolInfo::NewL()
    {
    CUpnpDlnaProtocolInfo* newElement = new (ELeave) CUpnpDlnaProtocolInfo();
    CleanupStack::PushL( newElement );
    CleanupStack::Pop( newElement );
    return newElement; 
    }

    
//-----------------------------------------------------------------
// CProtocolInfoDlna::NewL
// Factory method for creating instance of class. aInputString must contain protocolInfo string.
//-----------------------------------------------------------------
EXPORT_C CUpnpDlnaProtocolInfo* CUpnpDlnaProtocolInfo::NewL(const TDesC8& aInputString)
    {
    CUpnpDlnaProtocolInfo* newElement = new (ELeave) CUpnpDlnaProtocolInfo();
    CleanupStack::PushL( newElement );
    newElement->BaseConstructL( aInputString );     
    CleanupStack::Pop( newElement );
    return newElement; 
    }
    
//-----------------------------------------------------------------
//  CProtocolInfoDlna::ConstructL(TDesC8& aInputString)
//  Method for creating instance of class. aInputString must contain protocolInfo string.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::ConstructL(const TDesC8& aInputString) 
    {
    BaseConstructL(aInputString);
    
    TInt result = ParseL( aInputString );
    if ( result != KErrNone ) 
        {
        User::Leave( result );            
        }
    }


//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetOpTimeParam(TBool aValue)
//  Setter for DLNA.ORG_OP time seek parameter.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::SetOpTimeParam(TBool aValue)
    {
    SetDlnaParam( aValue, A_VAL );
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetOpRangeParam(TBool aValue)
//  Setter for DLNA.ORG_OP range seek parameter.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::SetOpRangeParam(TBool aValue)
    {
    return SetDlnaParam( aValue, B_VAL );
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetDlnaFlag(TBool aValue, TInt aFlagIndex)
//  Setter for DLNA_FLAGS
//-----------------------------------------------------------------
void  CUpnpDlnaProtocolInfo::SetDlnaFlag(TBool aValue, TUint8 aFlagIndex)
    {
    if ( aFlagIndex >= KDLNA_FLAGS_QUANTITY) return;
    TInt index = aFlagIndex / K32BIT;
    SetIntBit32((TUint32&) iDlnaFlags[ index ], aValue, aFlagIndex);
    }    
    

//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetDlnaFlag(TInt aFlagIndex)
//  Getter for DLNA_FLAGS
//-----------------------------------------------------------------
TBool CUpnpDlnaProtocolInfo::GetDlnaFlag(TInt aFlagIndex)
    {
    if ( aFlagIndex >= KDLNA_FLAGS_QUANTITY ) return EFalse;
    TUint8 index = aFlagIndex / K32BIT;
    TUint8 bit_index = aFlagIndex % K32BIT;
    TUint32 bit = 1<<bit_index;    
    if ( iDlnaFlags[ index ]  & bit )
        {
        return ETrue;
        }
    else 
        {
        return EFalse;
        }
    
    }        

//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseL(TDesC8& aInputString)
//  Parses aInputString into protocolInfo object.
//-----------------------------------------------------------------
TInt CUpnpDlnaProtocolInfo::ParseL(const TDesC8& aInputString)
    {
        TInt result = KErrNone;        
        CUpnpProtocolInfo::ParseL(aInputString);
        
        result = ParseForthParameterL();
        if ( iDlnaPn != NULL)
            {
            delete iFourthParameter; 
            iFourthParameter = NULL;
            }
        return result;        
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseForthParameterL()
//  Parses the fourth field.
//-----------------------------------------------------------------
TInt CUpnpDlnaProtocolInfo::ParseForthParameterL()
    {
    HBufC8* forth = iFourthParameter;
    if ( !forth )
        {
        return KErrArgument;
        }

    TLex8 input(*forth);
    TBool end = EFalse;
    while( (!input.Eos()) && (!end))
        {
        ParseAtomToDelimeter( input, KDlnaTokenizer);
        TPtrC8 name(input.MarkedToken());
        Skip(input,1);
        end = ParseForthParameterInternalL( name, input);
        }
    return KErrNone;
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseDlnaPsParamL(TLex8& aLexer)
//  Parses DLNA.ORG_PS params.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::ParseDlnaPsParamL(TLex8& aLexer)
    {
    ParseAtomToDelimeter(aLexer, KDlnaDelimeter);
    TPtrC8 value (aLexer.MarkedToken());
    if ( aLexer.MarkedToken().Length() == 0 ) User::Leave( KErrArgument );
    SetPsParameterL(value);
    SkipAndMark(aLexer, 1);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseDlnaPnParamL(TLex8& aLexer)
//  Parses DLNA.ORG_PN params.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::ParseDlnaPnParamL(TLex8& aLexer)
    {
    ParseAtomToDelimeter(aLexer, KDlnaDelimeter);
    TPtrC8 value (aLexer.MarkedToken());
    if ( aLexer.MarkedToken().Length() == 0 ) User::Leave( KErrArgument );
    SetPnParameterL(value);
    SkipAndMark(aLexer, 1);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseDlnaOpParamL(TLex8& aLexer)
//  Parses DLNA.ORG_OP params.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::ParseDlnaOpParamL(TLex8& aLexer)
    {
    ParseAtomToDelimeter(aLexer, KDlnaDelimeter);
    TPtrC8 value (aLexer.MarkedToken());
    if (value.Length() != 2) User::Leave( KErrArgument );
    TChar character = value[0]; 
    User::LeaveIfError(CheckBooleanValue(character));
    SetOpTimeParam(character == KDLNA_BOOLEAN_TRUE);    
    character = value[1]; 
    User::LeaveIfError(CheckBooleanValue(character));
    SetOpRangeParam(character == KDLNA_BOOLEAN_TRUE);
    //SetOpParameter
    SkipAndMark(aLexer, 1);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseDlnaCiParamL(TLex8& aLexer)
//  Parses DLNA.ORG_CI params.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::ParseDlnaCiParamL(TLex8& aLexer)
    {
    ParseAtomToDelimeter(aLexer, KDlnaDelimeter);
    TPtrC8 value (aLexer.MarkedToken());
    if (value.Length() != 1) User::Leave( KErrArgument );
    TChar character = value[0]; 
    User::LeaveIfError(CheckBooleanValue(character));    
    SetCiParameter(character == KDLNA_BOOLEAN_TRUE);
    //SetOpParameter
    SkipAndMark(aLexer, 1);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseDlnaFlagsParamL(TLex8& aLexer)
//  Parses DLNA.ORG_FLAGS params.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::ParseDlnaFlagsParamL(TLex8& aLexer)
    {
    ParseAtomToDelimeter(aLexer, KDlnaDelimeter);
    
    if ( aLexer.MarkedToken().Length() != 
        KDLNA_FLAGS_NUMBER * KMAX_INT_LENGTH_STRING) 
        User::Leave( KErrArgument );
    
    TLex8 plagLex(aLexer.MarkedToken());    
    
    for(int i = 0; i < KDLNA_FLAGS_NUMBER; i++)
        {
        plagLex.Mark();
        plagLex.Inc( KMAX_INT_LENGTH_STRING );
        TPtrC8 value (plagLex.MarkedToken());
        // check if values are from HEX range
        for (TInt j = 0; j < KMAX_INT_LENGTH_STRING;j++)
            if (!((value[j] >='0' &&  value[j] <='9') ||
                (value[j] >='a' &&  value[j] <='f') || 
                (value[j] >='A' &&  value[j] <='F')))
                User::Leave( KErrArgument );
        
        TLex8* ptr = new TLex8(value);
        CleanupStack::PushL(ptr);
        User::LeaveIfError(ptr->Val(iDlnaFlags[i], EHex)); 
        CleanupStack::PopAndDestroy(ptr);
        }
    SkipAndMark(aLexer,1);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseOtherParamsL(TLex8& aLexer)
//  Parses other params.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::ParseOtherParamsL(TLex8& /*aLexer*/)
    {
    if ( iDlnaPn != NULL )
        {
        
        //    SetOtherParamL(aLexer.RemainderFromMark());
        }
    }
    
//-----------------------------------------------------------------
//  CProtocolInfoDlna::ParseForthParameterInternalL( TDesC8& aName, TLex8& aLexer)
//  Parses the fourth param.
//-----------------------------------------------------------------
TBool CUpnpDlnaProtocolInfo::ParseForthParameterInternalL( const TDesC8& aName, TLex8& aLexer)
    {
    TBool result = EFalse;
    if ( aName.Compare(KDLNA_PN) == 0)
        {
        aLexer.Mark();
        ParseDlnaPnParamL(aLexer);
        }
    else if ( aName.Compare(KDLNA_OP) == 0 )
        {
        aLexer.Mark();
        ParseDlnaOpParamL(aLexer);
        }
    else if ( aName.Compare(KDLNA_PS) == 0 )
        {
        aLexer.Mark();
        ParseDlnaPsParamL(aLexer);
        }
    else if ( aName.Compare(KDLNA_CI) == 0 )        
        {
        aLexer.Mark();
        ParseDlnaCiParamL(aLexer);
        }
    else if ( aName.Compare(KDLNA_FLAGS) == 0 )                
        {
        aLexer.Mark();
        ParseDlnaFlagsParamL(aLexer);
        }
    else 
        {
        ParseOtherParamsL(aLexer);
        result = ETrue;
        }
    return result;
    }
        
//-----------------------------------------------------------------
//  CUpnpDlnaProtocolInfo::FourthField()
//  
//-----------------------------------------------------------------
EXPORT_C TPtrC8 CUpnpDlnaProtocolInfo::FourthField()
    {
     TRAPD( error, FourthParameterInternalL() )
     if ( error )
         { 
         return KNullDesC8();
         }    
    return iFourthParameter->Des();
    }


//-----------------------------------------------------------------
//  CUpnpDlnaProtocolInfo::FourthParameterInternalL()
//  
//-----------------------------------------------------------------    
void CUpnpDlnaProtocolInfo::FourthParameterInternalL()
    {
    TInt len = GetFourthParameterLength();
    
    HBufC8* buf = HBufC8::NewLC(len);
    TPtr8 bufPtr(buf->Des());
    GetFourthParameterInternalL(bufPtr);
    
    delete iFourthParameter;
    iFourthParameter = buf;
    
    CleanupStack::Pop(buf);        
    }
    
    
        
//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetIntBit(TInt& aParameter, TBool aValue, TInt aBitNumber)
//  Setter for DLNA_FLAGS
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::SetIntBit8(TUint8& aParameter, TBool aValue, TUint8 aBitNumber)
    {
    if ( aBitNumber >= KMAX_INT_LENGTH_STRING ) return;
    if ( ! (aValue == EFalse) )
        {
        aParameter |= (TUint8)1<<aBitNumber;
        }
    else
        {
        aParameter  &= ~((TUint8)1<<aBitNumber);
        }
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetIntBit(TInt& aParameter, TBool aValue, TInt aBitNumber)
//  Setter for DLNA_FLAGS
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::SetIntBit32(TUint32& aParameter, TBool aValue, TUint8 aBitNumber)
    {
    if ( aBitNumber >= K32BIT ) return;
    if ( ! (aValue == EFalse) )
        {
        aParameter |= (TUint32)1<<aBitNumber;
        }
    else
        {
        aParameter  &= ~((TUint32)1<<aBitNumber);
        }
    }    
    
//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetDlnaParam(TBool aValue, TInt aParamIndex)
//  Setter for a DLNA parameter.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::SetDlnaParam(TBool aValue, TUint8 aParamIndex)
    {
    SetIntBit8((TUint8&) iParams, aValue, aParamIndex);
    }    
            
//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetDlnaParam(TInt aParamIndex)
//  Getter for DLNA params.
//-----------------------------------------------------------------
TBool CUpnpDlnaProtocolInfo::GetDlnaParam(TInt aParamIndex)
    {
     return ( iParams  & ((TUint8)1<<aParamIndex));
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::IsDlnaFlagsSet()
//  This function returns ETrue if at least one dlna flag is set
//-----------------------------------------------------------------
TBool CUpnpDlnaProtocolInfo::IsDlnaFlagsSet()
    {
    for( int i = 0; i < KDLNA_FLAGS_NUMBER  ; i++)
        {
        if (iDlnaFlags[i] != 0 )
            return ETrue;     
        }
    //if not DLNA flags not set
    return EFalse;        
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetForthParameterInternalL(TPtr8& aBuffer)
//  This function produces a string containing all info taken from fourth ProtocolInfo field
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::GetFourthParameterInternalL(TDes8& aBuffer)
    {
    
    //if ( FourthField() != KNullDesC8)
    //    {
    //    aBuffer.Append( *iFourthParameter );
    //    return;
    //    }    
    
    
    if ( PnParameter() == KNullDesC8 )        
        {
        aBuffer.Append(KDlnaAllStar);
        return;
        }
    aBuffer.Append( KDLNA_PN );
    aBuffer.Append( KDlnaTokenizer ); 
    aBuffer.Append( *iDlnaPn );
    if ( GetDlnaOpRangeParam() || GetDlnaOpTimeParam() )
        {
        aBuffer.Append( KDlnaDelimeter ); 
        aBuffer.Append( KDLNA_OP );
        aBuffer.Append( KDlnaTokenizer ); 
        aBuffer.Append( GetDlnaOpTimeParam() ? KDLNA_BOOLEAN_TRUE:KDLNA_BOOLEAN_FALSE); //Time value 0,1
        aBuffer.Append( GetDlnaOpRangeParam() ? KDLNA_BOOLEAN_TRUE:KDLNA_BOOLEAN_FALSE); //Range value 0,1
        }
    if ( PsParameter() != KNullDesC8 )
        {
        aBuffer.Append( KDlnaDelimeter ); 
        aBuffer.Append( KDLNA_PS );
        aBuffer.Append( KDlnaTokenizer ); 
        aBuffer.Append( *iDlnaPs );
        }
    if ( iDlnaCi != KErrNotFound )
        {
        aBuffer.Append( KDlnaDelimeter ); 
        aBuffer.Append( KDLNA_CI );
        aBuffer.Append( KDlnaTokenizer ); 
        aBuffer.Append( iDlnaCi ? KOneChar() : KZeroChar() ); 
        }
    
    TBool saveDlnaFlags = IsDlnaFlagsSet();
    
    if ( saveDlnaFlags )
        {
        aBuffer.Append( KDlnaDelimeter ); 
        aBuffer.Append( KDLNA_FLAGS );
        aBuffer.Append( KDlnaTokenizer ); 
        SerializeDlnaFlagsL( aBuffer );
        }
    if ( GetOtherParams() != KNullDesC8) 
        {
        aBuffer.Append( KDlnaDelimeter ); 
        aBuffer.Append( *iOtherParams );
        }
    }
//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetForthParameterParameterLength
//  This function returns length of the string containing all relevant information from fourth ProtocolInfo field. 
//-----------------------------------------------------------------
TInt CUpnpDlnaProtocolInfo::GetFourthParameterLength()
    {
    
    //if ( FourthField() != KNullDesC8)
    //    {
    //    return iFourthParameter->Length();
    //    }
    
    
    if ( PnParameter() == KNullDesC8 )        
        {
        return 1; 
        }
    TInt result = 0; 
    result += KDLNA_PN.operator()().Length();
    result += 1 ; 
    result += iDlnaPn->Length();
    if ( GetDlnaOpRangeParam() || GetDlnaOpTimeParam() )
        {
        result += 1; // ; 
        result += KDLNA_OP.operator()().Length();
        result += 1; //= 
        result += 1; //Time value 0,1
        result += 1; //Range value 0,1
        }
    if ( PsParameter() != KNullDesC8 )
        {
        result += 1; // ; separator
        result += KDLNA_PS.operator()().Length();
        result += 1; // = 
        result += iDlnaPs->Length();
        }
    if ( iDlnaCi != KErrNotFound )
        {
        result += 1; //; 
        result += KDLNA_CI.operator()().Length();
        result += 1; //= 
        result += 1; // value 
        }
    
    TBool saveDlnaFlags = IsDlnaFlagsSet();
    
    if ( saveDlnaFlags )
        {
        result += 1; //; 
        result += KDLNA_FLAGS.operator()().Length();
        result += 1; // = 
        result += KDLNA_FLAGS_NUMBER * KMAX_INT_LENGTH_STRING; // Values length
        }
    if ( GetOtherParams() != KNullDesC8 ) 
        {
        result += 1; //; 
        result += iOtherParams->Length();
        }
    return result;
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SerializeDlnaFlagsL(TPtr8& aBuffer)
//  Serializes iDlnaFlags member variable into a string.
//-----------------------------------------------------------------
void CUpnpDlnaProtocolInfo::SerializeDlnaFlagsL(TDes8& aBuffer)
    {
    HBufC8* number = HBufC8::NewL(KMAX_INT_LENGTH_STRING);
    TPtr8 ptrNumber( number->Des() );
    for(int i = 0; i < KDLNA_FLAGS_NUMBER ; i++)    
        {
        ptrNumber.NumFixedWidth(iDlnaFlags[i], EHex, KMAX_INT_LENGTH_STRING);
        ptrNumber.UpperCase();
        aBuffer.Append( *number);
        }
    delete number;
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetDlnaOpTimeParam()
//  Getter for DLNA.ORG_OP time seek parameter.
//-----------------------------------------------------------------
TBool CUpnpDlnaProtocolInfo::GetDlnaOpTimeParam()
    {
    return GetDlnaParam(A_VAL);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetDlnaOpRangeParam()
//  Getter for DLNA.ORG_OP range seek parameter.
//-----------------------------------------------------------------
TBool CUpnpDlnaProtocolInfo::GetDlnaOpRangeParam()
    {
    return GetDlnaParam(B_VAL);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetOpParameterL(TPtrC8 aValue)
//  Setter for DLNA.ORG_OP parameter.
//-----------------------------------------------------------------
EXPORT_C void CUpnpDlnaProtocolInfo::SetOpParameterL(const TDesC8& aValue)
    {                   
    TPtrC8 opParamName;
    TPtrC8 opParamValue;
        
    //---- getting a proper value of DLNA.ORG_OP param --
    if ( aValue.Locate(KDlnaTokenizer) > KErrNotFound )
    {
        TLex8 lexer(aValue);    
        ParseAtomToDelimeter( lexer, KDlnaTokenizer);
        opParamName.Set( lexer.MarkedToken() );
        
        if ( opParamName != KDLNA_OP)
            {
            User::Leave(KErrBadDescriptor);    
            }
        
        Skip(lexer, 1);            
        opParamValue.Set( lexer.Remainder() );         
        }
    else
        {
        opParamValue.Set(aValue);            
        }
                
    //---- parsing DLNA.ORG_OP param value ---------------
    if ( opParamValue.Length() == 2 && 
        !CheckBooleanValue(((TChar)opParamValue[0])) && 
        !CheckBooleanValue(((TChar)opParamValue[1])) 
        )
        {                        
        TBool opTimeParam = ((TChar)opParamValue[0]).GetNumericValue();
        TBool opRangeParam = ((TChar)opParamValue[1]).GetNumericValue();
        
        SetOpTimeParam(opTimeParam);
        SetOpRangeParam(opRangeParam);        
        }
    else 
        {        
        User::Leave(KErrBadDescriptor);
        }                                                                                        
    } 
    
//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetOpParameterL(UpnpDlnaProtocolInfo::TDlnaParams param,TBool aValue)
//  Setter for DLNA.ORG_OP parameter.
//-----------------------------------------------------------------
EXPORT_C void CUpnpDlnaProtocolInfo::SetOpParameterL(UpnpDlnaProtocolInfo::TDlnaParams param,TBool aValue)
    {
    SetDlnaParam( aValue, param );
    }
    
//-----------------------------------------------------------------
//  CUpnpDlnaProtocolInfo::OpParameterL()
//  Getter for DLNA.ORG_OP parameter.
//-----------------------------------------------------------------
EXPORT_C TPtrC8 CUpnpDlnaProtocolInfo::OpParameterL()
    {
    TBool opTimeParam = GetDlnaOpTimeParam();
    TBool opRangeParam = GetDlnaOpRangeParam();
    HBufC8* opParameter = HBufC8::NewLC(2);    
    opParameter->Des().AppendNum( opTimeParam ? 1:0 );
    opParameter->Des().AppendNum( opRangeParam ? 1:0 );           
       
    CleanupStack::Pop(opParameter);
       
    delete iOpParam;
    iOpParam = opParameter;
    return iOpParam->Des();
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetOpParameterL(UpnpDlnaProtocolInfo::TDlnaParams param,TBool aValue)
//  Setter for DLNA.ORG_OP parameter.
//-----------------------------------------------------------------
EXPORT_C TBool CUpnpDlnaProtocolInfo::OpParameter(UpnpDlnaProtocolInfo::TDlnaParams param)
    {
    return GetDlnaParam( param );
    }
    
//-----------------------------------------------------------------
//  CUpnpDlnaProtocolInfo::SetFlagsParameterL(const TDesC8& flags)
//  Setter for DLNA.ORG_CI parameter.
//-----------------------------------------------------------------
EXPORT_C void CUpnpDlnaProtocolInfo::SetFlagsParameterL(const TDesC8& flags)
    {                
    TPtrC8 flagsParamName(KDLNA_FLAGS);        
    TLex8 lexer(flags);
    TInt len = flags.Length();
                
    //---- getting a proper value of DLNA.ORG_FLAGS ----
    if ( flags.Locate(KDlnaTokenizer) > KErrNotFound )
        {                    
        ParseAtomToDelimeter( lexer, KDlnaTokenizer);
        flagsParamName.Set( lexer.MarkedToken() );
            
        if ( flagsParamName != KDLNA_FLAGS )
            {
            User::Leave(KErrBadDescriptor);    
            }
            
        Skip(lexer, 1);
        TPtrC8 tmp = lexer.Remainder();
                        
        len = tmp.Length();
        lexer = tmp;
        }                                        
        
    //---- checking if DLNA.ORG_FLAGS has proper value --                
    if (len != 32)
        {
        User::Leave( KErrBadDescriptor );
        }
        
    while( !lexer.Eos() )
        {
        if ( !lexer.Get().IsHexDigit() )
            {
            User::Leave( KErrBadDescriptor );
            }
        }
        
    lexer.UnGetToMark();                                                
    ParseForthParameterInternalL( flagsParamName, lexer );                       
    }
    
//-----------------------------------------------------------------
//  CUpnpDlnaProtocolInfo::FlagsParameterL()
//  Getter for DLNA.ORG_CI parameter.
//----------------------------------------------------------------
EXPORT_C TPtrC8 CUpnpDlnaProtocolInfo::FlagsParameterL()
    {
    TInt len = KDLNA_FLAGS_NUMBER * KMAX_INT_LENGTH_STRING; // Values length
    HBufC8* flagsParameter = HBufC8::NewLC(len);
    TPtr8 ptr = flagsParameter->Des();
    SerializeDlnaFlagsL(ptr);
    CleanupStack::Pop(flagsParameter);    
    delete iFlagsParam;
    iFlagsParam = flagsParameter;            
    return iFlagsParam->Des();
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetCiParameter(TBool aValue)
//  Setter for DLNA.ORG_CI parameter.
//-----------------------------------------------------------------
EXPORT_C void CUpnpDlnaProtocolInfo::SetCiParameter(TBool aValue)
    {
    iDlnaCi = aValue;
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::CiParameter()
//  Getter for DLNA.ORG_CI parameter.
//-----------------------------------------------------------------
EXPORT_C TBool CUpnpDlnaProtocolInfo::CiParameter()
    {
    return !(iDlnaCi <= 0);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetOtherParamsL(TDesC8& aValue)
//  Setter for other parameter value.
//-----------------------------------------------------------------
EXPORT_C void CUpnpDlnaProtocolInfo::SetOtherParamL(const TDesC8& aValue)
     {
     if ( iOtherParams)
         {
         delete iOtherParams;
         iOtherParams = NULL;
         }
     iOtherParams = aValue.AllocL();
     }    

//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetOtherParams()
//  Getter for other parameter value.
//-----------------------------------------------------------------
EXPORT_C TPtrC8 CUpnpDlnaProtocolInfo::GetOtherParams()
     {
     if ( iOtherParams )
         {
         return iOtherParams->Des();
         }
     else
         {
         return KNullDesC8();
         }
     }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetDlnaFlag(TBool aValue,TInt flag)
//  Setter for a single flag.
//-----------------------------------------------------------------
EXPORT_C void CUpnpDlnaProtocolInfo::SetDlnaFlag(UpnpDlnaProtocolInfo::TDlnaFlags flag, TBool aValue)
    {
    SetDlnaFlag( aValue, flag);
    }

//-----------------------------------------------------------------
//  ProtocolInfo::DlnaFlag()
//  Getter for a single flag.
//-----------------------------------------------------------------
EXPORT_C TBool CUpnpDlnaProtocolInfo::DlnaFlag(UpnpDlnaProtocolInfo::TDlnaFlags flag)
    {
    return GetDlnaFlag(flag);
    }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetDlnaPnParameterL(TDesC8& aValue)
//  Setter for DLNA.ORG_PN.
//-----------------------------------------------------------------
EXPORT_C void CUpnpDlnaProtocolInfo::SetPnParameterL(const TDesC8& aValue)
     {
    if ( iDlnaPn )
        {
        delete iDlnaPn ; 
        iDlnaPn = NULL;
        }
    iDlnaPn = aValue.AllocL();
    }
 
//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetDlnaPnParameter()
//  Getter for DLNA.ORG_PN.
//-----------------------------------------------------------------
EXPORT_C TPtrC8 CUpnpDlnaProtocolInfo::PnParameter()
    {
     if ( iDlnaPn )
         {
         return iDlnaPn->Des();
         }
     else 
         {
         return KNullDesC8();
         }
     }

//-----------------------------------------------------------------
//  CProtocolInfoDlna::SetDlnaPsParameterL(TDesC8& aValue)
//  Setter for DLNA.ORG_PS.
//-----------------------------------------------------------------
EXPORT_C void CUpnpDlnaProtocolInfo::SetPsParameterL(const TDesC8& aValue)
    {
    if ( iDlnaPs )
        {
        delete iDlnaPs ; 
        iDlnaPs = NULL;
        }
    iDlnaPs = aValue.AllocL();    
    }
 
//-----------------------------------------------------------------
//  CProtocolInfoDlna::GetDlnaPsParameter()
//  Getter for DLNA.ORG_PS.
//-----------------------------------------------------------------
EXPORT_C TPtrC8 CUpnpDlnaProtocolInfo::PsParameter()
     {
     if ( iDlnaPs )
         {
         return iDlnaPs->Des();
         }
     else
        {
        return KNullDesC8();
        }
     }

     
//end of file