// Pulls the required data out of a stream containing a cfg. // Stream must point to start of cfg on entry and is reset to same point on exit. private static string CheckRuleName(Stream stream, string rulename, bool isImportedGrammar, bool stgInit, out bool sapi53Only, out GrammarOptions grammarOptions) { sapi53Only = false; long initialPosition = stream.Position; CfgGrammar.CfgHeader header; using (StreamMarshaler streamHelper = new(stream)) // Use StreamMarshaler which helps deserialize certain data types { CfgGrammar.CfgSerializedHeader serializedHeader = null; header = CfgGrammar.ConvertCfgHeader(streamHelper, false, true, out serializedHeader); StringBlob symbols = header.pszSymbols; // Calc the root rule string rootRule = header.ulRootRuleIndex != 0xffffffff && header.ulRootRuleIndex < header.rules.Length ? symbols.FromOffset(header.rules[header.ulRootRuleIndex]._nameOffset) : null; // Get if we have semantic interpretation sapi53Only = (header.GrammarOptions & (GrammarOptions.MssV1 | GrammarOptions.W3cV1 | GrammarOptions.STG | GrammarOptions.IpaPhoneme)) != 0; // Check that the rule name is valid if (rootRule == null && string.IsNullOrEmpty(rulename)) { throw new ArgumentException(SR.Get(SRID.SapiErrorNoRulesToActivate)); } if (!string.IsNullOrEmpty(rulename)) { // Convert the CFG script reference to ScriptRef bool fFoundRule = false; foreach (CfgRule cfgRule in header.rules) { if (symbols.FromOffset(cfgRule._nameOffset) == rulename) { // Private rule are not allowed fFoundRule = cfgRule.Export || stgInit || (!isImportedGrammar ? cfgRule.TopLevel || rulename == rootRule : false); break; } } // check that the name exists if (!fFoundRule) { throw new ArgumentException(SR.Get(SRID.RecognizerRuleNotFoundStream, rulename)); } } else { rulename = rootRule; } grammarOptions = header.GrammarOptions & GrammarOptions.TagFormat; } stream.Position = initialPosition; return(rulename); }
private static string CheckRuleName(Stream stream, string rulename, bool isImportedGrammar, bool stgInit, out bool sapi53Only, out GrammarOptions grammarOptions) { sapi53Only = false; long position = stream.Position; using (StreamMarshaler streamHelper = new StreamMarshaler(stream)) { CfgGrammar.CfgSerializedHeader cfgSerializedHeader = null; CfgGrammar.CfgHeader cfgHeader = CfgGrammar.ConvertCfgHeader(streamHelper, false, true, out cfgSerializedHeader); StringBlob pszSymbols = cfgHeader.pszSymbols; string text = (cfgHeader.ulRootRuleIndex != uint.MaxValue && cfgHeader.ulRootRuleIndex < cfgHeader.rules.Length) ? pszSymbols.FromOffset(cfgHeader.rules[cfgHeader.ulRootRuleIndex]._nameOffset) : null; sapi53Only = ((cfgHeader.GrammarOptions & (GrammarOptions.MssV1 | GrammarOptions.IpaPhoneme | GrammarOptions.W3cV1 | GrammarOptions.STG)) != 0); if (text == null && string.IsNullOrEmpty(rulename)) { throw new ArgumentException(SR.Get(SRID.SapiErrorNoRulesToActivate)); } if (!string.IsNullOrEmpty(rulename)) { bool flag = false; CfgRule[] rules = cfgHeader.rules; for (int i = 0; i < rules.Length; i++) { CfgRule cfgRule = rules[i]; if (pszSymbols.FromOffset(cfgRule._nameOffset) == rulename) { flag = (cfgRule.Export || stgInit || (!isImportedGrammar && (cfgRule.TopLevel || rulename == text))); break; } } if (!flag) { throw new ArgumentException(SR.Get(SRID.RecognizerRuleNotFoundStream, rulename)); } } else { rulename = text; } grammarOptions = (cfgHeader.GrammarOptions & GrammarOptions.TagFormat); } stream.Position = position; return(rulename); }