2016-12-31 15:56:10 +03:00

157 lines
3.9 KiB
C#

using System;
using System.IO;
using System.Linq;
using SonicAudioLib.IO;
using SonicAudioLib.Module;
namespace SonicAudioLib.CriMw
{
public class CriTable : ModuleBase
{
private CriFieldCollection fields;
private CriRowCollection rows;
private string tableName = "(no name)";
private CriTableWriterSettings writerSettings;
public CriFieldCollection Fields
{
get
{
return fields;
}
}
public CriRowCollection Rows
{
get
{
return rows;
}
}
public string TableName
{
get
{
return tableName;
}
set
{
tableName = value;
}
}
public CriTableWriterSettings WriterSettings
{
get
{
return writerSettings;
}
set
{
writerSettings = value;
}
}
public void Clear()
{
rows.Clear();
fields.Clear();
}
public CriRow NewRow()
{
CriRow criRow = new CriRow(this);
foreach (CriField criField in fields)
{
criRow.Records.Add(new CriRowRecord { Field = criField, Value = criField.DefaultValue });
}
return criRow;
}
public override void Read(Stream source)
{
using (CriTableReader reader = CriTableReader.Create(source))
{
tableName = reader.TableName;
for (int i = 0; i < reader.NumberOfFields; i++)
{
fields.Add(reader.GetFieldName(i), reader.GetFieldType(i), reader.GetFieldValue(i));
}
while (reader.Read())
{
rows.Add(reader.GetValueArray());
}
}
}
public override void Write(Stream destination)
{
using (CriTableWriter writer = CriTableWriter.Create(destination, writerSettings))
{
writer.WriteStartTable(tableName);
writer.WriteStartFieldCollection();
foreach (CriField criField in fields)
{
bool useDefaultValue = false;
object defaultValue = null;
if (rows.Count > 1)
{
useDefaultValue = true;
defaultValue = rows[0][criField];
if (rows.Any(row => !row[criField].Equals(defaultValue)))
{
useDefaultValue = false;
}
}
else if (rows.Count == 0)
{
useDefaultValue = true;
}
if (useDefaultValue)
{
writer.WriteField(criField.FieldName, criField.FieldType, defaultValue);
}
else
{
writer.WriteField(criField.FieldName, criField.FieldType);
}
}
writer.WriteEndFieldCollection();
foreach (CriRow criRow in rows)
{
writer.WriteRow(true, criRow.GetValueArray());
}
writer.WriteEndTable();
}
}
public CriTable()
{
fields = new CriFieldCollection(this);
rows = new CriRowCollection(this);
writerSettings = new CriTableWriterSettings();
}
public CriTable(string tableName) : this()
{
this.tableName = tableName;
}
}
}