Пример #1
0
        public void WriteField(string fieldName, Type fieldType)
        {
            if (status != Status.FieldCollection)
            {
                WriteStartFieldCollection();
            }

            CriFieldFlag fieldFlag = (CriFieldFlag)Array.IndexOf(CriField.FieldTypes, fieldType) | CriFieldFlag.RowStorage;

            if (!string.IsNullOrEmpty(fieldName))
            {
                fieldFlag |= CriFieldFlag.Name;
            }

            CriTableField field = new CriTableField
            {
                Flag = fieldFlag,
                Name = fieldName
            };

            DataStream.WriteByte(destination, (byte)field.Flag);

            if (!string.IsNullOrEmpty(fieldName))
            {
                WriteString(field.Name);
            }

            field.Offset = header.RowLength;
            switch (field.Flag & CriFieldFlag.TypeMask)
            {
            case CriFieldFlag.Byte:
            case CriFieldFlag.SByte:
                header.RowLength += 1;
                break;

            case CriFieldFlag.Int16:
            case CriFieldFlag.UInt16:
                header.RowLength += 2;
                break;

            case CriFieldFlag.Int32:
            case CriFieldFlag.UInt32:
            case CriFieldFlag.Single:
            case CriFieldFlag.String:
                header.RowLength += 4;
                break;

            case CriFieldFlag.Int64:
            case CriFieldFlag.UInt64:
            case CriFieldFlag.Double:
            case CriFieldFlag.Data:
                header.RowLength += 8;
                break;
            }

            fields.Add(field);
            header.FieldCount++;
        }
Пример #2
0
        public void WriteField(string fieldName, Type fieldType, object defaultValue)
        {
            if (status != Status.FieldCollection)
            {
                WriteStartFieldCollection();
            }

            CriFieldFlag fieldFlag = (CriFieldFlag)Array.IndexOf(CriField.FieldTypes, fieldType);

            if (!string.IsNullOrEmpty(fieldName))
            {
                fieldFlag |= CriFieldFlag.Name;
            }

            if (defaultValue != null)
            {
                fieldFlag |= CriFieldFlag.DefaultValue;
            }

            CriTableField field = new CriTableField
            {
                Flag  = fieldFlag,
                Name  = fieldName,
                Value = defaultValue
            };

            DataStream.WriteByte(destination, (byte)field.Flag);

            if (!string.IsNullOrEmpty(fieldName))
            {
                WriteString(field.Name);
            }

            if (defaultValue != null)
            {
                WriteValue(defaultValue);
            }

            fields.Add(field);
            header.FieldCount++;
        }
Пример #3
0
        private object ReadValue(CriFieldFlag fieldFlag)
        {
            switch (fieldFlag & CriFieldFlag.TypeMask)
            {
            case CriFieldFlag.Byte:
                return(DataStream.ReadByte(source));

            case CriFieldFlag.SByte:
                return(DataStream.ReadSByte(source));

            case CriFieldFlag.UInt16:
                return(DataStream.ReadUInt16BE(source));

            case CriFieldFlag.Int16:
                return(DataStream.ReadInt16BE(source));

            case CriFieldFlag.UInt32:
                return(DataStream.ReadUInt32BE(source));

            case CriFieldFlag.Int32:
                return(DataStream.ReadInt32BE(source));

            case CriFieldFlag.UInt64:
                return(DataStream.ReadUInt64BE(source));

            case CriFieldFlag.Int64:
                return(DataStream.ReadInt64BE(source));

            case CriFieldFlag.Single:
                return(DataStream.ReadSingleBE(source));

            case CriFieldFlag.Double:
                return(DataStream.ReadDoubleBE(source));

            case CriFieldFlag.String:
                return(ReadString());

            case CriFieldFlag.Data:
            {
                uint position = DataStream.ReadUInt32BE(source);
                uint length   = DataStream.ReadUInt32BE(source);

                // Some ACB files have the length info set to zero for UTF table fields, so find the correct length
                if (position > 0 && length == 0)
                {
                    source.Seek(headerPosition + header.DataPoolPosition + position, SeekOrigin.Begin);

                    if (DataStream.ReadBytes(source, 4).SequenceEqual(CriTableHeader.SignatureBytes))
                    {
                        length = DataStream.ReadUInt32BE(source) + 8;
                    }
                }

                return(new SubStream(source, headerPosition + header.DataPoolPosition + position, length));
            }

            case CriFieldFlag.Guid:
                return(new Guid(DataStream.ReadBytes(source, 16)));
            }

            return(null);
        }