Commit 68ba959b authored by urbant's avatar urbant
Browse files

decoding support for RFC 3327

parent 8021d4b4
Loading
Loading
Loading
Loading
+49 −0
Original line number Diff line number Diff line
@@ -754,6 +754,8 @@ private:
		SIP_HEADER_ADD (P-Media-Authorization,	,	pMediaAuthorization,	P_MEDIA_AUTHORIZATION_E);
		SIP_HEADER_ADD (Privacy,	,	privacy,	PRIVACY_E);
		SIP_HEADER_ADD (P-Asserted-Identity,	,	pAssertedID,	P_ASSERTED_ID_E);
		SIP_HEADER_ADD (P-Preferred-Identity,	,	pPreferredID,	P_PREFERRED_ID_E);
		SIP_HEADER_ADD (reason,		,	reason,		REASON_E);
		
		{
			mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, ""));
@@ -823,6 +825,8 @@ void MessageHeader::PreDecodeField (Buffer& buffer) throw (DecodeError)
			case id_allowEvents:
			case id_pMediaAuthorization:
			case id_pAssertedID:
			case id_pPreferredID:
			case id_reason:
			case id_undefinedHeader_List:
				// these fields can appear multiple times
				break;
@@ -2148,4 +2152,49 @@ void PAssertedIDValue_List::PostDecodeField (int id, Buffer& buffer) throw (Deco
		SetHypSize (-2);
}

void PPreferredIDValue_List::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
	SetHypAppend (1);
}

void PPreferredIDValue_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	if (detect_comma (buffer))
		SetHypSize (GetSize() + 1);
	else
		SetHypSize (-2);
}


void ReasonValue::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_token ("^" SIPREG_TOKEN);
	static Regex reg_separator ("^" SIPREG_SEMI);

	switch (id) { 
		case id_token:
			reg_token.AssertMatch (buffer, this);
			SetHypFieldLength (id, reg_token.GetMatchedLength());
			break;
		case id_reasonParams:
			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
			break;
	}
}

void ReasonValues::PreDecode (Buffer& buffer) throw (DecodeError)
{
	SetHypSize (GetSize() + 1);
	SetHypAppend (1);
}

void ReasonValues::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	if (detect_comma (buffer))
		SetHypSize (GetSize() + 1);
	else
		SetHypSize (-2);
}

}} // namespaces