Commit 85ae46ce authored by urbant's avatar urbant
Browse files

Addr_Union updated

parent cb03e655
Loading
Loading
Loading
Loading
+52 −17
Original line number Diff line number Diff line
@@ -73,14 +73,18 @@ public:

private:
	const char*	mSource;

	boost::regex	mRegex;
	iterator	mStart, mStop;
	boost::match_results<iterator>	mResults;
};

//WSP: space, htab, vtab, form feed
#define SIPCHARS_WSP		" \t\v\f"
#define SIPREG_LWS		"([" SIPCHARS_WSP "]*\\r\\n)?[" SIPCHARS_WSP "]+"
#define SIPREG_SWS		"(" SIPREG_LWS ")?"

void remove_whitespace (Buffer & buffer) {
	static Regex reg_ws ("[ \t\r\n\f\v]+");
	static Regex reg_ws ("^" SIPREG_LWS);
	if (reg_ws.Match (buffer)) {
		int nPos = buffer.GetPosition() + reg_ws.GetMatchedLength();
		buffer.SetPosition (nPos);
@@ -104,13 +108,11 @@ void read_sp (Buffer & buffer, Variable* v) {
#define SIPCHARS_UNRESERVED	SIPCHARS_ALFANUM SIPCHARS_MARK
#define SIPCHARS_RESERVED	";/?:@&=+$,"
#define SIPCHARS_USER_UNRESERVED "&=+$,;?/"
#define SIPCHARS_UTF8_NONASCII	"\xC0-\xFD"
#define SIPCHARS_UTF8_CONTENT	"\x80-\xBF"
#define SIPCHARS_UTF8_NONASCII	"\x80-\xFD"
#define SIPREG_ESCAPED	"(%[0-9A-Fa-f]{2})"
#define SIPREG_TOKEN "[" SIPCHARS_ALFANUM ".!%*_+`'~\\-]+"

//FIXME: WSP is not clearly defined (all whitespaces) 
#define SIPCHARS_WSP		" 	"


// sip version
#define SIPREG_SIP_VERSION "SIP/[0-9]\\.[0-9]"
@@ -120,11 +122,12 @@ void read_sp (Buffer & buffer, Variable* v) {
#define SIPREG_DOMAINLABEL	"[" SIPCHARS_ALFANUM "]([" SIPCHARS_ALFANUM "\\-]*[" SIPCHARS_ALFANUM "])?"
#define SIPREG_HOSTNAME	"(" SIPREG_DOMAINLABEL "\\.)*" SIPREG_TOPLABEL "\\.?"


#define SIPREG_LWS		"(?:[" SIPCHARS_WSP "]*\r\n)?[" SIPCHARS_WSP "]+"
#define SIPREG_SWS		"(?:" SIPREG_LWS ")?"
#define SIPREG_HCOLON		"[ 	]*:" SIPREG_SWS

// without leading and trailing whitespace
#define SIPREG_QUOTED_STRING	"[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|([\\x5C][\"\\x5C]))*[\"]"
#define SIPREG_DISPLAY_NAME "((" SIPREG_TOKEN "(" SIPREG_LWS SIPREG_TOKEN ")*)|(" SIPREG_QUOTED_STRING "))"

// IPv4
#define SIPREG_IP4	"([0-9]{1,3}\\.){3}[0-9]{1,3}"

@@ -472,7 +475,7 @@ void StatusLine::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_sip_version (SIPREG_SIP_VERSION);
	static Regex reg_status_code ("^[0-9]{3}");
	static Regex reg_phrase ("([" SIPCHARS_RESERVED SIPCHARS_UNRESERVED SIPCHARS_UTF8_NONASCII SIPCHARS_UTF8_CONTENT " \t]|" SIPREG_ESCAPED ")*");
	static Regex reg_phrase ("([" SIPCHARS_RESERVED SIPCHARS_UNRESERVED SIPCHARS_UTF8_NONASCII " \t]|" SIPREG_ESCAPED ")*");

	switch (id) {
		case id_sipVersion:
@@ -701,19 +704,17 @@ void FieldName::Decode (Buffer& buffer) throw (DecodeError)

void Addr_Union::PreDecode (Buffer& buffer) throw (DecodeError)
{
	static Regex reg_scheme ("^[A-Za-z][A-Za-z0-9]*:");

	static Regex reg_name_addr ("^" SIPREG_DISPLAY_NAME SIPREG_SWS "<[^\\r\\n]*>");
	SetHypChosenId (
		reg_scheme.Match (buffer)
			? id_addrSpecUnion
			: id_nameAddr
		reg_name_addr.Match (buffer)
			? id_nameAddr
			: id_addrSpecUnion
	);
}

void From::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_semicolon ("^;");

	if (id == id_fromParams) {
		if(reg_semicolon.Match(buffer)) {
			Unsigned(8).Decode(buffer);
@@ -722,7 +723,42 @@ void From::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
			SetHypFieldIsPresent (id, 0);
		}
	}
}

void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME);
	static Regex reg_laquot = ("^<");
	static Regex reg_uri = ("^[^\\r\\n]+");

	remove_whitespace(buffer);
	switch (id){
		case id_displayName:
			if (reg_display_name.Match(buffer)) {
				SetHypFieldIsPresent (id, 1);
				SetHypFieldLength (id, reg_display_name.GetMatchedLength());
			} else {
				SetHypFieldIsPresent (id, 0);
			}
			break;
		case id_addrSpec:
			reg_laquot.AssertMatch (buffer, this);
			buffer.SetPosition(buffer.GetPosition() + 8);
			reg_uri.AssertMatch(buffer, this);
			SetHypFieldLength (id, reg_uri.GetMatchedLength());
			break;
	}
}

void NameAddr::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_raquot ("^>");
	if (id == id_addrSpec)
	{
		reg_raquot.AssertMatch (buffer, this);
		buffer.SetPosition(buffer.GetPosition() + 8);
		remove_whitespace(buffer);
	}
}

void SentProtocol::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
@@ -800,5 +836,4 @@ void UndefinedHeader::PreDecodeField (int id, Buffer& buffer) throw (DecodeError
	}
}


}} // namespaces