summaryrefslogtreecommitdiffstats
path: root/kaffeine/src/input/dvb/dvbconfig.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kaffeine/src/input/dvb/dvbconfig.cpp')
-rw-r--r--kaffeine/src/input/dvb/dvbconfig.cpp1478
1 files changed, 1478 insertions, 0 deletions
diff --git a/kaffeine/src/input/dvb/dvbconfig.cpp b/kaffeine/src/input/dvb/dvbconfig.cpp
new file mode 100644
index 0000000..746d745
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbconfig.cpp
@@ -0,0 +1,1478 @@
+/*
+ * dvbconfig.cpp
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <qdir.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qregexp.h>
+#include <qradiobutton.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kfiledialog.h>
+#include <ktar.h>
+#include <kstandarddirs.h>
+
+#include "dvbconfig.h"
+#include "kaffeinedvbplugin.h"
+
+
+
+MSpinBox::MSpinBox( QWidget *parent, int devNum ) : QSpinBox( 1, 4, 1, parent )
+{
+ deviceNumber = devNum;
+ connect( this, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged(int)) );
+}
+
+
+
+void MSpinBox::slotValueChanged( int value )
+{
+ emit signalValueChanged( value, deviceNumber );
+}
+
+
+
+MPushButton::MPushButton( QWidget *parent, int devNum, int lnbNum ) : KPushButton( parent )
+{
+ deviceNumber = devNum;
+ lnbNumber = lnbNum;
+ connect( this, SIGNAL(clicked()), this, SLOT(isClicked()) );
+}
+
+
+
+void MPushButton::isClicked()
+{
+ emit clicked( deviceNumber, lnbNumber );
+}
+
+
+
+MComboBox::MComboBox( QWidget *parent, int devNum, int lnbNum ) : QComboBox( parent )
+{
+ deviceNumber = devNum;
+ lnbNumber = lnbNum;
+ connect( this, SIGNAL(activated(int)), this, SLOT(isActivated(int)) );
+}
+
+
+
+void MComboBox::isActivated( int index )
+{
+ emit activated( index, deviceNumber, lnbNumber );
+}
+
+
+
+LNB::LNB()
+{
+ switchFreq = 11700;
+ loFreq = 9750;
+ hiFreq = 10600;
+ rotorType = 0;
+ speed13v = 2.5;
+ speed18v = 1.5;
+}
+
+
+
+Device::Device( int anum, int tnum, fe_type_t t, const QString &n, bool as )
+{
+ adapter = anum;
+ tuner = tnum;
+ type = t;
+ name = n;
+ source = "";
+ canAutoscan= as;
+ tuningTimeout = 1500;
+}
+
+
+
+Category::Category( const QString &tname, const QString &ticon )
+{
+ name = tname;
+ icon = ticon;
+}
+
+
+
+DVBconfig::DVBconfig( const QString &dvbConf )
+{
+ dvbConfigDir = dvbConf;
+ dvbConfigIconsDir = dvbConf+"icons/";
+ QDir dir;
+ dir.setPath( dvbConfigIconsDir );
+ if ( !dir.exists() )
+ dir.mkdir( dvbConfigIconsDir );
+ config = new KConfig( dvbConfigDir+"dvbrc" );
+ downProgress = 0;
+ sizeFile = 0;
+ categories.setAutoDelete( true );
+ devList.setAutoDelete( true );
+ startup();
+ readConfig();
+}
+
+
+
+DVBconfig::~DVBconfig()
+{
+ saveConfig();
+ delete config;
+ categories.clear();
+ devList.clear();
+}
+
+
+
+bool DVBconfig::haveDvbDevice()
+{
+ int i, j, res, fdFrontend=0;
+ struct dvb_frontend_info info;
+
+ QStringList list, flist;
+ QDir d;
+ d.setPath( "/dev/dvb/" );
+ list = d.entryList( "adapter*", QDir::Dirs, QDir::Name );
+
+ for ( i=0; i<(int)list.count(); i++ ) {
+ d.setPath( "/dev/dvb/"+list[i]+"/" );
+ flist = d.entryList( "frontend*", QDir::System, QDir::Name );
+ for ( j=0; j<(int)flist.count(); j++ ) {
+ fdFrontend = open( QString("/dev/dvb/%1/%2").arg( list[i] ).arg( flist[j] ).ascii(), O_RDWR);
+ if ( fdFrontend>0 ) {
+ if ( (res = ioctl( fdFrontend, FE_GET_INFO, &info ) < 0) )
+ perror( QString("/dev/dvb/%1/%2 FE_GET_INFO: ").arg( list[i] ).arg( flist[j] ).ascii() );
+ else {
+ close( fdFrontend );
+ return true;
+ }
+ close( fdFrontend );
+ }
+ }
+ }
+
+ return false;
+}
+
+
+
+void DVBconfig::startup()
+{
+ int i=0, j=0, res, fdFrontend=0;
+ struct dvb_frontend_info info;
+ bool as;
+
+ QStringList list, flist;
+ QString s, t;
+ QDir d;
+ d.setPath( "/dev/dvb/" );
+ list = d.entryList( "adapter*", QDir::Dirs, QDir::Name );
+
+ for ( i=0; i<(int)list.count(); i++ ) {
+ d.setPath( "/dev/dvb/"+list[i]+"/" );
+ flist = d.entryList( "frontend*", QDir::System, QDir::Name );
+ for ( j=0; j<(int)flist.count(); j++ ) {
+ s = list[i];
+ t = flist[j];
+ fdFrontend = open( QString("/dev/dvb/%1/%2").arg( s ).arg( t ).ascii(), O_RDWR);
+ if ( fdFrontend>0 ) {
+ if ( !(res = ioctl( fdFrontend, FE_GET_INFO, &info ) < 0) ) {
+ if ( (info.type==FE_OFDM)
+ && (info.caps & FE_CAN_QAM_AUTO)
+ && (info.caps & FE_CAN_TRANSMISSION_MODE_AUTO)
+ && (info.caps & FE_CAN_GUARD_INTERVAL_AUTO)
+ && (info.caps & FE_CAN_HIERARCHY_AUTO)
+ && (info.caps & FE_CAN_FEC_AUTO) )
+ as = true;
+ else
+ as = false;
+ fprintf(stderr,"/dev/dvb/%s/%s : opened ( %s )\n", s.ascii(), t.ascii(), info.name );
+ devList.append( new Device( s.replace("adapter","").toInt(), t.replace("frontend","").toInt(), info.type, info.name, as ) );
+ }
+ close( fdFrontend );
+ }
+ else
+ perror( QString("/dev/dvb/%1/%2").arg( s ).arg( t ).ascii() );
+ }
+ }
+
+ //devList.append( new Device( 3, 0, FE_QPSK, "Dummy S", false ) );
+}
+
+
+
+void DVBconfig::setDownloadResult( Job *job )
+{
+ if ( downProgress && job ) {
+ delete downProgress;
+ downProgress = 0;
+ }
+}
+
+
+
+void DVBconfig::setDownloadPercent( Job *job, unsigned long percent )
+{
+ if ( downProgress && job )
+ downProgress->progressBar()->setProgress( percent );
+}
+
+
+
+bool DVBconfig::loadDvbData( QWidget *parent )
+{
+ QString s="";
+ FileCopyJob *job;
+ QFile f( dvbConfigDir+"dvbdata.tar.gz" );
+
+ //if ( f.exists() ) f.remove();
+ downProgress = new KProgressDialog( parent, "progress", i18n("Downloading... "), i18n("Copying data files..."), true );
+ downProgress->progressBar()->setTotalSteps( 100 );
+ //job = file_copy( KURL( "http://hftom.free.fr/kaxtv/dvbdata.tar.gz" ), KURL( dvbConfigDir+"dvbdata.tar.gz" ), -1, true, false, false );
+ job = file_copy( KURL( "http://hftom.free.fr/kaxtv/dvbdata.tar.gz" ), KURL( dvbConfigDir+"dvbdata.tar.gz" ), -1, true, false, false );
+ connect( job, SIGNAL(result(KIO::Job*)), this, SLOT(setDownloadResult(KIO::Job*)) );
+ connect( job, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(setDownloadPercent(KIO::Job*,unsigned long)) );
+ downProgress->exec();
+ disconnect( job, SIGNAL(result(KIO::Job*)), this, SLOT(setDownloadResult(KIO::Job*)) );
+ disconnect( job, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(setDownloadPercent(KIO::Job*,unsigned long)) );
+ if ( downProgress ) {
+ delete downProgress;
+ downProgress = 0;
+ }
+ KTar tar( dvbConfigDir+"dvbdata.tar.gz");
+ if ( tar.open( IO_ReadOnly ) ) {
+ tar.directory()->copyTo( dvbConfigDir );
+ return true;
+ }
+ else
+ return false;
+}
+
+
+
+bool DVBconfig::localData()
+{
+ QString s = locate("data","kaffeine/dvbdata.tar.gz");
+ KTar tar( s );
+ if ( tar.open( IO_ReadOnly ) ) {
+ tar.directory()->copyTo( dvbConfigDir );
+ return true;
+ }
+ else
+ return false;
+}
+
+
+
+bool DVBconfig::haveData()
+{
+ if ( !QDir( dvbConfigDir+"dvb-s" ).exists() || !QDir( dvbConfigDir+"dvb-c" ).exists() || !QDir( dvbConfigDir+"dvb-t" ).exists() ) {
+ loadDvbData(0);
+ if ( !QDir( dvbConfigDir+"dvb-s" ).exists() || !QDir( dvbConfigDir+"dvb-c" ).exists() || !QDir( dvbConfigDir+"dvb-t" ).exists() ) {
+ if ( !localData() )
+ return false;
+ }
+ }
+ return true;
+}
+
+
+
+QStringList DVBconfig::getSourcesList( fe_type_t type )
+{
+ QString s;
+ QStringList list;
+
+ switch ( type ) {
+ case FE_QPSK : s = "dvb-s"; break;
+ case FE_QAM : s = "dvb-c"; break;
+ case FE_OFDM : s = "dvb-t"; break;
+ default : return list;
+ }
+ list = QDir( dvbConfigDir+s ).entryList( QDir::Files, QDir::Name );
+ return list;
+}
+
+
+
+void DVBconfig::addCategory( const QString &name, const QString &icon )
+{
+ categories.append( new Category( name, icon ) );
+}
+
+
+
+void DVBconfig::removeCategory( const QString &name )
+{
+ int i;
+
+ for ( i=0; i<(int)categories.count(); i++ ) {
+ if ( categories.at(i)->name==name ) {
+ categories.remove( i );
+ break;
+ }
+ }
+}
+
+
+
+void DVBconfig::changeIconCategory( const QString &name, const QString &icon )
+{
+ int i;
+
+ if ( name==i18n("All") )
+ allIcon = icon;
+ else if ( name==i18n("TV") )
+ tvIcon = icon;
+ else if ( name==i18n("Radio") )
+ radioIcon = icon;
+ else {
+ for ( i=0; i<(int)categories.count(); i++ ) {
+ if ( categories.at(i)->name==name ) {
+ categories.at(i)->icon = icon;
+ break;
+ }
+ }
+ }
+}
+
+
+
+int DVBconfig::readDvbChanOrder()
+{
+ config->setGroup( "DVB Options" );
+ int sort = config->readNumEntry("ChannelsSorting", 0);
+ return sort;
+}
+
+
+
+void DVBconfig::saveDvbChanOrder( int s, int col )
+{
+ int sort = (s<<1) | col;
+ config->setGroup( "DVB Options" );
+ config->writeEntry("ChannelsSorting", sort);
+ config->sync();
+}
+
+
+
+void DVBconfig::readConfig()
+{
+ QSize size;
+ QString s;
+ int i, j;
+
+ config->setGroup( "DVB Options" );
+ broadcastAddress = config->readEntry( "BroadcastAddress", "192.168.0.255" );
+ broadcastPort = config->readNumEntry( "BroadcastPort", 1234 );
+ senderPort = config->readNumEntry( "SenderPort", 1235 );
+ size = QSize(600, 350);
+ epgSize = config->readSizeEntry( "EPG Geometry", &size );
+ size = QSize(600, 300);
+ timerSize = config->readSizeEntry( "Timers Geometry", &size );
+ size = QSize(300, 300);
+ scanSize = config->readSizeEntry( "Scan Geometry", &size );
+ beginMargin = config->readNumEntry( "BeginMargin", 5 );
+ endMargin = config->readNumEntry( "EndMargin", 10 );
+ instantDuration = config->readNumEntry( "InstantDuration", 120 );
+ recordDir = config->readEntry( "RecordDir", QDir::homeDirPath() );
+ if ( !recordDir.endsWith("/") )
+ recordDir+= "/";
+ sizeFile = config->readNumEntry("SizeFile",0);
+ shiftDir = config->readEntry( "ShiftDir", QDir::homeDirPath() );
+ if ( !shiftDir.endsWith("/") )
+ shiftDir+= "/";
+ filenameFormat = config->readEntry( "filenameFormat", "%name" );
+ for ( i=0; i<(int)devList.count(); i++ ) {
+ devList.at(i)->source = config->readEntry( QString("DVB%1").arg(i), "" );
+ devList.at(i)->tuningTimeout = config->readNumEntry( QString("DVB%1_TIMEOUT").arg(i), 1500 );
+ if ( devList.at(i)->type!=FE_QPSK )
+ continue;
+ devList.at(i)->numLnb = config->readNumEntry( QString("DVB%1_NLNB").arg(i), 1 );
+ for ( j=0; j<devList.at(i)->numLnb; j++ ) {
+ devList.at(i)->lnb[j].switchFreq = config->readNumEntry( QString("DVB%1_LNB%2_switch").arg(i).arg(j), 11700 );
+ devList.at(i)->lnb[j].loFreq = config->readNumEntry( QString("DVB%1_LNB%2_lo").arg(i).arg(j), 9750 );
+ devList.at(i)->lnb[j].hiFreq = config->readNumEntry( QString("DVB%1_LNB%2_hi").arg(i).arg(j), 10600 );
+ devList.at(i)->lnb[j].rotorType = config->readNumEntry( QString("DVB%1_LNB%2_rotor").arg(i).arg(j), 0 );
+ devList.at(i)->lnb[j].source = config->readListEntry( QString("DVB%1_LNB%2_source").arg(i).arg(j) );
+ devList.at(i)->lnb[j].position = config->readIntListEntry( QString("DVB%1_LNB%2_position").arg(i).arg(j) );
+ devList.at(i)->lnb[j].speed13v = config->readDoubleNumEntry( QString("DVB%1_LNB%2_speed13v").arg(i).arg(j), 2.5 );
+ devList.at(i)->lnb[j].speed18v = config->readDoubleNumEntry( QString("DVB%1_LNB%2_speed18v").arg(i).arg(j), 1.5 );
+ }
+ }
+ j = config->readNumEntry( "NumCategories", 0 );
+ for ( i=0; i<j; i++ )
+ categories.append( new Category( config->readEntry( QString("CategoryName%1").arg(i), "" ), config->readEntry( QString("CategoryIcon%1").arg(i), "kaffeine" ) ) );
+ allIcon = config->readEntry( "AllIcon", "kaffeine" );
+ tvIcon = config->readEntry( "TvIcon", "kdvbtv" );
+ radioIcon = config->readEntry( "RadioIcon", "kdvbra" );
+ lastChannel = config->readNumEntry( "LastChannel", 1 );
+ splitSizes = config->readIntListEntry("SplitSizes");
+ defaultCharset = config->readEntry( "DefaultCharset", "ISO8859-1" );
+ usalsLatitude = config->readDoubleNumEntry( "UsalsLatitude", 0.0 );
+ usalsLongitude = config->readDoubleNumEntry( "UsalsLongitude", 0.0 );
+ for ( i=0; i<(int)devList.count(); i++ ) {
+ devList.at(i)->usalsLatitude = usalsLatitude;
+ devList.at(i)->usalsLongitude = usalsLongitude;
+ }
+}
+
+
+
+void DVBconfig::saveConfig()
+{
+ int i, j;
+
+ config->setGroup( "DVB Options" );
+ config->writeEntry( "EPG Geometry", epgSize );
+ config->writeEntry( "Timers Geometry", timerSize );
+ config->writeEntry( "Scan Geometry", scanSize );
+ config->writeEntry( "BeginMargin", beginMargin );
+ config->writeEntry( "EndMargin", endMargin );
+ config->writeEntry( "InstantDuration", instantDuration );
+ config->writeEntry( "RecordDir", recordDir );
+ config->writeEntry( "ShiftDir", shiftDir );
+ config->writeEntry( "filenameFormat", filenameFormat );
+ config->writeEntry( "BroadcastAddress", broadcastAddress );
+ config->writeEntry( "BroadcastPort", broadcastPort );
+ config->writeEntry( "SenderPort", senderPort );
+ for ( i=0; i<(int)devList.count(); i++ ) {
+ config->writeEntry( QString("DVB%1").arg(i), devList.at(i)->source );
+ config->writeEntry( QString("DVB%1_TIMEOUT").arg(i), devList.at(i)->tuningTimeout );
+ if ( devList.at(i)->type!=FE_QPSK )
+ continue;
+ config->writeEntry( QString("DVB%1_NLNB").arg(i), devList.at(i)->numLnb );
+ for ( j=0; j<devList.at(i)->numLnb; j++ ) {
+ config->writeEntry( QString("DVB%1_LNB%2_switch").arg(i).arg(j), devList.at(i)->lnb[j].switchFreq );
+ config->writeEntry( QString("DVB%1_LNB%2_lo").arg(i).arg(j), devList.at(i)->lnb[j].loFreq );
+ config->writeEntry( QString("DVB%1_LNB%2_hi").arg(i).arg(j), devList.at(i)->lnb[j].hiFreq );
+ config->writeEntry( QString("DVB%1_LNB%2_rotor").arg(i).arg(j), devList.at(i)->lnb[j].rotorType );
+ config->writeEntry( QString("DVB%1_LNB%2_source").arg(i).arg(j), devList.at(i)->lnb[j].source );
+ config->writeEntry( QString("DVB%1_LNB%2_position").arg(i).arg(j), devList.at(i)->lnb[j].position );
+ config->writeEntry( QString("DVB%1_LNB%2_speed13v").arg(i).arg(j), devList.at(i)->lnb[j].speed13v );
+ config->writeEntry( QString("DVB%1_LNB%2_speed18v").arg(i).arg(j), devList.at(i)->lnb[j].speed18v );
+ }
+ }
+ config->writeEntry( "NumCategories", categories.count() );
+ for ( i=0; i<(int)categories.count(); i++ ) {
+ config->writeEntry( QString("CategoryName%1").arg(i), categories.at(i)->name );
+ config->writeEntry( QString("CategoryIcon%1").arg(i), categories.at(i)->icon );
+ }
+ config->writeEntry( "AllIcon", allIcon );
+ config->writeEntry( "TvIcon", tvIcon );
+ config->writeEntry( "RadioIcon", radioIcon );
+ config->writeEntry( "LastChannel", lastChannel );
+ config->writeEntry( "SplitSizes", splitSizes );
+ config->writeEntry( "DefaultCharset", defaultCharset );
+ config->writeEntry( "UsalsLatitude", usalsLatitude );
+ config->writeEntry( "UsalsLongitude", usalsLongitude );
+ config->writeEntry( "SizeFile", sizeFile );
+ config->sync();
+}
+
+
+
+bool DVBconfig::firstRun()
+{
+ config->setGroup( "DVB Options" );
+ if ( config->readNumEntry( "FirstRun", 0 )<3 ) {
+ config->writeEntry( "FirstRun", 3 );
+ return true;
+ }
+ return false;
+}
+
+
+
+DvbConfigDialog::DvbConfigDialog( DVBconfig *dc, QWidget *parent, KaffeineDvbPlugin *p ) :
+ KDialogBase ( IconList, i18n("DVB Settings"), Ok|Cancel, Ok, parent, "dvbConfigDialog", true, true )
+{
+ QLabel *lab;
+ KIconLoader *icon = new KIconLoader();
+ QHBoxLayout *h1;
+ QString s;
+ int i;
+ QVBoxLayout *vb;
+ QGroupBox *gb;
+ QGridLayout *grid, *sgrid;
+ QLabel *ident;
+ QLabel *dvbType;
+ int gridLine;
+ QFrame *page;
+ QSpinBox *spin;
+ KPushButton *usals;
+ QWidget *swidg;
+ QStringList rotorList; rotorList<<i18n("No rotor")<<i18n("USALS rotor")<<i18n("Positions rotor");
+
+ dvbConfig = dc;
+ timeoutSpin.setAutoDelete( true );
+
+ for ( i=0; i<(int)dvbConfig->devList.count(); i++ ) {
+ page = addPage( i18n("DVB Device")+" "+QString("%1:%2").arg(dvbConfig->devList.at(i)->adapter).arg(dvbConfig->devList.at(i)->tuner), i18n("Device Settings"),
+ KGlobal::instance()->iconLoader()->loadIcon( "hwinfo", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+ gridLine = 0;
+
+ lab = new QLabel( i18n("<qt><b>Name:</b></qt>"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ ident = new QLabel( dvbConfig->devList.at(i)->name, gb );
+ grid->addMultiCellWidget( ident, gridLine, gridLine, 1, 3 );
+ ++gridLine;
+
+ lab = new QLabel( i18n("<qt><b>Type:</b></qt>"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ dvbType = new QLabel( gb );
+ switch ( dvbConfig->devList.at(i)->type ) {
+ case FE_QAM : dvbType->setText( i18n("Cable") ); break;
+ case FE_OFDM : dvbType->setText( i18n("Terrestrial") ); break;
+ case FE_QPSK : dvbType->setText( i18n("Satellite") ); break;
+ case FE_ATSC : dvbType->setText( i18n("Atsc") ); break;
+ default : dvbType->setText( i18n("Unknown") );
+ }
+ grid->addMultiCellWidget( dvbType, gridLine, gridLine, 1, 3 );
+ ++gridLine;
+
+ lab = new QLabel( i18n("Tuner timeout :"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ spin = new QSpinBox( 500, 5000, 100, gb );
+ spin->setValue( dvbConfig->devList.at(i)->tuningTimeout );
+ timeoutSpin.append( spin );
+ grid->addWidget( spin, gridLine, 1 );
+ lab = new QLabel( i18n("(ms)"), gb );
+ grid->addWidget( lab, gridLine, 2 );
+ ++gridLine;
+
+ if ( dvbConfig->devList.at(i)->type==FE_QPSK ) {
+ lab = new QLabel( i18n("Number of LNBs:"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ satNumber[i] = new MSpinBox( gb, i );
+ connect( satNumber[i], SIGNAL(signalValueChanged(int,int)), this, SLOT(satNumberChanged(int,int)));
+ grid->addWidget( satNumber[i], gridLine, 1 );
+ usals = new KPushButton( gb );
+ usals->setGuiItem( KGuiItem(i18n("Set rotor coordinates..."), icon->loadIconSet("move", KIcon::Small) ) );
+ connect( usals, SIGNAL(clicked()), this, SLOT(setUsals()));
+ grid->addWidget( usals, gridLine, 2 );
+
+ ++gridLine;
+
+ lnb0[i] = new MPushButton( gb, i, 0 );
+ lnb0[i]->setGuiItem( KGuiItem(i18n("LNB 1 settings..."), icon->loadIconSet("hwinfo", KIcon::Small) ) );
+ lnb0[i]->setEnabled(true);
+ grid->addWidget( lnb0[i], gridLine, 0 );
+ connect( lnb0[i], SIGNAL(clicked(int,int)), this, SLOT(setLnb(int,int)));
+ rotor0[i] = new MComboBox( gb, i, 0 );
+ rotor0[i]->insertStringList( rotorList );
+ rotor0[i]->setCurrentItem( dvbConfig->devList.at(i)->lnb[0].rotorType );
+ grid->addWidget( rotor0[i], gridLine, 1 );
+ connect( rotor0[i], SIGNAL(activated(int,int,int)), this, SLOT(setRotor(int,int,int)));
+ swidg = new QWidget( gb );
+ sgrid = new QGridLayout( swidg, 1, 1, 0, 0 );
+ sat0[i] = new QComboBox( swidg );
+ sat0[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ sgrid->addWidget( sat0[i], 0, 0 );
+ src0[i] = new MPushButton( swidg, i, 0 );
+ src0[i]->setGuiItem( KGuiItem(i18n("Sources list...") ) );
+ connect( src0[i], SIGNAL(clicked(int,int)), this, SLOT(setRotorSources(int,int)) );
+ sgrid->addWidget( src0[i], 1, 0 );
+ if ( dvbConfig->devList.at(i)->lnb[0].rotorType==0 ) {
+ setSource( sat0[i], dvbConfig->devList.at(i)->lnb[0].source[0] );
+ src0[i]->hide();
+ }
+ else {
+ sat0[i]->hide();
+ }
+ grid->addWidget( swidg, gridLine, 2 );
+ ++gridLine;
+
+ lnb1[i] = new MPushButton( gb, i, 1 );
+ lnb1[i]->setGuiItem( KGuiItem(i18n("LNB 2 settings..."), icon->loadIconSet("hwinfo", KIcon::Small) ) );
+ lnb1[i]->setEnabled(false);
+ grid->addWidget( lnb1[i], gridLine, 0 );
+ connect( lnb1[i], SIGNAL(clicked(int,int)), this, SLOT(setLnb(int,int)));
+ rotor1[i] = new MComboBox( gb, i, 1 );
+ rotor1[i]->setEnabled( false );
+ rotor1[i]->insertStringList( rotorList );
+ rotor1[i]->setCurrentItem( dvbConfig->devList.at(i)->lnb[1].rotorType );
+ grid->addWidget( rotor1[i], gridLine, 1 );
+ connect( rotor1[i], SIGNAL(activated(int,int,int)), this, SLOT(setRotor(int,int,int)));
+ swidg = new QWidget( gb );
+ sgrid = new QGridLayout( swidg, 1, 1, 0, 0 );
+ sat1[i] = new QComboBox( swidg );
+ sat1[i]->setEnabled(false);
+ sat1[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ sgrid->addWidget( sat1[i], 0, 0 );
+ src1[i] = new MPushButton( swidg, i, 1 );
+ src1[i]->setEnabled(false);
+ src1[i]->setGuiItem( KGuiItem(i18n("Sources list...") ) );
+ connect( src1[i], SIGNAL(clicked(int,int)), this, SLOT(setRotorSources(int,int)) );
+ sgrid->addWidget( src1[i], 1, 0 );
+ if ( dvbConfig->devList.at(i)->lnb[1].rotorType==0 ) {
+ setSource( sat1[i], dvbConfig->devList.at(i)->lnb[1].source[0] );
+ src1[i]->hide();
+ }
+ else {
+ sat1[i]->hide();
+ }
+ grid->addWidget( swidg, gridLine, 2 );
+ ++gridLine;
+
+ lnb2[i] = new MPushButton( gb, i, 2 );
+ lnb2[i]->setGuiItem( KGuiItem(i18n("LNB 3 settings..."), icon->loadIconSet("hwinfo", KIcon::Small) ) );
+ lnb2[i]->setEnabled(false);
+ grid->addWidget( lnb2[i], gridLine, 0 );
+ connect( lnb2[i], SIGNAL(clicked(int,int)), this, SLOT(setLnb(int,int)));
+ rotor2[i] = new MComboBox( gb, i, 2 );
+ rotor2[i]->setEnabled(false);
+ rotor2[i]->insertStringList( rotorList );
+ rotor2[i]->setCurrentItem( dvbConfig->devList.at(i)->lnb[2].rotorType );
+ grid->addWidget( rotor2[i], gridLine, 1 );
+ connect( rotor2[i], SIGNAL(activated(int,int,int)), this, SLOT(setRotor(int,int,int)));
+ swidg = new QWidget( gb );
+ sgrid = new QGridLayout( swidg, 1, 1, 0, 0 );
+ sat2[i] = new QComboBox( swidg );
+ sat2[i]->setEnabled(false);
+ sat2[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ sgrid->addWidget( sat2[i], 0, 0 );
+ src2[i] = new MPushButton( swidg, i, 2 );
+ src2[i]->setEnabled(false);
+ src2[i]->setGuiItem( KGuiItem(i18n("Sources list...") ) );
+ connect( src2[i], SIGNAL(clicked(int,int)), this, SLOT(setRotorSources(int,int)) );
+ sgrid->addWidget( src2[i], 1, 0 );
+ if ( dvbConfig->devList.at(i)->lnb[2].rotorType==0 ) {
+ setSource( sat2[i], dvbConfig->devList.at(i)->lnb[2].source[0] );
+ src2[i]->hide();
+ }
+ else {
+ sat2[i]->hide();
+ }
+ grid->addWidget( swidg, gridLine, 2 );
+ ++gridLine;
+
+ lnb3[i] = new MPushButton( gb, i, 3 );
+ lnb3[i]->setGuiItem( KGuiItem(i18n("LNB 4 settings..."), icon->loadIconSet("hwinfo", KIcon::Small) ) );
+ lnb3[i]->setEnabled(false);
+ grid->addWidget( lnb3[i], gridLine, 0 );
+ connect( lnb3[i], SIGNAL(clicked(int,int)), this, SLOT(setLnb(int,int)));
+ rotor3[i] = new MComboBox( gb, i, 3 );
+ rotor3[i]->setEnabled(false);
+ rotor3[i]->insertStringList( rotorList );
+ rotor3[i]->setCurrentItem( dvbConfig->devList.at(i)->lnb[3].rotorType );
+ grid->addWidget( rotor3[i], gridLine, 1 );
+ connect( rotor3[i], SIGNAL(activated(int,int,int)), this, SLOT(setRotor(int,int,int)));
+ swidg = new QWidget( gb );
+ sgrid = new QGridLayout( swidg, 1, 1, 0, 0 );
+ sat3[i] = new QComboBox( swidg );
+ sat3[i]->setEnabled(false);
+ sat3[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ sgrid->addWidget( sat3[i], 0, 0 );
+ src3[i] = new MPushButton( swidg, i, 3 );
+ src3[i]->setEnabled(false);
+ src3[i]->setGuiItem( KGuiItem(i18n("Sources list...") ) );
+ connect( src3[i], SIGNAL(clicked(int,int)), this, SLOT(setRotorSources(int,int)) );
+ sgrid->addWidget( src3[i], 1, 0 );
+ if ( dvbConfig->devList.at(i)->lnb[3].rotorType==0 ) {
+ setSource( sat3[i], dvbConfig->devList.at(i)->lnb[3].source[0] );
+ src3[i]->hide();
+ }
+ else {
+ sat3[i]->hide();
+ }
+ grid->addWidget( swidg, gridLine, 2 );
+ ++gridLine;
+
+ satNumber[i]->setValue( dvbConfig->devList.at(i)->numLnb );
+ }
+ else {
+ lab = new QLabel( i18n("Source:"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ sat0[i] = new QComboBox( gb );
+ if ( dvbConfig->devList.at(i)->canAutoscan )
+ sat0[i]->insertItem( "AUTO" );
+ sat0[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ setSource( sat0[i], dvbConfig->devList.at(i)->source );
+ grid->addWidget( sat0[i], gridLine, 1 );
+ ++gridLine;
+
+ if ( dvbConfig->devList.at(i)->canAutoscan ) {
+ lab = new QLabel( i18n("<qt>This device seems to support the <b><i>autoscan</i></b> feature. "
+ "You can choose <b>AUTO</b> in Source list to let Kaffeine "
+ "search for a range of frequencies.<br>"
+ "If <b><i>autoscan</i></b> fails to find your channels, choose a real Source in list.</qt>"), gb );
+ grid->addMultiCellWidget( lab, gridLine, gridLine, 0, 3 );
+ ++gridLine;
+ }
+ }
+ lab = new QLabel( i18n("<qt><i>If you can't find your network/location in the list, you'll have to create one. "
+ "Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing file as start point. "
+ "Fill in with the values for your network/location and give it a sensible name "
+ "(follow the naming convention). If you think your new file could be usefull for others, send it to "
+ "kaffeine-user(AT)lists.sf.net.</i></qt>"), gb );
+ grid->addMultiCellWidget( lab, gridLine, gridLine, 0, 3 );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+ }
+
+ page = addPage(i18n("Recording"),i18n("DVB Recording Options"),
+ KGlobal::instance()->iconLoader()->loadIcon( "hdd_unmount", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+
+ lab = new QLabel( i18n("Records directory:"), gb );
+ grid->addWidget( lab, 0, 0 );
+ recordDirLe = new QLineEdit( gb );
+ recordDirLe->setReadOnly( true );
+ grid->addWidget( recordDirLe, 0, 1 );
+ recordDirBtn = new QToolButton( gb );
+ recordDirBtn->setIconSet( icon->loadIconSet("fileopen", KIcon::Small) );
+ grid->addWidget( recordDirBtn, 0, 2 );
+
+ lab = new QLabel( i18n("Time shifting directory:"), gb );
+ grid->addWidget( lab, 1, 0 );
+ shiftDirLe = new QLineEdit( gb );
+ shiftDirLe->setReadOnly( true );
+ grid->addWidget( shiftDirLe, 1, 1 );
+ shiftDirBtn = new QToolButton( gb );
+ shiftDirBtn->setIconSet( icon->loadIconSet("fileopen", KIcon::Small) );
+ grid->addWidget( shiftDirBtn, 1, 2 );
+
+ lab = new QLabel( i18n("Begin margin:"), gb );
+ grid->addWidget( lab, 2, 0 );
+ beginSpin = new QSpinBox( gb );
+ h1 = new QHBoxLayout();
+ h1->addWidget( beginSpin );
+ lab = new QLabel( i18n("(minutes)"), gb );
+ h1->addWidget( lab );
+ grid->addLayout( h1, 2, 1 );
+
+ lab = new QLabel( i18n("End margin:"), gb );
+ grid->addWidget( lab, 3, 0 );
+ endSpin = new QSpinBox( gb );
+ h1 = new QHBoxLayout();
+ h1->addWidget( endSpin );
+ lab = new QLabel( i18n("(minutes)"), gb );
+ h1->addWidget( lab );
+ grid->addLayout( h1, 3, 1 );
+
+ lab = new QLabel( i18n("Instant record duration:"), gb );
+ grid->addWidget( lab, 4, 0 );
+ instantDurationSpin = new QSpinBox( 1, 1440, 1, gb );
+ h1 = new QHBoxLayout();
+ h1->addWidget( instantDurationSpin );
+ lab = new QLabel( i18n("(minutes)"), gb );
+ h1->addWidget( lab );
+ grid->addLayout( h1, 4, 1 );
+
+ lab = new QLabel( i18n("Max file size (0=Unlimited):"), gb );
+ grid->addWidget( lab, 5, 0 );
+ sizeFileSpin = new QSpinBox( 1, 9999, 1, gb );
+ sizeFileSpin->setMinValue(0);
+ h1 = new QHBoxLayout();
+ h1->addWidget( sizeFileSpin );
+ lab = new QLabel( i18n("(MB)"), gb );
+ h1->addWidget( lab );
+ grid->addLayout( h1, 5, 1 );
+
+ lab = new QLabel( i18n("Filename Format:"), gb );
+ grid->addWidget( lab, 7, 0 );
+ filenameFormatLe = new QLineEdit( gb );
+ grid->addWidget( filenameFormatLe, 7, 1 );
+ helpNameBtn = new QToolButton( gb );
+ helpNameBtn->setIconSet( icon->loadIconSet("help", KIcon::Small) );
+ grid->addWidget( helpNameBtn, 7, 2 );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ recordDirLe->setText( dvbConfig->recordDir );
+ shiftDirLe->setText( dvbConfig->shiftDir );
+ beginSpin->setValue( dvbConfig->beginMargin );
+ endSpin->setValue( dvbConfig->endMargin );
+ instantDurationSpin->setValue( dvbConfig->instantDuration );
+ sizeFileSpin->setValue( dvbConfig->sizeFile );
+ filenameFormatLe->setText( dvbConfig->filenameFormat );
+
+ page = addPage(i18n("Broadcasting"),i18n("DVB Broadcasting"),
+ KGlobal::instance()->iconLoader()->loadIcon( "network_local", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+
+ lab = new QLabel( i18n("Broadcast address:"), gb );
+ grid->addWidget( lab, 0, 0 );
+ broadcastLe = new QLineEdit( gb );
+ grid->addWidget( broadcastLe, 0, 1 );
+ lab = new QLabel( i18n("Broadcast port:"), gb );
+ grid->addWidget( lab, 1, 0 );
+ bportSpin = new QSpinBox( 1, 65535, 1, gb );
+ grid->addWidget( bportSpin, 1, 1 );
+ lab = new QLabel( i18n("Info port:"), gb );
+ grid->addWidget( lab, 2, 0 );
+ sportSpin = new QSpinBox( 1, 65535, 1, gb );
+ grid->addWidget( sportSpin, 2, 1 );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ broadcastLe->setText( dvbConfig->broadcastAddress );
+ bportSpin->setValue( dvbConfig->broadcastPort );
+ sportSpin->setValue( dvbConfig->senderPort );
+
+ page = addPage(i18n("Misc"),i18n("Misc"),
+ KGlobal::instance()->iconLoader()->loadIcon( "misc", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+
+ lab = new QLabel( i18n("Default charset (restart needed):"), gb );
+ grid->addWidget( lab, 0, 0 );
+ charsetComb = new QComboBox( gb );
+ charsetComb->insertItem( "ISO8859-1" );
+ charsetComb->insertItem( "ISO6937" );
+ if ( dvbConfig->defaultCharset=="ISO8859-1" )
+ charsetComb->setCurrentItem( 0 );
+ else if ( dvbConfig->defaultCharset=="ISO6937" )
+ charsetComb->setCurrentItem( 1 );
+ grid->addWidget( charsetComb, 0, 1 );
+
+ lab = new QLabel( i18n("Update scan data:"), gb );
+ grid->addWidget( lab, 1, 0 );
+ updateBtn = new KPushButton( gb );
+ updateBtn->setGuiItem( KGuiItem(i18n("Download"), icon->loadIconSet("khtml_kget", KIcon::Small) ) );
+ grid->addWidget( updateBtn, 1, 1 );
+
+ lab = new QLabel( i18n("Dump epg's events to \n~/kaffeine_dvb_events.tx:"), gb );
+ grid->addWidget( lab, 2, 0 );
+ dumpBtn = new KPushButton( gb );
+ dumpBtn->setGuiItem( KGuiItem(i18n("Dump"), icon->loadIconSet("filesave", KIcon::Small) ) );
+ grid->addWidget( dumpBtn, 2, 1 );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ if ( p ) {
+ page = addPage(i18n("DVB plugins"),i18n("DVB plugins"),
+ KGlobal::instance()->iconLoader()->loadIcon( "misc", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+
+ KPushButton *btn = new KPushButton( p->pluginName(), gb );
+ grid->addWidget( btn, 0, 0 );
+ connect( btn, SIGNAL(clicked()), p, SLOT(configDialog()) );
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+ }
+
+ connect( recordDirBtn, SIGNAL(clicked()), this, SLOT(setRecordDir()) );
+ connect( shiftDirBtn, SIGNAL(clicked()), this, SLOT(setShiftDir()) );
+ connect( updateBtn, SIGNAL(clicked()), this, SLOT(downloadData()) );
+ connect( helpNameBtn, SIGNAL(clicked()), this, SLOT(fileTemplateHelp()) );
+ delete icon;
+}
+
+
+
+void DvbConfigDialog::setUsals()
+{
+ KDialogBase *dlg = new KDialogBase( this, "usalsConfigDialog", true, i18n("Rotors settings"), Ok|Cancel, Ok, true );
+ QGridLayout *grid;
+ QWidget *page = new QWidget( dlg );
+ dlg->setMainWidget( page );
+
+ QVBoxLayout *vb = new QVBoxLayout( page, 6, 6 );
+ QLabel *lab = new QLabel( i18n("Set your position coordinates for rotors:"), page );
+ vb->addWidget( lab );
+ lab = new QLabel( "(Sydney: -33.8916, 151.2417 - New York: 40.7139, -74.0063)", page );
+ vb->addWidget( lab );
+ grid = new QGridLayout( 0, 1, 1 );
+ lab = new QLabel( i18n("Latitude:"), page );
+ grid->addWidget( lab, 0, 0 );
+ QLineEdit *latitude = new QLineEdit( page );
+ latitude->setText( QString().setNum( dvbConfig->usalsLatitude ) );
+ grid->addWidget( latitude, 0, 1 );
+ lab = new QLabel( i18n("Longitude:"), page );
+ grid->addWidget( lab, 1, 0 );
+ QLineEdit *longitude = new QLineEdit( page );
+ longitude->setText( QString().setNum( dvbConfig->usalsLongitude ) );
+ grid->addWidget( longitude, 1, 1 );
+ vb->addLayout( grid );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ if ( dlg->exec()==QDialog::Accepted ) {
+ dvbConfig->usalsLatitude = latitude->text().toDouble();
+ dvbConfig->usalsLongitude = longitude->text().toDouble();
+ for ( int i=0; i<(int)dvbConfig->devList.count(); i++ ) {
+ dvbConfig->devList.at(i)->usalsLatitude = dvbConfig->usalsLatitude;
+ dvbConfig->devList.at(i)->usalsLongitude = dvbConfig->usalsLongitude;
+ }
+ }
+}
+
+
+
+void DvbConfigDialog::setRotorSources( int devNum, int lnbNum )
+{
+ RotorConfig rotor( dvbConfig->devList.at(devNum), dvbConfig, lnbNum, this );
+ rotor.exec();
+}
+
+
+
+void DvbConfigDialog::setRotor( int index, int devNum, int lnbNum )
+{
+ QComboBox *comb;
+ QPushButton *btn;
+
+ switch ( lnbNum ) {
+ case 0 : comb=sat0[devNum]; btn=src0[devNum]; break;
+ case 1 : comb=sat1[devNum]; btn=src1[devNum]; break;
+ case 2 : comb=sat2[devNum]; btn=src2[devNum]; break;
+ case 3 : comb=sat3[devNum]; btn=src3[devNum]; break;
+ default : return;
+ }
+
+ dvbConfig->devList.at(devNum)->lnb[lnbNum].rotorType=index;
+
+ if ( index==0 ) {
+ btn->hide();
+ comb->show();
+ }
+ else {
+ comb->hide();
+ btn->show();
+ }
+}
+
+
+
+void DvbConfigDialog::setLnb( int devNum, int lnbNum )
+{
+ LnbConfig lnb( &dvbConfig->devList.at(devNum)->lnb[lnbNum], this );
+ lnb.exec();
+}
+
+
+
+void DvbConfigDialog::downloadData()
+{
+ int ret;
+
+loop:
+ if ( !dvbConfig->loadDvbData(0) ) {
+ ret = KMessageBox::questionYesNo( this, i18n("<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!<br>\
+ Check your internet connection, and say Yes to try again.<br>\
+ Or say No to cancel.<br> Should I try again?</qt>") );
+ if ( ret==KMessageBox::Yes )
+ goto loop;
+ return;
+ }
+}
+
+
+
+void DvbConfigDialog::setSource( QComboBox *box, QString s )
+{
+ int pos, i;
+
+ pos = s.find("|");
+ if ( pos>=0 )
+ s = s.right( s.length()-pos-1 );
+ for ( i=0; i<(int)box->count(); i++ ) {
+ if ( box->text(i)==s ) {
+ box->setCurrentItem(i);
+ break;
+ }
+ }
+}
+
+
+
+void DvbConfigDialog::satNumberChanged( int value, int devNum )
+{
+ sat0[devNum]->setEnabled( value > 0 );
+ sat1[devNum]->setEnabled( value > 1 );
+ sat2[devNum]->setEnabled( value > 2 );
+ sat3[devNum]->setEnabled( value > 3 );
+
+ src0[devNum]->setEnabled( value > 0 );
+ src1[devNum]->setEnabled( value > 1 );
+ src2[devNum]->setEnabled( value > 2 );
+ src3[devNum]->setEnabled( value > 3 );
+
+ lnb0[devNum]->setEnabled( value > 0 );
+ lnb1[devNum]->setEnabled( value > 1 );
+ lnb2[devNum]->setEnabled( value > 2 );
+ lnb3[devNum]->setEnabled( value > 3 );
+
+ rotor0[devNum]->setEnabled( value > 0 );
+ rotor1[devNum]->setEnabled( value > 1 );
+ rotor2[devNum]->setEnabled( value > 2 );
+ rotor3[devNum]->setEnabled( value > 3 );
+}
+
+
+
+void DvbConfigDialog::fileTemplateHelp()
+{
+ KMessageBox::information( this, i18n("Special strings are:\n- %chan (channel's name)\n- %date (the starting date, YYMMdd-hhmmss)\n- %name (the name given in timer editor or the program name from EPG)\nSo, if you set template to '%chan-%date-%name', the resulting filename will be, for example, BBC-20070919-210000-News.m2t") );
+}
+
+
+
+void DvbConfigDialog::setRecordDir()
+{
+ QString s = KFileDialog::getExistingDirectory( recordDirLe->text().stripWhiteSpace() );
+ if ( !s.isEmpty() )
+ recordDirLe->setText( s );
+}
+
+
+
+void DvbConfigDialog::setShiftDir()
+{
+ QString s = KFileDialog::getExistingDirectory( shiftDirLe->text().stripWhiteSpace() );
+ if ( !s.isEmpty() )
+ shiftDirLe->setText( s );
+}
+
+
+
+void DvbConfigDialog::accept()
+{
+ QString s;
+ int i;
+
+ if ( recordDirLe->text().stripWhiteSpace().isEmpty() ) {
+ KMessageBox::sorry( this, i18n("Invalid records directory.") );
+ recordDirLe->setFocus();
+ return;
+ }
+ if ( shiftDirLe->text().stripWhiteSpace().isEmpty() ) {
+ KMessageBox::sorry( this, i18n("Invalid time shifting directory.") );
+ shiftDirLe->setFocus();
+ return;
+ }
+ if ( bportSpin->value()==sportSpin->value() ) {
+ KMessageBox::sorry( this, i18n("Broadcast and Info ports must be different.") );
+ sportSpin->setFocus();
+ return;
+ }
+ if ( !QRegExp("(\\d{1,3}\\.){3}\\d{1,3}").exactMatch( broadcastLe->text().stripWhiteSpace() ) ) {
+ KMessageBox::sorry( this, i18n("Invalid broadcast address.") );
+ broadcastLe->setFocus();
+ return;
+ }
+ if ( !filenameFormatLe->text().contains("%chan") && !filenameFormatLe->text().contains("%date") && !filenameFormatLe->text().contains("%name") ) {
+ KMessageBox::sorry( this, i18n("Invalid filename format.") );
+ filenameFormatLe->setFocus();
+ return;
+ }
+
+ for ( i=0; i<(int)dvbConfig->devList.count(); i++ ) {
+ switch (dvbConfig->devList.at(i)->type) {
+ case FE_QPSK: {
+ dvbConfig->devList.at(i)->numLnb = satNumber[i]->value();
+ if ( dvbConfig->devList.at(i)->lnb[3].rotorType==0 ) {
+ dvbConfig->devList.at(i)->lnb[3].source.clear();
+ dvbConfig->devList.at(i)->lnb[3].source.append(sat3[i]->currentText());
+ }
+ if ( dvbConfig->devList.at(i)->lnb[2].rotorType==0 ) {
+ dvbConfig->devList.at(i)->lnb[2].source.clear();
+ dvbConfig->devList.at(i)->lnb[2].source.append(sat2[i]->currentText());
+ }
+ if ( dvbConfig->devList.at(i)->lnb[1].rotorType==0 ) {
+ dvbConfig->devList.at(i)->lnb[1].source.clear();
+ dvbConfig->devList.at(i)->lnb[1].source.append(sat1[i]->currentText());
+ }
+ if ( dvbConfig->devList.at(i)->lnb[0].rotorType==0 ) {
+ dvbConfig->devList.at(i)->lnb[0].source.clear();
+ dvbConfig->devList.at(i)->lnb[0].source.append(sat0[i]->currentText());
+ }
+ s = "S";
+ break;
+ }
+ case FE_QAM: {
+ s = "C";
+ s+="|"+sat0[i]->currentText();
+ break;
+ }
+ case FE_OFDM: {
+ s = "T";
+ s+="|"+sat0[i]->currentText();
+ break;
+ }
+ case FE_ATSC: {
+ s = "A";
+ s+="|"+sat0[i]->currentText();
+ break;
+ }
+ }
+ dvbConfig->devList.at(i)->source = s;
+ dvbConfig->devList.at(i)->tuningTimeout = timeoutSpin.at(i)->value();
+ }
+
+ dvbConfig->recordDir = recordDirLe->text();
+ if ( !dvbConfig->recordDir.endsWith("/") )
+ dvbConfig->recordDir+= "/";
+ dvbConfig->shiftDir = shiftDirLe->text();
+ if ( !dvbConfig->shiftDir.endsWith("/") )
+ dvbConfig->shiftDir+= "/";
+ dvbConfig->beginMargin = beginSpin->value();
+ dvbConfig->endMargin = endSpin->value();
+ dvbConfig->instantDuration = instantDurationSpin->value();
+ dvbConfig->sizeFile = sizeFileSpin->value();
+ dvbConfig->filenameFormat = filenameFormatLe->text();
+ dvbConfig->defaultCharset = charsetComb->currentText();
+ dvbConfig->broadcastAddress = broadcastLe->text().stripWhiteSpace();
+ dvbConfig->broadcastPort = bportSpin->value();
+ dvbConfig->senderPort = sportSpin->value();
+ dvbConfig->saveConfig();
+ done( Accepted );
+}
+
+
+
+DvbConfigDialog::~DvbConfigDialog()
+{
+}
+
+
+
+LnbConfig::LnbConfig( LNB *b, QWidget *parent ) :
+ KDialogBase ( parent, "lnbConfigDialog", true, i18n("LNB Settings"), Ok|Cancel, Ok, true )
+{
+ QGridLayout *grid;
+
+ QWidget *page = new QWidget( this );
+ setMainWidget( page );
+
+ lnb = b;
+
+ QVBoxLayout *vb = new QVBoxLayout( page, 6, 6 );
+ univ = new QPushButton( i18n("Universal LNB"), page );
+ connect( univ, SIGNAL(clicked()), this, SLOT(setUniversal()) );
+ vb->addWidget( univ );
+ cmono = new QPushButton( i18n("C-Band LNB"), page );
+ connect( cmono, SIGNAL(clicked()), this, SLOT(setCBandMono()) );
+ vb->addWidget( cmono );
+ cmulti = new QPushButton( i18n("C-Band Multipoint LNB"), page );
+ connect( cmulti, SIGNAL(clicked()), this, SLOT(setCBandMulti()) );
+ vb->addWidget( cmulti );
+
+ grid = new QGridLayout( 0, 1, 1 );
+ nLO = new QButtonGroup( 3, Qt::Horizontal, page );
+ connect( nLO, SIGNAL(clicked(int)), this, SLOT(setDual(int)) );
+ new QRadioButton( i18n("Dual LO"), nLO );
+ new QRadioButton( i18n("Single LO"), nLO );
+ new QRadioButton( i18n("H/V LO"), nLO );
+ grid->addMultiCellWidget( nLO, 0, 0, 0, 1 );
+ slofLab = new QLabel( i18n("Dual LO switch frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( slofLab, 1, 0 );
+ slof = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( slof, 1, 1 );
+ loLab = new QLabel( i18n("Lo-band frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( loLab, 2, 0 );
+ lo = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( lo, 2, 1 );
+ hiLab = new QLabel( i18n("Hi-band frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( hiLab, 3, 0 );
+ hi = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( hi, 3, 1 );
+ singleLab = new QLabel( i18n("Single LO frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( singleLab, 4, 0 );
+ single = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( single, 4, 1 );
+ verticalLab = new QLabel( i18n("Vertical pol. LO frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( verticalLab, 5, 0 );
+ vertical = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( vertical, 5, 1 );
+ horizontalLab = new QLabel( i18n("Horizontal pol. LO frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( horizontalLab, 6, 0 );
+ horizontal = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( horizontal, 6, 1 );
+
+ vb->addLayout( grid );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+
+ slof->setValue( lnb->switchFreq );
+ lo->setValue( lnb->loFreq );
+ hi->setValue( lnb->hiFreq );
+ single->setValue( lnb->loFreq );
+ vertical->setValue( lnb->loFreq );
+ horizontal->setValue( lnb->hiFreq );
+
+ if ( lnb->switchFreq ) {
+ nLO->setButton( 0 );
+ setDual( 0 );
+ }
+ else {
+ if ( lnb->hiFreq ) {
+ nLO->setButton( 2 );
+ setDual( 2 );
+ }
+ else {
+ nLO->setButton( 1 );
+ setDual( 1 );
+ }
+ }
+}
+
+
+
+void LnbConfig::setDual( int id )
+{
+ switch ( id ) {
+ case 0: {
+ singleLab->hide();
+ single->hide();
+ verticalLab->hide();
+ vertical->hide();
+ horizontalLab->hide();
+ horizontal->hide();
+ slofLab->show();
+ slof->show();
+ loLab->show();
+ lo->show();
+ hiLab->show();
+ hi->show();
+ break;
+ }
+ case 1: {
+ slofLab->hide();
+ slof->hide();
+ loLab->hide();
+ lo->hide();
+ hiLab->hide();
+ hi->hide();
+ verticalLab->hide();
+ vertical->hide();
+ horizontalLab->hide();
+ horizontal->hide();
+ singleLab->show();
+ single->show();
+ break;
+ }
+ case 2: {
+ slofLab->hide();
+ slof->hide();
+ loLab->hide();
+ lo->hide();
+ hiLab->hide();
+ hi->hide();
+ singleLab->hide();
+ single->hide();
+ verticalLab->show();
+ vertical->show();
+ horizontalLab->show();
+ horizontal->show();
+ break;
+ }
+ }
+}
+
+
+
+void LnbConfig::setUniversal()
+{
+ nLO->setButton( 0 );
+ setDual( 0 );
+ slof->setValue( 11700 );
+ lo->setValue( 9750 );
+ hi->setValue( 10600 );
+}
+
+
+
+void LnbConfig::setCBandMono()
+{
+ nLO->setButton( 1 );
+ setDual( 1 );
+ single->setValue( 5150 );
+}
+
+
+
+void LnbConfig::setCBandMulti()
+{
+ nLO->setButton( 2 );
+ setDual( 2 );
+ vertical->setValue( 5150 );
+ horizontal->setValue( 5750 );
+}
+
+
+
+void LnbConfig::accept()
+{
+ switch ( nLO->selectedId() ) {
+ case 0: {
+ lnb->switchFreq = slof->value();
+ lnb->loFreq = lo->value();
+ lnb->hiFreq = hi->value();
+ break;
+ }
+ case 1: {
+ lnb->switchFreq = 0;
+ lnb->hiFreq = 0;
+ lnb->loFreq = single->value();
+ break;
+ }
+ case 2: {
+ lnb->switchFreq = 0;
+ lnb->loFreq = vertical->value();
+ lnb->hiFreq = horizontal->value();
+ break;
+ }
+ }
+ done( Accepted );
+}
+
+
+
+RotorConfig::RotorConfig( Device *d, DVBconfig *c, int lnb, QWidget *parent ) :
+ KDialogBase ( parent, "rotorConfigDialog", true, i18n("Rotor Settings"), Ok|Cancel, Ok, true )
+{
+ int i;
+
+ QWidget *page = new QWidget( this );
+ setMainWidget( page );
+
+ dev = d;
+ config = c;
+ lnbNum = lnb;
+
+ QVBoxLayout *vb = new QVBoxLayout( page, 6, 6 );
+ QGridLayout *grid = new QGridLayout( 0, 1, 1 );
+ QLabel *lab = new QLabel( i18n("Sattelite:"), page );
+ grid->addWidget( lab, 0, 0 );
+ if ( dev->lnb[lnbNum].rotorType==2 ) {
+ lab = new QLabel( i18n("Position:"), page );
+ grid->addWidget( lab, 0, 1 );
+ }
+ srcComb = new QComboBox( page );
+ srcComb->insertStringList( config->getSourcesList( dev->type ) );
+ grid->addWidget( srcComb, 1, 0 );
+ position = new QSpinBox( 0, 500, 1, page );
+ grid->addWidget( position, 1, 1 );
+ vb->addLayout( grid );
+ vb->addItem( new QSpacerItem( 20, 10, QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+
+ addBtn = new QPushButton( i18n("Add to list"), page );
+ connect( addBtn, SIGNAL(clicked()), this, SLOT(add()) );
+ vb->addWidget( addBtn );
+ vb->addItem( new QSpacerItem( 20, 10, QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+
+ listView = new QListView( page );
+ listView->addColumn( i18n("Sattelite:") );
+ vb->addWidget( listView );
+
+ resetBtn = new QPushButton( i18n("Clear list"), page );
+ connect( resetBtn, SIGNAL(clicked()), this, SLOT(reset()) );
+ vb->addWidget( resetBtn );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+
+ grid = new QGridLayout( 0, 1, 1 );
+ lab = new QLabel( i18n("13V rotor speed:"), page );
+ grid->addWidget( lab, 0, 0 );
+ speed13 = new QLineEdit( page );
+ speed13->setText( QString().setNum( dev->lnb[lnbNum].speed13v ) );
+ grid->addWidget( speed13, 0, 1 );
+ lab = new QLabel( i18n("sec./ °"), page );
+ grid->addWidget( lab, 0, 2 );
+ lab = new QLabel( i18n("18V rotor speed:"), page );
+ grid->addWidget( lab, 1, 0 );
+ speed18 = new QLineEdit( page );
+ speed18->setText( QString().setNum( dev->lnb[lnbNum].speed18v ) );
+ grid->addWidget( speed18, 1, 1 );
+ lab = new QLabel( i18n("sec./ °"), page );
+ grid->addWidget( lab, 1, 2 );
+ vb->addLayout( grid );
+
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ if ( dev->lnb[lnbNum].rotorType==2 ) {
+ listView->addColumn( i18n("Position:") );
+ for ( i=0; i<(int)dev->lnb[lnbNum].source.count(); i++ )
+ new QListViewItem( listView, dev->lnb[lnbNum].source[i], QString().setNum(dev->lnb[lnbNum].position[i]) );
+ }
+ else {
+ position->hide();
+ for ( i=0; i<(int)dev->lnb[lnbNum].source.count(); i++ )
+ new QListViewItem( listView, dev->lnb[lnbNum].source[i] );
+ }
+
+}
+
+
+
+void RotorConfig::reset()
+{
+ listView->clear();
+ position->setValue( 1 );
+}
+
+
+
+void RotorConfig::add()
+{
+ if ( position->isHidden() ) {
+ new QListViewItem( listView, srcComb->currentText() );
+ }
+ else {
+ new QListViewItem( listView, srcComb->currentText(), QString().setNum(position->value()) );
+ }
+
+}
+
+
+
+void RotorConfig::accept()
+{
+ QListViewItem *it;
+
+ dev->lnb[lnbNum].speed18v = speed18->text().toDouble();
+ dev->lnb[lnbNum].speed13v = speed13->text().toDouble();
+ dev->lnb[lnbNum].source.clear();
+ dev->lnb[lnbNum].position.clear();
+ for ( it=listView->firstChild(); it; it=it->nextSibling() ) {
+ dev->lnb[lnbNum].source.append( it->text(0) );
+ if ( dev->lnb[lnbNum].rotorType==2 )
+ dev->lnb[lnbNum].position.append( it->text(1).toInt() );
+ }
+ done( Accepted );
+}
+
+
+#include "dvbconfig.moc"