summaryrefslogtreecommitdiff
path: root/noncore/settings/networksettings2/opietooth2/Opietooth.cpp
Side-by-side diff
Diffstat (limited to 'noncore/settings/networksettings2/opietooth2/Opietooth.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/networksettings2/opietooth2/Opietooth.cpp1003
1 files changed, 1003 insertions, 0 deletions
diff --git a/noncore/settings/networksettings2/opietooth2/Opietooth.cpp b/noncore/settings/networksettings2/opietooth2/Opietooth.cpp
new file mode 100644
index 0000000..8d71f32
--- a/dev/null
+++ b/noncore/settings/networksettings2/opietooth2/Opietooth.cpp
@@ -0,0 +1,1003 @@
+#include <opie2/odebug.h>
+#include <opie2/oledbox.h>
+
+#include <qpe/resource.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qprogressbar.h>
+#include <qheader.h>
+#include <qmessagebox.h>
+#include <qapplication.h>
+#include <qlistbox.h>
+#include <qdialog.h>
+#include <qlayout.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlistview.h>
+#include <qpushbutton.h>
+
+#include <Opietooth.h>
+#include <OTDriver.h>
+#include <OTPeer.h>
+#include <OTGateway.h>
+#include <OTSDPAttribute.h>
+#include <OTSDPService.h>
+#include <OTInquiry.h>
+
+using namespace Opietooth2;
+
+namespace Opietooth2 {
+
+class PeerLVI : public QListViewItem {
+
+public :
+
+ PeerLVI( OTPeer * P, QListView * it ) : QListViewItem (it) {
+ Peer = P;
+ }
+ ~PeerLVI( void ) {
+ }
+
+ inline OTPeer * peer( void )
+ { return Peer; }
+
+private :
+
+ OTPeer * Peer;
+};
+
+class ChannelLVI : public QListViewItem {
+
+public :
+
+ ChannelLVI( int Ch, QListViewItem * it ) : QListViewItem (it) {
+ Channel = Ch;
+ }
+ ~ChannelLVI( void ) {
+ }
+
+ inline int channel( void )
+ { return Channel; }
+
+private :
+
+ int Channel;
+};
+
+class DriverLVI : public QListViewItem {
+
+public :
+
+ DriverLVI( OTDriver * P, QListView * it ) : QListViewItem (it) {
+ Driver = P;
+ }
+ ~DriverLVI( void ) {
+ }
+
+ inline OTDriver * driver( void )
+ { return Driver; }
+
+private :
+
+ OTDriver * Driver;
+};
+
+class LinkKeyLVI : public QListViewItem {
+
+public :
+
+ LinkKeyLVI( int Ch, QListView * it ) : QListViewItem (it) {
+ LinkKey = Ch;
+ }
+ ~LinkKeyLVI( void ) {
+ }
+
+ inline int index( void )
+ { return LinkKey; }
+
+private :
+
+ int LinkKey;
+};
+};
+
+//
+//
+//
+//
+//
+
+OTPairing::OTPairing( QWidget * parent, OTIcons * _IC ) :
+ OTPairingGUI( parent ) {
+
+ OT = OTGateway::getOTGateway();
+ Icons = (_IC ) ? _IC : new OTIcons();
+ MyIcons = (_IC == 0 );
+
+ // unpairing can only be done if bluetooth is disabled
+ Unpair_But->setEnabled( ! OT->isEnabled() );
+ if( ! OT->isEnabled() ) {
+ Unpair_LBL->hide();
+ } else {
+ Unpair_LBL->show();
+ }
+
+ // open linkkey file and load pairs
+ LinkKeyArray Keys = OT->getLinkKeys();
+ LinkKeyLVI * it;
+ OTPeer * P;
+ OTDriver * D;
+
+ for( unsigned int i = 0 ;
+ i < Keys.count();
+ i ++ ) {
+
+ it = new LinkKeyLVI( i, Pairs_LV );
+
+ P = 0;
+ D = OT->findDriver( Keys[i].from() );
+
+ if( D ) {
+ it->setText( 0, D->devname() );
+
+ // we are source
+ P = OT->findPeer( Keys[i].to() );
+
+ if( P ) {
+ // put name
+ it->setText( 1, P->name() );
+ } else {
+ // unknown
+ it->setText( 1, Keys[i].to().toString() );
+ }
+
+ // and put address as sub
+ QListViewItem * Sub = new QListViewItem( it );
+ Sub->setText( 0, D->address().toString() );
+ Sub->setText( 1, Keys[i].to().toString() );
+ } else {
+ // perhaps we are destination
+ D = OT->findDriver( Keys[i].to() );
+
+ if( D ) {
+ it->setText( 1, D->devname() );
+
+ // we are source
+ P = OT->findPeer( Keys[i].from() );
+
+ if( P ) {
+ // put name
+ it->setText( 0, P->name() );
+ } else {
+ // unknown
+ it->setText( 0, Keys[i].from().toString() );
+ }
+
+ // and put address as sub
+ QListViewItem * Sub = new QListViewItem( it );
+ Sub->setText( 0, Keys[i].from().toString() );
+ Sub->setText( 1, D->address().toString() );
+ } else {
+ // nor source nor destination -> unknown
+ it->setText( 0, Keys[i].from().toString() );
+ it->setText( 1, Keys[i].to().toString() );
+ }
+ }
+ }
+}
+
+
+OTPairing::~OTPairing() {
+ if( MyIcons )
+ delete Icons;
+ OTGateway::releaseOTGateway();
+}
+
+void OTPairing::SLOT_Unpair( ) {
+ // find selected pair
+
+ QListViewItem * it = Pairs_LV->firstChild();
+ while( it ) {
+ if( it->isSelected() ) {
+ // confirm ?
+ if( QMessageBox::warning(0,
+ tr("Break pairing"),
+ tr("Sure ?"),
+ tr("Yes, break"),
+ tr("No, don't break") ) == 0 ) {
+ LinkKeyLVI * KPIt = (LinkKeyLVI *)it;
+ // break
+ OT->removeLinkKey( KPIt->index() );
+ delete KPIt;
+ }
+ return;
+ }
+ it= it->nextSibling();
+ }
+}
+
+//
+//
+//
+//
+//
+
+OTScan::OTScan( QWidget * parent, OTIcons * _IC ) :
+ OTScanGUI( parent ), Filter() {
+
+ OT = OTGateway::getOTGateway();
+ Icons = (_IC ) ? _IC : new OTIcons();
+ MyIcons = (_IC == 0 );
+ DetectedPeers_LV->header()->hide();
+ Current = 0;
+ SelectedPeer = 0;
+ SelectedChannel = 0;
+
+ StrengthTimer = new QTimer( this );
+ connect( StrengthTimer,
+ SIGNAL( timeout()),
+ this,
+ SLOT( SLOT_UpdateStrength())
+ );
+
+ connect( OT,
+ SIGNAL( detectedPeer( OTPeer *, bool )),
+ this,
+ SLOT( SLOT_NewPeer( OTPeer *, bool ))
+ );
+ connect( OT,
+ SIGNAL( finishedDetecting()),
+ this,
+ SLOT( SLOT_FinishedDetecting())
+ );
+
+ // populate with peers we already know about
+ const PeerVector & P = OT->peers();
+ for( unsigned int i = 0;
+ i < P.count();
+ i ++ ) {
+ SLOT_NewPeer( P[i], TRUE );
+ }
+
+ // populate State fram
+ { QHBoxLayout * H =new QHBoxLayout( State_Frm );
+
+ Paired_Led = new OLedBox( green, State_Frm );
+ QLabel * L1 = new QLabel( tr( "Paired" ), State_Frm );
+
+ H->addWidget( Paired_Led );
+ H->addWidget( L1 );
+ H->addStretch( 1 );
+ }
+}
+
+OTScan::~OTScan() {
+ if( MyIcons )
+ delete Icons;
+ OTGateway::releaseOTGateway();
+
+ // send all peers that we do not care about states
+ QListViewItem * Lit = DetectedPeers_LV->firstChild();
+ while( Lit ) {
+ ((PeerLVI *)Lit)->peer()->stopFindingOutState( );
+ Lit = Lit->nextSibling();
+ }
+}
+
+// static scan dialog function
+int OTScan::getDevice( OTPeer *& Peer,
+ int & Channel,
+ OTGateway * OT,
+ const UUIDVector & Filter,
+ QWidget* Parent ) {
+ bool IsUp = 0;
+ unsigned int i;
+
+ // check if bluetooth is up
+ OTDriverList & DL = OT->getDriverList();
+ for( i = 0;
+ i < DL.count();
+ i ++ ) {
+ if( DL[i]->isUp() ) {
+ // one device that is up found
+ IsUp = 1;
+ break;
+ }
+ }
+
+ // use this driver
+ OT->setScanWith( OT->driver(i) );
+
+ // create dialog
+ QDialog * Dlg = new QDialog( Parent, 0, TRUE );
+ QVBoxLayout * V = new QVBoxLayout( Dlg );
+ OTScan * Scn = new OTScan( Dlg );
+
+ connect( Scn,
+ SIGNAL( selected() ),
+ Dlg,
+ SLOT( accept() )
+ );
+
+ if( Filter ) {
+ Scn->setScanFilter( Filter );
+ }
+
+ V->addWidget( Scn );
+ Dlg->setCaption( tr("Scan Neighbourhood" ) );
+ Dlg->showMaximized();
+ int rv = Dlg->exec();
+
+ if( rv == QDialog::Accepted ) {
+ // get peer
+ Peer = Scn->selectedPeer();
+ if( Peer == 0 ) {
+ // no peer selected
+ rv = QDialog::Rejected;
+ } else {
+ Channel = Scn->selectedChannel();
+ }
+ }
+
+ delete Dlg;
+
+ return rv;
+}
+
+void OTScan::setScanFilter( const UUIDVector & V ) {
+ Filter = V;
+}
+
+void OTScan::resetScanFilter( void ) {
+ Filter.truncate(0);
+}
+
+void OTScan::SLOT_DoScan( bool DoIt ) {
+ if( DoIt ) {
+ OT->scanNeighbourhood();
+ } else {
+ OT->stopScanOfNeighbourhood();
+ }
+
+ scanMode( DoIt );
+}
+
+// double clicked on a device
+void OTScan::SLOT_Selected( QListViewItem * it ) {
+ if( ! it )
+ return;
+
+ if( Filter.count() > 0 ) {
+ // filter on service
+ if( it->depth() == 0 ) {
+ // select a service and not a device
+ return;
+ }
+
+ // store result
+ SelectedPeer = ((PeerLVI *)it->parent())->peer();
+ SelectedChannel = ((ChannelLVI *)it)->channel();
+ } else {
+ // click on device
+ if( it->depth() != 0 ) {
+ return;
+ }
+
+ SelectedPeer = ((PeerLVI *)it)->peer();
+ SelectedChannel = 0;
+ }
+ owarn << "Selected " << SelectedPeer->address().toString() <<
+ " Channel " << SelectedChannel << oendl;
+ emit selected();
+}
+
+void OTScan::SLOT_FinishedDetecting( ) {
+ scanMode( false );
+}
+
+void OTScan::SLOT_CleanupOld( ) {
+
+ // iterate over all peers and find those that
+ // are down and have no pairing info
+ OTPeer * TheP;
+ const LinkKeyArray & Keys = OT->getLinkKeys();
+
+ QListViewItem * Lit = DetectedPeers_LV->firstChild();
+ while( Lit ) {
+ TheP = ((PeerLVI *)Lit)->peer();
+ if( TheP->state() == OTPeer::Peer_Down ) {
+ unsigned int k;
+
+ // what about linkkeys ?
+ for( k = 0; k < Keys.count(); k ++ ) {
+ if( TheP->address() == Keys[k].to() ||
+ TheP->address() == Keys[k].from()
+ ) {
+ // part of linkkey
+ owarn << "LINKKEY " << TheP->address().toString() << oendl;
+ break;
+ }
+ }
+
+ if( k == Keys.count() ) {
+ owarn << "RM LINKKEY " << TheP->address().toString() << oendl;
+ // not found -> remember to remove this peer
+ QListViewItem * Nit;
+ OT->removePeer( TheP );
+ Nit = Lit->nextSibling();
+ delete Lit;
+ Lit = Nit;
+ continue;
+ }
+ } else {
+ owarn << "NODOWN " << TheP->address().toString() << oendl;
+ }
+
+ Lit = Lit->nextSibling();
+ }
+}
+
+void OTScan::SLOT_NewPeer( OTPeer * P, bool IsNew ){
+ PeerLVI * it = 0;
+
+ if( IsNew ) {
+ it = new PeerLVI( P, DetectedPeers_LV );
+ } else {
+ // find peer in table
+ QListViewItem * Lit = DetectedPeers_LV->firstChild();
+ while( Lit ) {
+ if( ((PeerLVI *)Lit)->peer() == P ) {
+ // this item
+ it = (PeerLVI *)Lit;
+ break;
+ }
+ Lit = Lit->nextSibling();
+ }
+
+ if( ! it ) {
+ owarn << "Should not occur" << oendl;
+ return;
+ }
+ }
+
+ // update/show info
+ it->setText( 0, P->name() );
+ it->setPixmap(0, Icons->deviceIcon(
+ OT->deviceTypeToName( P->deviceClass() ) ) );
+
+ // tell peer to report its state async
+ connect( P,
+ SIGNAL( peerStateReport( OTPeer *)),
+ this,
+ SLOT( SLOT_PeerState( OTPeer *))
+ );
+
+ if( IsNew ) {
+ // find state
+ refreshState( (PeerLVI *)it, 1 );
+ } else {
+ // update staet
+ SLOT_PeerState( P );
+ }
+}
+
+void OTScan::SLOT_PeerState( OTPeer * P ) {
+ PeerLVI * it = (PeerLVI *)DetectedPeers_LV->firstChild();
+ while( it ) {
+ if( it->peer() == P ) {
+ break;
+ }
+ it = (PeerLVI * )it->nextSibling();
+ }
+
+ if( ! it )
+ return;
+
+ switch( P->state() ) {
+ case OTPeer::Peer_Unknown :
+ case OTPeer::Peer_Down :
+ it->setPixmap( 1, 0 );
+ break;
+ case OTPeer::Peer_Up :
+ it->setPixmap( 1, Icons->loadPixmap(
+ ( P->connectedTo() ) ? "connected" : "notconnected" ) );
+ if( it == Current && ! StrengthTimer->isActive() ) {
+ // start showing strength
+ StrengthTimer->start( 1000, FALSE );
+ SLOT_UpdateStrength();
+ }
+ break;
+ }
+}
+
+void OTScan::SLOT_RefreshState( void ) {
+
+ QListViewItem * it = DetectedPeers_LV->firstChild();
+ while( it ) {
+ if( it->isSelected() ) {
+ break;
+ }
+ it = it->nextSibling();
+ }
+
+ if( ! it )
+ return;
+
+ refreshState( (PeerLVI *)it, 1 );
+}
+
+void OTScan::refreshState( PeerLVI * it, bool Force ) {
+ it->setPixmap( 1, Icons->loadPixmap( "find" ) );
+ it->peer()->findOutState( 30, Force );
+}
+
+void OTScan::SLOT_Show( QListViewItem * it ) {
+
+ if( ! it || it->depth() > 0 )
+ return;
+
+ QString S;
+
+ Current = (PeerLVI *)it;
+
+ Strength_PB->setProgress( 0 ); // reset
+ Address_LBL->setText( Current->peer()->address().toString() );
+ Peer_GB->setTitle( Current->peer()->name() );
+
+ const LinkKeyArray & Keys = OT->getLinkKeys();
+
+ Paired_Led->setOn( FALSE );
+ for( unsigned int i = 0;
+ i < Keys.count();
+ i ++ ) {
+ if( Current->peer()->address() == Keys[i].to() ) {
+ Paired_Led->setOn( TRUE );
+ break;
+ }
+ }
+
+ if( Current->peer()->state() == OTPeer::Peer_Up ) {
+ RefreshServices_But->setEnabled( TRUE );
+ StrengthTimer->start( 1000, FALSE );
+ SLOT_UpdateStrength();
+ } else {
+ RefreshServices_But->setEnabled( FALSE );
+ }
+
+}
+
+void OTScan::SLOT_UpdateStrength( void ) {
+ OTDriver * D = Current->peer()->connectedTo();
+
+ if( D ) {
+ long Q = D->getLinkQuality( Current->peer()->address() );
+ Strength_PB->setProgress( Q );
+ if( ! Q ) {
+ // no quality
+ Strength_PB->setEnabled( TRUE );
+ StrengthTimer->stop();
+ }
+ } else {
+ Strength_PB->setEnabled( FALSE );
+ Strength_PB->setProgress( 0 );
+ // no point in continuing
+ StrengthTimer->stop();
+ }
+}
+
+void OTScan::SLOT_RefreshServices( void ) {
+
+ QListViewItem * it = DetectedPeers_LV->firstChild();
+ while( it ) {
+ if( it->isSelected() ) {
+ break;
+ }
+ it = it->nextSibling();
+ }
+
+ if( ! it )
+ return;
+
+ QString S;
+ PeerLVI * PI = (PeerLVI *)it;
+
+ scanMode( true );
+ qApp->processEvents(0);
+
+ ServiceVector & V = PI->peer()->services();
+
+ while( PI->firstChild() ) {
+ // remove children
+ delete PI->firstChild();
+ }
+
+ for( unsigned int i = 0 ;
+ i < V.count();
+ i ++ ) {
+ QString S;
+ S = V[i]->name();
+
+ if( S.isEmpty() ) {
+ continue;
+ }
+
+ { QListViewItem * SIt;
+ UUIDVector UIDV;
+ QPixmap Pm;
+ bool Done = 0;
+ bool R;
+ short ID;
+
+ SIt = 0;
+
+ UIDV = V[i]->classIDList();
+ // first all UUID ! 1200 12ff (Genericprofiles)
+ for( unsigned int j = 0;
+ j < UIDV.count();
+ j ++ ) {
+
+ if( Filter.count() ) {
+ bool FilterOut = 1;
+ // filter out if not in list
+ for( unsigned int ff = 0;
+ ff < Filter.count();
+ ff ++ ) {
+ if( UIDV[j] == Filter[ff] ) {
+ FilterOut = 0;
+ break;
+ }
+ }
+
+ if( FilterOut ) {
+ // not in filter list
+ continue;
+ }
+ } // else show
+
+ ID = UIDV[j].toShort();
+ if( ID < 0x1200 || ID > 0x12ff ) {
+ // use this profile
+ if( R ) {
+ unsigned int ch;
+ bool has;
+ has = V[i]->rfcommChannel( ch );
+ SIt = new ChannelLVI( (has) ? (int)ch : -1 , PI );
+ SIt->setText(0, V[i]->name() );
+
+ Pm = Icons->serviceIcon( ID, R );
+ SIt->setPixmap(0, Pm );
+ Done = 1;
+ break;
+ }
+ }
+ }
+
+ if( ! Done ) {
+ // check other range too
+ for( unsigned int j = 0;
+ j < UIDV.count();
+ j ++ ) {
+
+ if( Filter.count() ) {
+ bool FilterOut = 1;
+ // filter out if not in list
+ for( unsigned int ff = 0;
+ ff < Filter.count();
+ ff ++ ) {
+ if( UIDV[j] == Filter[ff] ) {
+ FilterOut = 0;
+ break;
+ }
+ }
+
+ if( FilterOut ) {
+ // not in filter list
+ continue;
+ }
+ } // else show
+
+ ID = UIDV[j].toShort();
+ if( ID >= 0x1200 && ID <= 0x12ff ) {
+ // use this profile
+ unsigned int ch;
+ bool has;
+ has = V[i]->rfcommChannel( ch );
+ SIt = new ChannelLVI( (has) ? (int)ch : -1 , PI );
+ SIt->setText(0, V[i]->name() );
+
+ Pm = Icons->serviceIcon( ID, R );
+ SIt->setPixmap(0, Pm );
+
+ break;
+ }
+ }
+ }
+
+ }
+ }
+
+ scanMode( false );
+}
+
+void OTScan::scanMode( bool M ) {
+ // avoid infinite loop because it triggers DoScan
+ Detect_But->blockSignals( TRUE );
+ Detect_But->setOn( M );
+ Detect_But->setText( (M) ? tr("Scanning") : tr("Scan") );
+ Detect_But->blockSignals( FALSE );
+}
+
+//
+//
+//
+//
+//
+
+OTManage::OTManage( QWidget * parent, OTIcons * _IC ) :
+ OTManageGUI( parent ) {
+
+ OT = OTGateway::getOTGateway();
+
+ Icons = (_IC ) ? _IC : new OTIcons();
+ MyIcons = (_IC == 0 );
+ AllDrivers_LV->setSorting(-1);
+
+ connect( OT,
+ SIGNAL( driverListChanged() ),
+ this,
+ SLOT( SLOT_DriverListChanged() )
+ );
+ connect( OT,
+ SIGNAL( stateChange( OTDriver *, bool ) ),
+ this,
+ SLOT( SLOT_StateChange( OTDriver *, bool ) )
+ );
+
+ SLOT_DriverListChanged();
+
+ AllDrivers_LV->header()->hide();
+}
+
+OTManage::~OTManage() {
+ if( MyIcons )
+ delete Icons;
+ OTGateway::releaseOTGateway();
+}
+
+void OTManage::SLOT_ShowDriver( QListViewItem * It ) {
+ if( It == 0 || It->depth() > 0 )
+ // not toplevel
+ return;
+
+ DriverLVI * it = (DriverLVI *) It;
+ DriverIsUp_CB->setChecked( it->driver()->isUp() );
+}
+
+void OTManage::SLOT_UpDriver( bool Up ) {
+ QListViewItem * it = AllDrivers_LV->firstChild();
+ while( it ) {
+ if( it->isSelected() ) {
+ OTDriver * D = ((DriverLVI *)it)->driver();
+ owarn << "UP driver " << D->devname() << oendl;
+ // this
+ D->setUp( Up );
+ return;
+ }
+ it = it->nextSibling();
+ }
+}
+
+void OTManage::SLOT_StateChange( OTDriver * D, bool Up ) {
+ QListViewItem * it = AllDrivers_LV->firstChild();
+ while( it ) {
+ if( ((DriverLVI *)it)->driver() == D ) {
+ it->setPixmap( 0,
+ Icons->loadPixmap( ( Up ) ? "bluezon" : "bluezoff" ) );
+ return;
+ }
+ it = it->nextSibling();
+ }
+}
+
+void OTManage::SLOT_DriverListChanged( ) {
+ DriverLVI * It;
+ QListViewItem * Sub;
+ QListViewItem * First = 0;
+ OTDriver* D;
+ OTDriverList & DL = OT->getDriverList();
+
+ AllDrivers_LV->clear();
+ for( unsigned int i = 0;
+ i < DL.count();
+ i ++ ) {
+ D = DL[i];
+ It = new DriverLVI( D, AllDrivers_LV );
+
+ if( ! First )
+ First = It;
+
+ It->setText( 0, D->devname() );
+ It->setPixmap( 0,
+ Icons->loadPixmap( (D->isUp()) ?
+ "bluezon" : "bluezoff" ) );
+
+ Sub = new QListViewItem( It );
+ Sub->setText( 0, tr( "Name" ) );
+ Sub->setText( 1, D->name() );
+
+ Sub = new QListViewItem( It );
+ Sub->setText( 0, tr( "Address" ) );
+ Sub->setText( 1, D->address().toString() );
+
+ Sub = new QListViewItem( It );
+ Sub->setText( 0, tr( "Revision" ) );
+ Sub->setText( 1, D->revision() );
+
+ Sub = new QListViewItem( It );
+ Sub->setText( 0, tr( "Manufacturer" ) );
+ Sub->setText( 1, D->manufacturer() );
+
+ QString Service, Device;
+ D->getClass( Service, Device );
+
+ Sub = new QListViewItem( It );
+ Sub->setText( 0, tr( "Service classes" ) );
+ Sub->setText( 1, Service );
+ Sub = new QListViewItem( It );
+ Sub->setText( 0, tr( "Device class" ) );
+ Sub->setText( 1, Device );
+ }
+
+ if( DL.count() ) {
+ AllDrivers_LV->setCurrentItem( First );
+ DriverIsUp_CB->setEnabled( TRUE );
+ } else {
+ DriverIsUp_CB->setChecked( FALSE );
+ DriverIsUp_CB->setEnabled( FALSE );
+ }
+}
+
+void OTManage::SLOT_SetRefreshTimer( int v ) {
+ OT->setRefreshTimer( v * 1000 );
+}
+
+//
+//
+//
+//
+//
+
+OTMain::OTMain( QWidget * parent ) : OTMainGUI( parent ) {
+
+ Icons = new OTIcons();
+ OT = OTGateway::getOTGateway();
+
+ connect( OT,
+ SIGNAL( deviceEnabled( bool ) ),
+ this,
+ SLOT( SLOT_DeviceIsEnabled( bool ) )
+ );
+ connect( OT,
+ SIGNAL( driverListChanged() ),
+ this,
+ SLOT( SLOT_DriverListChanged() )
+ );
+ connect( OT,
+ SIGNAL( stateChange( OTDriver *, bool ) ),
+ this,
+ SLOT( SLOT_StateChange( OTDriver *, bool ) )
+ );
+
+ if( ! OT->needsEnabling() ) {
+ MustBeEnabled_CB->hide();
+ } else {
+ // detect current state
+ MustBeEnabled_CB->setChecked(
+ OT->isEnabled() );
+ }
+
+ SLOT_DriverListChanged();
+}
+
+OTMain::~OTMain() {
+ OTGateway::releaseOTGateway();
+ delete Icons;
+}
+
+void OTMain::SLOT_DriverListChanged() {
+ OTDriver * D;
+ OTDriverList & DL = OT->getDriverList();
+
+ DeviceList_CB->clear();
+ for( unsigned int i = 0;
+ i < DL.count();
+ i ++ ) {
+ D = DL[i];
+ DeviceList_CB->insertItem(
+ Icons->loadPixmap( (D->isUp()) ?
+ "bluezon" : "bluezoff" ),
+ D->devname() );
+ if( D == OT->scanWith() ) {
+ DeviceList_CB->setCurrentItem( i );
+ }
+ }
+
+ Scan_But->setEnabled( OT->getDriverList().count() > 0 );
+ DeviceList_CB->setEnabled( OT->getDriverList().count() > 0 );
+}
+
+void OTMain::SLOT_EnableBluetooth( bool Up ) {
+ OT->SLOT_SetEnabled( Up );
+}
+
+void OTMain::SLOT_DeviceIsEnabled( bool Up ) {
+ MustBeEnabled_CB->blockSignals( TRUE );
+ MustBeEnabled_CB->setChecked( Up );
+ MustBeEnabled_CB->blockSignals( FALSE );
+}
+
+void OTMain::SLOT_Manage( void ) {
+ QDialog * Dlg = new QDialog( this, 0, TRUE );
+ QVBoxLayout * V = new QVBoxLayout( Dlg );
+ OTManage * Mng = new OTManage( Dlg, Icons );
+
+ V->addWidget( Mng );
+
+ Dlg->setCaption( tr("Manage local devices" ) );
+ Dlg->showMaximized();
+ Dlg->exec();
+ delete Dlg;
+}
+
+void OTMain::SLOT_Scan( void ) {
+ OTDriverList & DL = OT->getDriverList();
+ for( unsigned int i = 0;
+ i < DL.count();
+ i ++ ) {
+ if( DL[i]->isUp() &&
+ DL[i]->devname() == DeviceList_CB->currentText()
+ ) {
+ QDialog * Dlg = new QDialog( this, 0, TRUE );
+ QVBoxLayout * V = new QVBoxLayout( Dlg );
+ OTScan * Scn = new OTScan( Dlg, Icons );
+
+ OT->setScanWith( OT->driver(i) );
+ V->addWidget( Scn );
+ Dlg->setCaption( tr("Scan Neighbourhood" ) );
+ Dlg->showMaximized();
+ Dlg->exec();
+
+ delete Dlg;
+ return;
+ }
+ }
+
+}
+
+void OTMain::SLOT_StateChange( OTDriver * D, bool Up ) {
+ for( int i = 0;
+ i < DeviceList_CB->count();
+ i ++ ) {
+ if( DeviceList_CB->text(i) == D->devname() ) {
+ DeviceList_CB->changeItem(
+ Icons->loadPixmap( (Up) ? "bluezon" : "bluezoff" ),
+ D->devname(),
+ i );
+ return;
+ }
+ }
+}
+
+void OTMain::SLOT_Pairing( void ) {
+ QDialog * Dlg = new QDialog( this, 0, TRUE );
+ QVBoxLayout * V = new QVBoxLayout( Dlg );
+ OTPairing * Pair = new OTPairing( Dlg, Icons );
+
+ V->addWidget( Pair );
+ Dlg->showMaximized();
+ Dlg->setCaption( tr("Manage pairing" ) );
+ Dlg->exec();
+
+ delete Dlg;
+}