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++; }
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++; }
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); }