Merge pull request #900 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mcs / class / System.Net.Http / System.Net.Http.Headers / ProductInfoHeaderValue.cs
index 03bef5e3b759b9fe6e84cbc56e559b41440b039a..baace53ed8e9c1d8098ab24653473c5fdf2eda1f 100644 (file)
 // 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;
                }
 
@@ -45,6 +51,10 @@ namespace System.Net.Http.Headers
                        Product = new ProductHeaderValue (productName, productVersion);
                }
 
+               private ProductInfoHeaderValue ()
+               {
+               }
+
                public string Comment { get; private set; }
                public ProductHeaderValue Product { get; private set; }
 
@@ -82,7 +92,87 @@ namespace System.Net.Http.Headers
                
                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 ();
                }
        }
 }