PageRenderTime 72ms CodeModel.GetById 36ms RepoModel.GetById 1ms app.codeStats 0ms

/ThirdParty/Src/Lumisoft.Net/SIP/Message/SIP_t_AcceptRange.cs

https://github.com/csmaster2005/inbox2_desktop
C# | 232 lines | 139 code | 31 blank | 62 comment | 28 complexity | 70668f701ae90c376cbe4bf4d81d9601 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.Text;
  5. namespace LumiSoft.Net.SIP.Message
  6. {
  7. /// <summary>
  8. /// Implements SIP "accept-range" value. Defined in RFC 3261.
  9. /// </summary>
  10. /// <remarks>
  11. /// <code>
  12. /// RFC 3261 Syntax:
  13. /// accept-range = media-range [ accept-params ]
  14. /// media-range = ("*//*" / (m-type SLASH "*") / (m-type SLASH m-subtype)) *(SEMI m-parameter)
  15. /// accept-params = SEMI "q" EQUAL qvalue *(SEMI generic-param)
  16. /// </code>
  17. /// </remarks>
  18. public class SIP_t_AcceptRange : SIP_t_Value
  19. {
  20. private string m_MediaType = "";
  21. private SIP_ParameterCollection m_pMediaParameters = null;
  22. private SIP_ParameterCollection m_pParameters = null;
  23. /// <summary>
  24. /// Default constructor.
  25. /// </summary>
  26. public SIP_t_AcceptRange()
  27. {
  28. m_pMediaParameters = new SIP_ParameterCollection();
  29. m_pParameters = new SIP_ParameterCollection();
  30. }
  31. #region method Parse
  32. /// <summary>
  33. /// Parses "accept-range" from specified value.
  34. /// </summary>
  35. /// <param name="value">SIP "accept-range" value.</param>
  36. /// <exception cref="ArgumentNullException">Raised when <b>value</b> is null.</exception>
  37. /// <exception cref="SIP_ParseException">Raised when invalid SIP message.</exception>
  38. public void Parse(string value)
  39. {
  40. if(value == null){
  41. throw new ArgumentNullException("value");
  42. }
  43. Parse(new StringReader(value));
  44. }
  45. /// <summary>
  46. /// Parses "accept-range" from specified reader.
  47. /// </summary>
  48. /// <param name="reader">Reader from where to parse.</param>
  49. /// <exception cref="ArgumentNullException">Raised when <b>reader</b> is null.</exception>
  50. /// <exception cref="SIP_ParseException">Raised when invalid SIP message.</exception>
  51. public override void Parse(StringReader reader)
  52. {
  53. /*
  54. accept-range = media-range [ accept-params ]
  55. media-range = ("*//*" / (m-type SLASH "*") / (m-type SLASH m-subtype)) *(SEMI m-parameter)
  56. accept-params = SEMI "q" EQUAL qvalue *(SEMI generic-param)
  57. */
  58. if(reader == null){
  59. throw new ArgumentNullException("reader");
  60. }
  61. // Parse m-type
  62. string word = reader.ReadWord();
  63. if(word == null){
  64. throw new SIP_ParseException("Invalid 'accept-range' value, m-type is missing !");
  65. }
  66. this.MediaType = word;
  67. // Parse media and accept parameters !!! thats confusing part, RFC invalid.
  68. bool media_accept = true;
  69. while(reader.Available > 0){
  70. reader.ReadToFirstChar();
  71. // We have 'next' value, so we are done here.
  72. if(reader.SourceString.StartsWith(",")){
  73. break;
  74. }
  75. // We have parameter
  76. else if(reader.SourceString.StartsWith(";")){
  77. reader.ReadSpecifiedLength(1);
  78. string paramString = reader.QuotedReadToDelimiter(new char[]{';',','},false);
  79. if(paramString != ""){
  80. string[] name_value = paramString.Split(new char[]{'='},2);
  81. string name = name_value[0].Trim();
  82. string value = "";
  83. if(name_value.Length == 2){
  84. value = name_value[1];
  85. }
  86. // If q, then accept parameters begin
  87. if(name.ToLower() == "q"){
  88. media_accept = false;
  89. }
  90. if(media_accept){
  91. this.MediaParameters.Add(name,value);
  92. }
  93. else{
  94. this.Parameters.Add(name,value);
  95. }
  96. }
  97. }
  98. // Unknown data
  99. else{
  100. throw new SIP_ParseException("SIP_t_AcceptRange unexpected prarameter value !");
  101. }
  102. }
  103. }
  104. #endregion
  105. #region method ToStringValue
  106. /// <summary>
  107. /// Converts this to valid "accept-range" value.
  108. /// </summary>
  109. /// <returns>Returns "accept-range" value.</returns>
  110. public override string ToStringValue()
  111. {
  112. /*
  113. Accept = "Accept" HCOLON [ accept-range *(COMMA accept-range) ]
  114. accept-range = media-range [ accept-params ]
  115. media-range = ("*//*" / (m-type SLASH "*") / (m-type SLASH m-subtype)) *(SEMI m-parameter)
  116. accept-params = SEMI "q" EQUAL qvalue *(SEMI generic-param)
  117. */
  118. StringBuilder retVal = new StringBuilder();
  119. retVal.Append(m_MediaType);
  120. foreach(SIP_Parameter parameter in m_pMediaParameters){
  121. if(parameter.Value != null){
  122. retVal.Append(";" + parameter.Name + "=" + parameter.Value);
  123. }
  124. else{
  125. retVal.Append(";" + parameter.Name);
  126. }
  127. }
  128. foreach(SIP_Parameter parameter in m_pParameters){
  129. if(parameter.Value != null){
  130. retVal.Append(";" + parameter.Name + "=" + parameter.Value);
  131. }
  132. else{
  133. retVal.Append(";" + parameter.Name);
  134. }
  135. }
  136. return retVal.ToString();
  137. }
  138. #endregion
  139. #region Properties Implementation
  140. /// <summary>
  141. /// Gets or sets media type. Value *(STAR) means all values. Syntax: mediaType / mediaSubType.
  142. /// Examples: */*,video/*,text/html.
  143. /// </summary>
  144. public string MediaType
  145. {
  146. get{ return m_MediaType; }
  147. set{
  148. if(string.IsNullOrEmpty(value)){
  149. throw new ArgumentException("Property MediaType value can't be null or empty !");
  150. }
  151. if(value.IndexOf('/') == -1){
  152. throw new ArgumentException("Invalid roperty MediaType value, syntax: mediaType / mediaSubType !");
  153. }
  154. m_MediaType = value;
  155. }
  156. }
  157. /// <summary>
  158. /// Gets media parameters collection.
  159. /// </summary>
  160. /// <returns></returns>
  161. public SIP_ParameterCollection MediaParameters
  162. {
  163. get{ return m_pMediaParameters; }
  164. }
  165. /// <summary>
  166. /// Gets accept value parameters.
  167. /// </summary>
  168. public SIP_ParameterCollection Parameters
  169. {
  170. get{ return m_pParameters; }
  171. }
  172. /// <summary>
  173. /// Gets or sets qvalue parameter. Targets are processed from highest qvalue to lowest.
  174. /// This value must be between 0.0 and 1.0. Value -1 means that value not specified.
  175. /// </summary>
  176. public double QValue
  177. {
  178. get{
  179. SIP_Parameter parameter = this.Parameters["qvalue"];
  180. if(parameter != null){
  181. return Convert.ToDouble(parameter.Value);
  182. }
  183. else{
  184. return -1;
  185. }
  186. }
  187. set{
  188. if(value < 0 || value > 1){
  189. throw new ArgumentException("Property QValue value must be between 0.0 and 1.0 !");
  190. }
  191. if(value < 0){
  192. this.Parameters.Remove("qvalue");
  193. }
  194. else{
  195. this.Parameters.Set("qvalue",value.ToString());
  196. }
  197. }
  198. }
  199. #endregion
  200. }
  201. }