Commit 51ae38d5 authored by urbant's avatar urbant
Browse files

decoding of accept-encoding (waiting for toolkit fix) and accept-language

parent c70a13e0
Loading
Loading
Loading
Loading
+78 −3
Original line number Diff line number Diff line
@@ -131,6 +131,7 @@ bool is_tel_scheme (const char * pszScheme) {
#define SIPREG_ESCAPED	"(%[0-9A-Fa-f]{2})"
#define SIPREG_TOKEN "[" SIPCHARS_ALFANUM ".!%*_+`'~\\-]+"
#define SIPREG_WORD "(?:[][" SIPCHARS_ALFANUM "\\-.!%*_+`'~()<>:\\\\\"/?{}])+"
#define SIPREG_ASCII_WITHOUT_COMMA "[\\x21-\\x2B\\x2D-\\x7E]+"

// sip version
#define SIPREG_SIP_VERSION "SIP/[0-9]\\.[0-9]"
@@ -640,6 +641,8 @@ private:
		SIP_HEADER_ADD (Content-Type,	c,	contentType,	CONTENT_TYPE_E);
		SIP_HEADER_ADD (Contact,	m,	contact,		CONTACT_E);
		SIP_HEADER_ADD (To,			t,	toField,		TO_E);
		SIP_HEADER_ADD (Accept-Encoding,	,	acceptEncoding,	ACCEPT_ENCODING_E);
		SIP_HEADER_ADD (Accept-Language,	,	acceptLanguage,	ACCEPT_LANGUAGE_E);
		{
			mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, ""));
			Entry& e = *mEntries.rbegin();
@@ -821,7 +824,7 @@ void ContactAddress_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeE

void ContactAddress::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_semicolon ("^;");
	static Regex reg_semicolon ("^" SIPREG_SEMI);
	if (id == id_contactParams) {
		if(reg_semicolon.Match(buffer)) {
			SetHypFieldIsPresent (id, 1);
@@ -868,8 +871,8 @@ void Accept::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){

void AcceptBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_media_range ("^[^;,\\r\\n]+");
	static Regex reg_semicolon ("^;");
	static Regex reg_media_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+");
	static Regex reg_semicolon ("^" SIPREG_SEMI);
	switch (id){
		case id_mediaRange:
			reg_media_range.AssertMatch (buffer, this);
@@ -898,6 +901,78 @@ void AcceptBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError
		SetHypSize(-2);
}

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

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

	if (!buffer.GetBitsLeft())
		return;
	bool bSeparated = reg_separator.Match(buffer);
	if (bSeparated)
		buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength());

	if (GetSize() == 0 || bSeparated) {
		reg_content.AssertMatch(buffer, this);
		SetHypLength(reg_content.GetMatchedLength());
	} else
		SetHypSize(-2);
}

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

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

void LanguageBody_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);