mirror of
https://github.com/blueskythlikesclouds/SonicAudioTools.git
synced 2025-02-11 08:22:59 +01:00
157 lines
3.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|