- unified handling for deleting channels (action based on file format support either mark-as-deleted, remove-from-file, append-at-end)

- added unit tests
- internal code cleanup
This commit is contained in:
hbeham
2019-11-08 02:31:44 +01:00
parent caca802c0a
commit 34b281f5fc
105 changed files with 2024 additions and 1442 deletions

View File

@@ -1,4 +1,7 @@
using System.Text;
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Windows.Forms;
namespace ChanSort.Api
{
@@ -6,21 +9,34 @@ namespace ChanSort.Api
{
#region class SupportedFeatures
public enum DeleteMode
{
NotSupported = 0,
Physically = 1,
FlagWithoutPrNr = 2,
FlagWithPrNr = 3
}
public class SupportedFeatures
{
public ChannelNameEditMode ChannelNameEdit { get; set; }
public bool CleanUpChannelData { get; set; }
public bool DeviceSettings { get; set; }
public bool CanDeleteChannels { get; set; }
public bool CanSkipChannels { get; set; } = true;
public bool CanHaveGaps { get; set; }
public bool CanHaveGaps { get; set; } = true;
public bool EncryptedFlagEdit { get; set; }
public DeleteMode DeleteMode { get; set; } = DeleteMode.NotSupported;
public Favorites SupportedFavorites { get; set; } = Favorites.A | Favorites.B | Favorites.C | Favorites.D;
public bool SortedFavorites { get; set; }
public bool MixedSourceFavorites { get; set; }
public bool AllowGapsInFavNumbers { get; set; }
public bool CanDeleteChannelsWithFlag => this.DeleteMode == DeleteMode.FlagWithPrNr || this.DeleteMode == DeleteMode.FlagWithoutPrNr;
public bool CanDeleteChannelsFromFile => this.DeleteMode == DeleteMode.Physically;
public bool DeletedChannelsNeedNumbers => this.DeleteMode == DeleteMode.FlagWithPrNr;
public SupportedFeatures()
{
this.CanDeleteChannels = true;
this.CanHaveGaps = true;
}
}
#endregion
@@ -28,17 +44,15 @@ namespace ChanSort.Api
public string FileName { get; set; }
public DataRoot DataRoot { get; protected set; }
public SupportedFeatures Features { get; private set; }
public SupportedFeatures Features { get; } = new SupportedFeatures();
protected SerializerBase(string inputFile)
{
this.Features = new SupportedFeatures();
this.FileName = inputFile;
this.DataRoot = new DataRoot();
this.defaultEncoding = Encoding.GetEncoding("iso-8859-9");
this.DataRoot = new DataRoot(this);
}
public abstract string DisplayName { get; }
public abstract void Load();
public abstract void Save(string tvOutputFile);
@@ -48,8 +62,7 @@ namespace ChanSort.Api
set { this.defaultEncoding = value; }
}
public virtual void EraseChannelData() { }
#region GetFileInformation()
public virtual string GetFileInformation()
{
StringBuilder sb = new StringBuilder();
@@ -85,9 +98,52 @@ namespace ChanSort.Api
}
return sb.ToString();
}
#endregion
public virtual void ShowDeviceSettingsForm(object parentWindow) { }
public virtual string CleanUpChannelData() { return ""; }
// common implementation helper methods
protected string UnzipFileToTempFolder()
{
var tempDir = this.FileName + ".tmp";
if (Directory.Exists(tempDir))
Directory.Delete(tempDir, true);
Directory.CreateDirectory(tempDir);
ZipFile.ExtractToDirectory(this.FileName, tempDir);
this.DeleteOnExit(tempDir);
return tempDir;
}
protected void ZipToOutputFile(string tvOutputFile)
{
var tempDir = this.FileName + ".tmp";
File.Delete(tvOutputFile);
ZipFile.CreateFromDirectory(tempDir, tvOutputFile);
this.FileName = tvOutputFile;
}
// TODO: replace this with a SerializerBase implementing IDisposable
protected virtual void DeleteOnExit(string fileOrFolder)
{
Application.ApplicationExit += (sender, args) =>
{
try
{
if (Directory.Exists(fileOrFolder))
Directory.Delete(fileOrFolder, true);
else if (File.Exists(fileOrFolder))
File.Delete(fileOrFolder);
}
catch
{
// ignore
}
};
}
}
}