private StringIDNamespaceResolver LoadStringIDNamespaces(IReader reader) { if (_header.StringIDNamespaceCount > 1) { int[] namespaces = new int[_header.StringIDNamespaceCount]; reader.SeekTo(_header.StringIDNamespaceTable.Offset); for (int i = 0; i < namespaces.Length; i++) { namespaces[i] = reader.ReadInt32(); } //get layout info from formats var sidLayout = _buildInfo.StringIDs.IDLayout; var resolver = new StringIDNamespaceResolver(sidLayout); int indexMask = (1 << sidLayout.NamespaceStart) - 1; // register all but the first namespace as that needs the final count int counter = namespaces[0] & indexMask; for (int i = 1; i < namespaces.Length; i++) { resolver.RegisterSet(i, 0, counter); counter += namespaces[i] & indexMask; } resolver.RegisterSet(0, namespaces[0] & indexMask, counter); return(resolver); } else { return(null); } }
private static void ProcessSetElement(XElement element, StringIDNamespaceResolver resolver) { int id = (int)XMLUtil.GetNumericAttribute(element, "id"); int min = (int)XMLUtil.GetNumericAttribute(element, "min", 0); int globalIndex = (int)XMLUtil.GetNumericAttribute(element, "startIndex"); resolver.RegisterSet(id, min, globalIndex); }
private void LoadStringIDs(IReader reader, StringIDNamespaceResolver resolver = null) { if (_header.StringIDCount > 0) { var stringTable = new IndexedStringTable(reader, _header.StringIDCount, _header.StringIDIndexTable, _header.StringIDData, _buildInfo.StringIDKey); _stringIds = new IndexedStringIDSource(stringTable, resolver != null ? resolver : _buildInfo.StringIDs); } }
private StringIDNamespaceResolver LoadStringIDNamespaces(IReader reader) { // making some assumptions here based on all current stringid xmls if (_header.StringIDNamespaceCount > 1) { int[] namespaces = new int[_header.StringIDNamespaceCount]; reader.SeekTo(_header.StringIDNamespaceTable.Offset); for (int i = 0; i < namespaces.Length; i++) { namespaces[i] = reader.ReadInt32(); } // shift our way to the namespace bits, assuming index is always at least 16 bits int firstNamespaceBit = -1; for (int i = 16; i < 32; i++) { if (namespaces[1] >> i == 1) { firstNamespaceBit = i; break; } } if (firstNamespaceBit == -1) { return(null); } // assuming here that the namespace is always 8 bits var resolver = new StringIDNamespaceResolver(new StringIDLayout(firstNamespaceBit, 8, 32 - 8 - firstNamespaceBit)); int indexMask = (1 << firstNamespaceBit) - 1; // register all but the first namespace as that needs the final count int counter = namespaces[0] & indexMask; for (int i = 1; i < namespaces.Length; i++) { resolver.RegisterSet(i, 0, counter); counter += namespaces[i] & indexMask; } resolver.RegisterSet(0, namespaces[0] & indexMask, counter); return(resolver); } else { return(null); } }
/// <summary> /// Loads stringID set definitions from an XML document. /// </summary> /// <param name="document">The XML document to load set definitions from.</param> /// <returns>The StringIDSetResolver that was created.</returns> public static StringIDNamespaceResolver LoadStringIDNamespaces(XDocument document) { // Make sure there is a root <stringIDs> tag XElement container = document.Element("stringIDs"); if (container == null) { throw new ArgumentException("Invalid stringID definition document"); } StringIDLayout idLayout = ProcessIDLayoutInfo(container); // Process <set> elements var resolver = new StringIDNamespaceResolver(idLayout); foreach (XElement element in container.Elements("namespace")) { ProcessSetElement(element, resolver); } return(resolver); }