public static SIPUserField ParseSIPUserField(string userFieldStr)
{
if (userFieldStr.IsNullOrBlank())
{
throw new ArgumentException("A SIPUserField cannot be parsed from an empty string.");
}
SIPUserField userField = new SIPUserField();
string trimUserField = userFieldStr.Trim();
int position = trimUserField.IndexOf('<');
if (position == -1)
{
// Treat the field as a URI only, except that all parameters are Header parameters and not URI parameters
// (RFC3261 section 20.39 which refers to 20.10 for parsing rules).
string uriStr = trimUserField;
int paramDelimPosn = trimUserField.IndexOf(PARAM_TAG_DELIMITER);
if (paramDelimPosn != -1)
{
string paramStr = trimUserField.Substring(paramDelimPosn + 1).Trim();
userField.Parameters = new SIPParameters(paramStr, PARAM_TAG_DELIMITER);
uriStr = trimUserField.Substring(0, paramDelimPosn);
}
userField.URI = SIPURI.ParseSIPURI(uriStr);
}
else
{
if (position > 0)
{
userField.Name = trimUserField.Substring(0, position).Trim().Trim('"');
trimUserField = trimUserField.Substring(position, trimUserField.Length - position);
}
int addrSpecLen = trimUserField.Length;
position = trimUserField.IndexOf('>');
if (position != -1)
{
addrSpecLen = trimUserField.Length - 1;
if (position != -1)
{
addrSpecLen = position - 1;
string paramStr = trimUserField.Substring(position + 1).Trim();
userField.Parameters = new SIPParameters(paramStr, PARAM_TAG_DELIMITER);
}
string addrSpec = trimUserField.Substring(1, addrSpecLen);
userField.URI = SIPURI.ParseSIPURI(addrSpec);
}
else
{
throw new SIPValidationException(SIPValidationFieldsEnum.ContactHeader, "A SIPUserField was missing the right quote, " + userFieldStr + ".");
}
}
return userField;
}