1 // Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
2 
3 using System;
4 using System.Collections.Generic;
5 using System.Net.Http.Headers;
6 
7 namespace Microsoft.TestCommon
8 {
9     public class MediaTypeHeaderValueComparer : IComparer<MediaTypeHeaderValue>
10     {
11         private static readonly MediaTypeHeaderValueComparer mediaTypeComparer = new MediaTypeHeaderValueComparer();
12 
MediaTypeHeaderValueComparer()13         public MediaTypeHeaderValueComparer()
14         {
15         }
16 
17         public static MediaTypeHeaderValueComparer Comparer
18         {
19             get
20             {
21                 return mediaTypeComparer;
22             }
23         }
24 
Compare(MediaTypeHeaderValue mediaType1, MediaTypeHeaderValue mediaType2)25         public int Compare(MediaTypeHeaderValue mediaType1, MediaTypeHeaderValue mediaType2)
26         {
27             ParsedMediaTypeHeaderValue parsedMediaType1 = new ParsedMediaTypeHeaderValue(mediaType1);
28             ParsedMediaTypeHeaderValue parsedMediaType2 = new ParsedMediaTypeHeaderValue(mediaType2);
29 
30             int returnValue = CompareBasedOnQualityFactor(parsedMediaType1, parsedMediaType2);
31 
32             if (returnValue == 0)
33             {
34                 if (!String.Equals(parsedMediaType1.Type, parsedMediaType2.Type, StringComparison.OrdinalIgnoreCase))
35                 {
36                     if (parsedMediaType1.IsAllMediaRange)
37                     {
38                         return 1;
39                     }
40                     else if (parsedMediaType2.IsAllMediaRange)
41                     {
42                         return -1;
43                     }
44                 }
45                 else if (!String.Equals(parsedMediaType1.SubType, parsedMediaType2.SubType, StringComparison.OrdinalIgnoreCase))
46                 {
47                     if (parsedMediaType1.IsSubTypeMediaRange)
48                     {
49                         return 1;
50                     }
51                     else if (parsedMediaType2.IsSubTypeMediaRange)
52                     {
53                         return -1;
54                     }
55                 }
56                 else
57                 {
58                     if (!parsedMediaType1.HasNonQualityFactorParameter)
59                     {
60                         if (parsedMediaType2.HasNonQualityFactorParameter)
61                         {
62                             return 1;
63                         }
64                     }
65                     else if (!parsedMediaType2.HasNonQualityFactorParameter)
66                     {
67                         return -1;
68                     }
69                 }
70             }
71 
72             return returnValue;
73         }
74 
CompareBasedOnQualityFactor(ParsedMediaTypeHeaderValue parsedMediaType1, ParsedMediaTypeHeaderValue parsedMediaType2)75         private static int CompareBasedOnQualityFactor(ParsedMediaTypeHeaderValue parsedMediaType1, ParsedMediaTypeHeaderValue parsedMediaType2)
76         {
77             double qualityDifference = parsedMediaType1.QualityFactor - parsedMediaType2.QualityFactor;
78             if (qualityDifference < 0)
79             {
80                 return 1;
81             }
82             else if (qualityDifference > 0)
83             {
84                 return -1;
85             }
86 
87             return 0;
88         }
89     }
90 }