2016-04-20 00:33:47 +02:00
//#define LOCK_LCN_LISTS
using System ;
2015-11-25 23:19:39 +01:00
using System.Collections.Generic ;
2015-11-21 19:34:30 +01:00
using System.Data ;
2015-09-24 12:46:52 +02:00
using ChanSort.Api ;
2015-11-21 19:34:30 +01:00
using System.Data.SQLite ;
2016-05-05 00:12:06 +02:00
using System.IO ;
2015-11-25 23:19:39 +01:00
using System.Text.RegularExpressions ;
2016-04-16 20:01:51 +02:00
using System.Windows.Forms ;
2015-09-24 12:46:52 +02:00
namespace ChanSort.Loader.Hisense
{
2016-04-16 20:01:51 +02:00
public class HisDbSerializer : SerializerBase
2015-09-24 12:46:52 +02:00
{
2016-04-27 19:03:50 +02:00
public override string DisplayName = > "Hisense channel.db Loader" ;
2015-09-24 12:46:52 +02:00
2015-11-21 19:34:30 +01:00
#region enums and bitmasks
2015-09-24 12:46:52 +02:00
2016-04-20 00:33:47 +02:00
internal enum BroadcastType
{
Analog = 1 ,
Dvb = 2
}
internal enum BroadcastMedium
{
DigTer = 1 ,
DigCab = 2 ,
DigSat = 3 ,
AnaTer = 4 ,
AnaCab = 5 ,
AnaSat = 6
}
internal enum ServiceType
{
Tv = 1 ,
Radio = 2 ,
App = 3
}
2015-11-21 19:34:30 +01:00
[Flags]
2016-04-20 00:33:47 +02:00
internal enum NwMask
{
Active = 1 < < 1 ,
Visible = 1 < < 3 ,
Fav1 = 1 < < 4 ,
Fav2 = 1 < < 5 ,
Fav3 = 1 < < 6 ,
Fav4 = 1 < < 7 ,
Lock = 1 < < 8
}
2015-11-21 19:34:30 +01:00
[Flags]
2016-04-20 00:33:47 +02:00
internal enum OptionMask
{
NameEdited = 1 < < 3 ,
ChNumEdited = 1 < < 10 ,
DeletedByUser = 1 < < 13
}
2015-11-21 19:34:30 +01:00
[Flags]
2016-04-20 00:33:47 +02:00
internal enum HashCode
{
Name = 1 < < 0 ,
ChannelId = 1 < < 1 ,
BroadcastType = 1 < < 2 ,
TsRecId = 1 < < 3 ,
ProgNum = 1 < < 4 ,
DvbShortName = 1 < < 5 ,
Radio = 1 < < 10 ,
Encrypted = 1 < < 11 ,
Tv = 1 < < 13
}
2015-11-21 19:34:30 +01:00
[Flags]
2016-04-20 00:33:47 +02:00
internal enum DvbLinkageMask
{
Ts = 1 < < 2
}
2015-09-24 12:46:52 +02:00
#endregion
2015-11-25 23:19:39 +01:00
private readonly List < ChannelList > channelLists = new List < ChannelList > ( ) ;
2016-04-20 00:33:47 +02:00
private readonly Dictionary < long , ChannelInfo > channelsById = new Dictionary < long , ChannelInfo > ( ) ;
2015-11-25 23:19:39 +01:00
private List < string > tableNames ;
2015-09-24 12:46:52 +02:00
#region ctor ( )
2016-04-20 00:33:47 +02:00
2016-04-16 20:01:51 +02:00
public HisDbSerializer ( string inputFile ) : base ( inputFile )
2015-09-24 12:46:52 +02:00
{
2015-11-27 01:51:08 +01:00
DepencencyChecker . AssertVc2010RedistPackageX86Installed ( ) ;
2015-09-24 12:46:52 +02:00
this . Features . ChannelNameEdit = ChannelNameEditMode . All ;
2015-11-25 23:19:39 +01:00
this . Features . CanDeleteChannels = false ;
2016-04-20 00:33:47 +02:00
this . Features . CanSkipChannels = false ;
this . Features . CanHaveGaps = true ;
2016-04-16 20:01:51 +02:00
this . DataRoot . SortedFavorites = true ;
2016-04-20 00:33:47 +02:00
2015-11-25 23:19:39 +01:00
channelLists . Add ( new ChannelList ( SignalSource . Antenna | SignalSource . Analog | SignalSource . Digital | SignalSource . Radio | SignalSource . Tv , "Antenna" ) ) ;
channelLists . Add ( new ChannelList ( SignalSource . Cable | SignalSource . Analog | SignalSource . Digital | SignalSource . Radio | SignalSource . Tv , "Cable" ) ) ;
channelLists . Add ( new ChannelList ( SignalSource . Sat | SignalSource . Analog | SignalSource . Digital | SignalSource . Radio | SignalSource . Tv , "Sat" ) ) ;
channelLists . Add ( new ChannelList ( SignalSource . Sat | SignalSource . Analog | SignalSource . Digital | SignalSource . Radio | SignalSource . Tv , "Prefered Sat" ) ) ;
channelLists . Add ( new ChannelList ( SignalSource . Antenna | SignalSource . Cable | SignalSource . Sat | SignalSource . Analog | SignalSource . Digital | SignalSource . Radio | SignalSource . Tv , "CI 1" ) ) ;
channelLists . Add ( new ChannelList ( SignalSource . Antenna | SignalSource . Cable | SignalSource . Sat | SignalSource . Analog | SignalSource . Digital | SignalSource . Radio | SignalSource . Tv , "CI 2" ) ) ;
2016-04-16 20:01:51 +02:00
channelLists . Add ( new ChannelList ( SignalSource . AnalogCT | SignalSource . DvbCT | SignalSource . DvbS | SignalSource . TvAndRadio , "Favorites" ) ) ;
2016-04-27 19:03:50 +02:00
channelLists [ channelLists . Count - 1 ] . IsMixedSourceFavoritesList = true ;
2016-04-16 20:01:51 +02:00
2015-11-25 23:19:39 +01:00
foreach ( var list in this . channelLists )
{
2016-04-16 20:01:51 +02:00
this . DataRoot . AddChannelList ( list ) ;
2016-04-20 00:33:47 +02:00
list . VisibleColumnFieldNames = new List < string >
{
2016-04-27 19:03:50 +02:00
"OldPosition" ,
2016-04-20 00:33:47 +02:00
"Position" ,
2016-04-27 19:03:50 +02:00
"Source" ,
"NewProgramNr" ,
2016-04-20 00:33:47 +02:00
"Name" ,
"ShortName" ,
"Favorites" ,
"Lock" ,
"Hidden" ,
"Encrypted" ,
"FreqInMhz" ,
"OriginalNetworkId" ,
"TransportStreamId" ,
"ServiceId" ,
"ServiceType" ,
"ServiceTypeName" ,
"NetworkName" ,
"Satellite" ,
"SymbolRate"
} ;
2015-11-25 23:19:39 +01:00
}
2015-09-24 12:46:52 +02:00
}
2016-04-20 00:33:47 +02:00
2015-09-24 12:46:52 +02:00
#endregion
#region Load ( )
public override void Load ( )
{
2015-11-21 19:34:30 +01:00
using ( var conn = new SQLiteConnection ( "Data Source=" + this . FileName ) )
{
conn . Open ( ) ;
using ( var cmd = conn . CreateCommand ( ) )
{
this . RepairCorruptedDatabaseImage ( cmd ) ;
2015-11-25 23:19:39 +01:00
this . LoadTableNames ( cmd ) ;
2017-06-08 20:01:42 +02:00
if ( ! tableNames . Contains ( "svl_1" ) & & ! tableNames . Contains ( "svl_2" ) & & ! tableNames . Contains ( "svl_3" ) )
throw new FileLoadException ( "File doesn't contain svl_* tables" ) ;
2015-11-21 19:34:30 +01:00
this . LoadSatelliteData ( cmd ) ;
this . LoadTslData ( cmd ) ;
this . LoadSvlData ( cmd ) ;
2016-04-16 20:01:51 +02:00
this . LoadFavorites ( cmd ) ;
2015-11-21 19:34:30 +01:00
}
}
2016-04-16 20:01:51 +02:00
int totalCount = 0 ;
foreach ( var list in this . channelLists )
totalCount + = list . Count ;
if ( totalCount = = 0 )
MessageBox . Show ( Resources . Load_NoChannelsMsg , Resources . Load_NoChannelsCaption , MessageBoxButtons . OK ) ;
2015-09-24 12:46:52 +02:00
}
2016-04-20 00:33:47 +02:00
2015-09-24 12:46:52 +02:00
#endregion
2015-11-21 19:34:30 +01:00
#region RepairCorruptedDatabaseImage ( )
2016-04-20 00:33:47 +02:00
2015-11-21 19:34:30 +01:00
private void RepairCorruptedDatabaseImage ( SQLiteCommand cmd )
2015-09-24 12:46:52 +02:00
{
2015-11-21 19:34:30 +01:00
cmd . CommandText = "REINDEX" ;
cmd . ExecuteNonQuery ( ) ;
2015-09-24 12:46:52 +02:00
}
2016-04-20 00:33:47 +02:00
2015-09-24 12:46:52 +02:00
#endregion
2015-11-25 23:19:39 +01:00
#region LoadTableNames ( )
2016-04-20 00:33:47 +02:00
2015-11-25 23:19:39 +01:00
private void LoadTableNames ( SQLiteCommand cmd )
2015-09-24 12:46:52 +02:00
{
2015-11-25 23:19:39 +01:00
this . tableNames = new List < string > ( ) ;
cmd . CommandText = "SELECT name FROM sqlite_master WHERE type = 'table' order by name" ;
2015-11-21 19:34:30 +01:00
using ( var r = cmd . ExecuteReader ( ) )
{
while ( r . Read ( ) )
2015-11-25 23:19:39 +01:00
tableNames . Add ( r . GetString ( 0 ) ) ;
}
}
#endregion
#region LoadSatelliteData ( )
2016-04-20 00:33:47 +02:00
2015-11-25 23:19:39 +01:00
private void LoadSatelliteData ( SQLiteCommand cmd )
{
var regex = new Regex ( @"^satl_\d$" ) ;
foreach ( var tableName in this . tableNames )
{
if ( ! regex . IsMatch ( tableName ) )
continue ;
2017-01-26 12:49:36 +01:00
cmd . CommandText = "select satl_rec_id, i2_orb_pos, ac_sat_name from " + tableName ;
2015-11-25 23:19:39 +01:00
using ( var r = cmd . ExecuteReader ( ) )
2015-11-21 19:34:30 +01:00
{
2015-11-25 23:19:39 +01:00
while ( r . Read ( ) )
{
var sat = new Satellite ( r . GetInt32 ( 0 ) ) ;
2017-01-26 12:49:36 +01:00
var pos = r . GetInt32 ( 1 ) ;
2015-11-25 23:19:39 +01:00
sat . OrbitalPosition = $"{(decimal) Math.Abs(pos)/10:n1}{(pos < 0 ? 'W' : 'E')}" ;
2017-01-26 12:49:36 +01:00
sat . Name = r . GetString ( 2 ) ;
2015-11-25 23:19:39 +01:00
this . DataRoot . AddSatellite ( sat ) ;
}
2015-11-21 19:34:30 +01:00
}
}
}
2016-04-20 00:33:47 +02:00
2015-11-21 19:34:30 +01:00
#endregion
#region LoadTslData ( )
private void LoadTslData ( SQLiteCommand cmd )
{
2015-11-25 23:19:39 +01:00
var regex = new Regex ( @"^tsl_(\d)$" ) ;
foreach ( var table in this . tableNames )
2015-09-24 12:46:52 +02:00
{
2015-11-25 23:19:39 +01:00
var match = regex . Match ( table ) ;
if ( ! match . Success )
continue ;
int x = int . Parse ( match . Groups [ 1 ] . Value ) ;
2015-11-21 19:34:30 +01:00
2015-11-25 23:19:39 +01:00
this . LoadTslData ( cmd , x , "tsl_#_data_ter_dig" , ", freq" , ( t , r , i0 ) = >
{
2016-04-20 00:33:47 +02:00
t . FrequencyInMhz = ( decimal ) r . GetInt32 ( i0 + 0 ) / 1000000 ;
2015-11-25 23:19:39 +01:00
} ) ;
2016-04-16 20:01:51 +02:00
this . LoadTslData ( cmd , x , "tsl_#_data_ter_ana" , ", freq" , ( t , r , i0 ) = >
{
2016-04-20 00:33:47 +02:00
t . FrequencyInMhz = ( decimal ) r . GetInt32 ( i0 + 0 ) / 1000000 ;
2016-04-16 20:01:51 +02:00
} ) ;
2015-11-25 23:19:39 +01:00
this . LoadTslData ( cmd , x , "tsl_#_data_cab_dig" , ", freq, sym_rate" , ( t , r , i0 ) = >
{
2016-04-20 00:33:47 +02:00
t . FrequencyInMhz = ( decimal ) r . GetInt32 ( i0 + 0 ) / 1000000 ;
2015-11-25 23:19:39 +01:00
t . SymbolRate = r . GetInt32 ( i0 + 1 ) ;
} ) ;
2016-04-16 20:01:51 +02:00
this . LoadTslData ( cmd , x , "tsl_#_data_cab_ana" , ", freq" , ( t , r , i0 ) = >
{
t . FrequencyInMhz = ( decimal ) r . GetInt32 ( i0 + 0 ) / 1000000 ;
} ) ;
2016-04-20 00:33:47 +02:00
this . LoadTslData ( cmd , x , "tsl_#_data_sat_dig" , ", freq, sym_rate, orb_pos" , ( t , r , i0 ) = >
2015-11-25 23:19:39 +01:00
{
t . FrequencyInMhz = r . GetInt32 ( i0 + 0 ) ;
t . SymbolRate = r . GetInt32 ( i0 + 1 ) ;
2016-04-20 00:33:47 +02:00
// satellite information may or may not be available in the database. if there is none, create a proxy sat records from the orbital position in the TSL data
if ( t . Satellite = = null )
{
var opos = r . GetInt32 ( i0 + 2 ) ;
var sat = this . DataRoot . Satellites . TryGet ( opos ) ;
if ( sat = = null )
{
sat = new Satellite ( opos ) ;
var pos = ( decimal ) opos / 10 ;
sat . Name = pos < 0 ? ( - pos ) . ToString ( "n1" ) + "W" : pos . ToString ( "n1" ) + "E" ;
}
t . Satellite = sat ;
}
2015-11-25 23:19:39 +01:00
} ) ;
}
2015-11-21 19:34:30 +01:00
}
2015-11-25 23:19:39 +01:00
private void LoadTslData ( SQLiteCommand cmd , int tableNr , string joinTable , string joinFields , Action < Transponder , SQLiteDataReader , int > enhanceTransponderInfo )
2015-11-21 19:34:30 +01:00
{
2015-11-25 23:19:39 +01:00
if ( ! this . tableNames . Contains ( joinTable . Replace ( "#" , tableNr . ToString ( ) ) ) )
return ;
cmd . CommandText = $"select tsl_#.tsl_rec_id, `t_desc.on_id`, `t_desc.ts_id`, `t_ref.satl_rec_id`, `t_desc.e_bcst_medium` {joinFields} "
2016-04-20 00:33:47 +02:00
+ $" from tsl_# inner join {joinTable} on {joinTable}.tsl_rec_id=tsl_#.tsl_rec_id" ;
2015-11-25 23:19:39 +01:00
cmd . CommandText = cmd . CommandText . Replace ( "#" , tableNr . ToString ( ) ) ;
2015-11-21 19:34:30 +01:00
using ( var r = cmd . ExecuteReader ( ) )
{
while ( r . Read ( ) )
{
2016-04-20 00:33:47 +02:00
int id = ( tableNr < < 16 ) | r . GetInt32 ( 0 ) ;
var trans = new Transponder ( id ) ;
2015-11-25 23:19:39 +01:00
trans . OriginalNetworkId = r . GetInt32 ( 1 ) ;
trans . TransportStreamId = r . GetInt32 ( 2 ) ;
2015-11-21 19:34:30 +01:00
trans . Satellite = this . DataRoot . Satellites . TryGet ( r . GetInt32 ( 3 ) ) ;
2015-11-25 23:19:39 +01:00
enhanceTransponderInfo ( trans , r , 5 ) ;
2015-11-21 19:34:30 +01:00
this . DataRoot . AddTransponder ( trans . Satellite , trans ) ;
}
2015-09-24 12:46:52 +02:00
}
}
2016-04-20 00:33:47 +02:00
2015-09-24 12:46:52 +02:00
#endregion
2015-11-21 19:34:30 +01:00
#region LoadSvlData ( )
2015-09-24 12:46:52 +02:00
2015-11-21 19:34:30 +01:00
private void LoadSvlData ( SQLiteCommand cmd )
2015-09-24 12:46:52 +02:00
{
2015-11-25 23:19:39 +01:00
var regex = new Regex ( @"^svl_(\d)$" ) ;
foreach ( var table in this . tableNames )
{
var match = regex . Match ( table ) ;
if ( ! match . Success )
continue ;
int x = int . Parse ( match . Groups [ 1 ] . Value ) ;
if ( x < 1 | | x > 6 )
{
this . DataRoot . Warnings . AppendLine ( "Skipping unknown channel list with number " + x ) ;
return ;
}
this . LoadSvlData ( cmd , x , "svl_#_data_analog" , "" , ( ci , r , i0 ) = > { } ) ;
2016-04-16 20:01:51 +02:00
this . LoadSvlData ( cmd , x , "svl_#_data_dvb" , ", b_free_ca_mode, s_svc_name, sdt_service_type, cur_lcn" , ( ci , r , i0 ) = >
2015-11-25 23:19:39 +01:00
{
ci . Encrypted = r . GetBoolean ( i0 + 0 ) ;
ci . ShortName = r . GetString ( i0 + 1 ) ;
2016-04-16 20:01:51 +02:00
ci . ServiceType = r . GetInt32 ( i0 + 2 ) ;
if ( ci . ServiceType ! = 0 )
ci . ServiceTypeName = LookupData . Instance . GetServiceTypeDescription ( ci . ServiceType ) ;
2015-11-25 23:19:39 +01:00
if ( ( ci . SignalSource & SignalSource . DvbT ) = = SignalSource . DvbT )
ci . ChannelOrTransponder = LookupData . Instance . GetDvbtTransponder ( ci . FreqInMhz ) . ToString ( ) ;
2015-11-27 01:51:08 +01:00
2016-04-20 00:33:47 +02:00
#if LOCK_LCN_LISTS
2016-05-05 00:12:06 +02:00
// make the current list read-only if LCN is used
2016-04-16 20:01:51 +02:00
if ( r . GetInt32 ( i0 + 3 ) ! = 0 )
2016-05-05 00:12:06 +02:00
{
2015-11-27 01:51:08 +01:00
this . channelLists [ x - 1 ] . ReadOnly = true ;
2016-05-05 00:12:06 +02:00
}
2016-04-20 00:33:47 +02:00
#endif
2015-11-25 23:19:39 +01:00
} ) ;
}
2015-11-21 19:34:30 +01:00
}
2015-11-25 23:19:39 +01:00
private void LoadSvlData ( SQLiteCommand cmd , int tableNr , string joinTable , string joinFields , Action < ChannelInfo , SQLiteDataReader , int > enhanceChannelInfo )
2015-11-21 19:34:30 +01:00
{
2015-11-25 23:19:39 +01:00
if ( ! this . tableNames . Contains ( joinTable . Replace ( "#" , tableNr . ToString ( ) ) ) )
return ;
2016-04-20 00:33:47 +02:00
cmd . CommandText = $"select svl_#.svl_rec_id, channel_id, svl_#.tsl_id, svl_#.tsl_rec_id, e_serv_type, ac_name, nw_mask, prog_id, `t_desc.e_bcst_medium` {joinFields}"
+ $" from svl_# inner join {joinTable} on {joinTable}.svl_rec_id=svl_#.svl_rec_id inner join tsl_# on tsl_#.tsl_rec_id=svl_#.tsl_rec_id" ;
2015-11-25 23:19:39 +01:00
cmd . CommandText = cmd . CommandText . Replace ( "#" , tableNr . ToString ( ) ) ;
2015-11-21 19:34:30 +01:00
using ( var r = cmd . ExecuteReader ( ) )
{
while ( r . Read ( ) )
{
2016-04-20 00:33:47 +02:00
var id = ( ( long ) tableNr < < 32 ) | ( uint ) r . GetInt32 ( 0 ) ;
var prNr = ( int ) ( ( uint ) r . GetInt32 ( 1 ) ) > > 18 ;
var trans = this . DataRoot . Transponder . TryGet ( ( r . GetInt32 ( 2 ) < < 16 ) | r . GetInt32 ( 3 ) ) ;
var stype = ( ServiceType ) r . GetInt32 ( 4 ) ;
var name = r . GetString ( 5 ) ;
var nwMask = ( NwMask ) r . GetInt32 ( 6 ) ;
var sid = r . GetInt32 ( 7 ) ;
var bmedium = ( BroadcastMedium ) r . GetInt32 ( 8 ) ;
2015-11-25 23:19:39 +01:00
var ssource = DetermineSignalSource ( bmedium , stype ) ;
var ci = new ChannelInfo ( ssource , id , prNr , name ) ;
2015-11-21 19:34:30 +01:00
if ( trans ! = null )
{
ci . Transponder = trans ;
ci . OriginalNetworkId = trans . OriginalNetworkId ;
ci . TransportStreamId = trans . TransportStreamId ;
ci . SymbolRate = trans . SymbolRate ;
ci . FreqInMhz = trans . FrequencyInMhz ;
2015-11-25 23:19:39 +01:00
ci . Satellite = trans . Satellite ? . ToString ( ) ;
2015-11-21 19:34:30 +01:00
}
2015-11-25 23:19:39 +01:00
ci . ServiceId = sid ;
//ci.Skip = (nwMask & NwMask.Active) == 0;
2015-11-21 19:34:30 +01:00
ci . Lock = ( nwMask & NwMask . Lock ) ! = 0 ;
2015-11-25 23:19:39 +01:00
ci . Hidden = ( nwMask & NwMask . Visible ) = = 0 ;
2016-04-20 00:33:47 +02:00
ci . Favorites | = ( Favorites ) ( ( int ) ( nwMask & ( NwMask . Fav1 | NwMask . Fav2 | NwMask . Fav3 | NwMask . Fav4 ) ) > > 4 ) ;
2015-11-21 19:34:30 +01:00
2015-11-25 23:19:39 +01:00
if ( stype = = ServiceType . Radio )
ci . ServiceTypeName = "Radio" ;
else if ( stype = = ServiceType . Tv )
ci . ServiceTypeName = "TV" ;
else if ( stype = = ServiceType . App )
2015-11-21 19:34:30 +01:00
ci . ServiceTypeName = "Data" ;
2016-04-20 00:33:47 +02:00
enhanceChannelInfo ( ci , r , 9 ) ;
2015-11-21 19:34:30 +01:00
2015-11-25 23:19:39 +01:00
var list = this . channelLists [ tableNr - 1 ] ;
2016-04-27 19:03:50 +02:00
ci . Source = list . ShortCaption ;
2015-11-21 19:34:30 +01:00
this . DataRoot . AddChannel ( list , ci ) ;
2016-04-16 20:01:51 +02:00
// add the channel to all favorites lists
this . DataRoot . AddChannel ( this . channelLists [ 6 ] , ci ) ;
this . channelsById [ ci . RecordIndex ] = ci ;
}
}
}
2016-04-20 00:33:47 +02:00
2016-04-16 20:01:51 +02:00
#endregion
#region LoadFavorites ( )
2016-04-20 00:33:47 +02:00
2016-04-16 20:01:51 +02:00
private void LoadFavorites ( SQLiteCommand cmd )
{
for ( int i = 1 ; i < = 4 ; i + + )
{
if ( ! this . tableNames . Contains ( $"fav_{i}" ) )
continue ;
cmd . CommandText = $"select ui2_svc_id, ui2_svc_rec_id, user_defined_ch_num from fav_{i}" ;
using ( var r = cmd . ExecuteReader ( ) )
{
while ( r . Read ( ) )
{
2016-04-20 00:33:47 +02:00
var id = ( ( long ) r . GetInt32 ( 0 ) < < 32 ) | ( uint ) r . GetInt32 ( 1 ) ;
2016-04-16 20:01:51 +02:00
var ci = this . channelsById . TryGet ( id ) ;
if ( ci ! = null )
ci . FavIndex [ i - 1 ] = int . Parse ( r . GetString ( 2 ) ) ;
}
2015-11-21 19:34:30 +01:00
}
}
2015-09-24 12:46:52 +02:00
}
2016-04-20 00:33:47 +02:00
2015-09-24 12:46:52 +02:00
#endregion
2015-11-25 23:19:39 +01:00
#region DetermineSignalSource ( )
2016-04-20 00:33:47 +02:00
2015-11-25 23:19:39 +01:00
private static SignalSource DetermineSignalSource ( BroadcastMedium bmedium , ServiceType stype )
2015-09-24 12:46:52 +02:00
{
2015-11-25 23:19:39 +01:00
SignalSource ssource = 0 ;
if ( bmedium = = BroadcastMedium . AnaCab )
ssource = SignalSource . AnalogC ;
else if ( bmedium = = BroadcastMedium . AnaSat )
ssource = SignalSource . Analog | SignalSource . Sat ;
else if ( bmedium = = BroadcastMedium . AnaTer )
ssource = SignalSource . AnalogT ;
else if ( bmedium = = BroadcastMedium . DigCab )
ssource = SignalSource . DvbC ;
else if ( bmedium = = BroadcastMedium . DigSat )
ssource = SignalSource . DvbS ;
else if ( bmedium = = BroadcastMedium . DigTer )
ssource = SignalSource . DvbT ;
ssource | = stype = = ServiceType . Radio ? SignalSource . Radio : SignalSource . Tv ;
return ssource ;
2015-09-24 12:46:52 +02:00
}
#endregion
// Saving ====================================
#region Save ( )
2015-11-21 19:34:30 +01:00
2015-09-24 12:46:52 +02:00
public override void Save ( string tvOutputFile )
{
2016-04-16 20:01:51 +02:00
Editor . SequentializeFavPos ( this . channelLists [ 6 ] , 4 ) ;
2016-05-05 00:12:06 +02:00
if ( tvOutputFile ! = this . FileName )
File . Copy ( this . FileName , tvOutputFile , true ) ;
using ( var conn = new SQLiteConnection ( "Data Source=" + tvOutputFile ) )
2015-11-21 19:34:30 +01:00
{
conn . Open ( ) ;
using ( var trans = conn . BeginTransaction ( ) )
using ( var cmd = conn . CreateCommand ( ) )
{
cmd . Transaction = trans ;
try
{
2016-04-16 20:01:51 +02:00
this . CreateFavTables ( cmd ) ;
2016-04-20 00:33:47 +02:00
#if ! LOCK_LCN_LISTS
this . ResetLcn ( cmd ) ;
#endif
2015-11-21 19:34:30 +01:00
foreach ( var list in this . DataRoot . ChannelLists )
{
2016-04-20 00:33:47 +02:00
if ( list . ReadOnly )
continue ;
2015-11-21 19:34:30 +01:00
foreach ( var ci in list . Channels )
this . UpdateChannel ( cmd , ci ) ;
}
trans . Commit ( ) ;
2016-05-05 00:12:06 +02:00
this . FileName = tvOutputFile ;
2015-11-21 19:34:30 +01:00
}
catch
{
trans . Rollback ( ) ;
throw ;
}
}
}
}
2016-04-20 00:33:47 +02:00
2015-11-21 19:34:30 +01:00
#endregion
2016-04-16 20:01:51 +02:00
#region CreateFavTables ( )
2016-04-20 00:33:47 +02:00
2016-04-16 20:01:51 +02:00
private void CreateFavTables ( SQLiteCommand cmd )
2016-04-20 00:33:47 +02:00
{
2016-04-16 20:01:51 +02:00
for ( int i = 1 ; i < = 4 ; i + + )
{
if ( ! this . tableNames . Contains ( "fav_" + i ) )
{
cmd . CommandText = $"CREATE TABLE fav_{i} (ui2_svc_id INTEGER, ui2_svc_rec_id INTEGER, user_defined_ch_num VARCHAR, user_defined_ch_name VARCHAR)" ;
cmd . ExecuteNonQuery ( ) ;
this . tableNames . Add ( $"fav_{i}" ) ;
}
}
}
2016-04-20 00:33:47 +02:00
#endregion
#region ResetLcn ( )
private void ResetLcn ( SQLiteCommand cmd )
{
var regex = new Regex ( @"^svl_\d_data_dvb$" ) ;
foreach ( var table in this . tableNames )
{
if ( ! regex . IsMatch ( table ) )
continue ;
cmd . CommandText = "update " + table + " set cur_lcn=0, original_lcn=0, lcn_idx=0" ;
cmd . ExecuteNonQuery ( ) ;
}
}
2016-04-16 20:01:51 +02:00
#endregion
2015-11-21 19:34:30 +01:00
#region UpdateChannel ( )
2016-04-20 00:33:47 +02:00
2015-11-21 19:34:30 +01:00
private void UpdateChannel ( SQLiteCommand cmd , ChannelInfo ci )
{
2016-04-27 01:58:38 +02:00
if ( ci . RecordIndex < 0 ) // skip reference list proxy channels
return ;
2016-04-20 00:33:47 +02:00
int x = ( int ) ( ( ulong ) ci . RecordIndex > > 32 ) ; // the table number is kept in the higher 32 bits
int id = ( int ) ( ci . RecordIndex & 0xFFFFFFFF ) ; // the record id is kept in the lower 32 bits
2015-11-25 23:38:29 +01:00
2015-11-29 20:36:56 +01:00
var resetFlags = NwMask . Fav1 | NwMask . Fav2 | NwMask . Fav3 | NwMask . Fav4 | NwMask . Lock | NwMask . Visible ;
2016-04-20 00:33:47 +02:00
var setFlags = ( NwMask ) ( ( ( int ) ci . Favorites & 0x0F ) < < 4 ) ;
2015-11-29 20:36:56 +01:00
if ( ci . Lock ) setFlags | = NwMask . Lock ;
2016-04-16 20:01:51 +02:00
if ( ! ci . Hidden & & ci . NewProgramNr > = 0 ) setFlags | = NwMask . Visible ;
2016-04-27 01:58:38 +02:00
cmd . CommandText = $"update svl_{x} set channel_id=(channel_id&{0x3FFFF})|(@chnr << 18)" +
2016-04-27 19:03:50 +02:00
$", ch_id_txt=@chnr || ' 0'" +
$", ac_name=@name" +
2016-04-27 01:58:38 +02:00
$", option_mask=option_mask|{(int) (OptionMask.ChNumEdited | OptionMask.NameEdited)}" +
2016-04-27 19:03:50 +02:00
$", nw_mask=(nw_mask&@resetFlags)|@setFlags" +
$" where svl_rec_id=@id" ;
2016-04-16 20:01:51 +02:00
cmd . Parameters . Clear ( ) ;
cmd . Parameters . Add ( "@id" , DbType . Int32 ) ;
cmd . Parameters . Add ( "@chnr" , DbType . Int32 ) ;
cmd . Parameters . Add ( "@name" , DbType . String ) ;
cmd . Parameters . Add ( "@resetFlags" , DbType . Int32 ) ;
cmd . Parameters . Add ( "@setFlags" , DbType . Int32 ) ;
cmd . Parameters [ "@id" ] . Value = id ;
2016-04-27 01:58:38 +02:00
cmd . Parameters [ "@chnr" ] . Value = ci . NewProgramNr ;
2016-04-16 20:01:51 +02:00
cmd . Parameters [ "@name" ] . Value = ci . Name ;
2016-04-20 00:33:47 +02:00
cmd . Parameters [ "@resetFlags" ] . Value = ~ ( int ) resetFlags ;
cmd . Parameters [ "@setFlags" ] . Value = ( int ) setFlags ;
2016-04-16 20:01:51 +02:00
cmd . ExecuteNonQuery ( ) ;
2015-11-21 19:34:30 +01:00
2016-04-16 20:01:51 +02:00
for ( int i = 0 ; i < 4 ; i + + )
2015-11-21 19:34:30 +01:00
{
2016-04-16 20:01:51 +02:00
if ( ci . FavIndex [ i ] < = 0 )
{
cmd . CommandText = $"delete from fav_{i + 1} where ui2_svc_id={ci.RecordIndex >> 32} and ui2_svc_rec_id={ci.RecordIndex & 0xFFFF}" ;
cmd . ExecuteNonQuery ( ) ;
}
else
{
cmd . CommandText = $"update fav_{i + 1} set user_defined_ch_num=@chnr, user_defined_ch_name=@name where ui2_svc_id=@svcid and ui2_svc_rec_id=@recid" ;
cmd . Parameters . Clear ( ) ;
cmd . Parameters . Add ( "@chnr" , DbType . String ) ; // for some reason this is a VARCHAR in the database
cmd . Parameters . Add ( "@name" , DbType . String ) ;
cmd . Parameters . Add ( "@svcid" , DbType . Int32 ) ;
cmd . Parameters . Add ( "@recid" , DbType . Int32 ) ;
cmd . Parameters [ "@chnr" ] . Value = ci . FavIndex [ i ] . ToString ( ) ;
cmd . Parameters [ "@name" ] . Value = ci . Name ;
cmd . Parameters [ "@svcid" ] . Value = ci . RecordIndex > > 32 ;
cmd . Parameters [ "@recid" ] . Value = ci . RecordIndex & 0xFFFF ;
if ( cmd . ExecuteNonQuery ( ) = = 0 )
{
cmd . CommandText = $"insert into fav_{i + 1} (ui2_svc_id, ui2_svc_rec_id, user_defined_ch_num, user_defined_ch_name) values (@svcid,@recid,@chnr,@name)" ;
cmd . ExecuteNonQuery ( ) ;
}
}
2015-11-21 19:34:30 +01:00
}
2015-09-24 12:46:52 +02:00
}
2015-11-21 19:34:30 +01:00
2015-09-24 12:46:52 +02:00
#endregion
}
}