// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+using System.Collections.Generic;
+
namespace System.Net.Http.Headers
{
public class ProductInfoHeaderValue : ICloneable
{
public ProductInfoHeaderValue (ProductHeaderValue product)
{
+ if (product == null)
+ throw new ArgumentNullException ();
+
Product = product;
}
public ProductInfoHeaderValue (string comment)
{
+ Parser.Token.CheckComment (comment);
Comment = comment;
}
Product = new ProductHeaderValue (productName, productVersion);
}
+ private ProductInfoHeaderValue ()
+ {
+ }
+
public string Comment { get; private set; }
public ProductHeaderValue Product { get; private set; }
public static bool TryParse (string input, out ProductInfoHeaderValue parsedValue)
{
- throw new NotImplementedException ();
+ parsedValue = null;
+
+ var lexer = new Lexer (input);
+ if (!TryParseElement (lexer, out parsedValue) || parsedValue == null)
+ return false;
+
+ if (lexer.Scan () != Token.Type.End) {
+ parsedValue = null;
+ return false;
+ }
+
+ return true;
+ }
+
+ internal static bool TryParse (string input, int minimalCount, out List<ProductInfoHeaderValue> result)
+ {
+ var list = new List<ProductInfoHeaderValue> ();
+ var lexer = new Lexer (input);
+ result = null;
+
+ while (true) {
+ ProductInfoHeaderValue element;
+ if (!TryParseElement (lexer, out element))
+ return false;
+
+ if (element == null) {
+ if (list != null && minimalCount <= list.Count) {
+ result = list;
+ return true;
+ }
+
+ return false;
+ }
+
+ list.Add (element);
+ }
+ }
+
+ static bool TryParseElement (Lexer lexer, out ProductInfoHeaderValue parsedValue)
+ {
+ string comment;
+ parsedValue = null;
+ Token t;
+
+ if (lexer.ScanCommentOptional (out comment, out t)) {
+ if (comment == null)
+ return false;
+
+ parsedValue = new ProductInfoHeaderValue ();
+ parsedValue.Comment = comment;
+ return true;
+ }
+
+ if (t == Token.Type.End)
+ return true;
+
+ if (t != Token.Type.Token)
+ return false;
+
+ var value = new ProductHeaderValue ();
+ value.Name = lexer.GetStringValue (t);
+
+ t = lexer.Scan ();
+ if (t == Token.Type.SeparatorSlash) {
+ t = lexer.Scan ();
+ if (t != Token.Type.Token)
+ return false;
+
+ value.Version = lexer.GetStringValue (t);
+ }
+
+ parsedValue = new ProductInfoHeaderValue (value);
+ return true;
+ }
+
+ public override string ToString ()
+ {
+ if (Product == null)
+ return Comment;
+
+ return Product.ToString ();
}
}
}