Commit 0e57d1c3 authored by urbant's avatar urbant
Browse files

decoding support for RFC 3329

parent 5d82857e
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -757,6 +757,9 @@ private:
		SIP_HEADER_ADD (P-Preferred-Identity,	,	pPreferredID,	P_PREFERRED_ID_E);
		SIP_HEADER_ADD (Reason,		,	reason,		REASON_E);
		SIP_HEADER_ADD (Path,		,	path,		PATH_E);
		SIP_HEADER_ADD (Security-Client,		,	securityClient,		SECURITY_CLIENT_E);
		SIP_HEADER_ADD (Security-Server,		,	securityServer,		SECURITY_SERVER_E);
		SIP_HEADER_ADD (Security-Verify,		,	securityVerify,		SECURITY_VERIFY_E);
		{
			mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, ""));
			Entry& e = *mEntries.rbegin();
@@ -828,6 +831,9 @@ void MessageHeader::PreDecodeField (Buffer& buffer) throw (DecodeError)
			case id_pPreferredID:
			case id_reason:
			case id_path:
			case id_securityClient:
			case id_securityServer:
			case id_securityVerify:
			case id_undefinedHeader_List:
				// these fields can appear multiple times
				break;
@@ -2223,4 +2229,34 @@ void PathValues::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
		SetHypSize (-2);
}

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

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

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

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

}} // namespaces