feyris-tan e3b125e29d
Some checks failed
🚀 Pack skyscraper8 / make-zip (push) Failing after 1m49s
minor bug fixes.
2025-10-30 07:58:27 +01:00

349 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Skyscraper.IO;
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.src.Skyscraper.IO.PortableExecutables;
namespace skyscraper5.IO.StreamReader
{
public partial class LocalStreamReader : IStreamReader
{
private LocalStreamReader()
{
}
private static LocalStreamReader _instance;
public static LocalStreamReader GetInstance()
{
if (_instance == null)
{
_instance = new LocalStreamReader();
_instance.dllInfo = _instance.GetDllInfo();
}
return _instance;
}
public bool CheckForDVB()
{
return UnsafeStreamReaderMethods.CheckForDVB();
}
public bool CheckForDVBEx(DvbEnumCallback func)
{
return UnsafeStreamReaderMethods.CheckForDVBEx(func);
}
public bool CheckForDVBExEx(DvbEnumCallbackEx func)
{
return UnsafeStreamReaderMethods.CheckForDVBExEx(func);
}
public bool StartDVB()
{
return UnsafeStreamReaderMethods.StartDVB();
}
public bool StartDvbEx(int index)
{
return UnsafeStreamReaderMethods.StartDvbEx(index);
}
public bool StopDVB()
{
return UnsafeStreamReaderMethods.StopDVB();
}
public bool GetTunerType(ref STD_TYPE type)
{
return UnsafeStreamReaderMethods.GetTunerType(ref type);
}
public bool SendDiSEqC(uint diseqcType, DiSEqC_Opcode data)
{
return UnsafeStreamReaderMethods.SendDiSEqC(diseqcType, data);
}
public bool SendDiseqCmd(byte[] buffer, int length)
{
return UnsafeStreamReaderMethods.SendDiseqCmd(buffer, length);
}
public bool SendDiseqCmdEx(IntPtr pCmd, int length, IntPtr reply, int replyLength)
{
return UnsafeStreamReaderMethods.SendDiseqCmdEx(pCmd, length, reply, replyLength);
}
public bool SetChannel(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw)
{
try
{
return UnsafeStreamReaderMethods.SetChannel(freq, symbrate, pol, fec, lof1, lof2, lofsw);
}
catch (DivideByZeroException dvze)
{
Console.WriteLine("Mitigated Division-by-Zero bug in StreamReader.dll.");
return false;
}
}
public bool SetChannelEx(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw, MOD_TYPE mod)
{
return UnsafeStreamReaderMethods.SetChannelEx(freq, symbrate, pol, fec, lof1, lof2, lofsw, mod);
}
public bool SetChannelExEx(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw, MOD_TYPE mod, int inv, int pilot, ROLLOFF_TYPE rolloff)
{
return UnsafeStreamReaderMethods.SetChannelExEx(freq, symbrate, pol, fec, lof1, lof2, lofsw, mod, inv, pilot, rolloff);
}
public bool SetFilter(int pid, StdcallDvbCallback func, int callbackType, int size, ref IntPtr lpFilterNum)
{
return UnsafeStreamReaderMethods.SetFilter(pid, func, callbackType, size, ref lpFilterNum);
}
public bool SetFilterEx(int pid, StdcallDvbCallbackEx lpFunc, int callbackType, int size, ref IntPtr lpFilterNum)
{
return UnsafeStreamReaderMethods.SetFilterEx(pid, lpFunc, callbackType, size, ref lpFilterNum);
}
public bool SetBitFilter(int pid, IntPtr filterData, IntPtr filterMask, byte filterLength, StdcallDvbCallback lpFunc, ref IntPtr lpFilterNum)
{
return UnsafeStreamReaderMethods.SetBitFilter(pid, filterData, filterMask, filterLength, lpFunc, ref lpFilterNum);
}
public bool SetRemoteControl(int irtype, short devAddr, StdcallDvbCallback func, ref IntPtr lpFilterNum)
{
return UnsafeStreamReaderMethods.SetRemoteControl(irtype, devAddr, func, ref lpFilterNum);
}
public bool DelFilter(IntPtr filterNum)
{
return UnsafeStreamReaderMethods.DelFilter(filterNum);
}
public bool GetSignal(ref int pStrength, ref int pQuality)
{
return UnsafeStreamReaderMethods.GetSignal(ref pStrength, ref pQuality);
}
public bool GetSignalStrength(ref float pStrength, ref float pQuality)
{
return UnsafeStreamReaderMethods.GetSignalStrength(ref pStrength, ref pQuality);
}
public bool GetSignalEx(ref float pSNR, ref float pBER)
{
return UnsafeStreamReaderMethods.GetSignalEx(ref pSNR, ref pBER);
}
public bool GetSignalExEx(ref bool pPresent, ref bool pLock, ref int pRFLevel, ref float pSNR, ref float pBER)
{
return UnsafeStreamReaderMethods.GetSignalExEx(ref pPresent, ref pLock, ref pRFLevel, ref pSNR, ref pBER);
}
public bool Statistic(int[] pStat)
{
return UnsafeStreamReaderMethods.Statistic(pStat);
}
public bool GetMAC(byte[] pMac)
{
return UnsafeStreamReaderMethods.GetMAC(pMac);
}
public Caps GetCaps()
{
return UnsafeStreamReaderMethods.GetCaps();
}
public bool RFScan(int freq, int pol, int lof1, int lof2, int lofsw, out double pRFLevel)
{
return UnsafeStreamReaderMethods.RFScan(freq, pol, lof1, lof2, lofsw, out pRFLevel);
}
public bool FFTInit()
{
return UnsafeStreamReaderMethods.FFTInit();
}
public bool FFTScan(int freq, int pol, int lof1, int lof2, int lofsw, uint range, byte mode, byte nb_acc, IntPtr pTab, IntPtr pBegin, IntPtr pNum)
{
return UnsafeStreamReaderMethods.FFTScan(freq, pol, lof1, lof2, lofsw, range, mode, nb_acc, pTab, pBegin, pNum);
}
public bool BLScan(int freq, int freq_range, int pol, int lof1, int lof2, int lofsw, int minsr, ref SearchResult pSearchResult)
{
return UnsafeStreamReaderMethods.BLScan(freq, freq_range, pol, lof1, lof2, lofsw, minsr, ref pSearchResult);
}
public bool BLScanEx(int freq, int freq_range, int pol, int lof1, int lof2, int lofsw, int minsr, STD_TYPE std, ref SearchResult pSearchResult)
{
return UnsafeStreamReaderMethods.BLScanEx(freq, freq_range, pol, lof1, lof2, lofsw, minsr, std, ref pSearchResult);
}
public bool BLScan2(int freq_start, int freq_stop, int pol, int lof1, int lof2, int lofsw, IntPtr pSearchResult, ref int pTpNum, BlScanCallback lpFunc)
{
return UnsafeStreamReaderMethods.BLScan2(freq_start, freq_stop, pol, lof1, lof2, lofsw, pSearchResult, ref pTpNum, lpFunc);
}
public bool SignalInfo(ref SearchResult pSearchResult)
{
return UnsafeStreamReaderMethods.SignalInfo(ref pSearchResult);
}
public bool IQScan(uint input, sbyte[] pIQ, uint num)
{
return UnsafeStreamReaderMethods.IQScan(input, pIQ, num);
}
public bool IQScan2(uint point, short[] pIQ, uint num)
{
return UnsafeStreamReaderMethods.IQScan2(point, pIQ, num);
}
public bool IQScan2Range(byte input, ref ushort pMinPoint, ref ushort pMaxPoint)
{
return UnsafeStreamReaderMethods.IQScan2Range(input, ref pMinPoint, ref pMaxPoint);
}
public bool CIRScanRange(bool bHiRes, ref ushort pMinCnum, ref ushort pMaxCnum, ref int pMinDelayNs, ref int pMaxDelayNs)
{
return UnsafeStreamReaderMethods.CIRScanRange(bHiRes, ref pMinCnum, ref pMaxCnum, ref pMinDelayNs, ref pMaxDelayNs);
}
public bool CIRScan(bool bHiRes, int[] pPowers, int[] pDelays)
{
return UnsafeStreamReaderMethods.CIRScan(bHiRes, pPowers, pDelays);
}
public bool CarRange(ref ushort pMinCnum, ref ushort pMaxCnum)
{
return UnsafeStreamReaderMethods.CarRange(ref pMinCnum, ref pMaxCnum);
}
public bool CarEsNo(ref ushort cnum, ref double pEsNo)
{
return UnsafeStreamReaderMethods.CarEsNo(ref cnum, ref pEsNo);
}
public bool MISSel(bool bEnable, byte misFilter, byte misFilterMask)
{
return UnsafeStreamReaderMethods.MISSel(bEnable, misFilter, misFilterMask);
}
public bool PLSSel(byte plsMode, uint code)
{
return UnsafeStreamReaderMethods.PLSSel(plsMode, code);
}
public bool PLSGet(byte pMode, ref uint pCode)
{
return UnsafeStreamReaderMethods.PLSGet(pMode, ref pCode);
}
public bool ModSel(ref S2Mode ps2Modes, uint num)
{
return UnsafeStreamReaderMethods.ModSel(ref ps2Modes, num);
}
public bool ModInv(uint WaitMs, ref S2Mode pS2Modes, ref uint pNum)
{
return UnsafeStreamReaderMethods.ModInv(WaitMs, ref pS2Modes, ref pNum);
}
public bool SetChannel2(uint freq, uint bandwidth)
{
return UnsafeStreamReaderMethods.SetChannel2(freq, bandwidth);
}
public bool SetChannel2Ex(uint freq, uint bandwidth, STD_TYPE std, int stream)
{
return UnsafeStreamReaderMethods.SetChannel2Ex(freq, bandwidth, std, stream);
}
public bool SetChannel2ExEx(uint freq, uint bandwidth, uint symbrate, STD_TYPE std, int stream)
{
return UnsafeStreamReaderMethods.SetChannel2ExEx(freq, bandwidth, symbrate, std, stream);
}
public bool SignalInfo2(ref SearchResult2 si2)
{
return UnsafeStreamReaderMethods.SignalInfo2(ref si2);
}
public bool RFScan2(uint freq, STD_TYPE std, ref double pRFLevel)
{
return UnsafeStreamReaderMethods.RFScan2(freq, std, ref pRFLevel);
}
public bool AirScan(int freq_start, int freq_stop, uint step, uint bandwidth, int std, IntPtr pSearchResult, ref int pTpNum, AirScanCallback lpFunc)
{
return UnsafeStreamReaderMethods.AirScan(freq_start, freq_stop, step, bandwidth, std, pSearchResult, ref pTpNum, lpFunc);
}
public bool GetEEPROM(byte[] buffer, int offset, int len)
{
return UnsafeStreamReaderMethods.GetEEPROM(buffer, offset, len);
}
public bool SetEEPROM(byte[] buffer, int offset, int len)
{
return UnsafeStreamReaderMethods.SetEEPROM(buffer, offset, len);
}
public void Dispose()
{
if (!StopDVB())
{
throw new InvalidOperationException("failed to StopDVB");
}
}
private Dictionary<string, string> dllInfo;
private Dictionary<string,string> GetDllInfo()
{
FileInfo streamReaderDll = new FileInfo("StreamReader.dll");
if (!streamReaderDll.Exists)
{
Console.WriteLine("Could not find StreamReader.dll");
return null;
}
FileStream streamReaderDllStream = streamReaderDll.OpenRead();
PeFile peFile = new PeFile(streamReaderDllStream);
PeSectionStream rsrcStream = peFile.GetSectionStream(".rsrc");
ImageResourceDirectory imageResourceDirectory = RsrcParser.ParseRsrc(rsrcStream);
VsVersionInfo versionInfo = RsrcUtility.TryGetVersionInfo(imageResourceDirectory);
dllInfo = versionInfo.ToDictionary();
peFile.Dispose();
if (!dllInfo.ContainsKey("ProductName"))
{
Console.WriteLine("Could not detect the ProductName in StreamReader.dll");
return null;
}
if (!dllInfo.ContainsKey("ProductVersion"))
{
Console.WriteLine("Could not detect the Version of StreamReader.dll");
return null;
}
return dllInfo;
}
public Version GetEngineVersion()
{
return Version.Parse(dllInfo["ProductVersion"]);
}
public string GetEngineName()
{
return dllInfo["ProductName"];
}
}
}