DS-Pokemon-Rom-Editor/DS_Map/LibNDSFormats/NSBTX/inlinefile.cs
2020-10-06 22:57:27 +02:00

102 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
namespace NSMBe4.DSFileSystem
{
public class InlineFile : File
{
private int inlineOffs;
private int inlineLen;
private File parentFile;
private CompressionType comp;
public enum CompressionType : int
{
NoComp,
LZComp,
LZWithHeaderComp
}
public InlineFile(File parent, int offs, int len, string name, Directory parentDir) :
this(parent, offs, len, name, parentDir, CompressionType.NoComp)
{
}
public InlineFile(File parent, int offs, int len, string name, Directory parentDir, CompressionType comp)
: base(parent.parent, parentDir, parent.name + " - " + name + ":" + offs.ToString("X") + ":" + len)
{
parentFile = parent;
inlineOffs = offs;
inlineLen = len;
this.comp = comp;
this.fixedFile = true;
this.canChangeOffset = false;
refreshOffsets();
}
public override byte[] getContents()
{
if (comp != CompressionType.NoComp)
{
byte[] data;
if (comp == CompressionType.LZWithHeaderComp)
data = ROM.LZ77_DecompressWithHeader(parentFile.getContents());
else
data = ROM.LZ77_Decompress(parentFile.getContents());
byte[] thisdata = new byte[inlineLen];
Array.Copy(data, inlineOffs, thisdata, 0, inlineLen);
return thisdata;
}
else return base.getContents();
}
public override void replace(byte[] newFile, object editor)
{
//if (!isAGoodEditor(editor))
// throw new Exception("NOT CORRECT EDITOR " + name);
if (comp != CompressionType.NoComp)
{
byte[] data;
if (comp == CompressionType.LZWithHeaderComp)
data = ROM.LZ77_DecompressWithHeader(parentFile.getContents());
else
data = ROM.LZ77_Decompress(parentFile.getContents());
Array.Copy(newFile, 0, data, inlineOffs, inlineLen);
parentFile.replace(ROM.LZ77_Compress(data, comp == CompressionType.LZWithHeaderComp), this);
}
else base.replace(newFile, editor);
}
public override void beginEdit(object editor)
{
parentFile.beginEditInline(this);
base.beginEdit(editor);
}
public override void endEdit(object editor)
{
parentFile.endEditInline(this);
base.endEdit(editor);
}
public override void refreshOffsets()
{
fileBegin = parentFile.fileBegin + inlineOffs;
fileSize = inlineLen;
}
public override void saveOffsets()
{
}
public override void enableEdition()
{
refreshOffsets(); // In case the parent file gets moved...
base.enableEdition();
}
}
}