Implemented LoadInternal for CFL data format (was unfinished)
This commit is contained in:
parent
68e04c5d8c
commit
467eeb2633
@ -7,55 +7,77 @@ using UniversalEditor.ObjectModels.FileSystem;
|
||||
|
||||
namespace UniversalEditor.DataFormats.FileSystem.CFL
|
||||
{
|
||||
public class CFLDataFormat : DataFormat
|
||||
{
|
||||
private static DataFormatReference _dfr = null;
|
||||
public override DataFormatReference MakeReference()
|
||||
{
|
||||
if (_dfr == null)
|
||||
{
|
||||
_dfr = base.MakeReference();
|
||||
_dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All);
|
||||
_dfr.Filters.Add("Compressed File Library archive", new byte?[][] { new byte?[] { (byte)'C', (byte)'F', (byte)'L', (byte)'3' } }, new string[] { "*.cfl" });
|
||||
_dfr.Sources.Add("http://sol.gfxile.net/cfl/index.html");
|
||||
}
|
||||
return _dfr;
|
||||
}
|
||||
public class CFLDataFormat : DataFormat
|
||||
{
|
||||
private static DataFormatReference _dfr = null;
|
||||
public override DataFormatReference MakeReference()
|
||||
{
|
||||
if (_dfr == null)
|
||||
{
|
||||
_dfr = base.MakeReference();
|
||||
_dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All);
|
||||
_dfr.Filters.Add("Compressed File Library archive", new byte?[][] { new byte?[] { (byte)'C', (byte)'F', (byte)'L', (byte)'3' } }, new string[] { "*.cfl" });
|
||||
_dfr.Sources.Add("http://sol.gfxile.net/cfl/index.html");
|
||||
}
|
||||
return _dfr;
|
||||
}
|
||||
|
||||
protected override void LoadInternal(ref ObjectModel objectModel)
|
||||
{
|
||||
FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
|
||||
if (fsom == null) throw new ObjectModelNotSupportedException();
|
||||
protected override void LoadInternal(ref ObjectModel objectModel)
|
||||
{
|
||||
FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
|
||||
if (fsom == null) throw new ObjectModelNotSupportedException();
|
||||
|
||||
Reader reader = base.Accessor.Reader;
|
||||
string CFL3 = reader.ReadFixedLengthString(4);
|
||||
if (CFL3 != "CFL3") throw new InvalidDataFormatException();
|
||||
Reader reader = base.Accessor.Reader;
|
||||
string CFL3 = reader.ReadFixedLengthString(4);
|
||||
if (CFL3 != "CFL3") throw new InvalidDataFormatException();
|
||||
|
||||
uint offsetToDirectory = reader.ReadUInt32();
|
||||
uint decompressedLibrarySize = reader.ReadUInt32();
|
||||
uint offsetToDirectory = reader.ReadUInt32();
|
||||
uint decompressedLibrarySize = reader.ReadUInt32();
|
||||
|
||||
uint unknown1 = reader.ReadUInt32();
|
||||
base.Accessor.Seek(offsetToDirectory, SeekOrigin.Begin);
|
||||
uint compressionType = reader.ReadUInt32();
|
||||
uint directorySize = reader.ReadUInt32();
|
||||
long directoryEnd = reader.Accessor.Position + directorySize;
|
||||
|
||||
base.Accessor.Seek(offsetToDirectory, SeekOrigin.Begin);
|
||||
uint compressionType = reader.ReadUInt32();
|
||||
#region Directory Entry
|
||||
while (reader.Accessor.Position != directoryEnd)
|
||||
{
|
||||
uint fileSize = reader.ReadUInt32();
|
||||
uint offset = reader.ReadUInt32();
|
||||
uint compressionMethod = reader.ReadUInt32();
|
||||
string fileName = reader.ReadUInt16String();
|
||||
|
||||
{
|
||||
uint flags = reader.ReadUInt32();
|
||||
uint unknown2 = reader.ReadUInt32();
|
||||
uint unknown3 = reader.ReadUInt32();
|
||||
File file = fsom.AddFile(fileName);
|
||||
file.Size = fileSize;
|
||||
file.Properties.Add("reader", reader);
|
||||
file.Properties.Add("length", fileSize);
|
||||
file.Properties.Add("offset", offset);
|
||||
file.DataRequest += file_DataRequest;
|
||||
}
|
||||
#endregion
|
||||
|
||||
string fileName = reader.ReadUInt16String();
|
||||
}
|
||||
uint offsetToEndOfFile = reader.ReadUInt32();
|
||||
string signatureFooter = reader.ReadFixedLengthString(4);
|
||||
if (signatureFooter != "3CFL") throw new InvalidDataFormatException("File does not end with '3CFL'");
|
||||
}
|
||||
|
||||
uint offsetToHeader = reader.ReadUInt32();
|
||||
private void file_DataRequest(object sender, DataRequestEventArgs e)
|
||||
{
|
||||
File file = (sender as File);
|
||||
Reader reader = (Reader)file.Properties["reader"];
|
||||
uint filesize = (uint)file.Properties["length"];
|
||||
uint offset = (uint)file.Properties["offset"];
|
||||
|
||||
string signatureFooter = reader.ReadFixedLengthString(4);
|
||||
if (signatureFooter != "3CFL") throw new InvalidDataFormatException("File does not end with '3CFL'");
|
||||
}
|
||||
reader.Accessor.Seek(offset, SeekOrigin.Begin);
|
||||
uint compressedSize = reader.ReadUInt32();
|
||||
byte[] compressedData = reader.ReadBytes(compressedSize);
|
||||
byte[] decompressedData = compressedData;
|
||||
e.Data = decompressedData;
|
||||
}
|
||||
|
||||
protected override void SaveInternal(ObjectModel objectModel)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
protected override void SaveInternal(ObjectModel objectModel)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user