2013-03-31 14:09:38 +02:00
using System ;
using System.Collections.Generic ;
namespace ChanSort.Api
{
public class ChannelInfo
{
2019-08-13 13:29:59 +02:00
private const int MAX_FAV_LISTS = 16 ;
2013-07-02 23:55:02 +02:00
2013-03-31 14:09:38 +02:00
private string uid ;
2015-09-24 12:46:52 +02:00
private string serviceTypeName ;
2020-08-09 14:09:08 +02:00
private int newProgramNr ;
2015-09-24 12:46:52 +02:00
2013-04-03 12:47:24 +02:00
public virtual bool IsDeleted { get ; set ; }
2013-04-10 00:35:25 +02:00
public SignalSource SignalSource { get ; set ; }
2016-04-27 19:03:50 +02:00
public string Source { get ; set ; }
2019-11-08 02:31:44 +01:00
/// <summary>
/// Index or ID of the data record
/// </summary>
2015-04-17 21:59:44 +02:00
public long RecordIndex { get ; set ; }
2019-11-08 02:31:44 +01:00
/// <summary>
/// logical record order (might be different from the index, like old LG TLL files with a linked list of record indices)
/// </summary>
2013-03-31 14:09:38 +02:00
public int RecordOrder { get ; set ; }
2019-11-08 02:31:44 +01:00
/// <summary>
/// original program number from the file, except for channels with IsDeleted==true, which will have the value -1
/// </summary>
2013-03-31 14:09:38 +02:00
public int OldProgramNr { get ; set ; }
2020-08-09 14:09:08 +02:00
2019-11-08 02:31:44 +01:00
/// <summary>
/// new program number or -1, if the channel isn't assigned a number or has IsDeleted==true
/// </summary>
2020-08-09 14:09:08 +02:00
public int NewProgramNr
{
get = > newProgramNr ;
set
{
if ( value = = 0 )
{
}
newProgramNr = value ;
}
}
2019-11-08 02:31:44 +01:00
2013-03-31 14:09:38 +02:00
public string Name { get ; set ; }
public string ShortName { get ; set ; }
public bool Skip { get ; set ; }
public bool Lock { get ; set ; }
public bool Hidden { get ; set ; }
public bool? Encrypted { get ; set ; }
public string ChannelOrTransponder { get ; set ; }
public string Satellite { get ; set ; }
public decimal FreqInMhz { get ; set ; }
public char Polarity { get ; set ; }
public int ServiceId { get ; set ; }
2019-02-10 15:56:03 +01:00
public int PcrPid { get ; set ; }
2013-03-31 14:09:38 +02:00
public int VideoPid { get ; set ; }
public int AudioPid { get ; set ; }
public int OriginalNetworkId { get ; set ; }
public int TransportStreamId { get ; set ; }
2014-01-19 19:08:17 +01:00
public string Provider { get ; set ; }
2013-03-31 14:09:38 +02:00
public int SymbolRate { get ; set ; }
public int ServiceType { get ; set ; }
public string SatPosition { get ; set ; }
public Transponder Transponder { get ; set ; }
2019-11-08 02:31:44 +01:00
/// <summary>
/// Bitmask in which favorite lists the channel is included
/// </summary>
public Favorites Favorites { get ; set ; }
/// <summary>
/// current number of the channel in the various favorite lists (if individual sorting is supported)
/// </summary>
2016-04-27 19:03:50 +02:00
public List < int > FavIndex { get ; }
2019-11-08 02:31:44 +01:00
/// <summary>
/// original number of the channel in the various favorite lists (if individual sorting is supported)
/// </summary>
2016-04-27 19:03:50 +02:00
public List < int > OldFavIndex { get ; }
2019-11-08 02:31:44 +01:00
/// <summary>
/// predefined LCN (logical channel number) assigned by TV firmware or cable/sat operator
/// </summary>
2013-11-12 18:25:15 +01:00
public int ProgramNrPreset { get ; set ; }
2013-03-31 14:09:38 +02:00
public bool IsNameModified { get ; set ; }
2019-11-08 02:31:44 +01:00
/// <summary>
/// A proxy channel is inserted into the current channel list when there was no match for a reference list channel
/// </summary>
2020-05-02 19:04:43 +02:00
public bool IsProxy = > this . RecordIndex = = - 1 ;
2019-11-08 02:31:44 +01:00
/// <summary>
/// arbitrary information that can be shown in a UI column to assist in analyzing a file format while coding a plugin
/// </summary>
public string Debug { get ; private set ; }
2013-03-31 14:09:38 +02:00
#region ctor ( )
2013-04-03 12:47:24 +02:00
protected ChannelInfo ( )
2013-04-10 00:35:25 +02:00
{
2019-11-08 02:31:44 +01:00
this . OldProgramNr = - 1 ;
2013-04-10 00:35:25 +02:00
this . NewProgramNr = - 1 ;
2013-07-02 23:55:02 +02:00
this . FavIndex = new List < int > ( MAX_FAV_LISTS ) ;
2016-04-27 19:03:50 +02:00
this . OldFavIndex = new List < int > ( MAX_FAV_LISTS ) ;
2013-07-02 23:55:02 +02:00
for ( int i = 0 ; i < MAX_FAV_LISTS ; i + + )
2016-04-27 19:03:50 +02:00
{
2013-07-02 23:55:02 +02:00
this . FavIndex . Add ( - 1 ) ;
2016-04-27 19:03:50 +02:00
this . OldFavIndex . Add ( - 1 ) ;
}
2013-11-20 02:42:47 +01:00
this . Name = "" ;
this . ShortName = "" ;
2013-04-03 12:47:24 +02:00
}
2013-03-31 14:09:38 +02:00
/// <summary>
2019-07-16 01:44:18 +02:00
/// Constructor for existing TV channel
2013-03-31 14:09:38 +02:00
/// </summary>
2015-11-25 23:38:29 +01:00
public ChannelInfo ( SignalSource source , long index , int oldProgNr , string name ) : this ( )
2013-03-31 14:09:38 +02:00
{
this . SignalSource = source ;
this . RecordIndex = index ;
2015-11-25 23:38:29 +01:00
this . RecordOrder = ( int ) index ;
2013-03-31 14:09:38 +02:00
this . OldProgramNr = oldProgNr ;
this . Name = name ;
this . Encrypted = null ;
}
/// <summary>
/// Constructor for reference list channels which no longer exist in TV list
/// </summary>
2013-07-02 23:55:02 +02:00
public ChannelInfo ( SignalSource source , string uid , int newProgNr , string name ) : this ( )
2013-03-31 14:09:38 +02:00
{
this . SignalSource = source ;
this . Uid = uid ;
2013-04-29 01:24:49 +02:00
this . RecordIndex = - 1 ;
this . RecordOrder = - 1 ;
2013-04-10 00:35:25 +02:00
this . OldProgramNr = - 1 ;
2013-03-31 14:09:38 +02:00
this . NewProgramNr = newProgNr ;
this . Name = name ;
this . Encrypted = null ;
}
#endregion
#region Uid
2019-11-08 02:31:44 +01:00
/// <summary>
/// The Uid is the preferred way of matching channels between the current channel list and a reference list.
/// The basic format of this string was taken from a command line tool "TllSort" for LG TVs but then expanded beyond that
/// in order to support the various file formats and the data provided in those.
/// </summary>
2013-03-31 14:09:38 +02:00
public string Uid
{
get
{
if ( this . uid = = null )
{
2016-05-05 00:12:06 +02:00
if ( ( this . SignalSource & SignalSource . MaskAnalogDigital ) = = SignalSource . Analog )
this . uid = "A-0-" + ( int ) ( this . FreqInMhz * 20 ) + "-0" ;
2013-03-31 14:09:38 +02:00
else
2016-05-05 00:12:06 +02:00
{
if ( ( this . SignalSource & SignalSource . MaskAntennaCableSat ) = = SignalSource . Sat )
this . uid = "S" + /*this.SatPosition + */ "-" + this . OriginalNetworkId + "-" + this . TransportStreamId + "-" + this . ServiceId ;
else if ( ( this . SignalSource & SignalSource . MaskAntennaCableSat ) = = SignalSource . Antenna | | ( this . SignalSource & SignalSource . MaskAntennaCableSat ) = = SignalSource . Cable )
{
2019-11-08 02:31:44 +01:00
// ChannelOrTransponder is needed for DVB-T where the same ONID+TSID+SID can be received from 2 different radio transmitters, but on different frequencies/channels
2016-05-05 00:12:06 +02:00
this . uid = "C-" + this . OriginalNetworkId + "-" + this . TransportStreamId + "-" + this . ServiceId + "-" + this . ChannelOrTransponder ;
}
else
this . uid = this . OriginalNetworkId + "-" + this . TransportStreamId + "-" + this . ServiceId ;
}
2013-03-31 14:09:38 +02:00
}
return this . uid ;
}
set { this . uid = value ; }
}
#endregion
#region ToString ( ) , Equals ( ) , GetHashCode ( )
public override string ToString ( )
{
2013-04-12 00:47:50 +02:00
string nr = this . NewProgramNr ! = - 1 ? this . NewProgramNr . ToString ( ) : "@" + this . RecordIndex ;
return nr + ": " + this . Name ;
2013-03-31 14:09:38 +02:00
}
public override bool Equals ( object obj )
{
//ChannelInfo that = obj as ChannelInfo;
//return that != null && this.Uid == that.Uid && this.OldProgramNr == that.OldProgramNr;
return ReferenceEquals ( this , obj ) ;
}
public override int GetHashCode ( )
{
return this . Uid . GetHashCode ( ) + this . OldProgramNr ;
}
#endregion
#region NetworkName , NetworkOperator
public string NetworkName
{
get
{
var network = LookupData . Instance . GetNetwork ( this . OriginalNetworkId ) ;
return network = = null ? null : network . Name ;
}
}
public string NetworkOperator
{
get
{
var network = LookupData . Instance . GetNetwork ( this . OriginalNetworkId ) ;
return network = = null ? null : network . Operator ;
}
}
#endregion
#region ServiceTypeName
2015-09-24 12:46:52 +02:00
public string ServiceTypeName
{
get { return this . serviceTypeName ? ? ( this . serviceTypeName = LookupData . Instance . GetServiceTypeDescription ( this . ServiceType ) ) ; }
set { this . serviceTypeName = value ; }
}
2013-03-31 14:09:38 +02:00
#endregion
#region ParseFavString ( )
public static Favorites ParseFavString ( string value )
{
Favorites favMask = 0 ;
foreach ( Favorites fav in Enum . GetValues ( typeof ( Favorites ) ) )
{
foreach ( char c in value )
{
if ( c = = fav . ToString ( ) [ 0 ] )
{
favMask | = fav ;
break ;
}
}
}
return favMask ;
}
#endregion
#region AddDebug ( )
public void AddDebug ( byte val )
{
if ( this . Debug = = null )
this . Debug = val . ToString ( "x2" ) ;
else
this . Debug + = " " + val . ToString ( "x2" ) ;
}
public void AddDebug ( ushort val )
{
if ( this . Debug = = null )
2019-11-10 11:25:07 +01:00
this . Debug = val . ToString ( "x4" ) ;
2013-03-31 14:09:38 +02:00
else
this . Debug + = " " + val . ToString ( "x4" ) ;
}
2019-11-10 11:25:07 +01:00
public void AddDebug ( uint val )
{
if ( this . Debug = = null )
this . Debug = val . ToString ( "x8" ) ;
else
this . Debug + = " " + val . ToString ( "x8" ) ;
}
2013-04-12 00:47:50 +02:00
public void AddDebug ( byte [ ] data , int offset , int len )
2013-03-31 14:09:38 +02:00
{
for ( int i = 0 ; i < len ; i + + )
2013-04-12 00:47:50 +02:00
this . AddDebug ( data [ offset + i ] ) ;
2013-03-31 14:09:38 +02:00
}
2015-09-24 12:46:52 +02:00
public void AddDebug ( string val )
{
if ( this . Debug = = null )
this . Debug = val ;
else
this . Debug + = " " + val ;
}
2013-03-31 14:09:38 +02:00
#endregion
2013-04-03 12:47:24 +02:00
2013-07-02 23:55:02 +02:00
#region UpdateRawData ( )
2019-11-08 02:31:44 +01:00
/// <summary>
/// called during the saving procedure to update the external channel list data with the changes made by the user
/// </summary>
2013-04-03 12:47:24 +02:00
public virtual void UpdateRawData ( )
{
}
2013-07-02 23:55:02 +02:00
#endregion
2013-04-03 12:47:24 +02:00
2013-07-02 23:55:02 +02:00
#region ChangeEncoding ( )
2019-11-08 02:31:44 +01:00
/// <summary>
/// for file formats that allow characters in local code pages, this method should re-parse the raw data bytes for the given encoding
/// </summary>
/// <param name="encoding"></param>
2013-04-03 12:47:24 +02:00
public virtual void ChangeEncoding ( System . Text . Encoding encoding )
2013-07-02 23:55:02 +02:00
{
}
#endregion
#region GetPosition ( ) , SetPosition ( ) , ChangePosition ( )
2019-11-08 02:31:44 +01:00
/// <summary>
/// Gets the new channel number in the main channel list (index=0) or the various favorite lists (1-x)
/// </summary>
2013-07-02 23:55:02 +02:00
public int GetPosition ( int subListIndex )
{
return subListIndex = = 0 ? this . NewProgramNr : this . FavIndex [ subListIndex - 1 ] ;
2013-04-03 12:47:24 +02:00
}
2013-07-02 23:55:02 +02:00
2019-11-08 02:31:44 +01:00
/// <summary>
/// Gets the original channel number in the main channel list (index=0) or the various favorite lists (1-x)
/// </summary>
2016-04-27 19:03:50 +02:00
public int GetOldPosition ( int subListIndex )
{
return subListIndex = = 0 ? this . OldProgramNr : this . OldFavIndex [ subListIndex - 1 ] ;
}
2019-11-08 02:31:44 +01:00
/// <summary>
/// Sets the new channel number in the main channel list (index=0) or the various favorite lists (1-x)
/// </summary>
2013-07-02 23:55:02 +02:00
public void SetPosition ( int subListIndex , int newPos )
{
if ( subListIndex = = 0 )
this . NewProgramNr = newPos ;
else
{
this . FavIndex [ subListIndex - 1 ] = newPos ;
int mask = 1 < < ( subListIndex - 1 ) ;
if ( newPos = = - 1 )
this . Favorites & = ( Favorites ) ~ mask ;
else
this . Favorites | = ( Favorites ) mask ;
}
}
2019-11-08 02:31:44 +01:00
/// <summary>
/// Sets the original channel number in the main channel list (index=0) or the various favorite lists (1-x)
/// </summary>
2017-03-31 16:55:37 +02:00
public void SetOldPosition ( int subListIndex , int oldPos )
{
if ( subListIndex = = 0 )
this . OldProgramNr = oldPos ;
else
this . OldFavIndex [ subListIndex - 1 ] = oldPos ;
}
2019-11-08 02:31:44 +01:00
/// <summary>
/// Internal helper method to adjust the main or favorite program number by a delta value
/// </summary>
2013-07-02 23:55:02 +02:00
internal void ChangePosition ( int subListIndex , int delta )
{
if ( subListIndex = = 0 )
this . NewProgramNr + = delta ;
else
this . FavIndex [ subListIndex - 1 ] + = delta ;
}
#endregion
2013-03-31 14:09:38 +02:00
}
}