diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormat.cs index c47031f3..771d8a83 100644 --- a/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormat.cs +++ b/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormat.cs @@ -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 localVariables = new Dictionary(); + 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