using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using BurnOutSharp.Interfaces; using BurnOutSharp.Matching; namespace BurnOutSharp.ProtectionType { public class BDPlus : IPathCheck { /// public ConcurrentQueue CheckDirectoryPath(string path, IEnumerable files) { var matchers = new List { new PathMatchSet(new List { Path.Combine("BDSVM", "00000.svm").Replace("\\", "/"), Path.Combine("BDSVM", "BACKUP", "00000.svm").Replace("\\", "/"), }, GetVersion, "BD+"), }; return MatchUtil.GetAllMatches(files, matchers, any: true); } /// public string CheckFilePath(string path) { var matchers = new List { new PathMatchSet(new PathMatch("00000.svm", useEndsWith: true), GetVersion, "BD+"), }; return MatchUtil.GetFirstMatch(path, matchers, any: true); } /// /// Version detection logic from libbdplus was used to implement this /// public static string GetVersion(string firstMatchedString, IEnumerable files) { if (!File.Exists(firstMatchedString)) return "(Unknown Version)"; try { using (var fs = File.OpenRead(firstMatchedString)) { fs.Seek(0x0D, SeekOrigin.Begin); byte[] date = new byte[4]; fs.Read(date, 0, 4); //yymd short year = BitConverter.ToInt16(date.Reverse().ToArray(), 2); // Do some rudimentary date checking if (year < 2006 || year > 2100 || date[2] < 1 || date[2] > 12 || date[3] < 1 || date[3] > 31) return "(Invalid Version)"; return $"{year:0000}/{date[2]:00}/{date[3]:00}"; } } catch { return "(Unknown Version)"; } } } }