コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 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);
     }
 }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        /// <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);
        }