EveryFileExplorer/LibEveryFileExplorer/Files/EFEFile.cs
2014-11-04 16:22:45 +01:00

94 lines
2.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using LibEveryFileExplorer.Compression;
namespace LibEveryFileExplorer.Files
{
public abstract class EFEFile
{
public EFEFile()
{
Children = new List<EFEFile>();
}
public CompressionFormatBase CompressionFormat { get; private set; }
public byte[] Data { get; set; }
public bool IsCompressed { get; private set; }
public String Name { get; set; }
public EFEFile Parent { get; set; }
public List<EFEFile> Children { get; private set; }
public abstract void Save();
protected void PrepareDataForUse(byte[] FileData)
{
List<Type> Compressions = new List<Type>();
foreach (dynamic p in EveryFileExplorerUtil.Program.PluginManager.Plugins)
{
foreach (Type t in p.CompressionTypes)
{
dynamic c = new LibEveryFileExplorer.StaticDynamic(t);
if (c.Identifier.IsFormat(FileData)) Compressions.Add(t);
}
}
IsCompressed = false;
CompressionFormat = null;
if (Compressions.Count == 1)
{
CompressionFormatBase c = (CompressionFormatBase)Compressions[0].InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, null, new object[0]);
try
{
byte[] Result = c.Decompress(FileData);
IsCompressed = true;
CompressionFormat = c;
FileData = Result;
}
catch { }
}
else if (Compressions.Count > 1)
{
foreach (Type t in Compressions)
{
CompressionFormatBase c = (CompressionFormatBase)t.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, null, new object[0]);
try
{
byte[] Result = c.Decompress(FileData);
IsCompressed = true;
CompressionFormat = c;
FileData = Result;
break;
}
catch { }
}
}
Data = FileData;
}
protected byte[] GetDataForSave()
{
if (IsCompressed)
{
if (CompressionFormat is ICompressable)
{
return ((ICompressable)CompressionFormat).Compress(Data);
}
else throw new Exception("This file uses a compression method that has no compression implemented!");
}
return Data;
}
public abstract byte[] FindFileRelative(String Path);
public abstract override bool Equals(object obj);
}
}