Major improvements to CustomDataFormat

This commit is contained in:
Michael Becker 2015-09-08 09:16:42 -04:00
parent 72c6dbde3e
commit dd4b9726e5

View File

@ -1,10 +1,17 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace UniversalEditor
{
public class CustomDataFormat : DataFormat
{
protected override DataFormatReference MakeReferenceInternal()
{
if (this.Reference == null) return base.MakeReferenceInternal();
return this.Reference;
}
protected override void LoadInternal(ref ObjectModel objectModel)
{
CustomDataFormatReference cdfr = (base.Reference as CustomDataFormatReference);
@ -159,9 +166,240 @@ namespace UniversalEditor
return retval;
}
private string ExpandVariables(string value)
{
StringBuilder sb = new StringBuilder();
bool isEscaping = false;
for (int i = 0; i < value.Length; i++)
{
if (value[i] == '$')
{
if (isEscaping)
{
sb.Append(value[i]);
isEscaping = false;
continue;
}
i++;
if (i >= value.Length) break;
if (value[i] == '(')
{
i++;
if (i >= value.Length) break;
int lastIndex = value.IndexOf(')', i);
int count = 0;
for (int j = i; j < value.Length; j++)
{
if (value[j] == '(') count++;
if (value[j] == ')')
{
if (count == 0)
{
lastIndex = j;
break;
}
else
{
count--;
}
}
}
string variableStr = value.Substring(i, lastIndex - i);
string sectionName = null;
if (variableStr.Contains(":")) sectionName = variableStr.Substring(0, variableStr.IndexOf(':'));
string methodName = variableStr.Substring(variableStr.IndexOf(':'));
}
}
else if (value[i] == '\\')
{
if (isEscaping)
{
sb.Append(value[i]);
isEscaping = false;
continue;
}
else
{
isEscaping = true;
}
}
else
{
sb.Append(value[i]);
}
}
return sb.ToString();
}
protected override void SaveInternal(ObjectModel objectModel)
{
throw new NotImplementedException();
CustomDataFormatReference cdfr = (this.Reference as CustomDataFormatReference);
Type type = this.Reference.GetType();
if (cdfr == null) return;
Dictionary<string, object> localVariables = new Dictionary<string, object>();
IO.Writer bw = base.Accessor.Writer;
foreach (CustomDataFormatItem cdfi in cdfr.Items)
{
if (cdfi is CustomDataFormatItemField)
{
CustomDataFormatItemField fld = (cdfi as CustomDataFormatItemField);
object value = ExpandVariables(fld.Value);
switch (fld.DataType)
{
case "Boolean":
{
value = (value.ToString().ToLower().Equals("true"));
bw.WriteBoolean((bool)value);
break;
}
case "Byte":
{
value = Byte.Parse(value.ToString());
bw.WriteByte((byte)value);
break;
}
case "Char":
{
value = Char.Parse(value.ToString());
bw.WriteChar((char)value);
break;
}
case "DateTime":
{
value = DateTime.Parse(value.ToString());
bw.WriteDateTime((DateTime)value);
break;
}
case "Decimal":
{
value = Decimal.Parse(value.ToString());
bw.WriteDecimal((decimal)value);
break;
}
case "Double":
{
value = Double.Parse(value.ToString());
bw.WriteDouble((double)value);
break;
}
case "Guid":
{
value = Guid.Parse(value.ToString());
bw.WriteGuid((Guid)value);
break;
}
case "Int16":
{
value = Int16.Parse(value.ToString());
bw.WriteInt16((short)value);
break;
}
case "Int32":
{
value = Int32.Parse(value.ToString());
bw.WriteInt32((int)value);
break;
}
case "Int64":
{
value = Int64.Parse(value.ToString());
bw.WriteInt64((long)value);
break;
}
case "SByte":
{
value = SByte.Parse(value.ToString());
bw.WriteSByte((sbyte)value);
break;
}
case "Single":
{
value = Single.Parse(value.ToString());
bw.WriteSingle((float)value);
break;
}
case "String":
{
bw.WriteLengthPrefixedString((string)value);
break;
}
case "UInt16":
{
value = UInt16.Parse(value.ToString());
bw.WriteUInt16((ushort)value);
break;
}
case "UInt32":
{
value = UInt32.Parse(value.ToString());
bw.WriteUInt32((uint)value);
break;
}
case "UInt64":
{
value = UInt64.Parse(value.ToString());
bw.WriteUInt64((ulong)value);
break;
}
case "TerminatedString":
{
IO.Encoding encoding = IO.Encoding.Default;
if (fld.Encoding != null) encoding = fld.Encoding;
if (fld.Length.HasValue)
{
bw.WriteNullTerminatedString((string)value, encoding, fld.Length.Value);
}
else
{
bw.WriteNullTerminatedString((string)value, encoding);
}
break;
}
case "FixedString":
{
IO.Encoding encoding = IO.Encoding.Default;
if (fld.Encoding != null) encoding = fld.Encoding;
if (fld.Value == null) continue;
if (fld.Length != null)
{
bw.WriteFixedLengthString(fld.Value, encoding, fld.Length.Value);
}
else
{
bw.WriteFixedLengthString(fld.Value, encoding);
}
break;
}
}
if (fld.Name != null)
{
string fldName = ReplaceVariables(fld.Name, localVariables);
if (localVariables.ContainsKey(fldName))
{
localVariables[fldName] = fld.Value;
}
else
{
localVariables.Add(fldName, fld.Value);
}
}
if (fld.ExportTarget != null)
{
}
}
}
}
}
public class CustomDataFormatReference : DataFormatReference