private void RecursivelyExtractSemanticValue(IntPtr phraseBuffer, int semanticsOffset, SemanticValue semanticValue, IList <RecognizedWordUnit> words, bool isSapi53Header, GrammarOptions semanticTag) { IntPtr ptr = new IntPtr((long)phraseBuffer + semanticsOffset); SPSERIALIZEDPHRASEPROPERTY sPSERIALIZEDPHRASEPROPERTY = (SPSERIALIZEDPHRASEPROPERTY)Marshal.PtrToStructure(ptr, typeof(SPSERIALIZEDPHRASEPROPERTY)); string propertyName; SemanticValue semanticValue2 = ExtractSemanticValueInformation(semanticsOffset, sPSERIALIZEDPHRASEPROPERTY, phraseBuffer, isSapi53Header, out propertyName); if (propertyName == "_value" && semanticValue != null) { semanticValue.Value = semanticValue2.Value; if (sPSERIALIZEDPHRASEPROPERTY.pFirstChildOffset != 0) { semanticValue2 = semanticValue; } } else { InsertSemanticValueToDictionary(semanticValue, propertyName, semanticValue2, semanticTag, ref _dupItems); } if (sPSERIALIZEDPHRASEPROPERTY.pFirstChildOffset != 0) { RecursivelyExtractSemanticValue(phraseBuffer, (int)sPSERIALIZEDPHRASEPROPERTY.pFirstChildOffset, semanticValue2, words, isSapi53Header, semanticTag); } if (sPSERIALIZEDPHRASEPROPERTY.pNextSiblingOffset != 0) { RecursivelyExtractSemanticValue(phraseBuffer, (int)sPSERIALIZEDPHRASEPROPERTY.pNextSiblingOffset, semanticValue, words, isSapi53Header, semanticTag); } }
private static void RecursivelyExtractSemanticProperties(List <ResultPropertiesRef> propertyList, int semanticsOffset, IntPtr phraseBuffer, RuleNode ruleTree, IList <RecognizedWordUnit> words, bool isSapi53Header) { IntPtr ptr = new IntPtr((long)phraseBuffer + semanticsOffset); SPSERIALIZEDPHRASEPROPERTY sPSERIALIZEDPHRASEPROPERTY = (SPSERIALIZEDPHRASEPROPERTY)Marshal.PtrToStructure(ptr, typeof(SPSERIALIZEDPHRASEPROPERTY)); string propertyName; SemanticValue semanticValue = ExtractSemanticValueInformation(semanticsOffset, sPSERIALIZEDPHRASEPROPERTY, phraseBuffer, isSapi53Header, out propertyName); RuleNode ruleNode = ruleTree.Find(sPSERIALIZEDPHRASEPROPERTY.ulFirstElement, sPSERIALIZEDPHRASEPROPERTY.ulCountOfElements); if (propertyName == "SemanticKey") { ruleNode._name = (string)semanticValue.Value; ruleNode._hasName = true; } else { propertyList.Add(new ResultPropertiesRef(propertyName, semanticValue, ruleNode)); } if (sPSERIALIZEDPHRASEPROPERTY.pFirstChildOffset != 0) { RecursivelyExtractSemanticProperties(propertyList, (int)sPSERIALIZEDPHRASEPROPERTY.pFirstChildOffset, phraseBuffer, ruleTree, words, isSapi53Header); } if (sPSERIALIZEDPHRASEPROPERTY.pNextSiblingOffset != 0) { RecursivelyExtractSemanticProperties(propertyList, (int)sPSERIALIZEDPHRASEPROPERTY.pNextSiblingOffset, phraseBuffer, ruleTree, words, isSapi53Header); } }
private static SemanticValue ExtractSemanticValueInformation(int semanticsOffset, SPSERIALIZEDPHRASEPROPERTY property, IntPtr phraseBuffer, bool isSapi53Header, out string propertyName) { bool flag = false; if (property.pszNameOffset != 0) { IntPtr ptr = new IntPtr((long)phraseBuffer + (int)property.pszNameOffset); propertyName = Marshal.PtrToStringUni(ptr); } else { propertyName = property.ulId.ToString(CultureInfo.InvariantCulture); flag = true; } object obj; if (property.pszValueOffset != 0) { IntPtr ptr2 = new IntPtr((long)phraseBuffer + (int)property.pszValueOffset); obj = Marshal.PtrToStringUni(ptr2); if (!isSapi53Header && flag && ((string)obj).Contains("$")) { throw new NotSupportedException(SR.Get(SRID.NotSupportedWithThisVersionOfSAPI)); } } else if (property.SpVariantSubset >= 0) { IntPtr ptr3 = new IntPtr((long)phraseBuffer + semanticsOffset + 16); switch (property.vValue) { case 3: obj = Marshal.ReadInt32(ptr3); break; case 19: obj = Marshal.PtrToStructure(ptr3, typeof(uint)); break; case 20: obj = Marshal.ReadInt64(ptr3); break; case 21: obj = Marshal.PtrToStructure(ptr3, typeof(ulong)); break; case 4: obj = Marshal.PtrToStructure(ptr3, typeof(float)); break; case 5: obj = Marshal.PtrToStructure(ptr3, typeof(double)); break; case 11: obj = (Marshal.ReadByte(ptr3) != 0); break; case 0: obj = null; break; default: throw new NotSupportedException(SR.Get(SRID.UnhandledVariant)); } } else { obj = string.Empty; } return(new SemanticValue(propertyName, obj, property.SREngineConfidence)); }