145 lines
4.3 KiB
C#
145 lines
4.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using skyscraper5.src.InteractionChannel;
|
|
using skyscraper5.src.InteractionChannel.Model;
|
|
using skyscraper5.src.InteractionChannel.Model2;
|
|
using skyscraper8.InteractionChannel;
|
|
using skyscraper8.InteractionChannel.Model;
|
|
using skyscraper8.InteractionChannel.Model2;
|
|
|
|
namespace skyscraper8.GS.GSE_BFBS
|
|
{
|
|
internal class GseL2SHandler
|
|
{
|
|
public GsContextDto Context { get; }
|
|
|
|
public GseL2SHandler(GsContextDto context)
|
|
{
|
|
Context = context;
|
|
}
|
|
|
|
public void PushPacket(byte[] buffer)
|
|
{
|
|
GseTableStructure gseTableStructure = new GseTableStructure(buffer);
|
|
if (!gseTableStructure.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.GseTableStructureInvalid);
|
|
return;
|
|
}
|
|
|
|
MemoryStream ms = new MemoryStream(gseTableStructure.TableContent, false);
|
|
switch (gseTableStructure.TableId)
|
|
{
|
|
case 0x40:
|
|
RcsNit nit = new RcsNit(ms);
|
|
if (!nit.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.NitInvalid);
|
|
return;
|
|
}
|
|
|
|
Context.Rcs2Output.OnRcs2Nit(gseTableStructure.InteractiveNetworkId, nit);
|
|
return;
|
|
case 0x41:
|
|
Rmt rmt = new Rmt(ms, true);
|
|
if (!rmt.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.RmtInvalid);
|
|
return;
|
|
}
|
|
|
|
Context.Rcs2Output.OnRcsMap(rmt);
|
|
return;
|
|
case 0x70:
|
|
Rcs2Tdt tdt = new Rcs2Tdt(ms);
|
|
if (!tdt.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.TdtInvalid);
|
|
return;
|
|
}
|
|
|
|
Context.Rcs2Output.OnRcs2Tdt(gseTableStructure.InteractiveNetworkId, tdt);
|
|
return;
|
|
case 0xa0:
|
|
Sct sct = new Sct(ms);
|
|
if (!sct.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.SctInvalid);
|
|
return;
|
|
}
|
|
|
|
Context.Rcs2Output.OnSuperframeComposition(gseTableStructure.InteractiveNetworkId, sct);
|
|
return;
|
|
case 0xa3:
|
|
Spt spt = new Spt(ms);
|
|
if (!spt.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.SptInvalid);
|
|
return;
|
|
}
|
|
|
|
Context.Rcs2Output.OnSatellitePosition(gseTableStructure.InteractiveNetworkId, spt);
|
|
return;
|
|
case 0xa4:
|
|
Cmt cmt = new Cmt(ms);
|
|
if (!cmt.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.CmtInvalid);
|
|
return;
|
|
}
|
|
Context.Rcs2Output.OnCorrectionMessage(gseTableStructure.InteractiveNetworkId, cmt);
|
|
return;
|
|
case 0xab:
|
|
Fct2 fct2 = new Fct2(ms);
|
|
if (!fct2.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.Fct2Invalid);
|
|
return;
|
|
}
|
|
Context.Rcs2Output.OnFrameComposition2(gseTableStructure.InteractiveNetworkId, fct2);
|
|
return;
|
|
case 0xac:
|
|
Bct bct = new Bct(ms);
|
|
if (!bct.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.BctInvalid);
|
|
return;
|
|
}
|
|
Context.Rcs2Output.OnBroadcastConfiguration(gseTableStructure.InteractiveNetworkId, bct);
|
|
return;
|
|
case 0xad:
|
|
Tbtp2 tbtp2 = new Tbtp2(ms);
|
|
if (!tbtp2.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.Tbtp2Invalid);
|
|
return;
|
|
}
|
|
Context.Rcs2Output.OnTerminalBurstTimePlan2(gseTableStructure.InteractiveNetworkId, tbtp2);
|
|
return;
|
|
case 0xae:
|
|
int rmtTransmissionStandard = Context.Rcs2Output.GetRmtTransmissionStandard(gseTableStructure.InteractiveNetworkId);
|
|
Tmst2 tmst2 = new Tmst2(ms, rmtTransmissionStandard);
|
|
if (!tmst2.Valid)
|
|
{
|
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.Tmst2Invalid);
|
|
return;
|
|
}
|
|
Context.Rcs2Output.OnTransmissionModeSupport2(gseTableStructure.InteractiveNetworkId, tmst2);
|
|
return;
|
|
case 0xc0:
|
|
//User defined, we have no way of knowing what this is.
|
|
return;
|
|
default:
|
|
//See en_30154502v010401p.pdf
|
|
//page 49
|
|
throw new NotImplementedException(String.Format(
|
|
"Unknown DVB-RCS2 Table Id: 0x{0:X2}\nIf this is reproducible on this stream, please consider submitting me a sample.",
|
|
gseTableStructure.TableId));
|
|
}
|
|
}
|
|
}
|
|
}
|