Commit a7edd830 authored by berge's avatar berge
Browse files

Encoding support for RFC 3261

parent fc9d9d3a
Loading
Loading
Loading
Loading
+590 −0
Original line number Diff line number Diff line
@@ -361,6 +361,20 @@ bool detect_semi(Buffer & buffer) throw (DecodeError)
	return detect_separator(reg_semi, buffer);
}

void SipUrl::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csColon;
	csColon.SetValue(":");

	switch(field_id) {
	case id_scheme:
		csColon.Encode(buffer);
		break;
	default:
		break;
	}
}

void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{

@@ -457,6 +471,28 @@ void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void UserInfo::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csColon;
	csColon.SetValue(":");
	
	switch(field_id) {
	case id_password:
		csColon.Encode(buffer);
		break;
	default:
		break;
	}
}

void UserInfo::PostEncode (Buffer& buffer) throw (EncodeError)
{
	Charstring csAt;
	csAt.SetValue("@");

	csAt.Encode(buffer);
}

void UserInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_username ("^([" SIPCHARS_UNRESERVED SIPCHARS_USER_UNRESERVED "]|" SIPREG_ESCAPED ")+");
@@ -494,6 +530,23 @@ void UserInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void HostPort::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csColon;
	csColon.SetValue(":");

	switch(field_id) {
	case id_portField:
		if(IsPresent(field_id)) {
			Get_portField().SetFormat(Integer::AsciiDecimal);
			csColon.Encode(buffer);
		}
		break;
	default:
		break;
	}
}

void UserInfo::PostDecode (Buffer& buffer) throw (DecodeError)
{
	if (IsPresent (id_userOrTelephoneSubscriber))
@@ -527,6 +580,14 @@ void HostPort::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void SemicolonParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csSemi;
	csSemi.SetValue(";");

	csSemi.Encode(buffer);
}

void SemicolonParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_separator ("^" SIPREG_SEMI);
@@ -542,6 +603,20 @@ void SemicolonParam_List::PostDecodeField (int id, Buffer& buffer) throw (Decode
		SetHypSize (-2);
}

void AmpersandParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csAmpersand, csQuestion;
	csAmpersand.SetValue("&");
	csQuestion.SetValue("?");

	if(field_id == 0) {
		csQuestion.Encode(buffer);
	}
	else {		
		csAmpersand.Encode(buffer);
	}
}

void AmpersandParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_start ("^[?]");
@@ -559,6 +634,16 @@ void AmpersandParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeE
		SetHypSize(-2);
}

void CommaParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void CommaParam_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	Variable* parent = GetParent();
@@ -589,6 +674,23 @@ void CommaParam_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeErro
		SetHypSize (-2);
}


void GenericParam::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csEqual;
	csEqual.SetValue("=");

	switch(field_id) {
	case id_paramValue:
		if(IsPresent(field_id)) {
			csEqual.Encode(buffer);
		}
		break;
	default:
		break;
	}
}

void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_equal ("^" SIPREG_EQUAL);
@@ -669,6 +771,31 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}


void RequestLine::PostEncode (Buffer& buffer) throw (EncodeError)
{
	Charstring cs;

	cs.SetValue("\r\n");
	cs.Encode(buffer);
}

void RequestLine::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring cs;

	cs.SetValue(" ");

	switch(field_id) {
	case id_method:
	case id_requestUri:
		cs.Encode(buffer);
		break;
	default:
		break;
	}
}

void GenericParam::PostDecode (Buffer& buffer) throw (DecodeError)
{

@@ -816,6 +943,30 @@ void Method::Decode (Buffer& buffer) throw (DecodeError)
	buffer.SetPosition(buffer.GetPosition() + reg_method.GetMatchedLength());
}

void StatusLine::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csWS;
	csWS.SetValue(" ");

	switch(field_id) {
	case id_statusCode:
		Get_statusCode().SetFormat(Integer::AsciiDecimal);
	case id_reasonPhrase:
		csWS.Encode(buffer);
		break;
	default:
		break;
	}
}

void StatusLine::PostEncode (Buffer& buffer) throw (EncodeError)
{
	Charstring csCRLF;
	csCRLF.SetValue("\r\n");

	csCRLF.Encode(buffer);
}

void StatusLine::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_sip_version (SIPREG_SIP_VERSION);
@@ -1019,6 +1170,23 @@ private:

SipHeaderMap SipHeaderMap::msInstance;

void MessageHeader::PostEncode (Buffer& buffer) throw (EncodeError) 
{
 	Charstring csCRLF;
	csCRLF.SetValue("\r\n");

	csCRLF.Encode(buffer);	
}

void MessageHeader::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError) 
{
 	Charstring csCRLF;
	csCRLF.SetValue("\r\n");

	if(IsPresent(field_id)) {
		csCRLF.Encode(buffer);
	}
}

void MessageHeader::PreDecodeField (Buffer& buffer) throw (DecodeError)
{
@@ -1253,6 +1421,16 @@ void ContactBody::PreDecode (Buffer& buffer) throw (DecodeError)
	}
}

void ContactAddress_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void ContactAddress_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
@@ -1344,6 +1522,16 @@ void AcceptBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void AcceptBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void AcceptBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	// we assume that we are decoding one field at onece 
@@ -1382,6 +1570,16 @@ void AcceptEncoding::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void ContentCoding_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void ContentCoding_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
@@ -1434,6 +1632,16 @@ void LanguageBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void LanguageBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError) 
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void LanguageBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	// we assume that we are decoding one field at onece 
@@ -1460,6 +1668,11 @@ void LanguageBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeEr
		SetHypSize (-2);
}

void MaxForwards::PreEncode (Buffer& buffer) throw (EncodeError)
{
	Get_forwards().SetFormat(Integer::AsciiDecimal);
}

void MaxForwards::PreDecode (Buffer& buffer) throw (DecodeError)
{
	Get_forwards().SetFormat(Integer::AsciiDecimal);
@@ -1476,6 +1689,26 @@ void AlertInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
	}
}

void AlertInfoBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csLeftAngle;
	csLeftAngle.SetValue("<");

 	if(field_id == id_url) {
		csLeftAngle.Encode(buffer);
	}
}

void AlertInfoBody::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csRightAngle;
	csRightAngle.SetValue(">");

 	if(field_id == id_url) {
		csRightAngle.Encode(buffer);
	}
}

void AlertInfoBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_url ("^<" SIPREG_ABSOLUTE_URI ">");
@@ -1504,6 +1737,16 @@ void AlertInfoBody::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void AlertInfoBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void AlertInfoBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	// we assume that we are decoding one field at onece 
@@ -1532,6 +1775,16 @@ void Allow::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
	}
}

void Method_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void Method_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	// we assume that we are decoding one field at onece 
@@ -1562,6 +1815,16 @@ void Method_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
		SetHypSize (-2);
}

void Credentials::PreEncode (Buffer& buffer) throw (EncodeError)
{
	Charstring csDigestWS;
	csDigestWS.SetValue("Digest ");
	
	if(GetChosenId() == id_digestResponse) {
		csDigestWS.Encode(buffer);
	}
}

void Credentials::PreDecode (Buffer& buffer) throw (DecodeError)
{
	static Regex reg_digest ("^[Dd][Ii][Gg][Ee][Ss][Tt]" SIPREG_LWS);
@@ -1577,6 +1840,16 @@ void Credentials::PreDecode (Buffer& buffer) throw (DecodeError)
	}
}

void Challenge::PreEncode (Buffer& buffer) throw (EncodeError)
{
	Charstring csDigestWS;
	csDigestWS.SetValue("Digest ");
	
	if(GetChosenId() == id_digestCln) {
		csDigestWS.Encode(buffer);
	}
}

void Challenge::PreDecode (Buffer& buffer) throw (DecodeError)
{
	static Regex reg_digest ("^[Dd][Ii][Gg][Ee][Ss][Tt]" SIPREG_LWS);
@@ -1588,6 +1861,20 @@ void Challenge::PreDecode (Buffer& buffer) throw (DecodeError)
	}
}

void OtherAuth::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csWS;
	csWS.SetValue(" ");

	switch(field_id) {
	case id_authScheme:
		csWS.Encode(buffer);
		break;
	default:
		break;
	}
}

void OtherAuth::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_auth_scheme ("^" SIPREG_TOKEN);
@@ -1618,6 +1905,26 @@ void CallInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
	}
}

void CallInfoBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csLeftAngle;
	csLeftAngle.SetValue("<");

 	if(field_id == id_url) {
		csLeftAngle.Encode(buffer);
	}
}

void CallInfoBody::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csRightAngle;
	csRightAngle.SetValue(">");

 	if(field_id == id_url) {
		csRightAngle.Encode(buffer);
	}
}

void CallInfoBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_url ("^<" SIPREG_ABSOLUTE_URI ">");
@@ -1646,6 +1953,16 @@ void CallInfoBody::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void CallInfoBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void CallInfoBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	if (detect_comma (buffer))
@@ -1672,6 +1989,16 @@ void ContentDisposition::PreDecodeField (int id, Buffer& buffer) throw (DecodeEr
	}
}

void LanguageTag_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void LanguageTag_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
@@ -1712,6 +2039,26 @@ void ErrorInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
	}
}

void ErrorInfoBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csLeftAngle;
	csLeftAngle.SetValue("<");

 	if(field_id == id_uri) {
		csLeftAngle.Encode(buffer);
	}
}

void ErrorInfoBody::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csRightAngle;
	csRightAngle.SetValue(">");

 	if(field_id == id_uri) {
		csRightAngle.Encode(buffer);
	}
}

void ErrorInfoBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_uri ("^<" SIPREG_ABSOLUTE_URI ">");
@@ -1740,6 +2087,16 @@ void ErrorInfoBody::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void ErrorInfoBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void ErrorInfoBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
@@ -1766,6 +2123,16 @@ void Expires::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void CallidString_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void CallidString_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
@@ -1788,6 +2155,24 @@ void CallidString_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeEr
		SetHypSize (-2);
}

void MimeVersion::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csDot;
	csDot.SetValue(".");

	switch(field_id) {
	case id_majorNumber:
		Get_majorNumber().SetFormat(Integer::AsciiDecimal);
		break;
	case id_minorNumber:
		Get_minorNumber().SetFormat(Integer::AsciiDecimal);
		csDot.Encode(buffer);
		break;
	default:
		break;
	}
}

void MimeVersion::PreDecode (Buffer& buffer) throw (DecodeError)
{
	Get_majorNumber().SetFormat(Integer::AsciiDecimal);
@@ -1887,6 +2272,16 @@ void Subject::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
}


void ServerVal_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csWS;
	csWS.SetValue(" ");

	if(field_id != 0) {
		csWS.Encode(buffer);
	}
}

void ServerVal_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_content ("^(" SIPREG_TOKEN "(" SIPREG_SLASH SIPREG_TOKEN ")?|" SIPREG_COMMENT ")");
@@ -1919,6 +2314,36 @@ void Supported::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void NameAddr::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csLeftAngle;
	csLeftAngle.SetValue("<");

 	if(field_id == id_addrSpec) {
		csLeftAngle.Encode(buffer);
	}
}

void NameAddr::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csWS, csRightAngle;
	csWS.SetValue(" ");
	csRightAngle.SetValue(">");

	switch(field_id) {
	case id_displayName:
		if(IsPresent(id_displayName)) {
			csWS.Encode(buffer);
		}
		break;
	case id_addrSpec:
		csRightAngle.Encode(buffer);
		break;
	default:
		break;
	}
}

void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME);
@@ -1959,6 +2384,16 @@ void NameAddr::PostDecode (Buffer& buffer) throw (DecodeError)
	}
}

void SentProtocol::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csSlash;
	csSlash.SetValue("/");

	if(field_id != id_protocolName) {
		csSlash.Encode(buffer);
	}
}

void SentProtocol::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{

@@ -1975,6 +2410,16 @@ void SentProtocol::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	SetHypFieldLength (id, reg_sp.GetMatchedLength());
}

void ViaBody::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csWS;
	csWS.SetValue(" ");

	if(field_id == id_sentProtocol) {
		csWS.Encode(buffer);
	}
}

void ViaBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_lws ("^" SIPREG_LWS);
@@ -1993,6 +2438,16 @@ void ViaBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void ViaBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void ViaBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	// we assume that we are decoding one field at once 
@@ -2013,6 +2468,14 @@ void ViaBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void UndefinedHeader_List::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csCRLF;
	csCRLF.SetValue("\r\n");

	csCRLF.Encode(buffer);
}

void UndefinedHeader_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	// we assume that we are decoding one field at once 
@@ -2022,6 +2485,16 @@ void UndefinedHeader_List::PreDecode (Buffer& buffer) throw (DecodeError)
	SetHypAppend (1);
}

void UndefinedHeader::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csColon;
	csColon.SetValue(": ");

	if(field_id == id_headerName) {
		csColon.Encode(buffer);
	}
}

void UndefinedHeader::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_header_name ("^" SIPREG_TOKEN);
@@ -2060,6 +2533,23 @@ void CallId::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void CSeq::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csWS;
	csWS.SetValue(" ");
	
	switch(field_id) {
	case id_method:
		csWS.Encode(buffer);
		break;
	case id_seqNumber:
		Get_seqNumber().SetFormat(Integer::AsciiDecimal);
		break;
	default:
		break;
	}
}

void CSeq::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_method ("^" SIPREG_LWS "(" SIPREG_TOKEN ")");
@@ -2076,6 +2566,11 @@ void CSeq::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void ContentLength::PreEncode (Buffer& buffer) throw (EncodeError)
{
	Get_len().SetFormat(Integer::AsciiDecimal);
}

void ContentLength::PreDecode (Buffer& buffer) throw (DecodeError)
{
	Get_len().SetFormat(Integer::AsciiDecimal);
@@ -2179,6 +2674,16 @@ void MessageBody::PreDecode (Buffer& buffer) throw (DecodeError)
	SetHypChosenId (id_textplain);
}

void OptionTag_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void OptionTag_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
@@ -2215,6 +2720,16 @@ void OptionTag_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError
		SetHypSize (-2);
}

void RouteBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void RouteBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
@@ -2238,6 +2753,22 @@ void RouteBody::PreDecodeField(int id, Buffer& buffer) throw (DecodeError)
	}
}

void Timestamp::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csWS;
	csWS.SetValue(" ");
	
	switch(field_id) {
	case id_delay:
		if(IsPresent(id_delay)) {
			csWS.Encode(buffer);
		}
		break;
	default:
		break;
	}
}

void Timestamp::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_separator ("^" SIPREG_LWS);
@@ -2256,6 +2787,24 @@ void Timestamp::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void TimeValue::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csDot;
	csDot.SetValue(".");

	switch(field_id) {
	case id_majorDigit:
		Get_majorDigit().SetFormat(Integer::AsciiDecimal);
		break;
	case id_minorDigit:
		Get_minorDigit().SetFormat(Integer::AsciiDecimal);
		csDot.Encode(buffer);
		break;
	default:
		break;
	}
}

void TimeValue::PreDecode (Buffer& buffer) throw (DecodeError)
{
	Get_majorDigit().SetFormat(Integer::AsciiDecimal);
@@ -2278,6 +2827,16 @@ void TimeValue::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void WarningValue_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csComma;
	csComma.SetValue(",");

	if(field_id != 0) {
		csComma.Encode(buffer);
	}
}

void WarningValue_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
@@ -2292,6 +2851,21 @@ void WarningValue_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeEr
		SetHypSize (-2);
}

void WarningValue::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	Charstring csWS;
	csWS.SetValue(" ");

	switch(field_id) {
	case id_warnCode:
		Get_warnCode().SetFormat(Integer::AsciiDecimal);
		break;
	default:
		csWS.Encode(buffer);
		break;
	}
}

void WarningValue::PreDecode (Buffer& buffer) throw (DecodeError)
{
	Get_warnCode().SetFormat(Integer::AsciiDecimal);
@@ -2340,11 +2914,22 @@ void WarnAgent::PreDecode (Buffer& buffer) throw (DecodeError)
		SetHypChosenId (id_hostPort);
}

void RSeq::PreEncode (Buffer& buffer) throw (EncodeError)
{
	Get_responseNum().SetFormat(Integer::AsciiDecimal);
}

void RSeq::PreDecode (Buffer& buffer) throw (DecodeError)
{
	Get_responseNum().SetFormat(Integer::AsciiDecimal);
}

void RAck::PreEncode (Buffer& buffer) throw (EncodeError)
{
	Get_responseNum().SetFormat(Integer::AsciiDecimal);
	Get_seqNumber().SetFormat(Integer::AsciiDecimal);
}

void RAck::PreDecode (Buffer& buffer) throw (DecodeError)
{
	Get_responseNum().SetFormat(Integer::AsciiDecimal);
@@ -2746,6 +3331,11 @@ void MinSE::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void IntegerList::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
{
	GetField(field_id).SetFormat(Integer::AsciiDecimal);
}

void IntegerList::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	SetSize (GetSize() + 1);