From 3af82ce51a087de1a16b08eddff5557fb7aee159 Mon Sep 17 00:00:00 2001 From: alcexhim Date: Fri, 6 Jun 2014 13:21:54 -0400 Subject: [PATCH] Added more plugins to UniversalEditor --- .../UniversalEditor.Plugins.AniMiku.csproj | 4 - ...UniversalEditor.Plugins.Concertroid.csproj | 12 +- .../VersatileContainerDataFormat.cs | 203 +++++++++ .../VersatileContainerSectionType.cs | 27 ++ .../VersatileContainerV1DataFormat.cs | 407 ++++++++++++++++++ .../VersatileContainerV2DataFormat.cs | 203 +++++++++ .../VersatileContainerBlankSection.cs | 16 + .../VersatileContainerContentSection.cs | 39 ++ .../VersatileContainerDirectorySection.cs | 16 + .../VersatileContainerReferenceSection.cs | 20 + .../VersatileContainerObjectModel.cs | 44 ++ .../VersatileContainerProperty.cs | 29 ++ .../VersatileContainerSection.cs | 59 +++ .../Properties/AssemblyInfo.cs | 36 ++ ...alEditor.Plugins.VersatileContainer.csproj | 74 ++++ CSharp/UniversalEditor.sln | 63 +++ 16 files changed, 1240 insertions(+), 12 deletions(-) create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerDataFormat.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerSectionType.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerV1DataFormat.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerV2DataFormat.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerBlankSection.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerContentSection.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerDirectorySection.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerReferenceSection.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerObjectModel.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerProperty.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerSection.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/Properties/AssemblyInfo.cs create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/UniversalEditor.Plugins.VersatileContainer.csproj diff --git a/CSharp/Plugins/UniversalEditor.Plugins.AniMiku/UniversalEditor.Plugins.AniMiku.csproj b/CSharp/Plugins/UniversalEditor.Plugins.AniMiku/UniversalEditor.Plugins.AniMiku.csproj index f01c3d99..11703e2e 100644 --- a/CSharp/Plugins/UniversalEditor.Plugins.AniMiku/UniversalEditor.Plugins.AniMiku.csproj +++ b/CSharp/Plugins/UniversalEditor.Plugins.AniMiku/UniversalEditor.Plugins.AniMiku.csproj @@ -53,10 +53,6 @@ {30467e5c-05bc-4856-aadc-13906ef4cadd} UniversalEditor.Essential - - {d3bbda07-5088-454e-a16d-da24d8d88037} - UniversalEditor.Plugins.Concertroid - {4fd9db1d-76aa-48d1-8446-95376c4a2bc2} UniversalEditor.Plugins.Multimedia3D diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Concertroid/UniversalEditor.Plugins.Concertroid.csproj b/CSharp/Plugins/UniversalEditor.Plugins.Concertroid/UniversalEditor.Plugins.Concertroid.csproj index 788d317d..fcc73526 100644 --- a/CSharp/Plugins/UniversalEditor.Plugins.Concertroid/UniversalEditor.Plugins.Concertroid.csproj +++ b/CSharp/Plugins/UniversalEditor.Plugins.Concertroid/UniversalEditor.Plugins.Concertroid.csproj @@ -54,14 +54,6 @@ - - {e0897b7b-617a-4709-a4c6-fc0f6b441b2a} - Surodoine - - - {ffc91b24-39af-49ac-9a3a-900fbe1012ed} - VersatileContainer - {a92d520b-ffa3-4464-8cf6-474d18959e03} UniversalEditor.Core @@ -82,6 +74,10 @@ {be4d0ba3-0888-42a5-9c09-fc308a4509d2} UniversalEditor.Plugins.Multimedia + + {ffc91b24-39af-49ac-9a3a-900fbe1012ed} + UniversalEditor.Plugins.VersatileContainer + diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerDataFormat.cs new file mode 100644 index 00000000..1e02be89 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerDataFormat.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.VersatileContainer; +using UniversalEditor.ObjectModels.VersatileContainer.Sections; + +namespace UniversalEditor.DataFormats.VersatileContainer +{ + public class VersatileContainerDataFormat : DataFormat + { + private Version mvarFormatVersion = new Version(2, 0); + public Version FormatVersion { get { return mvarFormatVersion; } set { mvarFormatVersion = value; } } + + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + if (_dfr == null) + { + _dfr = base.MakeReference(); + _dfr.Capabilities.Add(typeof(VersatileContainerObjectModel), DataFormatCapabilities.All); + _dfr.Filters.Add("Versatile Container object file", new byte?[][] { new byte?[] { (byte)'V', (byte)'e', (byte)'r', (byte)'s', (byte)'a', (byte)'t', (byte)'i', (byte)'l', (byte)'e', (byte)' ', (byte)'C', (byte)'o', (byte)'n', (byte)'t', (byte)'a', (byte)'i', (byte)'n', (byte)'e', (byte)'r', (byte)' ', (byte)'f', (byte)'i', (byte)'l', (byte)'e', (byte)' ', (byte)'0', (byte)'0', (byte)'0', (byte)'2' } }, new string[] { "*.vco" }); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + VersatileContainerObjectModel vcom = (objectModel as VersatileContainerObjectModel); + if (vcom == null) return; + + IO.BinaryReader br = base.Stream.BinaryReader; + string signature = br.ReadFixedLengthString(30); // Versatile Container file 0002 + signature = signature.TrimNull(); + if (signature != "Versatile Container file 0002") throw new DataFormatException(Localization.StringTable.ErrorDataFormatInvalid); + + mvarFormatVersion = br.ReadVersion(); + vcom.Title = br.ReadNullTerminatedString(); + + uint propertyCount = br.ReadUInt32(); + uint sectionClassCount = br.ReadUInt32(); + uint sectionCount = br.ReadUInt32(); + + List sectionClassNames = new List(); + + #region Section Class Entries + for (uint i = 0; i < sectionClassCount; i++) + { + string sectionClassName = br.ReadNullTerminatedString(); + sectionClassNames.Add(sectionClassName); + } + #endregion + #region Section Entries + List sectionDataSizes = new List(); + for (uint i = 0; i < sectionCount; i++) + { + VersatileContainerSectionType sectionType = (VersatileContainerSectionType)br.ReadUInt32(); + string sectionName = br.ReadNullTerminatedString(); + + switch (sectionType) + { + case VersatileContainerSectionType.None: + { + sectionDataSizes.Add(0); + + VersatileContainerBlankSection sect = new VersatileContainerBlankSection(); + vcom.Sections.Add(sect); + break; + } + case VersatileContainerSectionType.Section: + { + uint sectionDataSize = br.ReadUInt32(); + sectionDataSizes.Add(sectionDataSize); + + uint sectionClassIndex = br.ReadUInt32(); + + VersatileContainerContentSection sect = new VersatileContainerContentSection(); + sect.Name = sectionName; + if (sectionClassIndex != 0xFFFFFFFF) + { + sect.ClassName = sectionClassNames[(int)sectionClassIndex]; + } + else + { + sect.ClassName = null; + } + vcom.Sections.Add(sect); + break; + } + case VersatileContainerSectionType.Directory: + { + sectionDataSizes.Add(0); + + VersatileContainerDirectorySection sect = new VersatileContainerDirectorySection(); + vcom.Sections.Add(sect); + break; + } + case VersatileContainerSectionType.Reference: + { + sectionDataSizes.Add(0); + uint sectionIndex = br.ReadUInt32(); + + VersatileContainerReferenceSection sect = new VersatileContainerReferenceSection(); + sect.Target = vcom.Sections[(int)sectionIndex]; + vcom.Sections.Add(sect); + break; + } + } + } + #endregion + for (uint i = 0; i < sectionCount; i++) + { + VersatileContainerSection section = vcom.Sections[(int)i]; + if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection sect = (section as VersatileContainerContentSection); + byte[] data = br.ReadBytes(sectionDataSizes[(int)i]); + if (sect == null) continue; + sect.Data = data; + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + VersatileContainerObjectModel vcom = (objectModel as VersatileContainerObjectModel); + if (vcom == null) return; + + IO.BinaryWriter bw = base.Stream.BinaryWriter; + bw.WriteNullTerminatedString("Versatile Container file 0002"); + bw.Write(mvarFormatVersion); + bw.WriteNullTerminatedString(vcom.Title); + + bw.Write((uint)vcom.Properties.Count); + + // get a list of section class names + List sectionClassNames = new List(); + foreach (VersatileContainerSection section in vcom.Sections) + { + if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection sect = (section as VersatileContainerContentSection); + if (!sectionClassNames.Contains(sect.ClassName)) sectionClassNames.Add(sect.ClassName); + } + } + bw.Write((uint)sectionClassNames.Count); + + bw.Write((uint)vcom.Sections.Count); + + #region Section Class Entries + foreach (string sectionClassName in sectionClassNames) + { + bw.WriteNullTerminatedString(sectionClassName); + } + #endregion + #region Section Entries + List sectionTypes = new List(); + List sectionDataSizes = new List(); + foreach (VersatileContainerSection section in vcom.Sections) + { + VersatileContainerSectionType sectionType = VersatileContainerSectionType.Section; // (VersatileContainerSectionType)br.ReadUInt32(); + bw.Write((uint)sectionType); + + bw.WriteNullTerminatedString(section.Name); + if (section is VersatileContainerBlankSection) + { + } + else if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection sect = (section as VersatileContainerContentSection); + bw.Write((uint)sect.Data.LongLength); + if (!String.IsNullOrEmpty(sect.ClassName)) + { + bw.Write(sectionClassNames.IndexOf(sect.ClassName)); + } + else + { + bw.Write((uint)0xFFFFFFFF); + } + } + else if (section is VersatileContainerDirectorySection) + { + VersatileContainerDirectorySection sect = (section as VersatileContainerDirectorySection); + } + else if (section is VersatileContainerReferenceSection) + { + VersatileContainerReferenceSection sect = (section as VersatileContainerReferenceSection); + bw.Write((uint)vcom.Sections.IndexOf(sect.Target)); + } + } + #endregion + foreach (VersatileContainerSection section in vcom.Sections) + { + if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection sect = (section as VersatileContainerContentSection); + bw.Write(sect.Data); + } + } + } + } +} \ No newline at end of file diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerSectionType.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerSectionType.cs new file mode 100644 index 00000000..07c26956 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerSectionType.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.VersatileContainer +{ + public enum VersatileContainerSectionType : uint + { + None = 0, + /// + /// A section that contains data stored within the Versatile Container. + /// Multiple named Sections can point to the same data location. + /// + Section = 1, + /// + /// A section that contains another list of sections. Directories can be + /// nested within one another. + /// + Directory = 2, + /// + /// A section that doesn't contain any data, but points to the data + /// contained within another indexed Section. + /// + Reference = 3 + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerV1DataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerV1DataFormat.cs new file mode 100644 index 00000000..f62ac0d4 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerV1DataFormat.cs @@ -0,0 +1,407 @@ +using System; +using System.Collections.Generic; +using System.Text; +using UniversalEditor.Compression; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.ObjectModels.VersatileContainer; +using UniversalEditor.ObjectModels.VersatileContainer.Sections; + +namespace UniversalEditor.DataFormats.VersatileContainer +{ + public class VersatileContainerV1DataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + _dfr = base.MakeReference(); + _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All); + _dfr.Filters.Add("Versatile Container binary file", new byte?[][] { new byte?[] { (byte)'V', (byte)'e', (byte)'r', (byte)'s', (byte)'a', (byte)'t', (byte)'i', (byte)'l', (byte)'e', (byte)' ', (byte)'C', (byte)'o', (byte)'n', (byte)'t', (byte)'a', (byte)'i', (byte)'n', (byte)'e', (byte)'r', (byte)' ', (byte)'f', (byte)'i', (byte)'l', (byte)'e', (byte)' ', (byte)'0', (byte)'0', (byte)'0', (byte)'1' } }, new string[] { "*.vcb" }); + return _dfr; + } + + private VersatileContainerProperty.VersatileContainerPropertyCollection mvarProperties = new VersatileContainerProperty.VersatileContainerPropertyCollection(); + public VersatileContainerProperty.VersatileContainerPropertyCollection Properties { get { return mvarProperties; } } + + private Version mvarFormatVersion = new Version(2, 0); + public Version FormatVersion { get { return mvarFormatVersion; } set { mvarFormatVersion = value; } } + + private uint mvarBytesPerNUMBER = 4; + public uint BytesPerNUMBER { get { return mvarBytesPerNUMBER; } set { mvarBytesPerNUMBER = value; } } + + private uint mvarSectionAlignment = 512; + public uint SectionAlignment { get { return mvarSectionAlignment; } set { mvarSectionAlignment = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + VersatileContainerObjectModel vcom = (objectModel as VersatileContainerObjectModel); + + string signature = br.ReadFixedLengthString(30); + if (signature != "Versatile Container file 0001\0") + { + throw new InvalidDataFormatException(); + } + + mvarFormatVersion = br.ReadVersion(); + mvarSectionAlignment = br.ReadUInt32(); + mvarBytesPerNUMBER = br.ReadUInt32(); + + string title = br.ReadNullTerminatedString(64); + + if (mvarFormatVersion.Major > 1) + { + long oldPosition = br.Accessor.Position; + long numberOfPropertiesInFile = (long)ReadUnum(br); + + long[] propertyNameLengths = new long[numberOfPropertiesInFile]; + long[] propertyValueLengths = new long[numberOfPropertiesInFile]; + + for (long i = 0; i < numberOfPropertiesInFile; i++) + { + long propertyNameLength = (long)ReadUnum(br); + long propertyValueLength = (long)ReadUnum(br); + propertyNameLengths.SetValue(propertyNameLength, i); + propertyValueLengths.SetValue(propertyValueLength, i); + } + for (long i = 0; i < numberOfPropertiesInFile; i++) + { + long propertyNameLength = (long)propertyNameLengths.GetValue(i); + long propertyValueLength = (long)propertyValueLengths.GetValue(i); + + string propertyName = br.ReadFixedLengthString(propertyNameLength); + string propertyValue = br.ReadFixedLengthString(propertyValueLength); + mvarProperties.Add(propertyName, propertyValue); + } + long newPosition = br.Accessor.Position; + + long totalSizeOfBlock = (newPosition - oldPosition); + if ((mvarSectionAlignment - totalSizeOfBlock) > 0) + { + byte[] padding = br.ReadBytes((ulong)(mvarSectionAlignment - totalSizeOfBlock)); + } + } + + long numberOfSectionsInFile = (long)ReadUnum(br); + + string[] sectionNames = new string[numberOfSectionsInFile]; + ulong[] sectionOffsets = new ulong[numberOfSectionsInFile]; + ulong[] sectionVirtualSizes = new ulong[numberOfSectionsInFile]; + ulong[] sectionPhysicalSizes = new ulong[numberOfSectionsInFile]; + VersatileContainerSectionType[] sectionContentTypes = new VersatileContainerSectionType[numberOfSectionsInFile]; + + Compression.CompressionMethod[] sectionCompressions = new Compression.CompressionMethod[numberOfSectionsInFile]; + + for (long i = 0; i < numberOfSectionsInFile; i++) + { + string sectionName = br.ReadFixedLengthString(32); + if (sectionName.Contains("\0")) sectionName = sectionName.Substring(0, sectionName.IndexOf('\0')); + + ulong sectionOffset = ReadUnum(br); + ulong sectionVirtualSize = ReadUnum(br); + ulong sectionPhysicalSize = ReadUnum(br); + + sectionCompressions.SetValue((Compression.CompressionMethod)br.ReadInt32(), i); + sectionNames.SetValue(sectionName, i); + sectionOffsets.SetValue(sectionOffset, i); + sectionPhysicalSizes.SetValue(sectionPhysicalSize, i); + sectionVirtualSizes.SetValue(sectionVirtualSize, i); + } + + for (long i = 0; i < numberOfSectionsInFile; i++) + { + ulong sectionOffset = (ulong)sectionOffsets.GetValue(i); + ulong sectionVirtualSize = (ulong)sectionVirtualSizes.GetValue(i); + ulong sectionPhysicalSize = (ulong)sectionPhysicalSizes.GetValue(i); + string sectionName = (string)sectionNames.GetValue(i); + ulong sectionRemainder = sectionPhysicalSize - sectionVirtualSize; + + byte[] sectionData = br.ReadBytes(sectionVirtualSize); + br.Accessor.Seek((long)sectionRemainder, SeekOrigin.Current); + + Compression.CompressionMethod sectionCompression = (Compression.CompressionMethod)sectionCompressions.GetValue(i); + + if (fsom != null) + { + if (sectionCompression != Compression.CompressionMethod.None) + { + File section = new File(); + section.Name = sectionName; + byte[] data = CompressionModule.FromKnownCompressionMethod(sectionCompression).Decompress(sectionData); + section.SetDataAsByteArray(data); + fsom.Files.Add(section); + } + else + { + File section = new File(); + section.Name = sectionName; + section.SetDataAsByteArray(sectionData); + fsom.Files.Add(section); + } + } + else if (vcom != null) + { + if (sectionCompression != Compression.CompressionMethod.None) + { + VersatileContainerContentSection section = new VersatileContainerContentSection(); + // section.CompressionMethod = sectionCompression; + section.Name = sectionName; + byte[] data = CompressionModule.FromKnownCompressionMethod(sectionCompression).Decompress(sectionData); + section.Data = data; + vcom.Sections.Add(section); + } + else + { + VersatileContainerContentSection section = new VersatileContainerContentSection(); + section.Name = sectionName; + section.Data = sectionData; + vcom.Sections.Add(section); + } + } + } + + if (fsom != null) + { + fsom.Title = title; + } + else if (vcom != null) + { + vcom.Title = title; + } + } + + private ulong ReadUnum(IO.Reader br) + { + switch (mvarBytesPerNUMBER) + { + case 1: return br.ReadByte(); + case 2: return br.ReadUInt16(); + case 4: return br.ReadUInt32(); + case 8: return br.ReadUInt64(); + } + throw new ArgumentOutOfRangeException(); + } + private long ReadNum(IO.Reader br) + { + switch (mvarBytesPerNUMBER) + { + case 1: return br.ReadByte(); + case 2: return br.ReadInt16(); + case 4: return br.ReadInt32(); + case 8: return br.ReadInt64(); + } + throw new ArgumentOutOfRangeException(); + } + + private void WriteUnum(IO.Writer bw, ulong value) + { + switch (mvarBytesPerNUMBER) + { + case 1: bw.WriteByte((byte)value); return; + case 2: bw.WriteUInt16((ushort)value); return; + case 4: bw.WriteUInt32((uint)value); return; + case 8: bw.WriteUInt64((ulong)value); return; + } + throw new ArgumentOutOfRangeException(); + } + private void WriteNum(IO.Writer bw, long value) + { + switch (mvarBytesPerNUMBER) + { + case 1: bw.WriteByte((byte)value); return; + case 2: bw.WriteInt16((short)value); return; + case 4: bw.WriteInt32((int)value); return; + case 8: bw.WriteInt64((long)value); return; + } + throw new ArgumentOutOfRangeException(); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + IO.Writer bw = base.Accessor.Writer; + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + VersatileContainerObjectModel vcom = (objectModel as VersatileContainerObjectModel); + + bw.WriteFixedLengthString("Versatile Container file 0001\0"); + bw.WriteVersion(mvarFormatVersion); + bw.WriteUInt32(mvarSectionAlignment); + bw.WriteUInt32(mvarBytesPerNUMBER); + if (fsom != null) + { + bw.WriteFixedLengthString(fsom.Title, 64); + } + else if (vcom != null) + { + bw.WriteFixedLengthString(vcom.Title, 64); + } + + #region Properties/Metadata (Versatile Container V2) + if (mvarFormatVersion.Major > 1) + { + long oldPosition = bw.Accessor.Position; + WriteUnum(bw, (ulong)mvarProperties.Count); + foreach (VersatileContainerProperty property in mvarProperties) + { + WriteUnum(bw, (ulong)property.Name.Length); + WriteUnum(bw, (ulong)property.Value.Length); + } + foreach (VersatileContainerProperty property in mvarProperties) + { + bw.WriteFixedLengthString(property.Name); + bw.WriteFixedLengthString(property.Value); + } + long newPosition = bw.Accessor.Position; + + long totalSizeOfBlock = (newPosition - oldPosition); + if ((mvarSectionAlignment - totalSizeOfBlock) > 0) + { + byte[] padding = new byte[mvarSectionAlignment - totalSizeOfBlock]; + bw.WriteBytes(padding); + } + } + #endregion + + if (fsom != null) + { + WriteUnum(bw, (ulong)fsom.Files.Count); + } + else if (vcom != null) + { + WriteUnum(bw, (ulong)vcom.Sections.Count); + } + + ulong sectionOffset = 0; + if (fsom != null) + { + sectionOffset = (ulong)(bw.Accessor.Position + ((32 + (mvarBytesPerNUMBER * 3)) * fsom.Files.Count)); + } + else if (vcom != null) + { + sectionOffset = (ulong)(bw.Accessor.Position + ((32 + (mvarBytesPerNUMBER * 3)) * vcom.Sections.Count)); + } + + byte[][] realDatas = null; + if (fsom != null) + { + realDatas = new byte[fsom.Files.Count][]; + } + else if (vcom != null) + { + realDatas = new byte[vcom.Sections.Count][]; + } + + if (fsom != null) + { + foreach (File section in fsom.Files) + { + byte[] data = section.GetDataAsByteArray(); + /* + if (section is File) + { + data = Compression.CompressionStream.Compress((section as File).CompressionMethod, data); + } + */ + ulong sectionVirtualSize = (ulong)data.Length; + realDatas[fsom.Files.IndexOf(section)] = data; + + bw.WriteFixedLengthString(section.Name, 32); + + ulong sectionPhysicalSize = sectionVirtualSize; + + ulong remainder = (sectionPhysicalSize % mvarSectionAlignment); + if (remainder != 0) + { + sectionPhysicalSize += (mvarSectionAlignment - remainder); + } + + WriteUnum(bw, sectionOffset); + WriteUnum(bw, sectionVirtualSize); + WriteUnum(bw, sectionPhysicalSize); + + /* + if (section is File) + { + bw.WriteInt32((int)((section as File).CompressionMethod)); + } + else + { + */ + bw.WriteInt32((int)Compression.CompressionMethod.None); + // } + + sectionOffset += sectionPhysicalSize; + } + + foreach (File section in fsom.Files) + { + byte[] realData = realDatas[fsom.Files.IndexOf(section)]; + ulong sectionVirtualSize = (ulong)realData.Length; + ulong sectionPhysicalSize = sectionVirtualSize; + + ulong remainder = (sectionPhysicalSize % mvarSectionAlignment); + if (remainder != 0) + { + sectionPhysicalSize += (mvarSectionAlignment - remainder); + } + + byte[] sectionData = new byte[sectionPhysicalSize]; + Array.Copy(realData, 0, sectionData, 0, (long)sectionVirtualSize); + + bw.WriteBytes(sectionData); + } + } + else if (vcom != null) + { + foreach (VersatileContainerSection section in vcom.Sections) + { + if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection content = (section as VersatileContainerContentSection); + + byte[] data = content.Data; + + ulong sectionVirtualSize = (ulong)data.Length; + realDatas[vcom.Sections.IndexOf(section)] = data; + + bw.WriteFixedLengthString(section.Name, 32); + + ulong sectionPhysicalSize = sectionVirtualSize; + + ulong remainder = (sectionPhysicalSize % mvarSectionAlignment); + if (remainder != 0) + { + sectionPhysicalSize += (mvarSectionAlignment - remainder); + } + + WriteUnum(bw, sectionOffset); + WriteUnum(bw, sectionVirtualSize); + WriteUnum(bw, sectionPhysicalSize); + + bw.WriteInt32((int)Compression.CompressionMethod.None); + + sectionOffset += sectionPhysicalSize; + } + } + foreach (VersatileContainerSection section in vcom.Sections) + { + byte[] realData = realDatas[vcom.Sections.IndexOf(section)]; + ulong sectionVirtualSize = (ulong)realData.Length; + ulong sectionPhysicalSize = sectionVirtualSize; + + ulong remainder = (sectionPhysicalSize % mvarSectionAlignment); + if (remainder != 0) + { + sectionPhysicalSize += (mvarSectionAlignment - remainder); + } + + byte[] sectionData = new byte[sectionPhysicalSize]; + Array.Copy(realData, 0, sectionData, 0, (long)sectionVirtualSize); + + bw.WriteBytes(sectionData); + } + } + bw.Flush(); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerV2DataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerV2DataFormat.cs new file mode 100644 index 00000000..d48101f6 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/DataFormats/VersatileContainer/VersatileContainerV2DataFormat.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.VersatileContainer; +using UniversalEditor.ObjectModels.VersatileContainer.Sections; + +namespace UniversalEditor.DataFormats.VersatileContainer +{ + public class VersatileContainerV2DataFormat : DataFormat + { + private Version mvarFormatVersion = new Version(2, 0); + public Version FormatVersion { get { return mvarFormatVersion; } set { mvarFormatVersion = value; } } + + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + if (_dfr == null) + { + _dfr = base.MakeReference(); + _dfr.Capabilities.Add(typeof(VersatileContainerObjectModel), DataFormatCapabilities.All); + _dfr.Filters.Add("Versatile Container object file", new byte?[][] { new byte?[] { (byte)'V', (byte)'e', (byte)'r', (byte)'s', (byte)'a', (byte)'t', (byte)'i', (byte)'l', (byte)'e', (byte)' ', (byte)'C', (byte)'o', (byte)'n', (byte)'t', (byte)'a', (byte)'i', (byte)'n', (byte)'e', (byte)'r', (byte)' ', (byte)'f', (byte)'i', (byte)'l', (byte)'e', (byte)' ', (byte)'0', (byte)'0', (byte)'0', (byte)'2' } }, new string[] { "*.vco" }); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + VersatileContainerObjectModel vcom = (objectModel as VersatileContainerObjectModel); + if (vcom == null) return; + + IO.Reader br = base.Accessor.Reader; + string signature = br.ReadFixedLengthString(30); // Versatile Container file 0002 + signature = signature.TrimNull(); + if (signature != "Versatile Container file 0002") throw new InvalidDataFormatException(); + + mvarFormatVersion = br.ReadVersion(); + vcom.Title = br.ReadNullTerminatedString(); + + uint propertyCount = br.ReadUInt32(); + uint sectionClassCount = br.ReadUInt32(); + uint sectionCount = br.ReadUInt32(); + + List sectionClassNames = new List(); + + #region Section Class Entries + for (uint i = 0; i < sectionClassCount; i++) + { + string sectionClassName = br.ReadNullTerminatedString(); + sectionClassNames.Add(sectionClassName); + } + #endregion + #region Section Entries + List sectionDataSizes = new List(); + for (uint i = 0; i < sectionCount; i++) + { + VersatileContainerSectionType sectionType = (VersatileContainerSectionType)br.ReadUInt32(); + string sectionName = br.ReadNullTerminatedString(); + + switch (sectionType) + { + case VersatileContainerSectionType.None: + { + sectionDataSizes.Add(0); + + VersatileContainerBlankSection sect = new VersatileContainerBlankSection(); + vcom.Sections.Add(sect); + break; + } + case VersatileContainerSectionType.Section: + { + uint sectionDataSize = br.ReadUInt32(); + sectionDataSizes.Add(sectionDataSize); + + uint sectionClassIndex = br.ReadUInt32(); + + VersatileContainerContentSection sect = new VersatileContainerContentSection(); + sect.Name = sectionName; + if (sectionClassIndex != 0xFFFFFFFF) + { + sect.ClassName = sectionClassNames[(int)sectionClassIndex]; + } + else + { + sect.ClassName = null; + } + vcom.Sections.Add(sect); + break; + } + case VersatileContainerSectionType.Directory: + { + sectionDataSizes.Add(0); + + VersatileContainerDirectorySection sect = new VersatileContainerDirectorySection(); + vcom.Sections.Add(sect); + break; + } + case VersatileContainerSectionType.Reference: + { + sectionDataSizes.Add(0); + uint sectionIndex = br.ReadUInt32(); + + VersatileContainerReferenceSection sect = new VersatileContainerReferenceSection(); + sect.Target = vcom.Sections[(int)sectionIndex]; + vcom.Sections.Add(sect); + break; + } + } + } + #endregion + for (uint i = 0; i < sectionCount; i++) + { + VersatileContainerSection section = vcom.Sections[(int)i]; + if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection sect = (section as VersatileContainerContentSection); + byte[] data = br.ReadBytes(sectionDataSizes[(int)i]); + if (sect == null) continue; + sect.Data = data; + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + VersatileContainerObjectModel vcom = (objectModel as VersatileContainerObjectModel); + if (vcom == null) return; + + IO.Writer bw = base.Accessor.Writer; + bw.WriteNullTerminatedString("Versatile Container file 0002"); + bw.WriteVersion(mvarFormatVersion); + bw.WriteNullTerminatedString(vcom.Title); + + bw.WriteUInt32((uint)vcom.Properties.Count); + + // get a list of section class names + List sectionClassNames = new List(); + foreach (VersatileContainerSection section in vcom.Sections) + { + if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection sect = (section as VersatileContainerContentSection); + if (!sectionClassNames.Contains(sect.ClassName)) sectionClassNames.Add(sect.ClassName); + } + } + bw.WriteUInt32((uint)sectionClassNames.Count); + + bw.WriteUInt32((uint)vcom.Sections.Count); + + #region Section Class Entries + foreach (string sectionClassName in sectionClassNames) + { + bw.WriteNullTerminatedString(sectionClassName); + } + #endregion + #region Section Entries + List sectionTypes = new List(); + List sectionDataSizes = new List(); + foreach (VersatileContainerSection section in vcom.Sections) + { + VersatileContainerSectionType sectionType = VersatileContainerSectionType.Section; // (VersatileContainerSectionType)br.ReadUInt32(); + bw.WriteUInt32((uint)sectionType); + + bw.WriteNullTerminatedString(section.Name); + if (section is VersatileContainerBlankSection) + { + } + else if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection sect = (section as VersatileContainerContentSection); + bw.WriteUInt32((uint)sect.Data.LongLength); + if (!String.IsNullOrEmpty(sect.ClassName)) + { + bw.WriteUInt32((uint)sectionClassNames.IndexOf(sect.ClassName)); + } + else + { + bw.WriteUInt32((uint)0xFFFFFFFF); + } + } + else if (section is VersatileContainerDirectorySection) + { + VersatileContainerDirectorySection sect = (section as VersatileContainerDirectorySection); + } + else if (section is VersatileContainerReferenceSection) + { + VersatileContainerReferenceSection sect = (section as VersatileContainerReferenceSection); + bw.WriteUInt32((uint)vcom.Sections.IndexOf(sect.Target)); + } + } + #endregion + foreach (VersatileContainerSection section in vcom.Sections) + { + if (section is VersatileContainerContentSection) + { + VersatileContainerContentSection sect = (section as VersatileContainerContentSection); + bw.WriteBytes(sect.Data); + } + } + } + } +} \ No newline at end of file diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerBlankSection.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerBlankSection.cs new file mode 100644 index 00000000..6a07f07d --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerBlankSection.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.VersatileContainer.Sections +{ + public class VersatileContainerBlankSection : VersatileContainerSection + { + public override object Clone() + { + VersatileContainerBlankSection clone = new VersatileContainerBlankSection(); + return clone; + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerContentSection.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerContentSection.cs new file mode 100644 index 00000000..a7a85b7e --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerContentSection.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.VersatileContainer.Sections +{ + public class VersatileContainerContentSection : VersatileContainerSection + { + private string mvarClassName = String.Empty; + public string ClassName { get { return mvarClassName; } set { mvarClassName = value; } } + + private byte[] mvarData = new byte[0]; + public byte[] Data { get { return mvarData; } set { mvarData = value; } } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("\"" + this.Name + "\""); + if (!String.IsNullOrEmpty(mvarClassName)) + { + sb.Append(" : "); + sb.Append(mvarClassName); + } + return sb.ToString(); + } + public override object Clone() + { + VersatileContainerContentSection clone = new VersatileContainerContentSection(); + clone.Name = (this.Name.Clone() as string); + clone.ClassName = (mvarClassName.Clone() as string); + clone.Data = (mvarData.Clone() as byte[]); + return clone; + } + + private Compression.CompressionMethod mvarCompressionMethod = Compression.CompressionMethod.None; + public Compression.CompressionMethod CompressionMethod { get { return mvarCompressionMethod; } set { mvarCompressionMethod = value; } } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerDirectorySection.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerDirectorySection.cs new file mode 100644 index 00000000..d4d6bac4 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerDirectorySection.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.VersatileContainer.Sections +{ + public class VersatileContainerDirectorySection : VersatileContainerSection + { + public override object Clone() + { + VersatileContainerDirectorySection clone = new VersatileContainerDirectorySection(); + return clone; + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerReferenceSection.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerReferenceSection.cs new file mode 100644 index 00000000..3e32dd5a --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/Sections/VersatileContainerReferenceSection.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.VersatileContainer.Sections +{ + public class VersatileContainerReferenceSection : VersatileContainerSection + { + private VersatileContainerSection mvarTarget = null; + public VersatileContainerSection Target { get { return mvarTarget; } set { mvarTarget = value; } } + + public override object Clone() + { + VersatileContainerReferenceSection clone = new VersatileContainerReferenceSection(); + clone.Target = mvarTarget; + return clone; + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerObjectModel.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerObjectModel.cs new file mode 100644 index 00000000..cff28bc4 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerObjectModel.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.VersatileContainer +{ + public class VersatileContainerObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + public override ObjectModelReference MakeReference() + { + if (_omr == null) + { + _omr = base.MakeReference(); + _omr.Title = "Versatile Container"; + } + return _omr; + } + + private VersatileContainerSection.VersatileContainerSectionCollection mvarSections = new VersatileContainerSection.VersatileContainerSectionCollection(); + public VersatileContainerSection.VersatileContainerSectionCollection Sections { get { return mvarSections; } } + + private VersatileContainerProperty.VersatileContainerPropertyCollection mvarProperties = new VersatileContainerProperty.VersatileContainerPropertyCollection(); + public VersatileContainerProperty.VersatileContainerPropertyCollection Properties { get { return mvarProperties; } } + + public override void Clear() + { + mvarSections.Clear(); + } + public override void CopyTo(ObjectModel where) + { + VersatileContainerObjectModel clone = (where as VersatileContainerObjectModel); + if (clone == null) return; + + foreach (VersatileContainerSection section in mvarSections) + { + clone.Sections.Add(section.Clone() as VersatileContainerSection); + } + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerProperty.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerProperty.cs new file mode 100644 index 00000000..e8865454 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerProperty.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.VersatileContainer +{ + public class VersatileContainerProperty + { + public class VersatileContainerPropertyCollection + : System.Collections.ObjectModel.Collection + { + public VersatileContainerProperty Add(string name, string value) + { + VersatileContainerProperty property = new VersatileContainerProperty(); + property.Name = name; + property.Value = value; + base.Add(property); + return property; + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private string mvarValue = String.Empty; + public string Value { get { return mvarValue; } set { mvarValue = value; } } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerSection.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerSection.cs new file mode 100644 index 00000000..7861b99a --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/ObjectModels/VersatileContainer/VersatileContainerSection.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Text; +using UniversalEditor.ObjectModels.VersatileContainer.Sections; + +namespace UniversalEditor.ObjectModels.VersatileContainer +{ + public abstract class VersatileContainerSection : ICloneable + { + public class VersatileContainerSectionCollection + : System.Collections.ObjectModel.Collection + { + private Dictionary sectionsByName = new Dictionary(); + + public VersatileContainerSection this[string Name] + { + get + { + if (sectionsByName.ContainsKey(Name)) + { + return sectionsByName[Name]; + } + return null; + } + } + + protected override void InsertItem(int index, VersatileContainerSection item) + { + if (!String.IsNullOrEmpty(item.Name)) sectionsByName.Add(item.Name, item); + base.InsertItem(index, item); + } + protected override void RemoveItem(int index) + { + if (!String.IsNullOrEmpty(this[index].Name)) sectionsByName.Remove(this[index].Name); + base.RemoveItem(index); + } + + + public VersatileContainerContentSection Add(string Name, byte[] Data) + { + return Add(Name, String.Empty, Data); + } + public VersatileContainerContentSection Add(string Name, string ClassName, byte[] Data) + { + VersatileContainerContentSection content = new VersatileContainerContentSection(); + content.Name = Name; + content.ClassName = ClassName; + content.Data = Data; + Add(content); + return content; + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + public abstract object Clone(); + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/Properties/AssemblyInfo.cs b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..03c48d14 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("VersatileContainer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("City of Orlando")] +[assembly: AssemblyProduct("VersatileContainer")] +[assembly: AssemblyCopyright("Copyright © City of Orlando 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("66a1c3a0-e85e-42ff-ad5e-a19c07d191ab")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/UniversalEditor.Plugins.VersatileContainer.csproj b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/UniversalEditor.Plugins.VersatileContainer.csproj new file mode 100644 index 00000000..60120b51 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.VersatileContainer/UniversalEditor.Plugins.VersatileContainer.csproj @@ -0,0 +1,74 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {FFC91B24-39AF-49AC-9A3A-900FBE1012ED} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.VersatileContainer + v3.5 + 512 + + + true + full + false + ..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + {3f664673-7e22-4486-9ad0-fc81861d0b78} + UniversalEditor.Compression + + + {2d4737e6-6d95-408a-90db-8dff38147e85} + UniversalEditor.Core + + + {30467e5c-05bc-4856-aadc-13906ef4cadd} + UniversalEditor.Essential + + + + + \ No newline at end of file diff --git a/CSharp/UniversalEditor.sln b/CSharp/UniversalEditor.sln index 8f5f5795..42de2d3f 100644 --- a/CSharp/UniversalEditor.sln +++ b/CSharp/UniversalEditor.sln @@ -65,6 +65,20 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Abo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.ConsoleBootstrapper", "Applications\UniversalEditor.ConsoleBootstrapper\UniversalEditor.ConsoleBootstrapper.csproj", "{62CFC025-B8CF-42AA-880A-92F27377FCAF}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Multimedia3D", "Plugins\UniversalEditor.Plugins.Multimedia3D\UniversalEditor.Plugins.Multimedia3D.csproj", "{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Moosta", "Plugins\UniversalEditor.Plugins.Moosta\UniversalEditor.Plugins.Moosta.csproj", "{10B9B771-9939-4D0B-8D47-501B6F60209F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.AniMiku", "Plugins\UniversalEditor.Plugins.AniMiku\UniversalEditor.Plugins.AniMiku.csproj", "{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Avalanche", "Plugins\UniversalEditor.Plugins.Avalanche\UniversalEditor.Plugins.Avalanche.csproj", "{828C6BB6-3543-4EAF-B0F9-F11410AE8836}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Lighting", "Plugins\UniversalEditor.Plugins.Lighting\UniversalEditor.Plugins.Lighting.csproj", "{1C24F4F8-9D94-4783-B5C0-11564D70B76A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Concertroid", "Plugins\UniversalEditor.Plugins.Concertroid\UniversalEditor.Plugins.Concertroid.csproj", "{D3BBDA07-5088-454E-A16D-DA24D8D88037}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.VersatileContainer", "Plugins\UniversalEditor.Plugins.VersatileContainer\UniversalEditor.Plugins.VersatileContainer.csproj", "{FFC91B24-39AF-49AC-9A3A-900FBE1012ED}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -207,6 +221,48 @@ Global {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Any CPU.ActiveCfg = Release|Any CPU {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Any CPU.Build.0 = Release|Any CPU {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|x86.ActiveCfg = Release|Any CPU + {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|x86.ActiveCfg = Debug|Any CPU + {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Any CPU.Build.0 = Release|Any CPU + {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|x86.ActiveCfg = Release|Any CPU + {10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|x86.ActiveCfg = Debug|Any CPU + {10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Any CPU.Build.0 = Release|Any CPU + {10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|x86.ActiveCfg = Release|Any CPU + {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|x86.ActiveCfg = Debug|Any CPU + {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Any CPU.Build.0 = Release|Any CPU + {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|x86.ActiveCfg = Release|Any CPU + {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Any CPU.Build.0 = Debug|Any CPU + {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|x86.ActiveCfg = Debug|Any CPU + {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Any CPU.ActiveCfg = Release|Any CPU + {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Any CPU.Build.0 = Release|Any CPU + {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|x86.ActiveCfg = Release|Any CPU + {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|x86.ActiveCfg = Debug|Any CPU + {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Any CPU.Build.0 = Release|Any CPU + {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|x86.ActiveCfg = Release|Any CPU + {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|x86.ActiveCfg = Debug|Any CPU + {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Any CPU.Build.0 = Release|Any CPU + {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|x86.ActiveCfg = Release|Any CPU + {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|x86.ActiveCfg = Debug|Any CPU + {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Any CPU.Build.0 = Release|Any CPU + {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -229,6 +285,13 @@ Global {76FD1306-9CA4-428F-993B-B7E4EEEACBF3} = {71CFF024-26F7-4626-A526-B435FDF8D64E} {26095090-3F7D-4DB5-A9BF-4C687230FC0F} = {71CFF024-26F7-4626-A526-B435FDF8D64E} {D4D9C9A6-04A4-46AD-8238-2493A455723F} = {71CFF024-26F7-4626-A526-B435FDF8D64E} + {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2} = {71CFF024-26F7-4626-A526-B435FDF8D64E} + {10B9B771-9939-4D0B-8D47-501B6F60209F} = {71CFF024-26F7-4626-A526-B435FDF8D64E} + {FEC4EAD0-8A6E-4029-A537-EBD9F420B227} = {71CFF024-26F7-4626-A526-B435FDF8D64E} + {828C6BB6-3543-4EAF-B0F9-F11410AE8836} = {71CFF024-26F7-4626-A526-B435FDF8D64E} + {1C24F4F8-9D94-4783-B5C0-11564D70B76A} = {71CFF024-26F7-4626-A526-B435FDF8D64E} + {D3BBDA07-5088-454E-A16D-DA24D8D88037} = {71CFF024-26F7-4626-A526-B435FDF8D64E} + {FFC91B24-39AF-49AC-9A3A-900FBE1012ED} = {71CFF024-26F7-4626-A526-B435FDF8D64E} {FE016EA3-DC31-4A92-8B0A-8C746EC117E1} = {46041F27-7C1C-4209-B72B-251EDB5D4C61} {C1F34183-7A2F-41A6-9958-F6F329099654} = {A846CA33-9CAA-4237-B14F-8721DBA89442} {5A423A3E-51C5-4188-8AD5-FB5C0CB76C6A} = {C1F34183-7A2F-41A6-9958-F6F329099654}