Click here to Skip to main content
15,892,643 members
Articles / Programming Languages / Visual C++ 10.0

SIP Stack (1 of 3)

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
20 Aug 2012CPOL3 min read 30.1K   1.7K   4  
SIP Stack Implementation on the basis of RFC SIP 3261 Specification
#include "SIPParserInclude\CSIPMessageParser.h"

#include "HHCoreInclude\CHHString.h"

namespace SIPParserFW
{
	CSIPMessageParser::CSIPMessageParser()
		:	m_pSIPMethodData( NULL ), m_pSIPRequestURIParser( NULL ), m_pSIPVersionData( NULL ), 
			m_pSIPStatusCodeData( NULL ), m_pSIPReasonPhraseData( NULL ),
			m_pSIPAcceptParser( NULL ), m_pSIPAcceptEncodingParser( NULL ), m_pSIPAcceptLanguageParser( NULL ),
			m_pSIPAlertInfoParser( NULL ), m_pSIPAllowParser( NULL ), m_pSIPAuthenticationInfoParser( NULL ),
			m_pSIPAuthorizationParser( NULL ), m_pSIPCallIDParser( NULL ), m_pSIPCallInfoParser( NULL ),
			m_pSIPContactParser( NULL ), m_pSIPContentDispositionParser( NULL ), m_pSIPContentEncodingParser( NULL ),
			m_pSIPContentLanguageParser( NULL ), m_pSIPContentLengthParser( NULL ), m_pSIPContentTypeParser( NULL ),
			m_pSIPCSeqParser( NULL ), m_pSIPDateParser( NULL ), m_pSIPErrorInfoParser( NULL ), m_pSIPExpiresParser( NULL ),
			m_pSIPFromParser( NULL ), m_pSIPInReplyToParser( NULL ), m_pSIPMaxForwardsParser( NULL ), m_pSIPMimeVersionParser( NULL ),
			m_pSIPMinExpiresParser( NULL ), m_pSIPOrganizationParser( NULL ), m_pSIPPriorityParser( NULL ), m_pSIPProxyAuthenticateParser( NULL ),
			m_pSIPProxyAuthorizationParser( NULL ), m_pSIPProxyRequireParser( NULL ), m_pSIPRecordRouteParser( NULL ),
			m_pSIPReplyToParser( NULL ), m_pSIPRequireParser( NULL ), m_pSIPRetryAfterParser( NULL ), m_pSIPRouteParser( NULL ),
			m_pSIPServerParser( NULL ), m_pSIPSubjectParser( NULL ), m_pSIPSupportedParser( NULL ), m_pSIPTimestampParser( NULL ),
			m_pSIPToParser( NULL ), m_pSIPUnSupportedParser( NULL ), m_pSIPUserAgentParser( NULL ), m_pSIPViaParser( NULL ),
			m_pSIPWarningParser( NULL ), m_pSIPWWWAuthenticateParser( NULL ),
			m_pSIPMessageBodyData( NULL )
	{
		ReleaseCSIPMessageParserData() ;
	}

	CSIPMessageParser::CSIPMessageParser( const CSIPMessageParser &SIPMessageParser )
		:	m_pSIPMethodData( NULL ), m_pSIPRequestURIParser( NULL ), m_pSIPVersionData( NULL ), 
			m_pSIPStatusCodeData( NULL ), m_pSIPReasonPhraseData( NULL ),
			m_pSIPAcceptParser( NULL ), m_pSIPAcceptEncodingParser( NULL ), m_pSIPAcceptLanguageParser( NULL ),
			m_pSIPAlertInfoParser( NULL ), m_pSIPAllowParser( NULL ), m_pSIPAuthenticationInfoParser( NULL ),
			m_pSIPAuthorizationParser( NULL ), m_pSIPCallIDParser( NULL ), m_pSIPCallInfoParser( NULL ),
			m_pSIPContactParser( NULL ), m_pSIPContentDispositionParser( NULL ), m_pSIPContentEncodingParser( NULL ),
			m_pSIPContentLanguageParser( NULL ), m_pSIPContentLengthParser( NULL ), m_pSIPContentTypeParser( NULL ),
			m_pSIPCSeqParser( NULL ), m_pSIPDateParser( NULL ), m_pSIPErrorInfoParser( NULL ), m_pSIPExpiresParser( NULL ),
			m_pSIPFromParser( NULL ), m_pSIPInReplyToParser( NULL ), m_pSIPMaxForwardsParser( NULL ), m_pSIPMimeVersionParser( NULL ),
			m_pSIPMinExpiresParser( NULL ), m_pSIPOrganizationParser( NULL ), m_pSIPPriorityParser( NULL ), m_pSIPProxyAuthenticateParser( NULL ),
			m_pSIPProxyAuthorizationParser( NULL ), m_pSIPProxyRequireParser( NULL ), m_pSIPRecordRouteParser( NULL ),
			m_pSIPReplyToParser( NULL ), m_pSIPRequireParser( NULL ), m_pSIPRetryAfterParser( NULL ), m_pSIPRouteParser( NULL ),
			m_pSIPServerParser( NULL ), m_pSIPSubjectParser( NULL ), m_pSIPSupportedParser( NULL ), m_pSIPTimestampParser( NULL ),
			m_pSIPToParser( NULL ), m_pSIPUnSupportedParser( NULL ), m_pSIPUserAgentParser( NULL ), m_pSIPViaParser( NULL ),
			m_pSIPWarningParser( NULL ), m_pSIPWWWAuthenticateParser( NULL ),
			m_pSIPMessageBodyData( NULL )
	{
		ReleaseCSIPMessageParserData() ;

		CopyCSIPMessageParserData( SIPMessageParser ) ;
	}

	CSIPMessageParser::~CSIPMessageParser()
	{
		ReleaseCSIPMessageParserData() ;
	}

	CSIPMessageParser& CSIPMessageParser::operator=( const CSIPMessageParser &SIPMessageParser )
	{
		ReleaseCSIPMessageParserData() ;

		ASIPParser::operator=( SIPMessageParser ) ;

		CopyCSIPMessageParserData( SIPMessageParser ) ;

		return *this ;
	}

	void CSIPMessageParser::ReleaseCSIPMessageParserData()
	{
		if( m_pSIPMethodData != NULL )
		{
			m_pSIPMethodData->Release() ;
			m_pSIPMethodData = NULL ;
		}

		if( m_pSIPRequestURIParser != NULL )
		{
			m_pSIPRequestURIParser->Release() ;
			m_pSIPRequestURIParser = NULL ;
		}

		if( m_pSIPVersionData != NULL )
		{
			m_pSIPVersionData->Release() ;
			m_pSIPVersionData = NULL ;
		}

		if( m_pSIPStatusCodeData != NULL )
		{
			m_pSIPStatusCodeData->Release() ;
			m_pSIPStatusCodeData = NULL ;
		}

		if( m_pSIPReasonPhraseData != NULL )
		{
			m_pSIPReasonPhraseData->Release() ;
			m_pSIPReasonPhraseData = NULL ;
		}

		if( m_pSIPAcceptParser != NULL )
		{
			m_pSIPAcceptParser->Release() ;
			m_pSIPAcceptParser = NULL ;
		}

		if( m_pSIPAcceptEncodingParser != NULL )
		{
			m_pSIPAcceptEncodingParser->Release() ;
			m_pSIPAcceptEncodingParser = NULL ;
		}

		if( m_pSIPAcceptLanguageParser != NULL )
		{
			m_pSIPAcceptLanguageParser->Release() ;
			m_pSIPAcceptLanguageParser = NULL ;
		}

		if( m_pSIPAlertInfoParser != NULL )
		{
			m_pSIPAlertInfoParser->Release() ;
			m_pSIPAlertInfoParser = NULL ;
		}

		if( m_pSIPAllowParser != NULL )
		{
			m_pSIPAllowParser->Release() ;
			m_pSIPAllowParser = NULL ;
		}

		if( m_pSIPAuthenticationInfoParser != NULL )
		{
			m_pSIPAuthenticationInfoParser->Release() ;
			m_pSIPAuthenticationInfoParser = NULL ;
		}

		if( m_pSIPAuthorizationParser != NULL )
		{
			m_pSIPAuthorizationParser->Release() ;
			m_pSIPAuthorizationParser = NULL ;
		}

		if( m_pSIPCallIDParser != NULL )
		{
			m_pSIPCallIDParser->Release() ;
			m_pSIPCallIDParser = NULL ;
		}

		if( m_pSIPCallInfoParser != NULL )
		{
			m_pSIPCallInfoParser->Release() ;
			m_pSIPCallInfoParser = NULL ;
		}

		if( m_pSIPContactParser != NULL )
		{
			m_pSIPContactParser->Release() ;
			m_pSIPContactParser = NULL ;
		}

		if( m_pSIPContentDispositionParser != NULL )
		{
			m_pSIPContentDispositionParser->Release() ;
			m_pSIPContentDispositionParser = NULL ;
		}

		if( m_pSIPContentEncodingParser != NULL )
		{
			m_pSIPContentEncodingParser->Release() ;
			m_pSIPContentEncodingParser = NULL ;
		}

		if( m_pSIPContentLanguageParser != NULL )
		{
			m_pSIPContentLanguageParser->Release() ;
			m_pSIPContentLanguageParser = NULL ;
		}

		if( m_pSIPContentLengthParser != NULL )
		{
			m_pSIPContentLengthParser->Release() ;
			m_pSIPContentLengthParser = NULL ;
		}

		if( m_pSIPContentTypeParser != NULL )
		{
			m_pSIPContentTypeParser->Release() ;
			m_pSIPContentTypeParser = NULL ;
		}

		if( m_pSIPCSeqParser != NULL )
		{
			m_pSIPCSeqParser->Release() ;
			m_pSIPCSeqParser = NULL ;
		}

		if( m_pSIPDateParser != NULL )
		{
			m_pSIPDateParser->Release() ;
			m_pSIPDateParser = NULL ;
		}

		if( m_pSIPErrorInfoParser != NULL )
		{
			m_pSIPErrorInfoParser->Release() ;
			m_pSIPErrorInfoParser = NULL ;
		}

		if( m_pSIPExpiresParser != NULL )
		{
			m_pSIPExpiresParser->Release() ;
			m_pSIPExpiresParser = NULL ;
		}

		if( m_pSIPFromParser != NULL )
		{
			m_pSIPFromParser->Release() ;
			m_pSIPFromParser = NULL ;
		}

		if( m_pSIPInReplyToParser != NULL )
		{
			m_pSIPInReplyToParser->Release() ;
			m_pSIPInReplyToParser = NULL ;
		}

		if( m_pSIPMaxForwardsParser != NULL )
		{
			m_pSIPMaxForwardsParser->Release() ;
			m_pSIPMaxForwardsParser = NULL ;
		}

		if( m_pSIPMimeVersionParser != NULL )
		{
			m_pSIPMimeVersionParser->Release() ;
			m_pSIPMimeVersionParser = NULL ;
		}

		if( m_pSIPMinExpiresParser != NULL )
		{
			m_pSIPMinExpiresParser->Release() ;
			m_pSIPMinExpiresParser = NULL ;
		}

		if( m_pSIPOrganizationParser != NULL )
		{
			m_pSIPOrganizationParser->Release() ;
			m_pSIPOrganizationParser = NULL ;
		}

		if( m_pSIPPriorityParser != NULL )
		{
			m_pSIPPriorityParser->Release() ;
			m_pSIPPriorityParser = NULL ;
		}

		if( m_pSIPProxyAuthenticateParser != NULL )
		{
			m_pSIPProxyAuthenticateParser->Release() ;
			m_pSIPProxyAuthenticateParser = NULL ;
		}

		if( m_pSIPProxyAuthorizationParser != NULL )
		{
			m_pSIPProxyAuthorizationParser->Release() ;
			m_pSIPProxyAuthorizationParser = NULL ;
		}

		if( m_pSIPProxyRequireParser != NULL )
		{
			m_pSIPProxyRequireParser->Release() ;
			m_pSIPProxyRequireParser = NULL ;
		}

		if( m_pSIPRecordRouteParser != NULL )
		{
			m_pSIPRecordRouteParser->Release() ;
			m_pSIPRecordRouteParser = NULL ;
		}

		if( m_pSIPReplyToParser != NULL )
		{
			m_pSIPReplyToParser->Release() ;
			m_pSIPReplyToParser = NULL ;
		}

		if( m_pSIPRequireParser != NULL )
		{
			m_pSIPRequireParser->Release() ;
			m_pSIPRequireParser = NULL ;
		}

		if( m_pSIPRetryAfterParser != NULL )
		{
			m_pSIPRetryAfterParser->Release() ;
			m_pSIPRetryAfterParser = NULL ;
		}

		if( m_pSIPRouteParser != NULL )
		{
			m_pSIPRouteParser->Release() ;
			m_pSIPRouteParser = NULL ;
		}

		if( m_pSIPServerParser != NULL )
		{
			m_pSIPServerParser->Release() ;
			m_pSIPServerParser = NULL ;
		}

		if( m_pSIPSubjectParser != NULL )
		{
			m_pSIPSubjectParser->Release() ;
			m_pSIPSubjectParser = NULL ;
		}

		if( m_pSIPSupportedParser != NULL )
		{
			m_pSIPSupportedParser->Release() ;
			m_pSIPSupportedParser = NULL ;
		}

		if( m_pSIPTimestampParser != NULL )
		{
			m_pSIPTimestampParser->Release() ;
			m_pSIPTimestampParser = NULL ;
		}

		if( m_pSIPToParser != NULL )
		{
			m_pSIPToParser->Release() ;
			m_pSIPToParser = NULL ;
		}

		if( m_pSIPUnSupportedParser != NULL )
		{
			m_pSIPUnSupportedParser->Release() ;
			m_pSIPUnSupportedParser = NULL ;
		}

		if( m_pSIPUserAgentParser != NULL )
		{
			m_pSIPUserAgentParser->Release() ;
			m_pSIPUserAgentParser = NULL ;
		}

		if( m_pSIPViaParser != NULL )
		{
			m_pSIPViaParser->Release() ;
			m_pSIPViaParser = NULL ;
		}

		if( m_pSIPWarningParser != NULL )
		{
			m_pSIPWarningParser->Release() ;
			m_pSIPWarningParser = NULL ;
		}

		if( m_pSIPWWWAuthenticateParser != NULL )
		{
			m_pSIPWWWAuthenticateParser->Release() ;
			m_pSIPWWWAuthenticateParser = NULL ;
		}

		if( m_pSIPMessageBodyData != NULL )
		{
			m_pSIPMessageBodyData->Release() ;
			m_pSIPMessageBodyData = NULL ;
		}
	}

	void CSIPMessageParser::CopyCSIPMessageParserData( const CSIPMessageParser &SIPMessageParser )
	{
		m_pSIPMethodData = ( ( SIPMessageParser.m_pSIPMethodData != NULL ) 
					? dynamic_cast< CMessageData* > ( SIPMessageParser.m_pSIPMethodData->Copy() ) : NULL ) ;
		m_pSIPRequestURIParser = ( ( SIPMessageParser.m_pSIPRequestURIParser != NULL ) 
					? dynamic_cast< CSIPURIParser* > ( SIPMessageParser.m_pSIPRequestURIParser->Copy() ) : NULL ) ;
		m_pSIPVersionData = ( ( SIPMessageParser.m_pSIPVersionData != NULL ) 
					? dynamic_cast< CMessageData* > ( SIPMessageParser.m_pSIPVersionData->Copy() ) : NULL ) ;
		m_pSIPStatusCodeData = ( ( SIPMessageParser.m_pSIPStatusCodeData != NULL ) 
					? dynamic_cast< CMessageData* > ( SIPMessageParser.m_pSIPStatusCodeData->Copy() ) : NULL ) ;
		m_pSIPReasonPhraseData = ( ( SIPMessageParser.m_pSIPReasonPhraseData != NULL ) 
					? dynamic_cast< CMessageData* > ( SIPMessageParser.m_pSIPReasonPhraseData->Copy() ) : NULL ) ;
		
		m_pSIPAcceptParser = ( ( SIPMessageParser.m_pSIPAcceptParser != NULL ) 
					? dynamic_cast< CSIPAcceptParser* > ( SIPMessageParser.m_pSIPAcceptParser->Copy() ) : NULL ) ;
		m_pSIPAcceptEncodingParser = ( ( SIPMessageParser.m_pSIPAcceptEncodingParser != NULL ) 
					? dynamic_cast< CSIPAcceptEncodingParser* > ( SIPMessageParser.m_pSIPAcceptEncodingParser->Copy() ) : NULL ) ;
		m_pSIPAcceptLanguageParser = ( ( SIPMessageParser.m_pSIPAcceptLanguageParser != NULL ) 
					? dynamic_cast< CSIPAcceptLanguageParser* > ( SIPMessageParser.m_pSIPAcceptLanguageParser->Copy() ) : NULL ) ;
		m_pSIPAlertInfoParser = ( ( SIPMessageParser.m_pSIPAlertInfoParser != NULL ) 
					? dynamic_cast< CSIPAlertInfoParser* > ( SIPMessageParser.m_pSIPAlertInfoParser->Copy() ) : NULL ) ;
		m_pSIPAllowParser = ( ( SIPMessageParser.m_pSIPAllowParser != NULL ) 
					? dynamic_cast< CSIPAllowParser* > ( SIPMessageParser.m_pSIPAllowParser->Copy() ) : NULL ) ;


		m_pSIPAuthenticationInfoParser = ( ( SIPMessageParser.m_pSIPAuthenticationInfoParser != NULL ) 
					? dynamic_cast< CSIPAuthenticationInfoParser* > ( SIPMessageParser.m_pSIPAuthenticationInfoParser->Copy() ) : NULL ) ;
		m_pSIPAuthorizationParser = ( ( SIPMessageParser.m_pSIPAuthorizationParser != NULL ) 
					? dynamic_cast< CSIPAuthorizationParser* > ( SIPMessageParser.m_pSIPAuthorizationParser->Copy() ) : NULL ) ;
		m_pSIPCallIDParser = ( ( SIPMessageParser.m_pSIPCallIDParser != NULL ) 
					? dynamic_cast< CSIPCallIDParser* > ( SIPMessageParser.m_pSIPCallIDParser->Copy() ) : NULL ) ;
		m_pSIPCallInfoParser = ( ( SIPMessageParser.m_pSIPCallInfoParser != NULL ) 
					? dynamic_cast< CSIPCallInfoParser* > ( SIPMessageParser.m_pSIPCallInfoParser->Copy() ) : NULL ) ;
		m_pSIPContactParser = ( ( SIPMessageParser.m_pSIPContactParser != NULL ) 
					? dynamic_cast< CSIPContactParser* > ( SIPMessageParser.m_pSIPContactParser->Copy() ) : NULL ) ;


		m_pSIPContentDispositionParser = ( ( SIPMessageParser.m_pSIPContentDispositionParser != NULL ) 
					? dynamic_cast< CSIPContentDispositionParser* > ( SIPMessageParser.m_pSIPContentDispositionParser->Copy() ) : NULL ) ;
		m_pSIPContentEncodingParser = ( ( SIPMessageParser.m_pSIPContentEncodingParser != NULL ) 
					? dynamic_cast< CSIPContentEncodingParser* > ( SIPMessageParser.m_pSIPContentEncodingParser->Copy() ) : NULL ) ;
		m_pSIPContentLanguageParser = ( ( SIPMessageParser.m_pSIPContentLanguageParser != NULL ) 
					? dynamic_cast< CSIPContentLanguageParser* > ( SIPMessageParser.m_pSIPContentLanguageParser->Copy() ) : NULL ) ;
		m_pSIPContentLengthParser = ( ( SIPMessageParser.m_pSIPContentLengthParser != NULL ) 
					? dynamic_cast< CSIPContentLengthParser* > ( SIPMessageParser.m_pSIPContentLengthParser->Copy() ) : NULL ) ;
		m_pSIPContentTypeParser = ( ( SIPMessageParser.m_pSIPContentTypeParser != NULL ) 
					? dynamic_cast< CSIPContentTypeParser* > ( SIPMessageParser.m_pSIPContentTypeParser->Copy() ) : NULL ) ;

		
		m_pSIPCSeqParser = ( ( SIPMessageParser.m_pSIPCSeqParser != NULL ) 
					? dynamic_cast< CSIPCSeqParser* > ( SIPMessageParser.m_pSIPCSeqParser->Copy() ) : NULL ) ;
		m_pSIPDateParser = ( ( SIPMessageParser.m_pSIPDateParser != NULL ) 
					? dynamic_cast< CSIPDateParser* > ( SIPMessageParser.m_pSIPDateParser->Copy() ) : NULL ) ;
		m_pSIPErrorInfoParser = ( ( SIPMessageParser.m_pSIPErrorInfoParser != NULL ) 
					? dynamic_cast< CSIPErrorInfoParser* > ( SIPMessageParser.m_pSIPErrorInfoParser->Copy() ) : NULL ) ;
		m_pSIPExpiresParser = ( ( SIPMessageParser.m_pSIPExpiresParser != NULL ) 
					? dynamic_cast< CSIPExpiresParser* > ( SIPMessageParser.m_pSIPExpiresParser->Copy() ) : NULL ) ;
		m_pSIPFromParser = ( ( SIPMessageParser.m_pSIPFromParser != NULL ) 
					? dynamic_cast< CSIPFromParser* > ( SIPMessageParser.m_pSIPFromParser->Copy() ) : NULL ) ;


		m_pSIPInReplyToParser = ( ( SIPMessageParser.m_pSIPInReplyToParser != NULL ) 
					? dynamic_cast< CSIPInReplyToParser* > ( SIPMessageParser.m_pSIPInReplyToParser->Copy() ) : NULL ) ;
		m_pSIPMaxForwardsParser = ( ( SIPMessageParser.m_pSIPMaxForwardsParser != NULL ) 
					? dynamic_cast< CSIPMaxForwardsParser* > ( SIPMessageParser.m_pSIPMaxForwardsParser->Copy() ) : NULL ) ;
		m_pSIPMimeVersionParser = ( ( SIPMessageParser.m_pSIPMimeVersionParser != NULL ) 
					? dynamic_cast< CSIPMimeVersionParser* > ( SIPMessageParser.m_pSIPMimeVersionParser->Copy() ) : NULL ) ;
		m_pSIPMinExpiresParser = ( ( SIPMessageParser.m_pSIPMinExpiresParser != NULL ) 
					? dynamic_cast< CSIPMinExpiresParser* > ( SIPMessageParser.m_pSIPMinExpiresParser->Copy() ) : NULL ) ;
		m_pSIPOrganizationParser = ( ( SIPMessageParser.m_pSIPOrganizationParser != NULL ) 
					? dynamic_cast< CSIPOrganizationParser* > ( SIPMessageParser.m_pSIPOrganizationParser->Copy() ) : NULL ) ;


		m_pSIPPriorityParser = ( ( SIPMessageParser.m_pSIPPriorityParser != NULL ) 
					? dynamic_cast< CSIPPriorityParser* > ( SIPMessageParser.m_pSIPPriorityParser->Copy() ) : NULL ) ;
		m_pSIPProxyAuthenticateParser = ( ( SIPMessageParser.m_pSIPProxyAuthenticateParser != NULL ) 
					? dynamic_cast< CSIPProxyAuthenticateParser* > ( SIPMessageParser.m_pSIPProxyAuthenticateParser->Copy() ) : NULL ) ;
		m_pSIPProxyAuthorizationParser = ( ( SIPMessageParser.m_pSIPProxyAuthorizationParser != NULL ) 
					? dynamic_cast< CSIPProxyAuthorizationParser* > ( SIPMessageParser.m_pSIPProxyAuthorizationParser->Copy() ) : NULL ) ;
		m_pSIPProxyRequireParser = ( ( SIPMessageParser.m_pSIPProxyRequireParser != NULL ) 
					? dynamic_cast< CSIPProxyRequireParser* > ( SIPMessageParser.m_pSIPProxyRequireParser->Copy() ) : NULL ) ;
		m_pSIPRecordRouteParser = ( ( SIPMessageParser.m_pSIPRecordRouteParser != NULL ) 
					? dynamic_cast< CSIPRecordRouteParser* > ( SIPMessageParser.m_pSIPRecordRouteParser->Copy() ) : NULL ) ;

				
		m_pSIPReplyToParser = ( ( SIPMessageParser.m_pSIPReplyToParser != NULL ) 
					? dynamic_cast< CSIPReplyToParser* > ( SIPMessageParser.m_pSIPReplyToParser->Copy() ) : NULL ) ;
		m_pSIPRequireParser = ( ( SIPMessageParser.m_pSIPRequireParser != NULL ) 
					? dynamic_cast< CSIPRequireParser* > ( SIPMessageParser.m_pSIPRequireParser->Copy() ) : NULL ) ;
		m_pSIPRetryAfterParser = ( ( SIPMessageParser.m_pSIPRetryAfterParser != NULL ) 
					? dynamic_cast< CSIPRetryAfterParser* > ( SIPMessageParser.m_pSIPRetryAfterParser->Copy() ) : NULL ) ;
		m_pSIPRouteParser = ( ( SIPMessageParser.m_pSIPRouteParser != NULL ) 
					? dynamic_cast< CSIPRouteParser* > ( SIPMessageParser.m_pSIPRouteParser->Copy() ) : NULL ) ;
		m_pSIPServerParser = ( ( SIPMessageParser.m_pSIPServerParser != NULL ) 
					? dynamic_cast< CSIPServerParser* > ( SIPMessageParser.m_pSIPServerParser->Copy() ) : NULL ) ;

		
		m_pSIPSubjectParser = ( ( SIPMessageParser.m_pSIPSubjectParser != NULL ) 
					? dynamic_cast< CSIPSubjectParser* > ( SIPMessageParser.m_pSIPSubjectParser->Copy() ) : NULL ) ;
		m_pSIPSupportedParser = ( ( SIPMessageParser.m_pSIPSupportedParser != NULL ) 
					? dynamic_cast< CSIPSupportedParser* > ( SIPMessageParser.m_pSIPSupportedParser->Copy() ) : NULL ) ;
		m_pSIPTimestampParser = ( ( SIPMessageParser.m_pSIPTimestampParser != NULL ) 
					? dynamic_cast< CSIPTimestampParser* > ( SIPMessageParser.m_pSIPTimestampParser->Copy() ) : NULL ) ;
		m_pSIPToParser = ( ( SIPMessageParser.m_pSIPToParser != NULL ) 
					? dynamic_cast< CSIPToParser* > ( SIPMessageParser.m_pSIPToParser->Copy() ) : NULL ) ;
		m_pSIPUnSupportedParser = ( ( SIPMessageParser.m_pSIPUnSupportedParser != NULL ) 
					? dynamic_cast< CSIPUnSupportedParser* > ( SIPMessageParser.m_pSIPUnSupportedParser->Copy() ) : NULL ) ;

						
		m_pSIPUserAgentParser = ( ( SIPMessageParser.m_pSIPUserAgentParser != NULL ) 
					? dynamic_cast< CSIPUserAgentParser* > ( SIPMessageParser.m_pSIPUserAgentParser->Copy() ) : NULL ) ;
		m_pSIPViaParser = ( ( SIPMessageParser.m_pSIPViaParser != NULL ) 
					? dynamic_cast< CSIPViaParser* > ( SIPMessageParser.m_pSIPViaParser->Copy() ) : NULL ) ;
		m_pSIPWarningParser = ( ( SIPMessageParser.m_pSIPWarningParser != NULL ) 
					? dynamic_cast< CSIPWarningParser* > ( SIPMessageParser.m_pSIPWarningParser->Copy() ) : NULL ) ;
		m_pSIPWWWAuthenticateParser = ( ( SIPMessageParser.m_pSIPWWWAuthenticateParser != NULL ) 
					? dynamic_cast< CSIPWWWAuthenticateParser* > ( SIPMessageParser.m_pSIPWWWAuthenticateParser->Copy() ) : NULL ) ;

		m_pSIPMessageBodyData = ( ( SIPMessageParser.m_pSIPMessageBodyData != NULL ) 
					? dynamic_cast< CMessageData* > ( SIPMessageParser.m_pSIPMessageBodyData->Copy() ) : NULL ) ;
	}

	CSIPMessageParser* CSIPMessageParser::GetAvailable()
	{
		CSIPMessageParser *pSIPMessageParser = CPoolObject<CSIPMessageParser>::GetAvailable() ;
		return pSIPMessageParser ;
	}

	void CSIPMessageParser::Release()
	{
		ReleaseParameters() ;

		CPoolObject<CSIPMessageParser>::Release( this ) ;
	}

	void CSIPMessageParser::ReleaseParameters()
	{
		ReleaseCSIPMessageParserData() ;
		
		ASIPParser::ReleaseParameters() ;
	}

	ASIPParser* CSIPMessageParser::Copy()
	{
		CSIPMessageParser *pSIPMessageParser = CSIPMessageParser::GetAvailable() ;
		if( pSIPMessageParser == NULL )
			return NULL ;

		*pSIPMessageParser = *this ;

		return pSIPMessageParser ;
	}

	void CSIPMessageParser::SetSIPMethod( const std::string &strSIPMethod )
	{
		if( m_pSIPMethodData == NULL )
			m_pSIPMethodData = CMessageData::GetAvailable() ;

		m_pSIPMethodData->SetData( strSIPMethod.c_str(), strSIPMethod.size() ) ;
	}

	std::string CSIPMessageParser::GetSIPMethod() const
	{
		if( m_pSIPMethodData == NULL )
			return "" ;

		return ( const char* ) m_pSIPMethodData->GetData() ;
	}

	void CSIPMessageParser::SetSIPVersion( const std::string &strSIPVersion )
	{
		if( m_pSIPVersionData == NULL )
			m_pSIPVersionData = CMessageData::GetAvailable() ;

		m_pSIPVersionData->SetData( strSIPVersion.c_str(), strSIPVersion.size() ) ;
	}

	std::string CSIPMessageParser::GetSIPVersion() const
	{
		if( m_pSIPVersionData == NULL )
			return "" ;

		return ( const char* ) m_pSIPVersionData->GetData() ;
	}

	void CSIPMessageParser::SetSIPStatusCode( const std::string &strSIPStatusCode )
	{
		if( m_pSIPStatusCodeData == NULL )
			m_pSIPStatusCodeData = CMessageData::GetAvailable() ;

		m_pSIPStatusCodeData->SetData( strSIPStatusCode.c_str(), strSIPStatusCode.size() ) ;
	}

	std::string CSIPMessageParser::GetSIPStatusCode() const
	{
		if( m_pSIPStatusCodeData == NULL )
			return "" ;

		return ( const char* ) m_pSIPStatusCodeData->GetData() ;
	}

	void CSIPMessageParser::SetSIPReasonPhrase( const std::string &strSIPReasonPhrase )
	{
		if( m_pSIPReasonPhraseData == NULL )
			m_pSIPReasonPhraseData = CMessageData::GetAvailable() ;

		m_pSIPReasonPhraseData->SetData( strSIPReasonPhrase.c_str(), strSIPReasonPhrase.size() ) ;
	}

	std::string CSIPMessageParser::GetSIPReasonPhrase() const
	{
		if( m_pSIPReasonPhraseData == NULL )
			return "" ;

		return ( const char* ) m_pSIPReasonPhraseData->GetData() ;
	}

	void CSIPMessageParser::SetSIPMessageBody( const std::string &strSIPMessageBody )
	{
		if( m_pSIPMessageBodyData == NULL )
			m_pSIPMessageBodyData = CMessageData::GetAvailable() ;

		m_pSIPMessageBodyData->SetData( strSIPMessageBody.c_str(), strSIPMessageBody.size() ) ;
	}

	std::string CSIPMessageParser::GetSIPMessageBody() const
	{
		if( m_pSIPMessageBodyData == NULL )
			return "" ;

		return ( const char* ) m_pSIPMessageBodyData->GetData() ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPMethodData( CMessageData **pSIPMethodData )
	{
		*pSIPMethodData = NULL ;

		if( m_pSIPMethodData == NULL )
		{
			m_pSIPMethodData = CMessageData::GetAvailable() ;

			if( m_pSIPMethodData == NULL )
				return SIP_PARSE_ERR_SIP_METHOD_DATA_OBJECT_NOT_CREATED ;
		}

		*pSIPMethodData = m_pSIPMethodData ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPRequestURIParser( CSIPURIParser **pSIPRequestURIParser )
	{
		*pSIPRequestURIParser = NULL ;

		if( m_pSIPRequestURIParser == NULL )
		{
			m_pSIPRequestURIParser = CSIPURIParser::GetAvailable() ;

			if( m_pSIPRequestURIParser == NULL )
				return SIP_PARSE_ERR_SIP_REQUEST_URI_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPRequestURIParser = m_pSIPRequestURIParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPVersionData( CMessageData **pSIPVersionData )
	{
		*pSIPVersionData = NULL ;

		if( m_pSIPVersionData == NULL )
		{
			m_pSIPVersionData = CMessageData::GetAvailable() ;

			if( m_pSIPVersionData == NULL )
				return SIP_PARSE_ERR_SIP_VERSION_DATA_OBJECT_NOT_CREATED ;
		}

		*pSIPVersionData = m_pSIPVersionData ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPStatusCodeData( CMessageData **pSIPStatusCodeData )
	{
		*pSIPStatusCodeData = NULL ;

		if( m_pSIPStatusCodeData == NULL )
		{
			m_pSIPStatusCodeData = CMessageData::GetAvailable() ;

			if( m_pSIPStatusCodeData == NULL )
				return SIP_PARSE_ERR_SIP_STATUS_CODE_DATA_OBJECT_NOT_CREATED ;
		}

		*pSIPStatusCodeData = m_pSIPStatusCodeData ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPReasonPhraseData( CMessageData **pSIPReasonPhraseData )
	{
		*pSIPReasonPhraseData = NULL ;

		if( m_pSIPReasonPhraseData == NULL )
		{
			m_pSIPReasonPhraseData = CMessageData::GetAvailable() ;

			if( m_pSIPReasonPhraseData == NULL )
				return SIP_PARSE_ERR_SIP_REASON_PHRASE_DATA_OBJECT_NOT_CREATED ;
		}

		*pSIPReasonPhraseData = m_pSIPReasonPhraseData ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPAcceptParser( CSIPAcceptParser **pSIPAcceptParser )
	{
		*pSIPAcceptParser = NULL ;

		if( m_pSIPAcceptParser == NULL )
		{
			m_pSIPAcceptParser = CSIPAcceptParser::GetAvailable() ;

			if( m_pSIPAcceptParser == NULL )
				return SIP_PARSE_ERR_SIP_ACCEPT_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPAcceptParser = m_pSIPAcceptParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPAcceptEncodingParser( CSIPAcceptEncodingParser **pSIPAcceptEncodingParser )
	{
		*pSIPAcceptEncodingParser = NULL ;

		if( m_pSIPAcceptEncodingParser == NULL )
		{
			m_pSIPAcceptEncodingParser = CSIPAcceptEncodingParser::GetAvailable() ;

			if( m_pSIPAcceptEncodingParser == NULL )
				return SIP_PARSE_ERR_SIP_ACCEPT_ENCODING_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPAcceptEncodingParser = m_pSIPAcceptEncodingParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPAcceptLanguageParser( CSIPAcceptLanguageParser **pSIPAcceptLanguageParser )
	{
		*pSIPAcceptLanguageParser = NULL ;

		if( m_pSIPAcceptLanguageParser == NULL )
		{
			m_pSIPAcceptLanguageParser = CSIPAcceptLanguageParser::GetAvailable() ;

			if( m_pSIPAcceptLanguageParser == NULL )
				return SIP_PARSE_ERR_SIP_ACCEPT_LANGUAGE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPAcceptLanguageParser = m_pSIPAcceptLanguageParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPAlertInfoParser( CSIPAlertInfoParser **pSIPAlertInfoParser )
	{
		*pSIPAlertInfoParser = NULL ;

		if( m_pSIPAlertInfoParser == NULL )
		{
			m_pSIPAlertInfoParser = CSIPAlertInfoParser::GetAvailable() ;

			if( m_pSIPAlertInfoParser == NULL )
				return SIP_PARSE_ERR_SIP_ALERT_INFO_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPAlertInfoParser = m_pSIPAlertInfoParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPAllowParser( CSIPAllowParser **pSIPAllowParser )
	{
		*pSIPAllowParser = NULL ;

		if( m_pSIPAllowParser == NULL )
		{
			m_pSIPAllowParser = CSIPAllowParser::GetAvailable() ;

			if( m_pSIPAllowParser == NULL )
				return SIP_PARSE_ERR_SIP_ALLOW_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPAllowParser = m_pSIPAllowParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPAuthenticationInfoParser( CSIPAuthenticationInfoParser **pSIPAuthenticationInfoParser )
	{
		*pSIPAuthenticationInfoParser = NULL ;

		if( m_pSIPAuthenticationInfoParser == NULL )
		{
			m_pSIPAuthenticationInfoParser = CSIPAuthenticationInfoParser::GetAvailable() ;

			if( m_pSIPAuthenticationInfoParser == NULL )
				return SIP_PARSE_ERR_SIP_AUTHENTICATION_INFO_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPAuthenticationInfoParser = m_pSIPAuthenticationInfoParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPAuthorizationParser( CSIPAuthorizationParser **pSIPAuthorizationParser )
	{
		*pSIPAuthorizationParser = NULL ;

		if( m_pSIPAuthorizationParser == NULL )
		{
			m_pSIPAuthorizationParser = CSIPAuthorizationParser::GetAvailable() ;

			if( m_pSIPAuthorizationParser == NULL )
				return SIP_PARSE_ERR_SIP_AUTHORIZATION_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPAuthorizationParser = m_pSIPAuthorizationParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPCallIDParser( CSIPCallIDParser **pSIPCallIDParser )
	{
		*pSIPCallIDParser = NULL ;

		if( m_pSIPCallIDParser == NULL )
		{
			m_pSIPCallIDParser = CSIPCallIDParser::GetAvailable() ;

			if( m_pSIPCallIDParser == NULL )
				return SIP_PARSE_ERR_SIP_CALL_ID_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPCallIDParser = m_pSIPCallIDParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPCallInfoParser( CSIPCallInfoParser **pSIPCallInfoParser )
	{
		*pSIPCallInfoParser = NULL ;

		if( m_pSIPCallInfoParser == NULL )
		{
			m_pSIPCallInfoParser = CSIPCallInfoParser::GetAvailable() ;

			if( m_pSIPCallInfoParser == NULL )
				return SIP_PARSE_ERR_SIP_CALL_INFO_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPCallInfoParser = m_pSIPCallInfoParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPContactParser( CSIPContactParser **pSIPContactParser )
	{
		*pSIPContactParser = NULL ;

		if( m_pSIPContactParser == NULL )
		{
			m_pSIPContactParser = CSIPContactParser::GetAvailable() ;

			if( m_pSIPContactParser == NULL )
				return SIP_PARSE_ERR_SIP_CONTACT_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPContactParser = m_pSIPContactParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPContentDispositionParser( CSIPContentDispositionParser **pSIPContentDispositionParser )
	{
		*pSIPContentDispositionParser = NULL ;

		if( m_pSIPContentDispositionParser == NULL )
		{
			m_pSIPContentDispositionParser = CSIPContentDispositionParser::GetAvailable() ;

			if( m_pSIPContentDispositionParser == NULL )
				return SIP_PARSE_ERR_SIP_CONTENT_DISPOSITION_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPContentDispositionParser = m_pSIPContentDispositionParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPContentEncodingParser( CSIPContentEncodingParser **pSIPContentEncodingParser )
	{
		*pSIPContentEncodingParser = NULL ;

		if( m_pSIPContentEncodingParser == NULL )
		{
			m_pSIPContentEncodingParser = CSIPContentEncodingParser::GetAvailable() ;

			if( m_pSIPContentEncodingParser == NULL )
				return SIP_PARSE_ERR_SIP_CONTENT_ENCODING_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPContentEncodingParser = m_pSIPContentEncodingParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPContentLanguageParser( CSIPContentLanguageParser **pSIPContentLanguageParser )
	{
		*pSIPContentLanguageParser = NULL ;

		if( m_pSIPContentLanguageParser == NULL )
		{
			m_pSIPContentLanguageParser = CSIPContentLanguageParser::GetAvailable() ;

			if( m_pSIPContentLanguageParser == NULL )
				return SIP_PARSE_ERR_SIP_CONTENT_LANGUAGE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPContentLanguageParser = m_pSIPContentLanguageParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPContentLengthParser( CSIPContentLengthParser **pSIPContentLengthParser )
	{
		*pSIPContentLengthParser = NULL ;

		if( m_pSIPContentLengthParser == NULL )
		{
			m_pSIPContentLengthParser = CSIPContentLengthParser::GetAvailable() ;

			if( m_pSIPContentLengthParser == NULL )
				return SIP_PARSE_ERR_SIP_CONTENT_LENGTH_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPContentLengthParser = m_pSIPContentLengthParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPContentTypeParser( CSIPContentTypeParser **pSIPContentTypeParser )
	{
		*pSIPContentTypeParser = NULL ;

		if( m_pSIPContentTypeParser == NULL )
		{
			m_pSIPContentTypeParser = CSIPContentTypeParser::GetAvailable() ;

			if( m_pSIPContentTypeParser == NULL )
				return SIP_PARSE_ERR_SIP_CONTENT_TYPE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPContentTypeParser = m_pSIPContentTypeParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPCSeqParser( CSIPCSeqParser **pSIPCSeqParser )
	{
		*pSIPCSeqParser = NULL ;

		if( m_pSIPCSeqParser == NULL )
		{
			m_pSIPCSeqParser = CSIPCSeqParser::GetAvailable() ;

			if( m_pSIPCSeqParser == NULL )
				return SIP_PARSE_ERR_SIP_CSEQ_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPCSeqParser = m_pSIPCSeqParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPDateParser( CSIPDateParser **pSIPDateParser )
	{
		*pSIPDateParser = NULL ;

		if( m_pSIPDateParser == NULL )
		{
			m_pSIPDateParser = CSIPDateParser::GetAvailable() ;

			if( m_pSIPDateParser == NULL )
				return SIP_PARSE_ERR_SIP_DATE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPDateParser = m_pSIPDateParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPErrorInfoParser( CSIPErrorInfoParser **pSIPErrorInfoParser )
	{
		*pSIPErrorInfoParser = NULL ;

		if( m_pSIPErrorInfoParser == NULL )
		{
			m_pSIPErrorInfoParser = CSIPErrorInfoParser::GetAvailable() ;

			if( m_pSIPErrorInfoParser == NULL )
				return SIP_PARSE_ERR_SIP_ERROR_INFO_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPErrorInfoParser = m_pSIPErrorInfoParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPExpiresParser( CSIPExpiresParser **pSIPExpiresParser )
	{
		*pSIPExpiresParser = NULL ;

		if( m_pSIPExpiresParser == NULL )
		{
			m_pSIPExpiresParser = CSIPExpiresParser::GetAvailable() ;

			if( m_pSIPExpiresParser == NULL )
				return SIP_PARSE_ERR_SIP_EXPIRES_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPExpiresParser = m_pSIPExpiresParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPFromParser( CSIPFromParser **pSIPFromParser )
	{
		*pSIPFromParser = NULL ;

		if( m_pSIPFromParser == NULL )
		{
			m_pSIPFromParser = CSIPFromParser::GetAvailable() ;

			if( m_pSIPFromParser == NULL )
				return SIP_PARSE_ERR_SIP_FROM_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPFromParser = m_pSIPFromParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPInReplyToParser( CSIPInReplyToParser **pSIPInReplyToParser )
	{
		*pSIPInReplyToParser = NULL ;

		if( m_pSIPInReplyToParser == NULL )
		{
			m_pSIPInReplyToParser = CSIPInReplyToParser::GetAvailable() ;

			if( m_pSIPInReplyToParser == NULL )
				return SIP_PARSE_ERR_SIP_IN_REPLY_TO_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPInReplyToParser = m_pSIPInReplyToParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPMaxForwardsParser( CSIPMaxForwardsParser **pSIPMaxForwardsParser )
	{
		*pSIPMaxForwardsParser = NULL ;

		if( m_pSIPMaxForwardsParser == NULL )
		{
			m_pSIPMaxForwardsParser = CSIPMaxForwardsParser::GetAvailable() ;

			if( m_pSIPMaxForwardsParser == NULL )
				return SIP_PARSE_ERR_SIP_MAX_FORWARDS_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPMaxForwardsParser = m_pSIPMaxForwardsParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPMimeVersionParser( CSIPMimeVersionParser **pSIPMimeVersionParser )
	{
		*pSIPMimeVersionParser = NULL ;

		if( m_pSIPMimeVersionParser == NULL )
		{
			m_pSIPMimeVersionParser = CSIPMimeVersionParser::GetAvailable() ;

			if( m_pSIPMimeVersionParser == NULL )
				return SIP_PARSE_ERR_SIP_MIME_VERSION_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPMimeVersionParser = m_pSIPMimeVersionParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPMinExpiresParser( CSIPMinExpiresParser **pSIPMinExpiresParser )
	{
		*pSIPMinExpiresParser = NULL ;

		if( m_pSIPMinExpiresParser == NULL )
		{
			m_pSIPMinExpiresParser = CSIPMinExpiresParser::GetAvailable() ;

			if( m_pSIPMinExpiresParser == NULL )
				return SIP_PARSE_ERR_SIP_MIN_EXPIRES_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPMinExpiresParser = m_pSIPMinExpiresParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPOrganizationParser( CSIPOrganizationParser **pSIPOrganizationParser )
	{
		*pSIPOrganizationParser = NULL ;

		if( m_pSIPOrganizationParser == NULL )
		{
			m_pSIPOrganizationParser = CSIPOrganizationParser::GetAvailable() ;

			if( m_pSIPOrganizationParser == NULL )
				return SIP_PARSE_ERR_SIP_ORGANIZATION_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPOrganizationParser = m_pSIPOrganizationParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPPriorityParser( CSIPPriorityParser **pSIPPriorityParser )
	{
		*pSIPPriorityParser = NULL ;

		if( m_pSIPPriorityParser == NULL )
		{
			m_pSIPPriorityParser = CSIPPriorityParser::GetAvailable() ;

			if( m_pSIPPriorityParser == NULL )
				return SIP_PARSE_ERR_SIP_PRIORITY_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPPriorityParser = m_pSIPPriorityParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPProxyAuthenticateParser( CSIPProxyAuthenticateParser **pSIPProxyAuthenticateParser )
	{
		*pSIPProxyAuthenticateParser = NULL ;

		if( m_pSIPProxyAuthenticateParser == NULL )
		{
			m_pSIPProxyAuthenticateParser = CSIPProxyAuthenticateParser::GetAvailable() ;

			if( m_pSIPProxyAuthenticateParser == NULL )
				return SIP_PARSE_ERR_SIP_PROXY_AUTHENTICATE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPProxyAuthenticateParser = m_pSIPProxyAuthenticateParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPProxyAuthorizationParser( CSIPProxyAuthorizationParser **pSIPProxyAuthorizationParser )
	{
		*pSIPProxyAuthorizationParser = NULL ;

		if( m_pSIPProxyAuthorizationParser == NULL )
		{
			m_pSIPProxyAuthorizationParser = CSIPProxyAuthorizationParser::GetAvailable() ;

			if( m_pSIPProxyAuthorizationParser == NULL )
				return SIP_PARSE_ERR_SIP_PROXY_AUTHORIZATION_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPProxyAuthorizationParser = m_pSIPProxyAuthorizationParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPProxyRequireParser( CSIPProxyRequireParser **pSIPProxyRequireParser )
	{
		*pSIPProxyRequireParser = NULL ;

		if( m_pSIPProxyRequireParser == NULL )
		{
			m_pSIPProxyRequireParser = CSIPProxyRequireParser::GetAvailable() ;

			if( m_pSIPProxyRequireParser == NULL )
				return SIP_PARSE_ERR_SIP_PROXY_REQUIRE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPProxyRequireParser = m_pSIPProxyRequireParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPRecordRouteParser( CSIPRecordRouteParser **pSIPRecordRouteParser )
	{
		*pSIPRecordRouteParser = NULL ;

		if( m_pSIPRecordRouteParser == NULL )
		{
			m_pSIPRecordRouteParser = CSIPRecordRouteParser::GetAvailable() ;

			if( m_pSIPRecordRouteParser == NULL )
				return SIP_PARSE_ERR_SIP_RECORD_ROUTE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPRecordRouteParser = m_pSIPRecordRouteParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPReplyToParser( CSIPReplyToParser **pSIPReplyToParser )
	{
		*pSIPReplyToParser = NULL ;

		if( m_pSIPReplyToParser == NULL )
		{
			m_pSIPReplyToParser = CSIPReplyToParser::GetAvailable() ;

			if( m_pSIPReplyToParser == NULL )
				return SIP_PARSE_ERR_SIP_REPLY_TO_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPReplyToParser = m_pSIPReplyToParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPRequireParser( CSIPRequireParser **pSIPRequireParser )
	{
		*pSIPRequireParser = NULL ;

		if( m_pSIPRequireParser == NULL )
		{
			m_pSIPRequireParser = CSIPRequireParser::GetAvailable() ;

			if( m_pSIPRequireParser == NULL )
				return SIP_PARSE_ERR_SIP_REQUIRE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPRequireParser = m_pSIPRequireParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPRetryAfterParser( CSIPRetryAfterParser **pSIPRetryAfterParser )
	{
		*pSIPRetryAfterParser = NULL ;

		if( m_pSIPRetryAfterParser == NULL )
		{
			m_pSIPRetryAfterParser = CSIPRetryAfterParser::GetAvailable() ;

			if( m_pSIPRetryAfterParser == NULL )
				return SIP_PARSE_ERR_SIP_RETRY_AFTER_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPRetryAfterParser = m_pSIPRetryAfterParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPRouteParser( CSIPRouteParser **pSIPRouteParser )
	{
		*pSIPRouteParser = NULL ;

		if( m_pSIPRouteParser == NULL )
		{
			m_pSIPRouteParser = CSIPRouteParser::GetAvailable() ;

			if( m_pSIPRouteParser == NULL )
				return SIP_PARSE_ERR_SIP_ROUTE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPRouteParser = m_pSIPRouteParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPServerParser( CSIPServerParser **pSIPServerParser )
	{
		*pSIPServerParser = NULL ;

		if( m_pSIPServerParser == NULL )
		{
			m_pSIPServerParser = CSIPServerParser::GetAvailable() ;

			if( m_pSIPServerParser == NULL )
				return SIP_PARSE_ERR_SIP_SERVER_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPServerParser = m_pSIPServerParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPSubjectParser( CSIPSubjectParser **pSIPSubjectParser )
	{
		*pSIPSubjectParser = NULL ;

		if( m_pSIPSubjectParser == NULL )
		{
			m_pSIPSubjectParser = CSIPSubjectParser::GetAvailable() ;

			if( m_pSIPSubjectParser == NULL )
				return SIP_PARSE_ERR_SIP_SUBJECT_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPSubjectParser = m_pSIPSubjectParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPSupportedParser( CSIPSupportedParser **pSIPSupportedParser )
	{
		*pSIPSupportedParser = NULL ;

		if( m_pSIPSupportedParser == NULL )
		{
			m_pSIPSupportedParser = CSIPSupportedParser::GetAvailable() ;

			if( m_pSIPSupportedParser == NULL )
				return SIP_PARSE_ERR_SIP_SUPPORTED_PARSER_OBJECT_NOT_CREATED ;	
		}

		*pSIPSupportedParser = m_pSIPSupportedParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPTimestampParser( CSIPTimestampParser **pSIPTimestampParser )
	{
		*pSIPTimestampParser = NULL ;

		if( m_pSIPTimestampParser == NULL )
		{
			m_pSIPTimestampParser = CSIPTimestampParser::GetAvailable() ;

			if( m_pSIPTimestampParser == NULL )
				return SIP_PARSE_ERR_SIP_TIMESTAMP_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPTimestampParser = m_pSIPTimestampParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPToParser( CSIPToParser **pSIPToParser )
	{
		*pSIPToParser = NULL ;

		if( m_pSIPToParser == NULL )
		{
			m_pSIPToParser = CSIPToParser::GetAvailable() ;

			if( m_pSIPToParser == NULL )
				return SIP_PARSE_ERR_SIP_TO_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPToParser = m_pSIPToParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPUnSupportedParser( CSIPUnSupportedParser **pSIPUnSupportedParser )
	{
		*pSIPUnSupportedParser = NULL ;

		if( m_pSIPUnSupportedParser == NULL )
		{
			m_pSIPUnSupportedParser = CSIPUnSupportedParser::GetAvailable() ;

			if( m_pSIPUnSupportedParser == NULL )
				return SIP_PARSE_ERR_SIP_UNSUPPORTED_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPUnSupportedParser = m_pSIPUnSupportedParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPUserAgentParser( CSIPUserAgentParser **pSIPUserAgentParser )
	{
		*pSIPUserAgentParser = NULL ;

		if( m_pSIPUserAgentParser == NULL )
		{
			m_pSIPUserAgentParser = CSIPUserAgentParser::GetAvailable() ;

			if( m_pSIPUserAgentParser == NULL )
				return SIP_PARSE_ERR_SIP_USER_AGENT_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPUserAgentParser = m_pSIPUserAgentParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPViaParser( CSIPViaParser **pSIPViaParser )
	{
		*pSIPViaParser = NULL ;

		if( m_pSIPViaParser == NULL )
		{
			m_pSIPViaParser = CSIPViaParser::GetAvailable() ;
			m_pSIPViaParser->SetCreateStringInMultipleHeaderFormat( true ) ;

			if( m_pSIPViaParser == NULL )
				return SIP_PARSE_ERR_SIP_VIA_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPViaParser = m_pSIPViaParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPWarningParser( CSIPWarningParser **pSIPWarningParser )
	{
		*pSIPWarningParser = NULL ;

		if( m_pSIPWarningParser == NULL )
		{
			m_pSIPWarningParser = CSIPWarningParser::GetAvailable() ;

			if( m_pSIPWarningParser == NULL )
				return SIP_PARSE_ERR_SIP_WARNING_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPWarningParser = m_pSIPWarningParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPWWWAuthenticateParser( CSIPWWWAuthenticateParser **pSIPWWWAuthenticateParser )
	{
		*pSIPWWWAuthenticateParser = NULL ;

		if( m_pSIPWWWAuthenticateParser == NULL )
		{
			m_pSIPWWWAuthenticateParser = CSIPWWWAuthenticateParser::GetAvailable() ;

			if( m_pSIPWWWAuthenticateParser == NULL )
				return SIP_PARSE_ERR_SIP_WWW_AUTHENTICATE_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPWWWAuthenticateParser = m_pSIPWWWAuthenticateParser ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::QuerySIPMessageBodyData( CMessageData **pSIPMessageBodyData )
	{
		*pSIPMessageBodyData = NULL ;

		if( m_pSIPMessageBodyData == NULL )
		{
			m_pSIPMessageBodyData = CMessageData::GetAvailable() ;

			if( m_pSIPMessageBodyData == NULL )
				return SIP_PARSE_ERR_SIP_MESSAGE_BODY_DATA_OBJECT_NOT_CREATED ;
		}

		*pSIPMessageBodyData = m_pSIPMessageBodyData ;

		return SIP_ERR_SUCCESS ;
	}

	/*
	FW_RETURN_TYPE CSIPMessageParser::QuerySIPFromParameters( CSIPParamListParser **pSIPFromParameters )
	{
		*pSIPFromParameters = NULL ;

		if( m_pSIPFromParameters == NULL )
		{
			m_pSIPFromParameters = CSIPParamListParser::GetAvailable() ;

			if( m_pSIPFromParameters == NULL )
				return SIP_PARSE_ERR_SIP_PARAM_LIST_PARSER_OBJECT_NOT_CREATED ;
		}

		*pSIPFromParameters = m_pSIPFromParameters ;

		return SIP_ERR_SUCCESS ;
	}*/

	FW_RETURN_TYPE CSIPMessageParser::ParseRequestLine( const std::string &strStringToParse )
	{
		if( strStringToParse.empty() )
			return SIP_PARSE_ERR_EMPTY_STRING_TO_PARSE ;

		// Request-Line = Method SP Request-URI SP SIP-Version CRLF
		std::string::size_type iFirstSpacePosition = strStringToParse.find( SIP_CONST_SPACE ) ;
		if( iFirstSpacePosition == std::string::npos )
			return SIP_PARSE_ERR_INVALID_SIP_REQUEST_LINE ;

		int iSIPSpaceDelimiterSize = strlen( SIP_CONST_SPACE ) ;
		std::string::size_type iSecondSpacePosition = strStringToParse.find( SIP_CONST_SPACE, 
																	iFirstSpacePosition + iSIPSpaceDelimiterSize ) ;
		if( iSecondSpacePosition == std::string::npos )
			return SIP_PARSE_ERR_INVALID_SIP_REQUEST_LINE ;

		SetSIPMethod( strStringToParse.substr( 0, iFirstSpacePosition ) ) ;

		FW_RETURN_TYPE FWRetValue = SIP_ERR_SUCCESS ;

		CSIPURIParser *pRequestURIParser = NULL ;
		if( ( FWRetValue = QuerySIPRequestURIParser( &pRequestURIParser ) ) != SIP_ERR_SUCCESS )
			return FWRetValue ;

		if( ( FWRetValue = pRequestURIParser->Parse( strStringToParse.substr( iFirstSpacePosition + iSIPSpaceDelimiterSize, 
								iSecondSpacePosition - ( iFirstSpacePosition + iSIPSpaceDelimiterSize ) ) ) ) != SIP_ERR_SUCCESS )
			return FWRetValue ;

		SetSIPVersion( strStringToParse.substr( iSecondSpacePosition + iSIPSpaceDelimiterSize ) ) ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::ParseResponseStatusLine( const std::string &strStringToParse )
	{
		if( strStringToParse.empty() )
			return SIP_PARSE_ERR_EMPTY_STRING_TO_PARSE ;

		// Status-Line = SIP-Version SP Status-Code SP Reason-Phrase CRLF
		std::string::size_type iFirstSpacePosition = strStringToParse.find( SIP_CONST_SPACE ) ;
		if( iFirstSpacePosition == std::string::npos )
			return SIP_PARSE_ERR_INVALID_SIP_RESPONSE_STATUS_LINE ;

		int iSIPSpaceDelimiterSize = strlen( SIP_CONST_SPACE ) ;

		std::string::size_type iSecondSpacePosition = strStringToParse.find( SIP_CONST_SPACE, 
															iFirstSpacePosition + iSIPSpaceDelimiterSize ) ;
		if( iSecondSpacePosition == std::string::npos )
			return SIP_PARSE_ERR_INVALID_SIP_RESPONSE_STATUS_LINE ;

		SetSIPVersion( strStringToParse.substr( 0, iFirstSpacePosition ) ) ;

		SetSIPStatusCode( strStringToParse.substr( iFirstSpacePosition + iSIPSpaceDelimiterSize, 
									iSecondSpacePosition - ( iFirstSpacePosition + iSIPSpaceDelimiterSize ) ) ) ;

		SetSIPReasonPhrase( strStringToParse.substr( iSecondSpacePosition + iSIPSpaceDelimiterSize ) ) ;

		return SIP_ERR_SUCCESS ;
	}

	FW_RETURN_TYPE CSIPMessageParser::ParseMessageHeaders( const std::string &strStringToParse,
													std::string::size_type &iMessageBodyPosition )
	{
		if( strStringToParse.empty() )
			return SIP_PARSE_ERR_EMPTY_STRING_TO_PARSE ;

		std::string lstrStringToParse = strStringToParse ;

		std::string strHeaderDataBuffer = "" ;
		std::string strHeaderName = "" ;
		std::string strHeaderValue = "" ;
		std::string::size_type iColonPosition = std::string::npos ;

		std::string::size_type iCRLFPosition = std::string::npos ;

		FW_RETURN_TYPE FWRetValue = SIP_ERR_SUCCESS ;
		ASIPParser *pSIPParser = NULL ;

		while( ( iCRLFPosition = lstrStringToParse.find( m_strCRLFDelimiter ) ) != 0 )
		{
			strHeaderDataBuffer = lstrStringToParse.substr( 0, iCRLFPosition ) ;
			lstrStringToParse = lstrStringToParse.substr( iCRLFPosition + m_strCRLFDelimiter.size() ) ;
			
			// Retrieve Message Body Position
			iMessageBodyPosition += iCRLFPosition + m_strCRLFDelimiter.size() ;

			iColonPosition =  strHeaderDataBuffer.find( m_strColonDelimiter ) ;

			if( iColonPosition == std::string::npos )
				return SIP_PARSE_ERR_INVALID_SIP_MESSAGE_HEADER ;

			strHeaderName = strHeaderDataBuffer.substr( 0, iColonPosition ) ;

			strHeaderValue = strHeaderDataBuffer.substr( iColonPosition + m_strColonDelimiter.size() ) ;

			// To, From, CSeq, Call-ID, Max-Forwards, and Via;
			CHHString::TrimAll( strHeaderName ) ;
			CHHString::TrimAll( strHeaderValue ) ;

			FWRetValue = SIP_ERR_SUCCESS ;
			pSIPParser = NULL ;
			 
			if(		( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_FROM ) )
				 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_FROM ) )
				 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_FROM ) )
			)
			{
				FWRetValue = QuerySIPFromParser( ( CSIPFromParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_TO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_TO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_TO ) )
			)
			{
				FWRetValue = QuerySIPToParser( ( CSIPToParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_VIA ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_VIA ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_VIA ) )
			)
			{
				FWRetValue = QuerySIPViaParser( ( CSIPViaParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CALL_ID ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CALL_ID ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CALL_ID ) )
			)
			{
				FWRetValue = QuerySIPCallIDParser( ( CSIPCallIDParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CSEQ ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CSEQ ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CSEQ ) )
			)
			{
				FWRetValue = QuerySIPCSeqParser( ( CSIPCSeqParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_MAX_FORWARDS ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_MAX_FORWARDS ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_MAX_FORWARDS ) )
			)
			{
				FWRetValue = QuerySIPMaxForwardsParser( ( CSIPMaxForwardsParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CONTACT ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CONTACT ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CONTACT ) )
			)
			{
				FWRetValue = QuerySIPContactParser( ( CSIPContactParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_USER_AGENT ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_USER_AGENT ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_USER_AGENT ) )
			)
			{
				FWRetValue = QuerySIPUserAgentParser( ( CSIPUserAgentParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CONTENT_TYPE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CONTENT_TYPE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CONTENT_TYPE ) )
			)
			{
				FWRetValue = QuerySIPContentTypeParser( ( CSIPContentTypeParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CONTENT_LENGTH ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CONTENT_LENGTH ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CONTENT_LENGTH ) )
			)
			{
				FWRetValue = QuerySIPContentLengthParser( ( CSIPContentLengthParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_ACCEPT ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_ACCEPT ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_ACCEPT ) )
			)
			{
				FWRetValue = QuerySIPAcceptParser( ( CSIPAcceptParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_ACCEPT_ENCODING ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_ACCEPT_ENCODING ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_ACCEPT_ENCODING ) )
			)
			{
				FWRetValue = QuerySIPAcceptEncodingParser( ( CSIPAcceptEncodingParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_ACCEPT_LANGUAGE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_ACCEPT_LANGUAGE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_ACCEPT_LANGUAGE ) )
			)
			{
				FWRetValue = QuerySIPAcceptLanguageParser( ( CSIPAcceptLanguageParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_ALERT_INFO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_ALERT_INFO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_ALERT_INFO ) )
			)
			{
				FWRetValue = QuerySIPAlertInfoParser( ( CSIPAlertInfoParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_ALLOW ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_ALLOW ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_ALLOW ) )
			)
			{
				FWRetValue = QuerySIPAllowParser( ( CSIPAllowParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_AUTEHTICATION_INFO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_AUTEHTICATION_INFO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_AUTEHTICATION_INFO ) )
			)
			{
				FWRetValue = QuerySIPAuthenticationInfoParser( ( CSIPAuthenticationInfoParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_AUTHORIZATION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_AUTHORIZATION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_AUTHORIZATION ) )
			)
			{
				FWRetValue = QuerySIPAuthorizationParser( ( CSIPAuthorizationParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CALL_INFO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CALL_INFO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CALL_INFO ) )
			)
			{
				FWRetValue = QuerySIPCallInfoParser( ( CSIPCallInfoParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CONTENT_DISPOSITION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CONTENT_DISPOSITION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CONTENT_DISPOSITION ) )
			)
			{
				FWRetValue = QuerySIPContentDispositionParser( ( CSIPContentDispositionParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CONTENT_ENCODING ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CONTENT_ENCODING ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CONTENT_ENCODING ) )
			)
			{
				FWRetValue = QuerySIPContentEncodingParser( ( CSIPContentEncodingParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_CONTENT_LANGUAGE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_CONTENT_LANGUAGE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_CONTENT_LANGUAGE ) )
			)
			{
				FWRetValue = QuerySIPContentLanguageParser( ( CSIPContentLanguageParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_DATE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_DATE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_DATE ) )
			)
			{
				FWRetValue = QuerySIPDateParser( ( CSIPDateParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_ERROR_INFO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_ERROR_INFO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_ERROR_INFO ) )
			)
			{
				FWRetValue = QuerySIPErrorInfoParser( ( CSIPErrorInfoParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_EXPIRES ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_EXPIRES ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_EXPIRES ) )
			)
			{
				FWRetValue = QuerySIPExpiresParser( ( CSIPExpiresParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_IN_REPLY_TO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_IN_REPLY_TO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_IN_REPLY_TO ) )
			)
			{
				FWRetValue = QuerySIPInReplyToParser( ( CSIPInReplyToParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_MIME_VERSION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_MIME_VERSION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_MIME_VERSION ) )
			)
			{
				FWRetValue = QuerySIPMimeVersionParser( ( CSIPMimeVersionParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_MIN_EXPIRES ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_MIN_EXPIRES ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_MIN_EXPIRES ) )
			)
			{
				FWRetValue = QuerySIPMinExpiresParser( ( CSIPMinExpiresParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_ORGANIZATION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_ORGANIZATION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_ORGANIZATION ) )
			)
			{
				FWRetValue = QuerySIPOrganizationParser( ( CSIPOrganizationParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_PRIORITY ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_PRIORITY ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_PRIORITY ) )
			)
			{
				FWRetValue = QuerySIPPriorityParser( ( CSIPPriorityParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_PROXY_AUTHENTICATE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_PROXY_AUTHENTICATE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_PROXY_AUTHENTICATE ) )
			)
			{
				FWRetValue = QuerySIPProxyAuthenticateParser( ( CSIPProxyAuthenticateParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_PROXY_AUTHORIZATION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_PROXY_AUTHORIZATION ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_PROXY_AUTHORIZATION ) )
			)
			{
				FWRetValue = QuerySIPProxyAuthorizationParser( ( CSIPProxyAuthorizationParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_PROXY_REQUIRE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_PROXY_REQUIRE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_PROXY_REQUIRE ) )
			)
			{
				FWRetValue = QuerySIPProxyRequireParser( ( CSIPProxyRequireParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_RECORD_ROUTE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_RECORD_ROUTE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_RECORD_ROUTE ) )
			)
			{
				FWRetValue = QuerySIPRecordRouteParser( ( CSIPRecordRouteParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_REPLY_TO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_REPLY_TO ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_REPLY_TO ) )
			)
			{
				FWRetValue = QuerySIPReplyToParser( ( CSIPReplyToParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_REQUIRE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_REQUIRE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_REQUIRE ) )
			)
			{
				FWRetValue = QuerySIPRequireParser( ( CSIPRequireParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_RETRY_AFTER ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_RETRY_AFTER ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_RETRY_AFTER ) )
			)
			{
				FWRetValue = QuerySIPRetryAfterParser( ( CSIPRetryAfterParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_ROUTE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_ROUTE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_ROUTE ) )
			)
			{
				FWRetValue = QuerySIPRouteParser( ( CSIPRouteParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_SERVER ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_SERVER ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_SERVER ) )
			)
			{
				FWRetValue = QuerySIPServerParser( ( CSIPServerParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_SUBJECT ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_SUBJECT ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_SUBJECT ) )
			)
			{
				FWRetValue = QuerySIPSubjectParser( ( CSIPSubjectParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_SUPPORTED ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_SUPPORTED ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_SUPPORTED ) )
			)
			{
				FWRetValue = QuerySIPSupportedParser( ( CSIPSupportedParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_TIMESTAMP ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_TIMESTAMP ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_TIMESTAMP ) )
			)
			{
				FWRetValue = QuerySIPTimestampParser( ( CSIPTimestampParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_UNSUPPORTED ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_UNSUPPORTED ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_UNSUPPORTED ) )
			)
			{
				FWRetValue = QuerySIPUnSupportedParser( ( CSIPUnSupportedParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_WARNING ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_WARNING ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_WARNING ) )
			)
			{
				FWRetValue = QuerySIPWarningParser( ( CSIPWarningParser** ) &pSIPParser ) ;
			}
			else if(	( strHeaderName == ASIPParser::GetHeaderLowerName( SIP_HEADER_WWW_AUTHENTICATE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderShortName( SIP_HEADER_WWW_AUTHENTICATE ) )
					 || ( strHeaderName == ASIPParser::GetHeaderUpperName( SIP_HEADER_WWW_AUTHENTICATE ) )
			)
			{
				FWRetValue = QuerySIPWWWAuthenticateParser( ( CSIPWWWAuthenticateParser** ) &pSIPParser ) ;
			}


			if( FWRetValue != SIP_ERR_SUCCESS )
				return FWRetValue ;

			if( pSIPParser != NULL )
			{
				if( ( FWRetValue = pSIPParser->Parse( strHeaderValue ) ) != SIP_ERR_SUCCESS )
					return FWRetValue ;
			}

		}

		iMessageBodyPosition += iCRLFPosition + m_strCRLFDelimiter.size();

		return SIP_ERR_SUCCESS ;
	}

	// Grammer
	/*SIP-message = Request / Response
	Request = Request-Line
			*( message-header )
			CRLF
			[ message-body ]
			
	Request-Line = Method SP Request-URI SP SIP-Version CRLF

	Response = Status-Line
			*( message-header )
			CRLF
			[ message-body ]
			
	Status-Line = SIP-Version SP Status-Code SP Reason-Phrase CRLF*/

	FW_RETURN_TYPE CSIPMessageParser::Parse( const std::string &strStringToParse )
	{
		if( strStringToParse.empty() )
			return SIP_PARSE_ERR_EMPTY_STRING_TO_PARSE ;

		std::string::size_type iRequestLineOrResponseStatusLineStringPosition = strStringToParse.find( m_strCRLFDelimiter ) ;

		if( iRequestLineOrResponseStatusLineStringPosition == std::string::npos )
			return SIP_PARSE_ERR_INVALID_SIP_MESSAGE ;

		std::string strRequestLineOrResponseStatusLineString = strStringToParse.substr( 0, iRequestLineOrResponseStatusLineStringPosition ) ;

		FW_RETURN_TYPE FWRetValue = SIP_ERR_SUCCESS ;

		if( strRequestLineOrResponseStatusLineString.find( SIP_PROTOCOL_NAME + std::string( "/" ) ) == 0 )
			FWRetValue = ParseResponseStatusLine( strRequestLineOrResponseStatusLineString ) ; // It is a SIP Response
		else
			FWRetValue = ParseRequestLine( strRequestLineOrResponseStatusLineString ) ; // It is a SIP Request

		if( FWRetValue != SIP_ERR_SUCCESS )
			return FWRetValue ;

		std::string::size_type iMessageHeaderPosition = iRequestLineOrResponseStatusLineStringPosition 
																			+ m_strCRLFDelimiter.size() ;
		std::string::size_type iMessageBodyPosition = iMessageHeaderPosition ;

		if( ( FWRetValue = ParseMessageHeaders( strStringToParse.substr( iMessageHeaderPosition ), 
											iMessageBodyPosition ) ) != SIP_ERR_SUCCESS )
			return FWRetValue ;

		if( iMessageBodyPosition < strStringToParse.size() )
			SetSIPMessageBody( strStringToParse.substr( iMessageBodyPosition ) ) ;
				
		return SIP_ERR_SUCCESS ;
	}

	std::string CSIPMessageParser::ToString() const
	{
		std::string strSIPMessageString = "" ;

		if( m_pSIPMethodData != NULL )
			strSIPMessageString = GetSIPMethod() + SIP_CONST_SPACE + m_pSIPRequestURIParser->ToString() + SIP_CONST_SPACE 
									+ GetSIPVersion() + m_strCRLFDelimiter ;
		else
			strSIPMessageString = GetSIPVersion() + SIP_CONST_SPACE + GetSIPStatusCode() + SIP_CONST_SPACE 
									+ GetSIPReasonPhrase() + m_strCRLFDelimiter ;

		if( m_pSIPViaParser != NULL )
			strSIPMessageString += (		( m_pSIPViaParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPViaParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPViaParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPViaParser->ToString() ) ;

		if( m_pSIPMaxForwardsParser != NULL )
			strSIPMessageString += m_pSIPMaxForwardsParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPMaxForwardsParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPContactParser != NULL )
			strSIPMessageString += (		( m_pSIPContactParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPContactParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPContactParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPContactParser->ToString() ) ;

		if( m_pSIPToParser != NULL )
			strSIPMessageString += m_pSIPToParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPToParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPFromParser != NULL )
			strSIPMessageString += m_pSIPFromParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPFromParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPCallIDParser != NULL )
			strSIPMessageString += m_pSIPCallIDParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE
									+ m_pSIPCallIDParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPCSeqParser != NULL )
			strSIPMessageString += m_pSIPCSeqParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPCSeqParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPExpiresParser != NULL )
			strSIPMessageString += m_pSIPExpiresParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPExpiresParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPAllowParser != NULL )
			strSIPMessageString += (		( m_pSIPAllowParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPAllowParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPAllowParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPAllowParser->ToString() ) ;
		
		if( m_pSIPContentTypeParser != NULL )
			strSIPMessageString += m_pSIPContentTypeParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPContentTypeParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPSupportedParser != NULL )
			strSIPMessageString += (		( m_pSIPSupportedParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPSupportedParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPSupportedParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPSupportedParser->ToString() ) ;
		
		if( m_pSIPUserAgentParser != NULL )
			strSIPMessageString += m_pSIPUserAgentParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPUserAgentParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPContentLengthParser != NULL )
			strSIPMessageString += m_pSIPContentLengthParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPContentLengthParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPAcceptParser != NULL )
			strSIPMessageString += (		( m_pSIPAcceptParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPAcceptParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPAcceptParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPAcceptParser->ToString() ) ;
			
		if( m_pSIPAcceptEncodingParser != NULL )
			strSIPMessageString += (		( m_pSIPAcceptEncodingParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPAcceptEncodingParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPAcceptEncodingParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPAcceptEncodingParser->ToString() ) ;

		if( m_pSIPAcceptLanguageParser != NULL )
			strSIPMessageString += (		( m_pSIPAcceptLanguageParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPAcceptLanguageParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPAcceptLanguageParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPAcceptLanguageParser->ToString() ) ;

		if( m_pSIPAlertInfoParser != NULL )
			strSIPMessageString += (		( m_pSIPAlertInfoParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPAlertInfoParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPAlertInfoParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPAlertInfoParser->ToString() ) ;

		if( m_pSIPAuthenticationInfoParser != NULL )
			strSIPMessageString += m_pSIPAuthenticationInfoParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPAuthenticationInfoParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPAuthorizationParser != NULL )
			strSIPMessageString += m_pSIPAuthorizationParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPAuthorizationParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPCallInfoParser != NULL )
			strSIPMessageString += (		( m_pSIPCallInfoParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPCallInfoParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPCallInfoParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPCallInfoParser->ToString() ) ;

		if( m_pSIPContentDispositionParser != NULL )
			strSIPMessageString += m_pSIPContentDispositionParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPContentDispositionParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPContentEncodingParser != NULL )
			strSIPMessageString += (		( m_pSIPContentEncodingParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPContentEncodingParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPContentEncodingParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPContentEncodingParser->ToString() ) ;

		if( m_pSIPContentLanguageParser != NULL )
			strSIPMessageString += (		( m_pSIPContentLanguageParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPContentLanguageParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPContentLanguageParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPContentLanguageParser->ToString() ) ;
		
		if( m_pSIPDateParser != NULL )
			strSIPMessageString += m_pSIPDateParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPDateParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPErrorInfoParser != NULL )
			strSIPMessageString += (		( m_pSIPErrorInfoParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPErrorInfoParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPErrorInfoParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPErrorInfoParser->ToString() ) ;

		if( m_pSIPInReplyToParser != NULL )
			strSIPMessageString += (		( m_pSIPInReplyToParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPInReplyToParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPInReplyToParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPInReplyToParser->ToString() ) ;

		if( m_pSIPMimeVersionParser != NULL )
			strSIPMessageString += m_pSIPMimeVersionParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPMimeVersionParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPMinExpiresParser != NULL )
			strSIPMessageString += m_pSIPMinExpiresParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPMinExpiresParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPOrganizationParser != NULL )
			strSIPMessageString += m_pSIPOrganizationParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPOrganizationParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPPriorityParser != NULL )
			strSIPMessageString += m_pSIPPriorityParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPPriorityParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPProxyAuthenticateParser != NULL )
			strSIPMessageString += m_pSIPProxyAuthenticateParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPProxyAuthenticateParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPProxyAuthorizationParser != NULL )
			strSIPMessageString += m_pSIPProxyAuthorizationParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPProxyAuthorizationParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPProxyRequireParser != NULL )
			strSIPMessageString += (		( m_pSIPProxyRequireParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPProxyRequireParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPProxyRequireParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPProxyRequireParser->ToString() ) ;

		if( m_pSIPRecordRouteParser != NULL )
			strSIPMessageString += (		( m_pSIPRecordRouteParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPRecordRouteParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPRecordRouteParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPRecordRouteParser->ToString() ) ;
		
		if( m_pSIPReplyToParser != NULL )
			strSIPMessageString += m_pSIPReplyToParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPReplyToParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPRequireParser != NULL )
			strSIPMessageString += (		( m_pSIPRequireParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPRequireParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPRequireParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPRequireParser->ToString() ) ;
		
		if( m_pSIPRetryAfterParser != NULL )
			strSIPMessageString += m_pSIPRetryAfterParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPRetryAfterParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPRouteParser != NULL )
			strSIPMessageString += (		( m_pSIPRouteParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPRouteParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPRouteParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPRouteParser->ToString() ) ;
		
		if( m_pSIPServerParser != NULL )
			strSIPMessageString += m_pSIPServerParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPServerParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPSubjectParser != NULL )
			strSIPMessageString += m_pSIPSubjectParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE
									+ m_pSIPSubjectParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPTimestampParser != NULL )
			strSIPMessageString += m_pSIPTimestampParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPTimestampParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPUnSupportedParser != NULL )
			strSIPMessageString += (		( m_pSIPUnSupportedParser->GetCreateStringInMultipleHeaderFormat() == false )
										?	( m_pSIPUnSupportedParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
												+ m_pSIPUnSupportedParser->ToString() + m_strCRLFDelimiter )
										:	m_pSIPUnSupportedParser->ToString() ) ;
		
		if( m_pSIPWarningParser != NULL )
			strSIPMessageString += m_pSIPWarningParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPWarningParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPWWWAuthenticateParser != NULL )
			strSIPMessageString += m_pSIPWWWAuthenticateParser->GetHeaderName() + m_strColonDelimiter + SIP_CONST_SPACE 
									+ m_pSIPWWWAuthenticateParser->ToString() + m_strCRLFDelimiter ;

		if( m_pSIPMessageBodyData != NULL )
			strSIPMessageString += m_strCRLFDelimiter + GetSIPMessageBody() + m_strCRLFDelimiter ;
		
		strSIPMessageString += m_strCRLFDelimiter ;

		return strSIPMessageString ;
	}

	std::string CSIPMessageParser::GetBranchID()
	{
		std::string strBranchID = "" ;

		CSIPViaParser *pSIPViaParser = GetSIPViaParser() ;
		if( pSIPViaParser != NULL )
		{
			CSIPViaParmParser *pSIPViaParmParser = ( CSIPViaParmParser* ) pSIPViaParser->GetSIPParserList().front() ;
			strBranchID = pSIPViaParmParser->GetSIPViaParmParameters()->GetParameterValue( SIP_PARAM_BRANCH ) ;
		}

		return strBranchID ;
	}

	bool CSIPMessageParser::IsSIPResponse()
	{
		if( GetSIPStatusCode() != "" )
		{
			return true ;
		}

		return false ;
	}
			
	bool CSIPMessageParser::IsSIPProvisionalResponse()
	{
		long lSIPStatusCode = atol( GetSIPStatusCode().c_str() ) ;

		if( ( lSIPStatusCode >= 100 ) && ( lSIPStatusCode < 200 ) ) // Provisional Responses
		{
			return true ;
		}

		return false ;
	}

	bool CSIPMessageParser::IsSIPFinalResponse()
	{
		return ( !IsSIPProvisionalResponse() ) ;
	}

	bool CSIPMessageParser::IsSIP2XXFinalResponse()
	{
		long lSIPStatusCode = atol( GetSIPStatusCode().c_str() ) ;

		if( ( lSIPStatusCode >= 200 ) && ( lSIPStatusCode < 300 ) ) // 2XX Response
		{
			return true ;
		}

		return false ;
	}

	bool CSIPMessageParser::IsSIPNon2XXFinalResponse()
	{
		return ( !IsSIPProvisionalResponse() && !IsSIP2XXFinalResponse() ) ;
	}
} // End namespace

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
India India
Hatim Haidry

VC++, Technical Architect

India

haidryhatim@gmail.com

Comments and Discussions