コード例 #1
0
ファイル: BlobFile.cs プロジェクト: gibbed/Gibbed.Cryptic
        public static void DeserializeColumn(ParseSchema.Column column, Stream input, XmlWriter output)
        {
            if (column.Flags.HasAny(
                    Parse.ColumnFlags.REDUNDANTNAME |
                    Parse.ColumnFlags.UNOWNED |
                    Parse.ColumnFlags.NO_WRITE) == true)
            {
                return;
            }

            var token = Parse.GlobalTokens.GetToken(column.Token);

            if (column.Flags.HasAny(Parse.ColumnFlags.EARRAY | Parse.ColumnFlags.FIXED_ARRAY) == false)
            {
                // value
                token.Deserialize(input, column, output);
            }
            else if (column.Flags.HasAny(Parse.ColumnFlags.EARRAY) == false)
            {
                // fixed array
                if (column.Token == Parse.TokenType.MATPYR)
                {
                    token.Deserialize(input, column, output);
                }
                else
                {
                    for (int i = 0; i < column.NumberOfElements; i++)
                    {
                        output.WriteStartElement("item");
                        token.Deserialize(input, column, output);
                        output.WriteEndElement();
                    }
                }
            }
            else
            {
                if (column.Token == Parse.TokenType.FunctionCall)
                {
                    token.Deserialize(input, column, output);
                }
                else
                {
                    var count = input.ReadValueU32();
                    if (count > ParseSchemaFile.DefaultMaxArraySize)
                    {
                        throw new FormatException(string.Format("list exceeds maximum array size ({0} > {1})",
                                                                count,
                                                                ParseSchemaFile.DefaultMaxArraySize));
                    }

                    for (int i = 0; i < count; i++)
                    {
                        output.WriteStartElement("item");
                        token.Deserialize(input, column, output);
                        output.WriteEndElement();
                    }
                }
            }
        }
コード例 #2
0
ファイル: Helpers.cs プロジェクト: gibbed/Gibbed.Cryptic
        public static bool IsGoodColumn(ParseSchema.Column column)
        {
            if (column.Flags.HasAny(
                    Parse.ColumnFlags.REDUNDANTNAME |
                    Parse.ColumnFlags.UNOWNED |
                    Parse.ColumnFlags.NO_WRITE) == true)
            {
                return(false);
            }

            if (column.Token == Parse.TokenType.Ignore ||
                column.Token == Parse.TokenType.Start ||
                column.Token == Parse.TokenType.End ||
                column.Token == Parse.TokenType.Command)
            {
                return(false);
            }

            return(true);
        }
コード例 #3
0
ファイル: Helpers.cs プロジェクト: gibbed/Gibbed.Cryptic
        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);
        }
コード例 #4
0
ファイル: Helpers.cs プロジェクト: gibbed/Gibbed.Cryptic
        public static MethodInfo GetReadMethod(ParseSchema.Column column)
        {
            var token = Parse.GlobalTokens.GetToken(column.Token);

            string name = "Read";

            if (column.Flags.HasAny(Parse.ColumnFlags.EARRAY | Parse.ColumnFlags.FIXED_ARRAY) == false)
            {
                name += "Value";
            }
            else if (column.Flags.HasAny(Parse.ColumnFlags.EARRAY) == false)
            {
                name += "Array";
            }
            else
            {
                name += "List";
            }

            name += token.GetType().Name;

            if (string.IsNullOrEmpty(column.StaticDefineListExternalName) == false ||
                column.StaticDefineList != null)
            {
                name += "Enum";
            }

            var methodInfo = typeof(Serialization.IBaseReader).GetMethod(
                name,
                BindingFlags.Public | BindingFlags.Instance);

            if (methodInfo == null)
            {
                throw new NotSupportedException(name + " is missing");
            }

            return(methodInfo);
        }
コード例 #5
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);
        }