예제 #1
0
        public QueuedType(string name, ParseSchema.Table table, QueuedType parent)
        {
            if (string.IsNullOrEmpty(name) == true)
            {
                throw new ArgumentException();
            }

            this.Name   = name;
            this.Table  = table;
            this.Parent = parent;
        }
예제 #2
0
        public static void DeserializeTable(ParseSchema.Table table, Stream input, XmlWriter output)
        {
            //output.Flush();

            var dataSize = input.ReadValueU32();

            using (var data = input.ReadToMemoryStream((int)dataSize))
            {
                /*
                 * Counter++;
                 * using (var temp = File.Create(string.Format("{0}.struct", Counter)))
                 * {
                 *  temp.WriteFromStream(data, data.Length);
                 *  data.Position = 0;
                 * }
                 */

                output.WriteStartElement("table");

                foreach (var column in table.Columns)
                {
                    if (column.Flags.HasAny(
                            Parse.ColumnFlags.REDUNDANTNAME |
                            Parse.ColumnFlags.UNOWNED |
                            Parse.ColumnFlags.NO_WRITE) == true)
                    {
                        continue;
                    }

                    //output.WriteComment(string.Format(" offset = {0} ", data.Position));
                    output.WriteStartElement("column");
                    output.WriteAttributeString("name", column.Name);
                    DeserializeColumn(column, data, output);
                    output.WriteEndElement();
                    //output.Flush();
                }

                output.WriteEndElement();

                if (data.Position != data.Length)
                {
                    throw new InvalidOperationException();
                }
            }

            //output.Flush();
        }
예제 #3
0
        private void ResolveParse(ParseSchema.Table table)
        {
            foreach (var column in table
                     .Columns
                     .Where(c => c.Subtable != null))
            {
                ResolveParse(column.Subtable);
            }

            foreach (var column in table
                     .Columns
                     .Where(c => string.IsNullOrEmpty(c.SubtableExternalName) == false))
            {
                var external = this.LoadParse(column.SubtableExternalName);
                column.Subtable = external.Table ?? throw new InvalidOperationException();
            }
        }
예제 #4
0
        public static string GetColumnName(
            ParseSchema.Table table,
            ParseSchema.Column column)
        {
            if (string.IsNullOrEmpty(column.Name) == true)
            {
                if (table.Columns.Count(c => string.IsNullOrEmpty(c.Name)) > 1)
                {
                    return("__unnamed_" + column.Offset.ToString("X"));
                }

                return("_");
            }

            if (table.Columns.Count(c => c != column && c.Name.ToLowerInvariant() == column.Name.ToLowerInvariant()) > 1)
            {
                throw new InvalidOperationException();
            }

            return(column.Name);
        }
예제 #5
0
 public QueuedType(string name, ParseSchema.Table table)
     : this(name, table, null)
 {
 }
예제 #6
0
        private static ParseSchema.Table LoadTable(XPathNavigator nav, string path)
        {
            var table = new ParseSchema.Table();

            var columnIterator = nav.Select("column");

            while (columnIterator.MoveNext() == true)
            {
                var columnNode = columnIterator.Current;
                if (columnNode == null)
                {
                    throw new InvalidOperationException();
                }

                // ReSharper disable UseObjectOrCollectionInitializer
                var column = new ParseSchema.Column();
                // ReSharper restore UseObjectOrCollectionInitializer
                column.Name = columnNode.GetAttribute("name", "");

                var type  = columnNode.GetAttribute("type", "");
                var token = Parse.GlobalTokens.MatchToken(type, out column.Token, out column.Flags);

                var flagIterator = columnNode.Select("flags/flag");
                while (flagIterator.MoveNext() == true)
                {
                    if (flagIterator.Current == null)
                    {
                        throw new InvalidOperationException();
                    }

                    var flag = flagIterator.Current.Value;
                    if (Enum.IsDefined(typeof(Parse.ColumnFlags), flag) == false)
                    {
                        throw new FormatException("invalid parse flag");
                    }

                    column.Flags |= (Parse.ColumnFlags)Enum.Parse(typeof(Parse.ColumnFlags), flag);
                }

                column.Offset = (uint)GetIntElement(columnNode, "offset", 0);

                column.RedundantName = GetStringElement(columnNode, "redundant_name", null);

                column.MinBits       = (byte)GetIntElement(columnNode, "min_bits", 0);
                column.FloatRounding = GetStringElement(columnNode, "float_rounding", null);

                column.NumberOfElements = GetIntElement(columnNode, "num_elements", 0);
                column.Default          = GetIntElement(columnNode, "default", 0);
                column.StringLength     = GetIntElement(columnNode, "string_length", 0);
                column.DefaultString    = GetStringElement(columnNode, "default_string", null);
                column.CommandString    = GetStringElement(columnNode, "command_string", null);
                column.Size             = GetIntElement(columnNode, "size", 0);
                column.BitOffset        = GetIntElement(columnNode, "bit_offset", 0);

                var subtable = columnNode.SelectSingleNode("subtable");
                if (subtable != null)
                {
                    var subtableExternalName = subtable.GetAttribute("external", "");
                    if (string.IsNullOrEmpty(subtableExternalName) == false)
                    {
                        column.SubtableExternalName = subtableExternalName;
                        column.SubtableIsExternal   = true;
                    }
                    else
                    {
                        var subtableTable = subtable.SelectSingleNode("table");
                        if (subtableTable != null)
                        {
                            column.SubtableIsExternal = false;
                            column.Subtable           = LoadTable(subtableTable, path);
                        }
                        else
                        {
                            var lineInfo = (IXmlLineInfo)subtable;
                            Console.WriteLine("empty subtable in {0} @ {1}/{2}", path, lineInfo.LineNumber, lineInfo.LinePosition);
                            continue;
                        }
                    }
                }

                var staticDefineList = columnNode.SelectSingleNode("static_define_list");
                if (staticDefineList != null)
                {
                    column.StaticDefineListExternalName = staticDefineList.GetAttribute("external", "");
                    column.StaticDefineListIsExternal   = true;

                    var staticDefineListElements = staticDefineList.SelectSingleNode("elements");
                    if (staticDefineListElements != null)
                    {
                        column.StaticDefineListIsExternal = false;
                        column.StaticDefineList           = ParseEnumFile.LoadEnumeration(staticDefineListElements);
                    }
                }

                var formatName = GetStringElement(columnNode, "format", null);
                if (string.IsNullOrEmpty(formatName) == false)
                {
                    ParseSchema.ColumnFormat format;
                    if (Enum.TryParse(formatName, true, out format) == false)
                    {
                        throw new FormatException("invalid column format");
                    }
                    column.Format = format;
                }

                var formatStringIterator = columnNode.Select("format_strings/format_string");
                column.FormatStrings.Clear();
                while (formatStringIterator.MoveNext() == true)
                {
                    var formatStringNode = formatStringIterator.Current;
                    if (formatStringNode == null)
                    {
                        throw new InvalidOperationException();
                    }

                    var formatStringKey = formatStringNode.GetAttribute("name", "");
                    if (string.IsNullOrEmpty(formatStringKey) == true)
                    {
                        throw new FormatException("invalid schema format string key");
                    }

                    /*Console.WriteLine("Adding {0}={1} to {2}",
                     *  formatStringKey, formatStringNode.Value, column.Name);*/
                    column.FormatStrings.Add(formatStringKey, formatStringNode.Value);
                }

                table.Columns.Add(column);
            }

            return(table);
        }