diff --git a/CSharp/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/KenSilverman/GRP.uexml b/CSharp/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/KenSilverman/GRP.uexml new file mode 100644 index 00000000..e8f533ca --- /dev/null +++ b/CSharp/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/KenSilverman/GRP.uexml @@ -0,0 +1,25 @@ + + + + + + + + *.grp + + + + KenSilverman + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj b/CSharp/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj index 429de8ac..25510b59 100644 --- a/CSharp/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj +++ b/CSharp/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj @@ -668,6 +668,7 @@ + @@ -703,6 +704,7 @@ + diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/KenSilverman/KenSilvermanGRPDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/KenSilverman/KenSilvermanGRPDataFormat.cs new file mode 100644 index 00000000..73ada237 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/KenSilverman/KenSilvermanGRPDataFormat.cs @@ -0,0 +1,85 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.FileSystem; + +namespace UniversalEditor.DataFormats.FileSystem.KenSilverman +{ + public class KenSilvermanGRPDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) + throw new ObjectModelNotSupportedException(); + + Reader reader = Accessor.Reader; + string signature = reader.ReadFixedLengthString(12); + if (signature != "KenSilverman") + throw new InvalidDataFormatException("file does not begin with 'KenSilverman'"); + + uint fileCount = reader.ReadUInt32(); + uint offset = (16 * (fileCount + 1)); + for (uint i = 0; i < fileCount; i++) + { + string filename = reader.ReadFixedLengthString(12); + filename = filename.TrimNull(); + + uint size = reader.ReadUInt32(); + File f = fsom.AddFile(filename); + f.Size = size; + f.Properties.Add("reader", reader); + f.Properties.Add("offset", offset); + f.Properties.Add("length", size); + f.DataRequest += f_DataRequest; + + offset += size; + } + } + + private void f_DataRequest(object sender, DataRequestEventArgs e) + { + File f = (sender as File); + Reader reader = (Reader)f.Properties["reader"]; + uint offset = (uint)f.Properties["offset"]; + uint length = (uint)f.Properties["length"]; + + reader.Seek(offset, SeekOrigin.Begin); + e.Data = reader.ReadBytes(length); + } + + + protected override void SaveInternal(ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) + throw new ObjectModelNotSupportedException(); + + Writer writer = Accessor.Writer; + writer.WriteFixedLengthString("KenSilverman"); + + uint filecount = (uint)fsom.Files.Count; + writer.WriteUInt32(filecount); + + for (uint i = 0; i < filecount; i++) + { + writer.WriteFixedLengthString(fsom.Files[(int)i].Name, 12); + writer.WriteUInt32((uint)fsom.Files[(int)i].Size); + } + for (uint i = 0; i < filecount; i++) + { + writer.WriteBytes(fsom.Files[(int)i].GetData()); + } + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj index eda5c0c9..0cfdb006 100644 --- a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj +++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj @@ -239,6 +239,7 @@ + @@ -281,6 +282,7 @@ +