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