1 //-----------------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //-----------------------------------------------------------------------------
4 namespace System.ServiceModel.ComIntegration
5 {
6     using System;
7     using System.Collections.Generic;
8     using System.Threading;
9     using System.Text;
10 
11     internal static class MonikerUtility
12     {
Getkeyword(string moniker, out MonikerHelper.MonikerAttribute keyword)13         internal static string Getkeyword(string moniker, out MonikerHelper.MonikerAttribute keyword)
14         {
15             moniker = moniker.TrimStart();
16             int indexOfEqualSign = moniker.IndexOf("=", StringComparison.Ordinal);
17             if (indexOfEqualSign == -1)
18                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.NoEqualSignFound, moniker)));
19 
20             int indexOfComma = moniker.IndexOf(",", StringComparison.Ordinal);
21 
22             if (indexOfComma != -1 && indexOfComma < indexOfEqualSign)
23                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.NoEqualSignFound, moniker)));
24 
25             string suspectedKeyword = moniker.Substring(0, indexOfEqualSign).Trim();
26             suspectedKeyword = suspectedKeyword.ToLower(System.Globalization.CultureInfo.InvariantCulture);
27 
28             foreach (MonikerHelper.KeywordInfo keywordInfo in MonikerHelper.KeywordInfo.KeywordCollection)
29             {
30                 if (suspectedKeyword == keywordInfo.Name)
31                 {
32                     keyword = keywordInfo.Attrib;
33                     moniker = moniker.Substring(indexOfEqualSign + 1).TrimStart();
34                     return moniker;
35                 }
36             }
37             throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.UnknownMonikerKeyword, suspectedKeyword)));
38         }
GetValue(string moniker, out string val)39         internal static string GetValue(string moniker, out string val)
40         {
41             StringBuilder value = new StringBuilder();
42             int index = 0;
43             moniker = moniker.Trim();
44             if (string.IsNullOrEmpty(moniker))
45                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.KewordMissingValue)));
46             switch (moniker[index])
47             {
48                 case '"':
49                 case '\'':
50                     {
51                         char quoteToCompare = moniker[index];
52                         index++;
53 
54                         for (; index < moniker.Length; index++)
55                         {
56 
57                             if (moniker[index] == quoteToCompare)
58                             {
59 
60                                 if ((index < (moniker.Length - 1)) && (moniker[index + 1] == quoteToCompare))
61                                 {
62                                     value.Append(quoteToCompare);
63                                     index++;
64                                 }
65                                 else
66                                 {
67                                     break;
68                                 }
69                             }
70                             else
71                                 value.Append(moniker[index]);
72 
73                         }
74                         if (index < moniker.Length)
75                         {
76                             index++;
77                             if (index < moniker.Length)
78                             {
79                                 moniker = moniker.Substring(index);
80                                 moniker = moniker.Trim();
81 
82                                 if (!String.IsNullOrEmpty(moniker))
83                                 {
84                                     if (moniker[0] == ',')
85                                     {
86                                         moniker = moniker.Substring(1);
87                                         moniker = moniker.Trim();
88                                     }
89                                     else
90                                         throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.BadlyTerminatedValue, value.ToString())));
91                                 }
92 
93 
94                             }
95                             else
96                                 moniker = "";
97 
98 
99                         }
100                         else
101                             throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.MissingQuote, value.ToString())));
102 
103                         break;
104                     }
105                 default:
106                     {
107                         for (; (index < moniker.Length) && (moniker[index] != ','); index++)
108                             value.Append(moniker[index]);
109                         if (index < moniker.Length)
110                         {
111                             index++;
112                             if (index < moniker.Length)
113                             {
114                                 moniker = moniker.Substring(index);
115                                 moniker = moniker.Trim();
116                             }
117 
118                         }
119                         else
120                             moniker = "";
121 
122                         break;
123                     }
124             }
125             val = value.ToString().Trim();
126             return moniker;
127         }
Parse(string displayName, ref Dictionary<MonikerHelper.MonikerAttribute, string> propertyTable)128         internal static void Parse(string displayName, ref Dictionary<MonikerHelper.MonikerAttribute, string> propertyTable)
129         {
130             int indexOfMonikerData = displayName.IndexOf(":", StringComparison.Ordinal);
131             if (indexOfMonikerData == -1)
132                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.MonikerMissingColon)));
133             string monikerParams = displayName.Substring(indexOfMonikerData + 1).Trim();
134             MonikerHelper.MonikerAttribute keyword;
135             string value;
136 
137             while (!string.IsNullOrEmpty(monikerParams))
138             {
139                 monikerParams = Getkeyword(monikerParams, out keyword);
140                 propertyTable.TryGetValue(keyword, out value);
141                 if (!String.IsNullOrEmpty(value))
142                     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.RepeatedKeyword)));
143                 monikerParams = GetValue(monikerParams, out value);
144                 propertyTable[keyword] = value;
145             }
146         }
147     }
148 }
149