Commit c70a13e0 authored by urbant's avatar urbant
Browse files

decoder support for the accept field

parent 85b0ffa3
Loading
Loading
Loading
Loading
+48 −3
Original line number Diff line number Diff line
@@ -141,6 +141,8 @@ bool is_tel_scheme (const char * pszScheme) {
#define SIPREG_HOSTNAME	"(" SIPREG_DOMAINLABEL "\\.)*" SIPREG_TOPLABEL "\\.?"

#define SIPREG_HCOLON		"[ 	]*:" SIPREG_SWS
#define SIPREG_COMMA		SIPREG_SWS "[,]" SIPREG_SWS
#define SIPREG_SEMI			SIPREG_SWS "[;]" SIPREG_SWS

// without leading and trailing whitespace
#define SIPREG_QUOTED_STRING	"[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|([\\x5C][\"\\x5C]))*[\"]"
@@ -335,11 +337,11 @@ void HostPort::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)

void SemicolonParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_separator ("^;");
	static Regex reg_separator ("^" SIPREG_SEMI);
	if (!buffer.GetBitsLeft())
		return;
	if (reg_separator.Match(buffer))
		buffer.SetPosition(buffer.GetPosition() + 8);
		buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength());
	else
		SetHypSize(-2);
}
@@ -805,7 +807,7 @@ void ContactBody::PreDecode (Buffer& buffer) throw (DecodeError)

void ContactAddress_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_separator ("^" SIPREG_SWS "[,]" SIPREG_SWS);
	static Regex reg_separator ("^" SIPREG_COMMA);

	if (!buffer.GetBitsLeft())
		return;
@@ -853,6 +855,49 @@ void To::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	}
}

void Accept::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
	static Regex reg_accept_args ("^[^;,\\r\\n]+");
	if (id == id_acceptArgs){
		if(reg_accept_args.Match(buffer)) {
			SetHypFieldIsPresent (id, 1);
		} else {
			SetHypFieldIsPresent (id, 0);
		}
	}
}

void AcceptBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_media_range ("^[^;,\\r\\n]+");
	static Regex reg_semicolon ("^;");
	switch (id){
		case id_mediaRange:
			reg_media_range.AssertMatch (buffer, this);
			SetHypFieldLength(id, reg_media_range.GetMatchedLength());
			break;
		case id_acceptParam:
			if (reg_semicolon.Match (buffer)) {
				SetHypFieldIsPresent(id, 1);
			} else {
				SetHypFieldIsPresent(id, 0);
			}
	}
}

void AcceptBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_separator ("^" SIPREG_COMMA);

	if (!buffer.GetBitsLeft())
		return;
	if (GetSize() == 0)
		return; // at least one element must be present
	else if (reg_separator.Match(buffer))
		buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength());
	else
		SetHypSize(-2);
}

void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME);