diff --git a/BlobStorages/skyscraper5.Data.Minio/skyscraper5.Data.Minio.csproj b/BlobStorages/skyscraper5.Data.Minio/skyscraper5.Data.Minio.csproj index 8676a00..85cd7c1 100644 --- a/BlobStorages/skyscraper5.Data.Minio/skyscraper5.Data.Minio.csproj +++ b/BlobStorages/skyscraper5.Data.Minio/skyscraper5.Data.Minio.csproj @@ -5,7 +5,7 @@ - + diff --git a/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs b/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs index 85cb480..5898e64 100644 --- a/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs +++ b/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs @@ -2,7 +2,9 @@ using Npgsql; using skyscraper5.src.InteractionChannel.Model; using skyscraper5.src.InteractionChannel.Model.Descriptors; +using skyscraper5.src.InteractionChannel.Model2; using skyscraper5.src.Skyscraper.Scraper.Storage.Utilities; +using skyscraper8.InteractionChannel.Model2; using System; using System.Collections.Generic; using System.Diagnostics; @@ -969,5 +971,30 @@ namespace skyscraper5.Data.PostgreSql command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)coordinate.Item1); command.ExecuteNonQuery(); } - } + + public bool TestForTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, byte frameFrameNumber) + { + throw new NotImplementedException(); + } + public void StoreTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, Tbtp2.Frame frame) + { + throw new NotImplementedException(); + } + public bool TestForFrameComposition2(ushort networkId, Fct2.Frame fct2) + { + throw new NotImplementedException(); + } + public void InsertFct2Frame(ushort networkId, Fct2.Frame frame) + { + throw new NotImplementedException(); + } + public bool TestForBroadcastConfiguration(ushort networkId, byte txTypeTxType) + { + throw new NotImplementedException(); + } + public void InsertBroadcastConfiguration(ushort networkId, Bct.BroadcastConfiguration txType) + { + throw new NotImplementedException(); + } + } } diff --git a/GUIs/skyscraper8.UI.ImGui/.filenesting.json b/GUIs/skyscraper8.UI.ImGui/.filenesting.json new file mode 100644 index 0000000..0b71966 --- /dev/null +++ b/GUIs/skyscraper8.UI.ImGui/.filenesting.json @@ -0,0 +1,3 @@ +{ + "help":"https://go.microsoft.com/fwlink/?linkid=866610" +} \ No newline at end of file diff --git a/GUIs/skyscraper8.UI.ImGui/Properties/launchSettings.json b/GUIs/skyscraper8.UI.ImGui/Properties/launchSettings.json new file mode 100644 index 0000000..544000f --- /dev/null +++ b/GUIs/skyscraper8.UI.ImGui/Properties/launchSettings.json @@ -0,0 +1,7 @@ +{ + "profiles": { + "skyscraper8.UI.SDL2": { + "commandName": "Project" + } + } +} \ No newline at end of file diff --git a/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/RemoteStreamReaderServer.cs b/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/RemoteStreamReaderServer.cs index c18467d..922ce56 100644 --- a/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/RemoteStreamReaderServer.cs +++ b/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/RemoteStreamReaderServer.cs @@ -588,11 +588,9 @@ namespace skyscraper5.Skyscraper.IO.CrazycatStreamReader { this.wrapped = client; this.bufferedStream = new BufferedStream(wrapped.GetStream(), 96256); - this.packetsRemainBeforeStart = 512; } internal TcpClient wrapped; internal BufferedStream bufferedStream; - private int packetsRemainBeforeStart; public void Dispose() { @@ -615,15 +613,6 @@ namespace skyscraper5.Skyscraper.IO.CrazycatStreamReader internal void DropPacket(byte[] buffer, int offset, int length) { - if (packetsRemainBeforeStart > 0) - { - if (packetsRemainBeforeStart == 512 || packetsRemainBeforeStart == 256 || packetsRemainBeforeStart == 128 || packetsRemainBeforeStart == 64 || packetsRemainBeforeStart == 32 || packetsRemainBeforeStart == 16 || packetsRemainBeforeStart == 8 || packetsRemainBeforeStart == 4 || packetsRemainBeforeStart == 2 || packetsRemainBeforeStart == 1) - { - Console.WriteLine("Waiting {0} packets before starting to send to client {1}...", packetsRemainBeforeStart, wrapped.Client.RemoteEndPoint); - } - packetsRemainBeforeStart--; - return; - } bufferedStream?.Write(buffer, offset, length); } } diff --git a/IoPlugins/skyscraper5.IO.StreamReader/LocalStreamReader.cs b/IoPlugins/skyscraper5.IO.StreamReader/LocalStreamReader.cs index 36a23de..9cb2aa7 100644 --- a/IoPlugins/skyscraper5.IO.StreamReader/LocalStreamReader.cs +++ b/IoPlugins/skyscraper5.IO.StreamReader/LocalStreamReader.cs @@ -80,7 +80,15 @@ namespace skyscraper5.IO.StreamReader public bool SetChannel(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw) { - return UnsafeStreamReaderMethods.SetChannel(freq, symbrate, pol, fec, lof1, lof2, 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) diff --git a/skyscraper8.slnLaunch.user b/skyscraper8.slnLaunch.user new file mode 100644 index 0000000..9da9afd --- /dev/null +++ b/skyscraper8.slnLaunch.user @@ -0,0 +1,15 @@ +[ + { + "Name": "Neues Profil", + "Projects": [ + { + "Path": "IoPlugins\\skyscraper5.IO.StreamReader.RemoteStreamReaderServer\\skyscraper5.IO.StreamReader.RemoteStreamReaderServer.csproj", + "Action": "Start" + }, + { + "Path": "GUIs\\skyscraper8.UI.ImGui\\skyscraper8.UI.SDL2.csproj", + "Action": "Start" + } + ] + } +] \ No newline at end of file diff --git a/skyscraper8/GS/GSE/GseReader.cs b/skyscraper8/GS/GSE/GseReader.cs index e2272d1..015b052 100644 --- a/skyscraper8/GS/GSE/GseReader.cs +++ b/skyscraper8/GS/GSE/GseReader.cs @@ -33,6 +33,8 @@ internal class GseReader : IMisHandler GsePacket child = new GsePacket(startIndicator, endIndicator, labelTypeIndicator); if (!startIndicator || !endIndicator) { + if (ms.Position == ms.Length) + return; child.FragmentId = ms.ReadUInt8(); gseLength--; } @@ -45,6 +47,8 @@ internal class GseReader : IMisHandler if (startIndicator) { + if (ms.GetAvailableBytes() < 2) + return; child.ProtocolType = ms.ReadUInt16BE(); gseLength -= 2; if (!endIndicator) @@ -52,6 +56,8 @@ internal class GseReader : IMisHandler switch (labelTypeIndicator) { case 0: + if (ms.GetAvailableBytes() < 6) + return; child.Label = new _6byteLabel(ms.ReadBytes(6)); gseLength -= 6; if (!endIndicator) @@ -59,6 +65,8 @@ internal class GseReader : IMisHandler lastLabel = child.Label; break; case 1: + if (ms.GetAvailableBytes() < 3) + return; child.Label = new _3byteLabel(ms.ReadBytes(3)); gseLength -= 3; if (!endIndicator) @@ -81,6 +89,8 @@ internal class GseReader : IMisHandler if (gseLength > ms.GetAvailableBytes()) return; + if (gseLength <= -1) + return; child.GseDataBytes = ms.ReadBytes(gseLength); if (!startIndicator && endIndicator) @@ -120,6 +130,21 @@ internal class GseReader : IMisHandler return; } + if (!child.StartIndicator && !child.EndIndicator) + { + if (fragmentations == null) + { + //We haven't seen any starting frames yet, so we can't use an inbetween frame. We can throw this away. + return; + } + if (fragmentations[child.FragmentId.Value] == null) + { + //fragment beginning missing, we can throw this away. + return; + } + throw new NotImplementedException(child.ToString()); + } + if (child.StartIndicator && child.EndIndicator) { switch (child.ProtocolType) @@ -129,10 +154,10 @@ internal class GseReader : IMisHandler break; default: if (warnedEthertypes == null) - warnedEthertypes = new bool[0xffff]; + warnedEthertypes = new bool[ushort.MaxValue]; if (!warnedEthertypes[child.ProtocolType.Value]) { - logger.WarnFormat("This GSE contains other traffic types (type {0:X4}) besides IP (type 0x0800). If it's not too much trouble, please consider submitting a sample.",child.ProtocolType.Value); + logger.WarnFormat("This GSE contains other traffic types (type 0x{0:X4}) besides IP (type 0x0800). If it's not too much trouble, please consider submitting a sample.",child.ProtocolType.Value); warnedEthertypes[child.ProtocolType.Value] = true; } break; diff --git a/skyscraper8/Mpeg2/PesPacket.cs b/skyscraper8/Mpeg2/PesPacket.cs index 0bada52..e352fe9 100644 --- a/skyscraper8/Mpeg2/PesPacket.cs +++ b/skyscraper8/Mpeg2/PesPacket.cs @@ -236,7 +236,10 @@ namespace skyscraper5.Mpeg2 //Marker Flag markerBit = (escrBinary & 0x0000000000000001) != 0; if (!markerBit) - throw new DvbException("invalid pes packet"); + { + //invalid PES + return; + } } if (EsRateFlag) diff --git a/skyscraper8/Program.cs b/skyscraper8/Program.cs index cff18c6..e91852c 100644 --- a/skyscraper8/Program.cs +++ b/skyscraper8/Program.cs @@ -34,6 +34,7 @@ using skyscraper8.SatIp; using skyscraper8.SatIp.RtspResponses; using skyscraper8.SimpleServiceDiscoveryProtocol; using skyscraper8.Skyscraper.Math; +using skyscraper8.Skyscraper; [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")] namespace skyscraper5 diff --git a/skyscraper8/Properties/launchSettings.json b/skyscraper8/Properties/launchSettings.json index 5d5c369..8ff1d59 100644 --- a/skyscraper8/Properties/launchSettings.json +++ b/skyscraper8/Properties/launchSettings.json @@ -2,7 +2,11 @@ "profiles": { "skyscraper8": { "commandName": "Project", +<<<<<<< HEAD "commandLineArgs": "\"D:\\sorglos-iww-rww-aca-oca.ts\"", +======= + "commandLineArgs": "udpin udp://127.0.0.1:6970", +>>>>>>> remotes/origin/sauerland "remoteDebugEnabled": false }, "Container (Dockerfile)": { diff --git a/skyscraper8/Skyscraper/FrequencyListGenerator/BaseBlindscanJob.cs b/skyscraper8/Skyscraper/FrequencyListGenerator/BaseBlindscanJob.cs index b75338d..f5af635 100644 --- a/skyscraper8/Skyscraper/FrequencyListGenerator/BaseBlindscanJob.cs +++ b/skyscraper8/Skyscraper/FrequencyListGenerator/BaseBlindscanJob.cs @@ -572,6 +572,12 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator if (caps.HasFlag(Caps.SR_SIGINFO)) { + int polarity = result.SearchResult.Pol; + int freq = result.SearchResult.Freq; + bool isHighBand = freq > config.LnbType.LofSw * 1000; + bool isHorizontal = polarity == 0; + + SendDiseqcCommand(isHighBand, isHorizontal); logger.Log(PluginLogLevel.Info, string.Format("Trying to BLScanEx..."), 8); if (!config.StreamReader.BLScanEx(result.SearchResult.Freq, 5000, result.SearchResult.Pol, config.LnbType.Lof1 * 1000, config.LnbType.Lof2 * 1000, @@ -587,35 +593,31 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator if (!satelliteSr.Lock) { - logger.Log(PluginLogLevel.Info, string.Format("Trying to SetChannel..."), 8); - bool channel = config.StreamReader.SetChannel(result.SearchResult.Freq, result.SearchResult.SR, result.SearchResult.Freq, result.SearchResult.FEC, config.LnbType.Lof1 * 1000, config.LnbType.Lof2 * 1000, config.LnbType.LofSw * 1000); - if (!channel) + int attempts = (result.SearchResult.Freq / 1000).GetHighestDigit(); + bool success = false; + for (int i = 0; i < attempts; i++) { - result.State = BlindscanResultState.TuningFailed; - config.Ui.OnBlindscanLockFail(satelliteSr, result.State); - config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2); - return; - } - else - { - logger.Log(PluginLogLevel.Info, string.Format("Trying to get SignalInfo..."), 8); - bool signalInfo = config.StreamReader.SignalInfo(ref satelliteSr); - if (!signalInfo) + Thread.Sleep(1000); + result.State = BlindscanResultState.Retrying; + logger.Log(PluginLogLevel.Info, string.Format("Retrying BLScanEx... ({0}/{1})", i + 1, attempts + 1), 8); + bool retryResult = config.StreamReader.BLScanEx(result.SearchResult.Freq, 5000, result.SearchResult.Pol, config.LnbType.Lof1 * 1000, config.LnbType.Lof2 * 1000, config.LnbType.LofSw * 1000, 1000000, (STD_TYPE)result.SearchResult.StdType,ref satelliteSr); + if (!retryResult) { - result.State = BlindscanResultState.TuningFailed; - config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2); - config.Ui.OnBlindscanLockFail(satelliteSr, result.State); - return; - } - + result.State = BlindscanResultState.BlScanFailure; + continue; + } if (!satelliteSr.Lock) { result.State = BlindscanResultState.NoLock; - config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2); - config.Ui.OnBlindscanLockFail(satelliteSr, result.State); - return; + continue; } - } + success = true; + break; + } + config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2); + if (!success) + return; + logger.Log(PluginLogLevel.Debug, "Sucessfully tuned with retries."); } if (caps.HasFlag(Caps.SR_MISSEL)) diff --git a/skyscraper8/Skyscraper/FrequencyListGenerator/BlindscanResult.cs b/skyscraper8/Skyscraper/FrequencyListGenerator/BlindscanResult.cs index b3ee564..a0ed0c8 100644 --- a/skyscraper8/Skyscraper/FrequencyListGenerator/BlindscanResult.cs +++ b/skyscraper8/Skyscraper/FrequencyListGenerator/BlindscanResult.cs @@ -27,6 +27,7 @@ namespace skyscraper5.src.Skyscraper.FrequencyListGenerator BlScanFailure = 108, DataSaving = 4, IqCollecting = 5, - IqSaving = 6 - } + IqSaving = 6, + Retrying = 7 + } } diff --git a/skyscraper8/Skyscraper/FrequencyListGenerator/CoopBlindscanStreamReaderProxy.cs b/skyscraper8/Skyscraper/FrequencyListGenerator/CoopBlindscanStreamReaderProxy.cs index 3c426d4..e6b1aa2 100644 --- a/skyscraper8/Skyscraper/FrequencyListGenerator/CoopBlindscanStreamReaderProxy.cs +++ b/skyscraper8/Skyscraper/FrequencyListGenerator/CoopBlindscanStreamReaderProxy.cs @@ -52,11 +52,19 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator if (!_proxiedStreamReader.StartDvbEx(targetTuner)) return false; - if (lastDiseqcType != uint.MaxValue) + /*if (lastDiseqcType != uint.MaxValue) { if (!_proxiedStreamReader.SendDiSEqC(lastDiseqcType, lastDiseqcOpcode)) return false; - } + }*/ + + if (lastDiseqcOpcode.HasFlag(DiSEqC_Opcode.DISEQC_HORIZONTAL)) + { + if (!_proxiedStreamReader.StopDVB()) + return false; + if (!_proxiedStreamReader.StartDvbEx(targetTuner)) + return false; + } currentlySelectedTuner = targetTuner; return true; @@ -260,9 +268,13 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator if (!SwitchTuner(_setFilterTuner)) return false; + bool diseqc = SendDiSEqC(lastDiseqcType, lastDiseqcOpcode); + if (!_proxiedStreamReader.BLScanEx(freq, freq_range, pol, lof1, lof2, lofsw, minsr, std, ref pSearchResult)) return false; + logger.InfoFormat("Frequency: {0}, Polarity: {1}, Lock: {2}", freq, pol, pSearchResult.Lock); + return true; } diff --git a/skyscraper8/Skyscraper/IntegerExtensions.cs b/skyscraper8/Skyscraper/IntegerExtensions.cs new file mode 100644 index 0000000..8d10bb8 --- /dev/null +++ b/skyscraper8/Skyscraper/IntegerExtensions.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.Skyscraper +{ + internal static class IntegerExtensions + { + public static int GetHighestDigit(this int source) + { + int result = 0; + while (source > 0) + { + int currentDigit = source % 10; + if (currentDigit > result) + result = currentDigit; + source /= 10; + } + return result; + } + } +} diff --git a/skyscraper8/Skyscraper/QualificationTool.cs b/skyscraper8/Skyscraper/QualificationTool.cs index 10019d3..af24a46 100644 --- a/skyscraper8/Skyscraper/QualificationTool.cs +++ b/skyscraper8/Skyscraper/QualificationTool.cs @@ -30,9 +30,10 @@ namespace skyscraper5.src.Skyscraper string versionString = version.ToString(); switch(versionString) { + case "1.2.5.208": return QualificationToolResultEnum.Good; case "1.2.5.194": return QualificationToolResultEnum.Bad; //Won't find most transponders with a 6903x case "1.2.5.176": return QualificationToolResultEnum.Bad; //Won't find most transponders with a 6903x - case "1.2.4.101": return QualificationToolResultEnum.Good; //Works great, but is reather slow with a 6903x + case "1.2.4.101": return QualificationToolResultEnum.Bad; //Breaks GS encapsulation on 6903x. default: return QualificationToolResultEnum.Unknown; } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs index d5dbfde..4f59fcd 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs @@ -1276,14 +1276,21 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory return 0; } + private byte[][] _tmst; public byte[] GetTmst(ushort interactiveNetworkId) { - throw new NotImplementedException(); + if (_tmst == null) + return null; + if (_tmst[interactiveNetworkId] == null) + return null; + return _tmst[interactiveNetworkId]; } public void InsertTmst(ushort interactiveNetworkId, byte[] modes) { - throw new NotImplementedException(); + if (_tmst == null) + _tmst = new byte[ushort.MaxValue][]; + _tmst[interactiveNetworkId] = modes; } public void UpdateTmst(ushort interactiveNetworkId, byte[] modes) diff --git a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-1.cs b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-1.cs index 747e1f4..f25b936 100644 --- a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-1.cs +++ b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-1.cs @@ -32,6 +32,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings case 0xc7: resultBuilder.Append('Ç'); break; case 0xc9: resultBuilder.Append('É'); break; case 0xcb: resultBuilder.Append('¼'); break; + case 0xcd: resultBuilder.Append('Í'); break; case 0xd6: resultBuilder.Append('Ö'); break; case 0xdc: resultBuilder.Append('Ü'); break; case 0xdf: resultBuilder.Append('ß'); break; @@ -59,6 +60,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings case 0xfa: resultBuilder.Append('ú'); break; case 0xfb: resultBuilder.Append('û'); break; case 0xfc: resultBuilder.Append('ü'); break; + case 0xfd: resultBuilder.Append('ý'); break; default: throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i])); } diff --git a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-13.cs b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-13.cs index 2b4a0e8..5e3f0d0 100644 --- a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-13.cs +++ b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-13.cs @@ -78,19 +78,21 @@ namespace skyscraper5.Skyscraper.Text.Encodings case 0xee: resultBuilder.Append('ī'); break; case 0xf0: resultBuilder.Append('š'); break; case 0xf1: resultBuilder.Append('ń'); break; + case 0xf2: resultBuilder.Append('ņ'); break; case 0xf3: resultBuilder.Append('ó'); break; + case 0xf5: resultBuilder.Append('õ'); break; case 0xf6: resultBuilder.Append('ö'); break; - case 0xf8: resultBuilder.Append('ų'); break; - case 0xf9: resultBuilder.Append('ł'); break; - case 0xfa: resultBuilder.Append('ś'); break; - case 0xfb: resultBuilder.Append('ū'); break; - case 0xfc: resultBuilder.Append('ü'); break; - case 0xfd: resultBuilder.Append('ż'); break; - case 0xfe: resultBuilder.Append('ž'); break; - case 0xff: resultBuilder.Append('’'); break; - default: - throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i])); - } + case 0xf8: resultBuilder.Append('ų'); break; + case 0xf9: resultBuilder.Append('ł'); break; + case 0xfa: resultBuilder.Append('ś'); break; + case 0xfb: resultBuilder.Append('ū'); break; + case 0xfc: resultBuilder.Append('ü'); break; + case 0xfd: resultBuilder.Append('ż'); break; + case 0xfe: resultBuilder.Append('ž'); break; + case 0xff: resultBuilder.Append('’'); break; + default: + throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i])); + } } return resultBuilder.ToString().ToCharArray(); diff --git a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-7.cs b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-7.cs index 91f3225..87a6fc5 100644 --- a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-7.cs +++ b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-7.cs @@ -26,6 +26,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings case 0xa2: resultBuilder.Append('’'); break; case 0xa3: resultBuilder.Append('£'); break; case 0xa4: resultBuilder.Append('€'); break; + case 0xa8: resultBuilder.Append('¨'); break; case 0xa9: resultBuilder.Append('©'); break; case 0xab: resultBuilder.Append('«'); break; case 0xad: resultBuilder.Append('\u00AD'); break; diff --git a/skyscraper8/Teletext/EbuTeletextDataField.cs b/skyscraper8/Teletext/EbuTeletextDataField.cs index 0388987..206f76b 100644 --- a/skyscraper8/Teletext/EbuTeletextDataField.cs +++ b/skyscraper8/Teletext/EbuTeletextDataField.cs @@ -32,17 +32,26 @@ namespace skyscraper5.Teletext { //Non-Displayable Packet Y = 26 to 31 if (ms.GetAvailableBytes() == 0) + { + Valid = false; return; + } DesignationCode = ms.ReadUInt8(); if (ms.GetAvailableBytes() < 39) - return; + { + Valid = false; + return; + } CharacterCodes = ms.ReadBytes(39); } else { //Normal Packet (Y = 1 to 25) if (ms.GetAvailableBytes() < 40) - return; + { + Valid = false; + return; + } CharacterCodes = ms.ReadBytes(40); } }