mirror of
https://github.com/PredatH0r/ChanSort.git
synced 2026-01-12 10:22:04 +01:00
146 lines
4.6 KiB
C#
146 lines
4.6 KiB
C#
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Text;
|
|
using ChanSort.Api;
|
|
|
|
namespace ChanSort.Loader.Toshiba
|
|
{
|
|
internal class DbChannel : ChannelInfo
|
|
{
|
|
private const int BITS_Tv = 0x10000;
|
|
private const int BITS_Radio = 0x20000;
|
|
private const int BITS_FavA = 0x100000;
|
|
private const int BITS_FavB = 0x200000;
|
|
private const int BITS_FavC = 0x400000;
|
|
private const int BITS_FavD = 0x800000;
|
|
private const int BITS_Locked = 0x20000000;
|
|
|
|
internal int Bits;
|
|
|
|
#region ctor()
|
|
internal DbChannel(SignalSource source, IDataReader r, IDictionary<string, int> field,
|
|
DataRoot dataRoot, IDictionary<string,bool> encryptionInfo)
|
|
{
|
|
this.SignalSource = source;
|
|
this.RecordIndex = r.GetInt32(field["channel_handle"]);
|
|
|
|
this.Bits = r.GetInt32(field["list_bits"]);
|
|
bool isTv = (Bits & BITS_Tv) != 0;
|
|
bool isRadio = (Bits & BITS_Radio) != 0;
|
|
bool isAnalog = (source & SignalSource.Analog) != 0;
|
|
if (isAnalog && !isTv)
|
|
{
|
|
this.IsDeleted = true;
|
|
return;
|
|
}
|
|
|
|
if (isTv) this.SignalSource |= SignalSource.Tv;
|
|
if (isRadio) this.SignalSource |= SignalSource.Radio;
|
|
this.Lock = (Bits & BITS_Locked) != 0;
|
|
this.OldProgramNr = r.GetInt32(field["channel_number"]);
|
|
this.Favorites = this.ParseFavorites(Bits);
|
|
|
|
if (isAnalog)
|
|
this.ReadAnalogData(r, field);
|
|
else
|
|
this.ReadDvbData(r, field, dataRoot, encryptionInfo);
|
|
}
|
|
#endregion
|
|
|
|
#region ReadAnalogData()
|
|
private void ReadAnalogData(IDataReader r, IDictionary<string, int> field)
|
|
{
|
|
this.Name = r.GetString(field["channel_label"]);
|
|
this.FreqInMhz = (decimal)r.GetInt32(field["frequency"]) / 1000000;
|
|
}
|
|
#endregion
|
|
|
|
#region ReadDvbData()
|
|
protected void ReadDvbData(IDataReader r, IDictionary<string, int> field, DataRoot dataRoot,
|
|
IDictionary<string, bool> encryptionInfo)
|
|
{
|
|
string longName, shortName;
|
|
this.GetChannelNames(r.GetString(field["channel_label"]), out longName, out shortName);
|
|
this.Name = longName;
|
|
this.ShortName = shortName;
|
|
this.RecordOrder = r.GetInt32(field["channel_order"]);
|
|
this.FreqInMhz = (decimal)r.GetInt32(field["frequency"]) / 1000;
|
|
int serviceType = r.GetInt32(field["dvb_service_type"]);
|
|
this.ServiceType = serviceType;
|
|
this.OriginalNetworkId = r.GetInt32(field["onid"]);
|
|
this.TransportStreamId = r.GetInt32(field["tsid"]);
|
|
this.ServiceId = r.GetInt32(field["sid"]);
|
|
int bits = r.GetInt32(field["list_bits"]);
|
|
this.Favorites = this.ParseFavorites(bits);
|
|
if ((this.SignalSource & SignalSource.Sat) != 0)
|
|
{
|
|
int satId = r.GetInt32(field["sat_id"]);
|
|
var sat = dataRoot.Satellites.TryGet(satId);
|
|
if (sat != null)
|
|
{
|
|
this.Satellite = sat.Name;
|
|
this.SatPosition = sat.OrbitalPosition;
|
|
int tpId = satId * 1000000 + (int)this.FreqInMhz;
|
|
var tp = dataRoot.Transponder.TryGet(tpId);
|
|
if (tp != null)
|
|
{
|
|
this.SymbolRate = tp.SymbolRate;
|
|
}
|
|
}
|
|
}
|
|
this.Encrypted = encryptionInfo.TryGet(this.Uid);
|
|
}
|
|
#endregion
|
|
|
|
#region GetChannelNames()
|
|
private void GetChannelNames(string name, out string longName, out string shortName)
|
|
{
|
|
StringBuilder sbLong = new StringBuilder();
|
|
StringBuilder sbShort = new StringBuilder();
|
|
|
|
bool inShort = false;
|
|
foreach (char c in name)
|
|
{
|
|
if (c == 0x86)
|
|
inShort = true;
|
|
else if (c == 0x87)
|
|
inShort = false;
|
|
if (c >= 0x80 && c <= 0x9F)
|
|
continue;
|
|
|
|
if (inShort)
|
|
sbShort.Append(c);
|
|
sbLong.Append(c);
|
|
}
|
|
|
|
longName = sbLong.ToString();
|
|
shortName = sbShort.ToString();
|
|
}
|
|
#endregion
|
|
|
|
#region ParseFavorites()
|
|
private Favorites ParseFavorites(int bits)
|
|
{
|
|
Favorites fav = 0;
|
|
if ((bits & BITS_FavA) != 0) fav |= Favorites.A;
|
|
if ((bits & BITS_FavB) != 0) fav |= Favorites.B;
|
|
if ((bits & BITS_FavC) != 0) fav |= Favorites.C;
|
|
if ((bits & BITS_FavD) != 0) fav |= Favorites.D;
|
|
return fav;
|
|
}
|
|
#endregion
|
|
|
|
#region UpdateRawData()
|
|
public override void UpdateRawData()
|
|
{
|
|
Bits &= ~(BITS_FavA | BITS_FavB | BITS_FavC | BITS_FavD | BITS_Locked);
|
|
if ((this.Favorites & Favorites.A) != 0) Bits |= BITS_FavA;
|
|
if ((this.Favorites & Favorites.B) != 0) Bits |= BITS_FavB;
|
|
if ((this.Favorites & Favorites.C) != 0) Bits |= BITS_FavC;
|
|
if ((this.Favorites & Favorites.D) != 0) Bits |= BITS_FavD;
|
|
if (this.Lock) Bits |= BITS_Locked;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|