Commit 220cc3e5 authored by urbant's avatar urbant
Browse files

decoding support for RFC 4244

parent 98f55930
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -776,6 +776,7 @@ private:
		SIP_HEADER_ADD (Referred-By,	b,	referredBy,	REFERRED_BY_E);
		SIP_HEADER_ADD (Session-Expires,		,	sessionExpires,		SESSION_EXPIRES_E);
		SIP_HEADER_ADD (Min-SE,		,	minSE,		MIN_SE_E);
		SIP_HEADER_ADD (History-Info,			,	historyInfo,		HISTORY_INFO_E);
		{
			mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, ""));
			Entry& e = *mEntries.rbegin();
@@ -854,6 +855,7 @@ void MessageHeader::PreDecodeField (Buffer& buffer) throw (DecodeError)
			case id_pCalledPartyID:
			case id_pVisitedNetworkID:
			case id_acceptContact:
			case id_historyInfo:
			case id_undefinedHeader_List:
				// these fields can appear multiple times
				break;
@@ -2453,4 +2455,53 @@ void MinSE::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void IntegerList::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	SetSize (GetSize() + 1);
	GetField(id).SetFormat(Integer::AsciiDecimal);
}

void IntegerList::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	Regex reg_dot ("^[\\x2E]");

	if (detect_separator(reg_dot, buffer))
		SetHypSize (GetSize() + 1);
	else
		SetHypSize (-2);
}

void HistoryInfoEntry::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_index ("^" SIPREG_SEMI "[Ii][Nn][Dd][Ee][Xx][=]");
	static Regex reg_separator ("^" SIPREG_SEMI);

	switch (id) {
		case id_hiIndex: 
			if (reg_index.Match (buffer)) {				
				reg_index.MovePast (buffer);
				SetHypFieldIsPresent (id, 1);
			} else
				SetHypFieldIsPresent (id, 0);
			break;
		case id_hiExtention:
			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
			break;
	}
}

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

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

}} // namespaces