#include "SIPParserInclude\CSIPEncodingParser.h"
namespace SIPParserFW
{
CSIPEncodingParser::CSIPEncodingParser()
: m_pSIPEncodingParameters( NULL )
{
ReleaseCSIPEncodingParserData() ;
}
CSIPEncodingParser::CSIPEncodingParser( const CSIPEncodingParser &SIPEncodingParser )
: ASIPParser( SIPEncodingParser ), m_pSIPEncodingParameters( NULL )
{
ReleaseCSIPEncodingParserData() ;
CopyCSIPEncodingParserData( SIPEncodingParser ) ;
}
CSIPEncodingParser::~CSIPEncodingParser()
{
ReleaseCSIPEncodingParserData() ;
}
CSIPEncodingParser& CSIPEncodingParser::operator=( const CSIPEncodingParser &SIPEncodingParser )
{
ReleaseCSIPEncodingParserData() ;
ASIPParser::operator=( SIPEncodingParser ) ;
CopyCSIPEncodingParserData( SIPEncodingParser ) ;
return *this ;
}
void CSIPEncodingParser::ReleaseCSIPEncodingParserData()
{
m_strCoding.erase() ;
if( m_pSIPEncodingParameters != NULL )
{
m_pSIPEncodingParameters->Release() ;
m_pSIPEncodingParameters = NULL ;
}
}
void CSIPEncodingParser::CopyCSIPEncodingParserData( const CSIPEncodingParser &SIPEncodingParser )
{
m_strCoding = SIPEncodingParser.m_strCoding ;
m_pSIPEncodingParameters = ( ( SIPEncodingParser.m_pSIPEncodingParameters != NULL )
? dynamic_cast< CSIPParamListParser* >
( SIPEncodingParser.m_pSIPEncodingParameters->Copy() ) : NULL ) ;
}
CSIPEncodingParser* CSIPEncodingParser::GetAvailable()
{
CSIPEncodingParser *pSIPEncodingParser = CPoolObject<CSIPEncodingParser>::GetAvailable() ;
return pSIPEncodingParser ;
}
void CSIPEncodingParser::Release()
{
ReleaseParameters() ;
CPoolObject<CSIPEncodingParser>::Release( this ) ;
}
void CSIPEncodingParser::ReleaseParameters()
{
ReleaseCSIPEncodingParserData() ;
ASIPParser::ReleaseParameters() ;
}
ASIPParser* CSIPEncodingParser::Copy()
{
CSIPEncodingParser *pSIPEncodingParser = CSIPEncodingParser::GetAvailable() ;
if( pSIPEncodingParser == NULL )
return NULL ;
*pSIPEncodingParser = *this ;
return pSIPEncodingParser ;
}
// Grammer
//encoding = codings *(SEMI accept-param)
//codings = content-coding / "*"
//content-coding = token
//accept-param = ("q" EQUAL qvalue) / generic-param
//qvalue = ( "0" [ "." 0*3DIGIT ] ) / ( "1" [ "." 0*3("0") ] )
//generic-param = token [ EQUAL gen-value ]
//gen-value = token / host / quoted-string
// Please see RFC3261, Pages from 163 to 164
// Please see RFC3261, Pages from 219 to 232 for ABNF forms
// Please see file ..\Document\SIPEncoding Parsing Logic.txt for parsing algorithm
FW_RETURN_TYPE CSIPEncodingParser::Parse( const std::string &strStringToParse )
{
if( strStringToParse.empty() )
return SIP_PARSE_ERR_EMPTY_STRING_TO_PARSE ;
std::string::size_type iEncodingParamsPosition = strStringToParse.find( ";" ) ;
FW_RETURN_TYPE FWRetValue = SIP_ERR_SUCCESS ;
if( iEncodingParamsPosition == std::string::npos )
{
m_strCoding = strStringToParse ;
}
else
{
m_strCoding = strStringToParse.substr( 0, iEncodingParamsPosition ) ;
std::string strEncodingParameters = "" ;
strEncodingParameters = strStringToParse.substr( iEncodingParamsPosition + 1 ) ;
CSIPParamListParser *pSIPEncodingParameters = NULL ;
if( ( FWRetValue = QuerySIPEncodingParameters( &pSIPEncodingParameters ) ) != SIP_ERR_SUCCESS )
return FWRetValue ;
FWRetValue = pSIPEncodingParameters->Parse( strEncodingParameters, ";", "=" ) ;
}
return FWRetValue ;
}
FW_RETURN_TYPE CSIPEncodingParser::QuerySIPEncodingParameters( CSIPParamListParser **pSIPEncodingParameters )
{
*pSIPEncodingParameters = NULL ;
if( m_pSIPEncodingParameters == NULL )
{
m_pSIPEncodingParameters = CSIPParamListParser::GetAvailable() ;
if( m_pSIPEncodingParameters == NULL )
return SIP_PARSE_ERR_SIP_PARAM_LIST_PARSER_OBJECT_NOT_CREATED ;
}
*pSIPEncodingParameters = m_pSIPEncodingParameters ;
return SIP_ERR_SUCCESS ;
}
std::string CSIPEncodingParser::ToString() const
{
std::string strSIPEncodingString = "" ;
if( !m_strCoding.empty() )
strSIPEncodingString = m_strCoding ;
if( m_pSIPEncodingParameters != NULL )
{
if( m_pSIPEncodingParameters->GetParamListSize() > 0 )
strSIPEncodingString = strSIPEncodingString + ";" + m_pSIPEncodingParameters->ToString() ;
}
return strSIPEncodingString ;
}
} // End namespace