Commit 1c78be4b authored by urbant's avatar urbant
Browse files

decoding support for RFC 5009

parent 255480f2
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
@@ -777,6 +777,8 @@ private:
		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);
		SIP_HEADER_ADD (P-Early-Media,			,	pEarlyMedia,		P_EARLY_MEDIA_E);
		SIP_HEADER_ADD (P-Asserted-Service,		,	pAssertedService,		P_ASSERTED_SERVICE_E);		
		{
			mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, ""));
			Entry& e = *mEntries.rbegin();
@@ -856,6 +858,7 @@ void MessageHeader::PreDecodeField (Buffer& buffer) throw (DecodeError)
			case id_pVisitedNetworkID:
			case id_acceptContact:
			case id_historyInfo:
			case id_pEarlyMedia:
			case id_undefinedHeader_List:
				// these fields can appear multiple times
				break;
@@ -2504,4 +2507,56 @@ void HistoryInfo_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeErr
		SetHypSize (-2);
}


void CharstringList::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) {
	static Regex reg_token ("^" SIPREG_TOKEN);
	if (GetSize() == 0)
		reg_token.AssertMatch(buffer, this);
	else if (!reg_token.Match(buffer)) {
		SetHypSize(-2);
		return;
	}
	SetHypFieldLength(reg_token.GetMatchedLength());
}

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

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

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

	switch (id) {
		case id_em_param: 
			if (reg_token.Match (buffer) || Get_em_param().GetSize() > 0) {				
				SetHypFieldIsPresent (id, 1);
			} else
				SetHypFieldIsPresent (id, 0);
			break;
	}
}

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

	switch (id) {
		case id_pAssertedServiceValue: 
			reg_token.AssertMatch (buffer, this);
			SetHypFieldLength(id, reg_token.GetMatchedLength());
			break;
	}
}

}} // namespaces