summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/opietooth/manager/.cvsignore4
-rw-r--r--noncore/net/opietooth/manager/bluebase.cpp30
-rw-r--r--noncore/net/opietooth/manager/bluebase.h1
-rw-r--r--noncore/net/opietooth/manager/bluetoothbase.ui43
-rw-r--r--noncore/net/opietooth/manager/btconfhandler.cpp391
-rw-r--r--noncore/net/opietooth/manager/btconfhandler.h126
-rw-r--r--noncore/net/opietooth/manager/manager.pro9
-rw-r--r--noncore/net/opietooth/manager/servicesdialog.cpp120
-rw-r--r--noncore/net/opietooth/manager/servicesdialog.h30
-rw-r--r--noncore/net/opietooth/manager/servicesdialogbase.ui658
10 files changed, 1387 insertions, 25 deletions
diff --git a/noncore/net/opietooth/manager/.cvsignore b/noncore/net/opietooth/manager/.cvsignore
index 019226e..ca2d996 100644
--- a/noncore/net/opietooth/manager/.cvsignore
+++ b/noncore/net/opietooth/manager/.cvsignore
@@ -1,15 +1,19 @@
Makefile
Makefile.in
bluetoothbase.cpp
bluetoothbase.h
devicedialog.cpp
devicedialog.h
moc_*
scandialog.cpp
scandialog.h
rfcommassigndialogbase.cpp
rfcommassigndialogbase.h
rfcommdialogitembase.cpp
rfcommdialogitembase.h
+servicesdialogbase.cpp
+servicesdialogbase.h
+obexftpdialogbase.cpp
+obexftpdialogbase.h
.moc*
.obj
diff --git a/noncore/net/opietooth/manager/bluebase.cpp b/noncore/net/opietooth/manager/bluebase.cpp
index 924d191..13954c5 100644
--- a/noncore/net/opietooth/manager/bluebase.cpp
+++ b/noncore/net/opietooth/manager/bluebase.cpp
@@ -1,763 +1,781 @@
/*
* bluebase.cpp *
* ---------------------
*
* copyright : (c) 2002 by Maximilian Reiß
* email : max.reiss@gmx.de
*
*/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "bluebase.h"
#include "scandialog.h"
#include "hciconfwrapper.h"
#include "devicehandler.h"
#include "btconnectionitem.h"
#include "rfcommassigndialogimpl.h"
#include "forwarder.h"
+#include "servicesdialog.h"
#include <termios.h>
#include <string.h>
#include <errno.h>
/* OPIE */
#include <qpe/qpeapplication.h>
#include <qpe/resource.h>
#include <qpe/config.h>
#include <opie2/odebug.h>
using namespace Opie::Core;
/* QT */
#include <qframe.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qlayout.h>
#include <qvariant.h>
#include <qimage.h>
#include <qpixmap.h>
#include <qtabwidget.h>
#include <qscrollview.h>
#include <qvbox.h>
#include <qmessagebox.h>
#include <qcombobox.h>
#include <qcheckbox.h>
#include <qlineedit.h>
#include <qlistview.h>
#include <qdir.h>
#include <qpopupmenu.h>
#include <qtimer.h>
#include <qlist.h>
#include <qfile.h>
/* STD */
#include <remotedevice.h>
#include <services.h>
#include <stdlib.h>
using namespace OpieTooth;
//Array of possible speeds of the serial port
struct SerSpeed {
const char* str; //string value
int val; //value itself
} speeds[] = {
{ "150", B150 }, { "300", B300 }, { "600", B600 }, { "1200", B1200 },
{ "2400", B2400 }, { "4800", B4800 }, { "9600", B9600 },
{ "19200", B19200 }, { "38400", B38400 }, { "57600", B57600 },
{ "115200", B115200}
};
BlueBase::BlueBase( QWidget* parent, const char* name, WFlags fl )
: BluetoothBase( parent, name, fl )
{
m_localDevice = new Manager( "hci0" );
connect( PushButton2, SIGNAL( clicked() ), this, SLOT(startScan() ) );
connect( configApplyButton, SIGNAL(clicked() ), this, SLOT(applyConfigChanges() ) );
connect( rfcommBindButton, SIGNAL( clicked() ), this, SLOT( rfcommDialog() ) );
connect( devicesView, SIGNAL( clicked(QListViewItem*)),
this, SLOT( startServiceActionClicked(QListViewItem*) ) );
connect( devicesView, SIGNAL( rightButtonClicked(QListViewItem*,const QPoint&,int) ),
this, SLOT(startServiceActionHold(QListViewItem*,const QPoint&,int) ) );
connect( m_localDevice , SIGNAL( foundServices(const QString&,Services::ValueList) ),
this, SLOT( addServicesToDevice(const QString&,Services::ValueList) ) );
connect( m_localDevice, SIGNAL( available(const QString&,bool) ),
this, SLOT( deviceActive(const QString&,bool) ) );
connect( m_localDevice, SIGNAL( connections(ConnectionState::ValueList) ),
this, SLOT( addConnectedDevices(ConnectionState::ValueList) ) );
connect( m_localDevice, SIGNAL( signalStrength(const QString&,const QString&) ),
this, SLOT( addSignalStrength(const QString&,const QString&) ) );
connect(runButton, SIGNAL(clicked()), this, SLOT(doForward()));
connect(encCheckBox, SIGNAL(toggled(bool)), this, SLOT(doEncrypt(bool)));
+ connect(servicesEditButton, SIGNAL(clicked()), this, SLOT(editServices()));
// let hold be rightButtonClicked()
QPEApplication::setStylusOperation( devicesView->viewport(), QPEApplication::RightOnHold);
QPEApplication::setStylusOperation( connectionsView->viewport(), QPEApplication::RightOnHold);
//Load all icons needed
m_offPix = Resource::loadPixmap( "opietooth/notconnected" );
m_onPix = Resource::loadPixmap( "opietooth/connected" );
m_findPix = Resource::loadPixmap( "opietooth/find" );
QPalette pal = this->palette();
QColor col = pal.color( QPalette::Active, QColorGroup::Background );
pal.setColor( QPalette::Active, QColorGroup::Button, col );
pal.setColor( QPalette::Inactive, QColorGroup::Button, col );
pal.setColor( QPalette::Normal, QColorGroup::Button, col );
pal.setColor( QPalette::Disabled, QColorGroup::Button, col );
this->setPalette( pal );
setCaption( tr( "Bluetooth Manager" ) );
readConfig();
initGui();
devicesView->setRootIsDecorated(true);
m_iconLoader = new BTIconLoader();
writeToHciConfig();
addConnectedDevices();
readSavedDevices();
addServicesToDevices();
QTimer::singleShot( 3000, this, SLOT( addServicesToDevices() ) );
forwarder = NULL;
- serDevName->setText(tr("/dev/ircomm0"));
- for (unsigned int i = 0; i < (sizeof(speeds) / sizeof(speeds[0])); i++) {
- serSpeed->insertItem(speeds[i].str);
- }
- serSpeed->setCurrentItem((sizeof(speeds) / sizeof(speeds[0])) - 1);
- encCheckBox->setChecked(true);
}
/**
* Reads all options from the config file
*/
void BlueBase::readConfig()
{
Config cfg( "bluetoothmanager" );
cfg.setGroup( "bluezsettings" );
m_deviceName = cfg.readEntry( "name" , "No name" ); // name the device should identify with
m_defaultPasskey = cfg.readEntryCrypt( "passkey" , "" ); // <- hmm, look up how good the trolls did that, maybe too weak
m_useEncryption = cfg.readBoolEntry( "useEncryption" , TRUE );
m_enableAuthentification = cfg.readBoolEntry( "enableAuthentification" , TRUE );
m_enablePagescan = cfg.readBoolEntry( "enablePagescan" , TRUE );
m_enableInquiryscan = cfg.readBoolEntry( "enableInquiryscan" , TRUE );
}
/**
* Writes all options to the config file
*/
void BlueBase::writeConfig()
{
Config cfg( "bluetoothmanager" );
cfg.setGroup( "bluezsettings" );
cfg.writeEntry( "name" , m_deviceName );
cfg.writeEntryCrypt( "passkey" , m_defaultPasskey );
cfg.writeEntry( "useEncryption" , m_useEncryption );
cfg.writeEntry( "enableAuthentification" , m_enableAuthentification );
cfg.writeEntry( "enablePagescan" , m_enablePagescan );
cfg.writeEntry( "enableInquiryscan" , m_enableInquiryscan );
writeToHciConfig();
}
/**
* Modify the hcid.conf file to our needs
*/
void BlueBase::writeToHciConfig()
{
QFile pinFile("/etc/bluetooth/pin"); // /etc/bluetooth/pin file
owarn << "writeToHciConfig" << oendl;
//Write /etc/bluetooth/hcid.conf file
HciConfWrapper hciconf ( "/etc/bluetooth/hcid.conf" );
hciconf.load();
hciconf.setPinHelper( QPEApplication::qpeDir() + "bin/bluepin" );
hciconf.setName( m_deviceName );
hciconf.setEncrypt( m_useEncryption );
hciconf.setAuth( m_enableAuthentification );
hciconf.setPscan( m_enablePagescan );
hciconf.setIscan( m_enableInquiryscan );
hciconf.save();
// Write /etc/bluetooth/pin (default PIN file)
pinFile.open(IO_WriteOnly | IO_Truncate);
pinFile.writeBlock(m_defaultPasskey, m_defaultPasskey.length());
pinFile.writeBlock("\n", sizeof("\n"));
pinFile.flush();
pinFile.close();
}
/**
* Read the list of already known devices
*/
void BlueBase::readSavedDevices()
{
QValueList<RemoteDevice> loadedDevices;
DeviceHandler handler;
loadedDevices = handler.load();
addSearchedDevices( loadedDevices );
}
/**
* Write the list of already known devices
*/
void BlueBase::writeSavedDevices()
{
QListViewItemIterator it( devicesView );
BTListItem* item;
BTDeviceItem* device;
RemoteDevice::ValueList list;
for ( ; it.current(); ++it )
{
item = (BTListItem*)it.current();
if(item->typeId() != BTListItem::Device )
continue;
device = (BTDeviceItem*)item;
list.append( device->remoteDevice() );
}
/*
* if not empty save the List through DeviceHandler
*/
if ( list.isEmpty() )
return;
DeviceHandler handler;
handler.save( list );
}
/**
* Set up the gui
*/
void BlueBase::initGui()
{
StatusLabel->setText( status() ); // maybe move it to getStatus()
cryptCheckBox->setChecked( m_useEncryption );
authCheckBox->setChecked( m_enableAuthentification );
pagescanCheckBox->setChecked( m_enablePagescan );
inquiryscanCheckBox->setChecked( m_enableInquiryscan );
deviceNameLine->setText( m_deviceName );
passkeyLine->setText( m_defaultPasskey );
// set info tab
setInfo();
+ serDevName->setText(tr("/dev/ircomm0"));
+ for (unsigned int i = 0; i < (sizeof(speeds) / sizeof(speeds[0])); i++) {
+ serSpeed->insertItem(speeds[i].str);
+ }
+ serSpeed->setCurrentItem((sizeof(speeds) / sizeof(speeds[0])) - 1);
+ encCheckBox->setChecked(true);
}
/**
* Get the status informations and returns it
* @return QString the status informations gathered
*/
QString BlueBase::status()const
{
QString infoString = tr( "<b>Device name : </b> Ipaq" );
infoString += QString( "<br><b>" + tr( "MAC adress: " ) +"</b> No idea" );
infoString += QString( "<br><b>" + tr( "Class" ) + "</b> PDA" );
return (infoString);
}
/**
* Read the current values from the gui and invoke writeConfig()
*/
void BlueBase::applyConfigChanges()
{
m_deviceName = deviceNameLine->text();
m_defaultPasskey = passkeyLine->text();
m_useEncryption = cryptCheckBox->isChecked();
m_enableAuthentification = authCheckBox->isChecked();
m_enablePagescan = pagescanCheckBox->isChecked();
m_enableInquiryscan = inquiryscanCheckBox->isChecked();
writeConfig();
QMessageBox::information( this, tr("Test") , tr("Changes were applied.") );
}
/**
* Launch Rfcomm Bind dialog
*
*/
void BlueBase::rfcommDialog()
{
RfcommAssignDialog rfcommAssign ( this, "RfcommAssignDialog", true, WStyle_ContextHelp );
if ( QPEApplication::execDialog( &rfcommAssign ) == QDialog::Accepted )
{
rfcommAssign.saveConfig();
}
}
/**
* Add fresh found devices from scan dialog to the listing
*
*/
void BlueBase::addSearchedDevices( const QValueList<RemoteDevice> &newDevices )
{
BTDeviceItem * deviceItem;
QValueList<RemoteDevice>::ConstIterator it;
for( it = newDevices.begin(); it != newDevices.end() ; ++it )
{
if (find( (*it) )) // is already inserted
continue;
deviceItem = new BTDeviceItem( devicesView , (*it) );
deviceItem->setPixmap( 1, m_findPix );
deviceItem->setExpandable ( true );
// look if device is avail. atm, async
deviceActive( (*it) );
}
}
/**
* Action that is toggled on entrys on click
*/
void BlueBase::startServiceActionClicked( QListViewItem */*item*/ )
{}
/**
* Action that are toggled on hold (mostly QPopups i guess)
*/
void BlueBase::startServiceActionHold( QListViewItem * item, const QPoint & point, int /*column*/ )
{
if (!item )
return;
QPopupMenu *menu = new QPopupMenu();
if ( static_cast<BTListItem*>( item )->type() == "device")
{
QPopupMenu *groups = new QPopupMenu();
menu->insertItem( static_cast<BTDeviceItem*>( item )->name(), 0 );
menu->insertSeparator( 1 );
menu->insertItem( tr( "&Rescan services" ), 2);
// menu->insertItem( tr( "&Add to group" ), groups, 3);
menu->insertItem( tr( "&Delete"), 4);
int ret = menu->exec( point, 0);
switch(ret)
{
case -1:
break;
case 2:
addServicesToDevice( static_cast<BTDeviceItem*>( item ) );
break;
case 4:
// deletes childs too
delete item;
break;
}
// delete groups;
}
/*
* We got service sensitive PopupMenus in our factory
* We will create one through the factory and will insert
* our Separator + ShowInfo into the menu or create a new
* one if the factory returns 0
* PopupMenu deletion is kind of weird.
* If escaped( -1 ) or any of our items were chosen we'll
* delete the PopupMenu otherwise it's the responsibility of
* the PopupMenu to delete itself
*
*/
else if ( ((BTListItem*)item)->type() == "service")
{
BTServiceItem* service = (BTServiceItem*)item;
QMap<int, QString> list = service->services().classIdList();
QMap<int, QString>::Iterator it = list.begin();
QPopupMenu *popup =0l;
if ( it != list.end() )
{
owarn << "Searching id " << it.key() << " " << it.data().latin1() << "" << oendl;
popup = m_popHelper.find( it.key(),
service->services(),
(BTDeviceItem*)service->parent() );
}
else
{
owarn << "Empty" << oendl;
}
if ( popup == 0l )
{
owarn << "factory returned 0l" << oendl;
popup = new QPopupMenu();
}
int test1 = popup->insertItem( tr("Test1:"), 2);
int ret = popup->exec( point );
owarn << "returned from exec() " << oendl;
if ( ret == -1 )
{
;
}
else if ( ret == test1 )
{
;
}
delete popup;
}
delete menu;
}
void BlueBase::addServicesToDevices()
{
odebug << "BlueBase::addServicesToDevices()" << oendl;
BTDeviceItem* item = (BTDeviceItem*) devicesView->firstChild();
while ( item )
{
addServicesToDevice( item );
item = (BTDeviceItem*) static_cast<QListViewItem*>( item )->nextSibling();
}
}
/**
* Search and display avail. services for a device (on expand from device listing)
* @param item the service item returned
*/
void BlueBase::addServicesToDevice( BTDeviceItem * item )
{
odebug << "BlueBase::addServicesToDevice" << oendl;
// row of mac adress text(3)
RemoteDevice device = item->remoteDevice();
m_deviceList.insert( item->mac() , item );
// and some time later I get a signal foundServices( const QString& device, Services::ValueList ); back
m_localDevice->searchServices( device );
}
/**
* @param device the mac address of the remote device
* @param servicesList the list with the service the device has.
*/
void BlueBase::addServicesToDevice( const QString& device, Services::ValueList servicesList )
{
odebug << "BlueBase::fill services list" << oendl;
QMap<QString,BTDeviceItem*>::Iterator it;
BTDeviceItem* deviceItem = 0;
// get the right devices which requested the search
it = m_deviceList.find( device );
if( it == m_deviceList.end() )
return;
deviceItem = it.data();
// remove previous entries
QList<QListViewItem> tempList;
tempList.setAutoDelete( true );
QListViewItem * child = deviceItem->firstChild();
while( child )
{
tempList.append( child );
child = child->nextSibling();
}
tempList.clear();
QValueList<OpieTooth::Services>::Iterator it2;
BTServiceItem* serviceItem;
if (!servicesList.isEmpty() )
{
// add services
QMap<int, QString> list;
QMap<int, QString>::Iterator classIt;
for( it2 = servicesList.begin(); it2 != servicesList.end(); ++it2 )
{
serviceItem = new BTServiceItem( deviceItem, (*it2) );
list = (*it2).classIdList();
classIt = list.begin();
int classId=0;
if ( classIt != list.end() )
{
classId = classIt.key();
}
serviceItem->setPixmap( 0, m_iconLoader->serviceIcon( classId ) );
}
}
else
{
Services s1;
s1.setServiceName( tr("no services found") );
serviceItem = new BTServiceItem( deviceItem, s1 );
}
// now remove them from the list
m_deviceList.remove( it );
}
void BlueBase::addSignalStrength()
{
QListViewItemIterator it( connectionsView );
for ( ; it.current(); ++it )
{
m_localDevice->signalStrength( ((BTConnectionItem*)it.current() )->connection().mac() );
}
QTimer::singleShot( 5000, this, SLOT( addSignalStrength() ) );
}
void BlueBase::addSignalStrength( const QString& mac, const QString& strength )
{
QListViewItemIterator it( connectionsView );
for ( ; it.current(); ++it )
{
if( ((BTConnectionItem*)it.current())->connection().mac() == mac )
{
((BTConnectionItem*)it.current() )->setSignalStrength( strength );
}
}
}
/**
* Add the existing connections (pairs) to the connections tab.
* This one triggers the search
*/
void BlueBase::addConnectedDevices()
{
m_localDevice->searchConnections();
QTimer::singleShot( 5000, this, SLOT( addSignalStrength() ) );
}
/**
* This adds the found connections to the connection tab.
* @param connectionList the ValueList with all current connections
*/
void BlueBase::addConnectedDevices( ConnectionState::ValueList connectionList )
{
QValueList<OpieTooth::ConnectionState>::Iterator it;
BTConnectionItem * connectionItem;
if ( !connectionList.isEmpty() )
{
for (it = connectionList.begin(); it != connectionList.end(); ++it)
{
QListViewItemIterator it2( connectionsView );
bool found = false;
for ( ; it2.current(); ++it2 )
{
if( ( (BTConnectionItem*)it2.current())->connection().mac() == (*it).mac() )
{
found = true;
}
}
if ( found == false )
{
connectionItem = new BTConnectionItem( connectionsView, (*it) );
if( m_deviceList.find((*it).mac()).data() )
{
connectionItem->setName( m_deviceList.find( (*it).mac()).data()->name() );
}
}
}
QListViewItemIterator it2( connectionsView );
for ( ; it2.current(); ++it2 )
{
bool found = false;
for (it = connectionList.begin(); it != connectionList.end(); ++it)
{
if( ( ((BTConnectionItem*)it2.current())->connection().mac() ) == (*it).mac() )
{
found = true;
}
}
if ( !found )
{
delete it2.current();
}
}
}
else
{
connectionsView->clear();
ConnectionState con;
con.setMac( tr("No connections found") );
connectionItem = new BTConnectionItem( connectionsView , con );
}
// recall connection search after some time
QTimer::singleShot( 15000, this, SLOT( addConnectedDevices() ) );
}
/**
* Find out if a device can currently be reached
* @param device
*/
void BlueBase::deviceActive( const RemoteDevice &device )
{
// search by mac, async, gets a signal back
// We should have a BTDeviceItem there or where does it get added to the map -zecke
m_localDevice->isAvailable( device.mac() );
}
/**
* The signal catcher. Set the avail. status on device.
* @param device - the mac address
* @param connected - if it is avail. or not
*/
void BlueBase::deviceActive( const QString& device, bool connected )
{
odebug << "deviceActive slot" << oendl;
QMap<QString,BTDeviceItem*>::Iterator it;
it = m_deviceList.find( device );
if( it == m_deviceList.end() )
return;
BTDeviceItem* deviceItem = it.data();
if ( connected )
{
deviceItem->setPixmap( 1, m_onPix );
}
else
{
deviceItem->setPixmap( 1, m_offPix );
}
m_deviceList.remove( it );
}
/**
* Open the "scan for devices" dialog
*/
void BlueBase::startScan()
{
ScanDialog *scan = new ScanDialog( this, "ScanDialog",
true, WDestructiveClose );
QObject::connect( scan, SIGNAL( selectedDevices(const QValueList<RemoteDevice>&) ),
this, SLOT( addSearchedDevices(const QValueList<RemoteDevice>&) ) );
QPEApplication::showDialog( scan );
}
/**
* Set the informations about the local device in information Tab
*/
void BlueBase::setInfo()
{
StatusLabel->setText( status() );
}
/**
* Decontructor
*/
BlueBase::~BlueBase()
{
writeSavedDevices();
delete m_iconLoader;
}
/**
* find searches the ListView for a BTDeviceItem containig
* the same Device if found return true else false
* @param dev RemoteDevice to find
* @return returns true if found
*/
bool BlueBase::find( const RemoteDevice& rem )
{
QListViewItemIterator it( devicesView );
BTListItem* item;
BTDeviceItem* device;
for (; it.current(); ++it )
{
item = (BTListItem*) it.current();
if ( item->typeId() != BTListItem::Device )
continue;
device = (BTDeviceItem*)item;
if ( rem.equals( device->remoteDevice() ) )
return true;
}
return false; // not found
}
/**
* Start process of the cell phone forwarding
*/
void BlueBase::doForward()
{
if (forwarder && forwarder->isRunning()) {
runButton->setText("start gateway");
forwarder->stop();
delete forwarder;
forwarder = NULL;
return;
}
QString str = serDevName->text();
forwarder = new SerialForwarder(str, speeds[serSpeed->currentItem()].val);
connect(forwarder, SIGNAL(processExited(Opie::Core::OProcess*)),
this, SLOT(forwardExited(Opie::Core::OProcess*)));
if (forwarder->start(OProcess::NotifyOnExit) < 0) {
QMessageBox::critical(this, tr("Forwarder Error"),
tr("Forwarder start error:") + tr(strerror(errno)));
return;
}
runButton->setText("stop gateway");
}
/**
* React on the process end
*/
void BlueBase::forwardExit(Opie::Core::OProcess* proc)
{
if (proc->exitStatus() != 0)
QMessageBox::critical(this, tr("Forwarder Error"),
tr("Forwarder start error"));
delete proc;
forwarder = NULL;
runButton->setText("start gateway");
}
/**
* Encrypt entered passkey
* doit - do encryption of the key
*/
void BlueBase::doEncrypt(bool doit)
{
passkeyLine->setEchoMode((doit)? QLineEdit::Password: QLineEdit::Normal);
}
+/**
+ * Start services edit dialog
+ */
+void BlueBase::editServices()
+{
+ QString conf = "/etc/default/bluetooth";
+//// Use for debugging purposes
+//// QString conf = "/mnt/net/opie/bin/bluetooth";
+ ServicesDialog svcEdit(conf, this, "ServicesDialog", true,
+ WStyle_ContextHelp);
+
+ if (QPEApplication::execDialog(&svcEdit) == QDialog::Accepted)
+ {
+ }
+}
+
//eof
diff --git a/noncore/net/opietooth/manager/bluebase.h b/noncore/net/opietooth/manager/bluebase.h
index 9cbea56..d3e21f4 100644
--- a/noncore/net/opietooth/manager/bluebase.h
+++ b/noncore/net/opietooth/manager/bluebase.h
@@ -1,107 +1,108 @@
#ifndef BLUEBASE_H
#define BLUEBASE_H
#include <qvariant.h>
#include <qwidget.h>
#include <qscrollview.h>
#include <qsplitter.h>
#include <qlist.h>
#include <qpixmap.h>
#include "bluetoothbase.h"
#include "btserviceitem.h"
#include "btdeviceitem.h"
#include "popuphelper.h"
#include "bticonloader.h"
#include "forwarder.h"
#include <remotedevice.h>
#include <manager.h>
class QVBox;
class QHBoxLayout;
class QGridLayout;
class QFrame;
class QLabel;
class QPushButton;
class QTabWidget;
class QCheckBox;
class BTConnectionItem;
namespace OpieTooth {
class BlueBase : public BluetoothBase {
Q_OBJECT
public:
BlueBase( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
~BlueBase();
static QString appName() { return QString::fromLatin1("bluetooth-manager"); }
protected:
private slots:
void startScan();
private:
bool find( const RemoteDevice& device );
void readConfig();
void writeConfig();
void readSavedDevices();
void writeSavedDevices();
void writeToHciConfig();
QString status()const;
void initGui();
void setInfo();
PopupHelper m_popHelper;
Manager *m_localDevice;
QMap<QString,BTDeviceItem*> m_deviceList;
void deviceActive( const RemoteDevice &device );
QString m_deviceName;
QString m_defaultPasskey;
bool m_useEncryption;
bool m_enableAuthentification;
bool m_enablePagescan;
bool m_enableInquiryscan;
QPixmap m_offPix;
QPixmap m_onPix;
QPixmap m_findPix;
BTIconLoader *m_iconLoader;
SerialForwarder* forwarder;
private slots:
void addSearchedDevices( const QValueList<RemoteDevice> &newDevices );
void addServicesToDevices();
void addServicesToDevice( BTDeviceItem *item );
void addServicesToDevice( const QString& device, Services::ValueList );
void addConnectedDevices();
void addConnectedDevices( ConnectionState::ValueList );
void startServiceActionClicked( QListViewItem *item );
void startServiceActionHold( QListViewItem *, const QPoint &, int );
void deviceActive( const QString& mac, bool connected );
void applyConfigChanges();
void doForward();
void doEncrypt(bool);
void forwardExit(Opie::Core::OProcess* proc);
+ void editServices();
void addSignalStrength();
void addSignalStrength( const QString& mac, const QString& strengh );
void rfcommDialog();
};
}
#endif
diff --git a/noncore/net/opietooth/manager/bluetoothbase.ui b/noncore/net/opietooth/manager/bluetoothbase.ui
index 5539181..350da63 100644
--- a/noncore/net/opietooth/manager/bluetoothbase.ui
+++ b/noncore/net/opietooth/manager/bluetoothbase.ui
@@ -1,522 +1,533 @@
<!DOCTYPE UI><UI>
<class>BluetoothBase</class>
<widget>
<class>QWidget</class>
<property stdset="1">
<name>name</name>
<cstring>BluetoothBase</cstring>
</property>
<property stdset="1">
<name>geometry</name>
<rect>
<x>0</x>
<y>0</y>
- <width>273</width>
+ <width>269</width>
<height>368</height>
</rect>
</property>
<property stdset="1">
<name>caption</name>
<string>Form1</string>
</property>
<hbox>
<property stdset="1">
<name>margin</name>
<number>0</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>0</number>
</property>
<widget>
<class>QTabWidget</class>
<property stdset="1">
<name>name</name>
<cstring>Status</cstring>
</property>
<property>
<name>layoutMargin</name>
</property>
<property>
<name>layoutSpacing</name>
</property>
<widget>
<class>QWidget</class>
<property stdset="1">
<name>name</name>
<cstring>tab</cstring>
</property>
<attribute>
<name>title</name>
<string>Devices</string>
</attribute>
<vbox>
<property stdset="1">
<name>margin</name>
<number>4</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>2</number>
</property>
<widget>
<class>QListView</class>
<column>
<property>
<name>text</name>
<string>Device Name</string>
</property>
<property>
<name>clickable</name>
<bool>true</bool>
</property>
<property>
<name>resizeable</name>
<bool>true</bool>
</property>
</column>
<column>
<property>
<name>text</name>
<string>Online</string>
</property>
<property>
<name>clickable</name>
<bool>true</bool>
</property>
<property>
<name>resizeable</name>
<bool>true</bool>
</property>
</column>
<property stdset="1">
<name>name</name>
<cstring>devicesView</cstring>
</property>
</widget>
<widget>
<class>QPushButton</class>
<property stdset="1">
<name>name</name>
<cstring>PushButton2</cstring>
</property>
<property stdset="1">
<name>sizePolicy</name>
<sizepolicy>
<hsizetype>0</hsizetype>
<vsizetype>0</vsizetype>
</sizepolicy>
</property>
<property stdset="1">
<name>text</name>
<string>&amp;Rescan Devices</string>
</property>
</widget>
</vbox>
</widget>
<widget>
<class>QWidget</class>
<property stdset="1">
<name>name</name>
<cstring>tab</cstring>
</property>
<attribute>
<name>title</name>
<string>Connections</string>
</attribute>
<vbox>
<property stdset="1">
<name>margin</name>
<number>4</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>2</number>
</property>
<widget>
<class>QListView</class>
<column>
<property>
<name>text</name>
<string>Device Name</string>
</property>
<property>
<name>clickable</name>
<bool>true</bool>
</property>
<property>
<name>resizeable</name>
<bool>true</bool>
</property>
</column>
<column>
<property>
<name>text</name>
<string>Connection type</string>
</property>
<property>
<name>clickable</name>
<bool>true</bool>
</property>
<property>
<name>resizeable</name>
<bool>true</bool>
</property>
</column>
<column>
<property>
<name>text</name>
<string>Signal</string>
</property>
<property>
<name>clickable</name>
<bool>true</bool>
</property>
<property>
<name>resizeable</name>
<bool>true</bool>
</property>
</column>
<property stdset="1">
<name>name</name>
<cstring>connectionsView</cstring>
</property>
</widget>
</vbox>
</widget>
<widget>
<class>QWidget</class>
<property stdset="1">
<name>name</name>
<cstring>tab</cstring>
</property>
<attribute>
<name>title</name>
<string>Config</string>
</attribute>
- <grid>
+ <vbox>
<property stdset="1">
<name>margin</name>
- <number>4</number>
+ <number>2</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>2</number>
</property>
- <widget row="1" column="0" >
- <class>QPushButton</class>
- <property stdset="1">
- <name>name</name>
- <cstring>rfcommBindButton</cstring>
- </property>
- <property stdset="1">
- <name>text</name>
- <string>&amp;Edit RFCOMM Bind Table</string>
- </property>
- </widget>
- <widget row="0" column="0" >
+ <widget>
<class>QGroupBox</class>
<property stdset="1">
<name>name</name>
<cstring>GroupBox1</cstring>
</property>
<property stdset="1">
<name>title</name>
<string>Bluetooth Basic Config</string>
</property>
<property>
<name>layoutMargin</name>
</property>
<property>
<name>layoutSpacing</name>
</property>
<grid>
<property stdset="1">
<name>margin</name>
<number>4</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>2</number>
</property>
<widget row="0" column="0" >
<class>QLabel</class>
<property stdset="1">
<name>name</name>
<cstring>deviceNameLabel</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>Device Name</string>
</property>
</widget>
<widget row="1" column="0" >
<class>QLabel</class>
<property stdset="1">
<name>name</name>
<cstring>passkeyLabel</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>Default Passkey</string>
</property>
</widget>
<widget row="0" column="1" >
<class>QLineEdit</class>
<property stdset="1">
<name>name</name>
<cstring>deviceNameLine</cstring>
</property>
</widget>
<widget row="1" column="1" >
<class>QLineEdit</class>
<property stdset="1">
<name>name</name>
<cstring>passkeyLine</cstring>
</property>
<property stdset="1">
<name>echoMode</name>
<enum>Password</enum>
</property>
</widget>
<widget row="2" column="1" >
<class>QCheckBox</class>
<property stdset="1">
<name>name</name>
<cstring>encCheckBox</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>encrypt</string>
</property>
</widget>
<widget row="3" column="0" rowspan="1" colspan="2" >
<class>QCheckBox</class>
<property stdset="1">
<name>name</name>
<cstring>authCheckBox</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>enable authentification</string>
</property>
</widget>
<widget row="4" column="0" rowspan="1" colspan="2" >
<class>QCheckBox</class>
<property stdset="1">
<name>name</name>
<cstring>cryptCheckBox</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>enable encryption</string>
</property>
</widget>
<widget row="5" column="0" rowspan="1" colspan="2" >
<class>QCheckBox</class>
<property stdset="1">
<name>name</name>
<cstring>pagescanCheckBox</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>Enable Page scan</string>
</property>
</widget>
<widget row="6" column="0" rowspan="1" colspan="2" >
<class>QCheckBox</class>
<property stdset="1">
<name>name</name>
<cstring>inquiryscanCheckBox</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>Enable Inquiry scan</string>
</property>
</widget>
<widget row="7" column="0" rowspan="1" colspan="2" >
<class>QPushButton</class>
<property stdset="1">
<name>name</name>
<cstring>configApplyButton</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>Apply</string>
</property>
</widget>
</grid>
</widget>
- </grid>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>servicesEditButton</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Edit Services Configuration</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>rfcommBindButton</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&amp;Edit RFCOMM Bind Table</string>
+ </property>
+ </widget>
+ </vbox>
</widget>
<widget>
<class>QWidget</class>
<property stdset="1">
<name>name</name>
<cstring>tab</cstring>
</property>
<attribute>
<name>title</name>
<string>Status</string>
</attribute>
<vbox>
<property stdset="1">
<name>margin</name>
<number>0</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>0</number>
</property>
<widget>
<class>QLabel</class>
<property stdset="1">
<name>name</name>
<cstring>StatusLabel</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>Status Label</string>
</property>
</widget>
</vbox>
</widget>
<widget>
<class>QWidget</class>
<property stdset="1">
<name>name</name>
<cstring>tab</cstring>
</property>
<attribute>
<name>title</name>
<string>Phone</string>
</attribute>
<vbox>
<property stdset="1">
<name>margin</name>
<number>4</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>2</number>
</property>
<widget>
<class>QGroupBox</class>
<property stdset="1">
<name>name</name>
<cstring>cellForwarder</cstring>
</property>
<property stdset="1">
<name>title</name>
<string>Cell Forwarder</string>
</property>
<property>
<name>layoutMargin</name>
</property>
<property>
<name>layoutSpacing</name>
</property>
<grid>
<property stdset="1">
<name>margin</name>
<number>4</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>2</number>
</property>
<widget row="2" column="0" rowspan="1" colspan="3" >
<class>QPushButton</class>
<property stdset="1">
<name>name</name>
<cstring>runButton</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>start gateway</string>
</property>
</widget>
<widget row="0" column="0" rowspan="1" colspan="2" >
<class>QLabel</class>
<property stdset="1">
<name>name</name>
<cstring>serDevLabel</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>Serial device:</string>
</property>
</widget>
<widget row="0" column="2" >
<class>QLineEdit</class>
<property stdset="1">
<name>name</name>
<cstring>serDevName</cstring>
</property>
</widget>
<widget row="1" column="1" rowspan="1" colspan="2" >
<class>QComboBox</class>
<property stdset="1">
<name>name</name>
<cstring>serSpeed</cstring>
</property>
</widget>
<widget row="1" column="0" >
<class>QLabel</class>
<property stdset="1">
<name>name</name>
<cstring>serSpeedLabel</cstring>
</property>
<property stdset="1">
<name>text</name>
<string>Speed:</string>
</property>
</widget>
</grid>
</widget>
</vbox>
</widget>
</widget>
</hbox>
</widget>
<customwidgets>
<customwidget>
<class>QWidget</class>
<header location="local">qwidget.h</header>
<sizehint>
<width>100</width>
<height>100</height>
</sizehint>
<container>0</container>
<sizepolicy>
<hordata>7</hordata>
<verdata>7</verdata>
</sizepolicy>
<pixmap>image0</pixmap>
</customwidget>
</customwidgets>
<images>
<image>
<name>image0</name>
<data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
</image>
</images>
<tabstops>
<tabstop>Status</tabstop>
<tabstop>devicesView</tabstop>
<tabstop>PushButton2</tabstop>
<tabstop>connectionsView</tabstop>
<tabstop>deviceNameLine</tabstop>
<tabstop>passkeyLine</tabstop>
<tabstop>encCheckBox</tabstop>
<tabstop>authCheckBox</tabstop>
<tabstop>cryptCheckBox</tabstop>
<tabstop>pagescanCheckBox</tabstop>
<tabstop>inquiryscanCheckBox</tabstop>
<tabstop>configApplyButton</tabstop>
<tabstop>rfcommBindButton</tabstop>
<tabstop>serDevName</tabstop>
<tabstop>serSpeed</tabstop>
<tabstop>runButton</tabstop>
</tabstops>
</UI>
diff --git a/noncore/net/opietooth/manager/btconfhandler.cpp b/noncore/net/opietooth/manager/btconfhandler.cpp
new file mode 100644
index 0000000..0048993
--- a/dev/null
+++ b/noncore/net/opietooth/manager/btconfhandler.cpp
@@ -0,0 +1,391 @@
+/* $Id$ */
+/* Bluetooth services configuration file handler */
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include "btconfhandler.h"
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <opie2/odebug.h>
+
+//Keywords
+static QCString k_hcidEnable("HCID_ENABLE=");
+static QCString k_hiddEnable("HIDD_ENABLE=");
+static QCString k_sdpdEnable("SDPD_ENABLE=");
+static QCString k_rfcommEnable("RFCOMM_ENABLE=");
+static QCString k_dundEnable("DUND_ENABLE=");
+static QCString k_pandEnable("PAND_ENABLE=");
+static QCString k_pandOpts("PAND_OPTIONS=");
+static QCString k_dundOpts("DUND_OPTIONS=");
+
+const struct option pandCLOpts[] = //Pand command line options
+{
+ { "listen", 0, NULL, 's' },
+ { "encrypt", 0, NULL, 'E' },
+ { "secure", 0, NULL, 'S' },
+ { "master", 0, NULL, 'M' },
+ { "nosdp", 0, NULL, 'D' },
+ { "role", 1, NULL, 'r' },
+ { "persist", 0, NULL, 'p' },
+ { "cache", 0, NULL, 'C' },
+ { NULL, 0, NULL, 0 } //Marker of the end
+};
+
+const struct option dundCLOpts[] = //Pand command line options
+{
+ { "listen", 0, NULL, 's' },
+ { "nosdp", 0, NULL, 'D' },
+ { "persist", 0, NULL, 'p' },
+ { "cache", 0, NULL, 'C' },
+ { "msdun", 0, NULL, 'X' },
+ { "channel", 1, NULL, 'P' },
+ { "pppd", 1, NULL, 'd' },
+ { NULL, 0, NULL, 0 } //Marker of the end
+};
+
+using namespace OpieTooth;
+BTConfHandler::BTConfHandler(const QString& conf): confName(conf)
+{
+ hcidEnable = false;
+ hiddEnable = false;
+ sdpdEnable = false;
+ rfcommEnable = false;
+
+ //dund parameters
+ dundEnable = false;
+ dundDisableSDP = false;
+ dundPersist = false;
+ dundPersistPeriod = "";
+ dundCache = false;
+ dundCachePeriod = "";
+ dundMsdun = false;
+ dundMsdunTimeout = "";
+ dundChannel = "1";
+ dundPPPd = false;
+ dundPPPdPath = "";
+ dundPPPdOptions = "";
+
+ //pandparameters
+ pandEnable = false;
+ pandEncrypt = false;
+ pandSecure = false;
+ pandMaster = false;
+ pandDisableSDP = false;
+ pandRole = "";
+ pandPersist = false;
+ pandPersistPeriod = "";
+ pandCache = false;
+ pandCachePeriod = "";
+
+ readConfig(confName);
+}
+
+BTConfHandler::~BTConfHandler()
+{
+}
+
+/**
+ * getBoolArg
+ * Gets boolean argument from a string str with a keyword key
+ */
+bool BTConfHandler::getBoolArg(QString& str, QCString& keyword)
+{
+ QString arg = str.mid(keyword.length(), str.length() - keyword.length());
+ return (bool)(arg == "true");
+}
+
+/**
+ * getStringArg
+ * Gets string argument from a string str with a keyword key
+ */
+QString BTConfHandler::getStringArg(QString& str, QCString& keyword)
+{
+ QString arg = str.mid(keyword.length(), str.length() - keyword.length());
+ if (arg.left(1) == "\"")
+ arg.remove(0, 1);
+ if (arg.right(1) == "\"")
+ arg.remove(arg.length() - 1, 1);
+ return arg;
+}
+
+/**
+ * parsePanParameters
+ * Function gets PAND parameters from the command line conf
+ */
+void BTConfHandler::parsePanParameters(const QString& conf)
+{
+ int i; //just an index variable
+ int argc;
+ QStringList panList = QStringList::split(" ", conf);
+ argc = panList.count();
+ char* argv[argc + 1];
+ int shOpt;
+ i = 1;
+ optind = 0;
+ argv[0] = strdup("pand");
+ for (QStringList::Iterator arg = panList.begin();
+ arg != panList.end() && i < argc + 1; arg++, i++) {
+ argv[i] = strdup((*arg));
+ }
+ do {
+ shOpt = getopt_long(argc + 1, argv, "sESMDr:p:C:", pandCLOpts, NULL);
+ switch(shOpt) {
+ case 'E':
+ pandEncrypt = true;
+ break;
+ case 'S':
+ pandSecure = true;
+ break;
+ case 'M':
+ pandMaster = true;
+ break;
+ case 'D':
+ pandDisableSDP = true;
+ break;
+ case 'r':
+ if (optarg)
+ pandRole = optarg;
+ else
+ pandRole = "NG";
+ break;
+ case 'p':
+ pandPersist = true;
+ if (optarg)
+ pandPersistPeriod = optarg;
+ break;
+ case 'C':
+ pandCache = true;
+ if (optarg)
+ pandCachePeriod = optarg;
+ break;
+ case 's':
+ case '?':
+ default:
+ break;
+ }
+ } while (shOpt != -1);
+ for (i = 0; i < argc + 1; i++) {
+ free(argv[i]);
+ }
+}
+
+/**
+ * parseDunParameters
+ * Function gets PAND parameters from the command line conf
+ */
+void BTConfHandler::parseDunParameters(const QString& conf)
+{
+ int i; //just an index variable
+ int argc;
+ QStringList dunList = QStringList::split(" ", conf);
+ argc = dunList.count();
+ char* argv[argc + 1];
+ int shOpt;
+ i = 1;
+ optind = 0;
+ argv[0] = strdup("dund");
+ for (QStringList::Iterator arg = dunList.begin();
+ arg != dunList.end() && i < argc + 1; arg++, i++) {
+ argv[i] = strdup((*arg));
+ }
+ do {
+ shOpt = getopt_long(argc + 1, argv, "sDp:C:X:P:d:", dundCLOpts, NULL);
+ switch(shOpt) {
+ case 'D':
+ dundDisableSDP = true;
+ break;
+ case 'p':
+ dundPersist = true;
+ if (optarg)
+ dundPersistPeriod = optarg;
+ break;
+ case 'C':
+ dundCache = true;
+ if (optarg)
+ dundCachePeriod = optarg;
+ break;
+ case 'X':
+ dundMsdun = true;
+ if (optarg)
+ dundMsdunTimeout = optarg;
+ break;
+ case 'P':
+ if (optarg)
+ dundChannel = optarg;
+ else
+ dundChannel = "1";
+ break;
+ case 'd':
+ dundPPPd = true;
+ if (optarg)
+ dundPPPdPath = optarg;
+ break;
+ case 's':
+ case '?':
+ default:
+ break;
+ }
+ } while (shOpt != -1);
+ if (optind < argc + 1) {
+ for (i = optind; i < argc + 1; i++) {
+ if (!dundPPPdOptions.isEmpty())
+ dundPPPdOptions += " ";
+ dundPPPdOptions += argv[i];
+ }
+ }
+ for (i = 0; i < argc + 1; i++) {
+ free(argv[i]);
+ }
+}
+
+/**
+ * readConfig
+ * Reads configuration file with conf as a file name
+ * return true on success and false on failure
+ */
+bool BTConfHandler::readConfig(const QString& conf)
+{
+ QFile btConf(conf); //File we read
+ QString tmp; //temporary string
+ if (btConf.open(IO_ReadOnly)) {
+ QTextStream inStream(&btConf);
+ list = QStringList::split("\n", inStream.read(), true);
+ for (QStringList::Iterator line = list.begin();
+ line != list.end(); line++) {
+ QString tmpLine = (*line).simplifyWhiteSpace();
+ if (tmpLine.startsWith("#"))
+ continue;
+ else if (tmpLine.startsWith(k_hcidEnable))
+ hcidEnable = getBoolArg(tmpLine, k_hcidEnable);
+ else if (tmpLine.startsWith(k_hiddEnable))
+ hiddEnable = getBoolArg(tmpLine, k_hiddEnable);
+ else if (tmpLine.startsWith(k_sdpdEnable))
+ sdpdEnable = getBoolArg(tmpLine, k_sdpdEnable);
+ else if (tmpLine.startsWith(k_rfcommEnable))
+ rfcommEnable = getBoolArg(tmpLine, k_rfcommEnable);
+ else if (tmpLine.startsWith(k_dundEnable))
+ dundEnable = getBoolArg(tmpLine, k_dundEnable);
+ else if (tmpLine.startsWith(k_pandEnable))
+ pandEnable = getBoolArg(tmpLine, k_pandEnable);
+ else if (tmpLine.startsWith(k_pandOpts)) {
+ tmp = getStringArg(tmpLine, k_pandOpts);
+ parsePanParameters(tmp);
+ }
+ else if (tmpLine.startsWith(k_dundOpts)) {
+ tmp = getStringArg(tmpLine, k_dundOpts);
+ parseDunParameters(tmp);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+/**
+ * writeConfig
+ * Writes configuration file with conf as a file name
+ * return true on success and false on failure
+ */
+bool BTConfHandler::saveConfig()
+{
+ QFile btConf(confName); //File we read
+ if (!btConf.open(IO_WriteOnly))
+ return false;
+ QTextStream stream(&btConf);
+ for (QStringList::Iterator line = list.begin();
+ line != list.end(); line++) {
+ QString tmpLine = (*line).simplifyWhiteSpace();
+ if (tmpLine.startsWith(k_hcidEnable))
+ (*line) = k_hcidEnable + ((hcidEnable)? "true": "false");
+ else if (tmpLine.startsWith(k_hiddEnable))
+ (*line) = k_hiddEnable + ((hiddEnable)? "true": "false");
+ else if (tmpLine.startsWith(k_sdpdEnable))
+ (*line) = k_sdpdEnable + ((sdpdEnable)? "true": "false");
+ else if (tmpLine.startsWith(k_rfcommEnable))
+ (*line) = k_rfcommEnable + ((rfcommEnable)? "true": "false");
+ else if (tmpLine.startsWith(k_dundEnable))
+ (*line) = k_dundEnable + ((dundEnable)? "true": "false");
+ else if (tmpLine.startsWith(k_pandEnable))
+ (*line) = k_pandEnable + ((pandEnable)? "true": "false");
+ else if (tmpLine.startsWith(k_pandOpts)) {
+ (*line) = k_pandOpts + "\"--listen";
+ (*line) += " --role " + pandRole;
+ if (pandEncrypt)
+ (*line) += " --encrypt";
+ if (pandSecure)
+ (*line) += " --secure";
+ if (pandMaster)
+ (*line) += " --master";
+ if (pandDisableSDP)
+ (*line) += " --nosdp";
+ if (pandPersist) {
+ if (pandPersistPeriod.isEmpty())
+ (*line) += " --persist";
+ else {
+ (*line) += " -p ";
+ (*line) += pandPersistPeriod;
+ }
+ }
+ if (pandCache) {
+ if (pandCachePeriod.isEmpty())
+ (*line) += " --cache";
+ else {
+ (*line) += " -C ";
+ (*line) += pandCachePeriod;
+ }
+ }
+ (*line) += "\"";
+ }
+ else if (tmpLine.startsWith(k_dundOpts)) {
+ (*line) = k_dundOpts + "\"--listen";
+ (*line) += " --channel " + dundChannel;
+ if (dundDisableSDP)
+ (*line) += " --nosdp";
+ if (dundPersist) {
+ if (dundPersistPeriod.isEmpty())
+ (*line) += " --persist";
+ else {
+ (*line) += " -p ";
+ (*line) += dundPersistPeriod;
+ }
+ }
+ if (dundCache) {
+ if (dundCachePeriod.isEmpty())
+ (*line) += " --cache";
+ else {
+ (*line) += " -C ";
+ (*line) += dundCachePeriod;
+ }
+ }
+ if (dundPPPd)
+ (*line) += " --pppd " + dundPPPdPath;
+ if (dundMsdun) {
+ if (dundMsdunTimeout.isEmpty())
+ (*line) += " --msdun";
+ else {
+ (*line) += " -X ";
+ (*line) += dundMsdunTimeout;
+ }
+ }
+ if (!dundPPPdOptions.isEmpty()) {
+ (*line) += " ";
+ (*line) += dundPPPdOptions;
+ }
+ (*line) += "\"";
+ }
+ stream << (*line) << endl;
+ }
+ return true;
+}
+
+//eof
diff --git a/noncore/net/opietooth/manager/btconfhandler.h b/noncore/net/opietooth/manager/btconfhandler.h
new file mode 100644
index 0000000..5638d00
--- a/dev/null
+++ b/noncore/net/opietooth/manager/btconfhandler.h
@@ -0,0 +1,126 @@
+/* $Id$ */
+/* Bluetooth services configuration file handler */
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef _BTCONFHANDLER_H_
+#define _BTCONFHANDLER_H_
+#include <qstring.h>
+#include <qstringlist.h>
+
+namespace OpieTooth {
+ class BTConfHandler {
+ public:
+ BTConfHandler(const QString& conf);
+ ~BTConfHandler();
+ bool saveConfig();
+
+ bool getHcidEnable() { return hcidEnable; }
+ void setHcidEnable(bool arg) { hcidEnable = arg; }
+
+ bool getHiddEnable() { return hiddEnable; }
+ void setHiddEnable(bool arg) { hiddEnable = arg; }
+
+ bool getSdpdEnable() { return sdpdEnable; }
+ void setSdpdEnable(bool arg) { sdpdEnable = arg; }
+
+ bool getRfcommEnable() { return rfcommEnable; }
+ void setRfcommEnable(bool arg) { rfcommEnable = arg; }
+
+ //DUND parameter
+ bool getDundEnable() { return dundEnable; }
+ void setDundEnable(bool arg) { dundEnable = arg; }
+ bool getDunDisableSDP() { return dundDisableSDP; }
+ void setDunDisableSDP(bool arg) { dundDisableSDP = arg; }
+ bool getDunPersist() { return dundPersist; }
+ void setDunPersist(bool arg) { dundPersist = arg; }
+ QString getDunPersistPeriod() { return dundPersistPeriod; }
+ void setDunPersistPeriod(QString& arg) { dundPersistPeriod = arg; }
+ bool getDunCache() { return dundCache; }
+ void setDunCache(bool arg) { dundCache = arg; }
+ QString getDunCachePeriod() { return dundCachePeriod; }
+ void setDunCachePeriod(QString& arg) { dundCachePeriod = arg; }
+ bool getDunMsdun() { return dundMsdun; }
+ void setDunMsdun(bool arg) { dundMsdun = arg; }
+ QString getDunMsdunTimeout() { return dundMsdunTimeout; }
+ void setDunMsdunTimeout(QString& arg) { dundMsdunTimeout = arg; }
+ QString getDunChannel() { return dundChannel; }
+ void setDunChannel(QString& arg) { dundChannel = arg; }
+ bool getDunPPPd() { return dundPPPd; }
+ void setDunPPPd(bool arg) { dundPPPd = arg; }
+ QString getDunPPPdPath() { return dundPPPdPath; }
+ void setDunPPPdPath(QString& arg) { dundPPPdPath = arg; }
+ QString getDunPPPdOptions() { return dundPPPdOptions; }
+ void setDunPPPdOptions(QString& arg) { dundPPPdOptions = arg; }
+
+ //PAND parameters
+ bool getPanEnable() { return pandEnable; }
+ void setPanEnable(bool arg) { pandEnable = arg; }
+ bool getPanEncrypt() { return pandEncrypt; }
+ void setPanEncrypt(bool arg) { pandEncrypt = arg; }
+ bool getPanSecure() { return pandSecure; }
+ void setPanSecure(bool arg) { pandSecure = arg; }
+ bool getPanMaster() { return pandMaster; }
+ void setPanMaster(bool arg) { pandMaster = arg; }
+ bool getPanDisableSDP() { return pandDisableSDP; }
+ void setPanDisableSDP(bool arg) { pandDisableSDP = arg; }
+ QString getPanRole() { return pandRole; }
+ void setPanRole(QString& arg) { pandRole = arg; }
+ bool getPanPersist() { return pandPersist; }
+ void setPanPersist(bool arg) { pandPersist = arg; }
+ QString getPanPersistPeriod() { return pandPersistPeriod; }
+ void setPanPersistPeriod(QString& arg) { pandPersistPeriod = arg; }
+ bool getPanCache() { return pandCache; }
+ void setPanCache(bool arg) { pandCache = arg; }
+ QString getPanCachePeriod() { return pandCachePeriod; }
+ void setPanCachePeriod(QString& arg) { pandCachePeriod = arg; }
+
+ QString& getConfName() { return confName; }
+ protected:
+ bool getBoolArg(QString& str, QCString& keyword);
+ QString getStringArg(QString& str, QCString& keyword);
+ bool readConfig(const QString& conf);
+ void parsePanParameters(const QString& conf);
+ void parseDunParameters(const QString& conf);
+ protected:
+ bool hcidEnable;
+ bool hiddEnable;
+ bool sdpdEnable;
+ bool rfcommEnable;
+ //DUND parameters
+ bool dundEnable;
+ bool dundDisableSDP;
+ bool dundPersist;
+ QString dundPersistPeriod;
+ bool dundCache;
+ QString dundCachePeriod;
+ bool dundMsdun;
+ QString dundMsdunTimeout;
+ QString dundChannel;
+ bool dundPPPd;
+ QString dundPPPdPath;
+ QString dundPPPdOptions;
+
+ //PAND parameters
+ bool pandEnable;
+ bool pandEncrypt;
+ bool pandSecure;
+ bool pandMaster;
+ bool pandDisableSDP;
+ bool pandPersist;
+ QString pandPersistPeriod;
+ bool pandCache;
+ QString pandCachePeriod;
+ QString pandRole;
+ QStringList list; //list of strings we read from configuration file
+ QString confName; //Configuration filename
+ };
+};
+#endif
+//eof
diff --git a/noncore/net/opietooth/manager/manager.pro b/noncore/net/opietooth/manager/manager.pro
index dc43f40..09bd10e 100644
--- a/noncore/net/opietooth/manager/manager.pro
+++ b/noncore/net/opietooth/manager/manager.pro
@@ -1,42 +1,45 @@
CONFIG = qt warn_on quick-app
HEADERS = btconnectionitem.h btdeviceitem.h \
btserviceitem.h stdpopups.h \
popuphelper.h bluebase.h \
scandialog.h btlistitem.h filistitem.h \
hciconfwrapper.h bticonloader.h \
pppdialog.h dundialog.h pandialog.h \
obexdialog.h obexftpdialog.h \
rfcommassigndialogimpl.h rfcommassigndialogitem.h \
devicehandler.h rfcpopup.h obexpopup.h obexftpopup.h \
- rfcommhelper.h panpopup.h dunpopup.h rfcommconfhandler.h
+ rfcommhelper.h panpopup.h dunpopup.h rfcommconfhandler.h \
+ servicesdialog.h btconfhandler.h
SOURCES = btconnectionitem.cpp btdeviceitem.cpp \
btserviceitem.cpp filelistitem.cpp stdpopups.cpp \
popuphelper.cpp main.cpp \
bluebase.cpp scandialog.cpp \
btlistitem.cpp hciconfwrapper.cpp \
bticonloader.cpp pppdialog.cpp dundialog.cpp pandialog.cpp \
rfcommassigndialogimpl.cpp rfcommassigndialogitem.cpp \
obexdialog.cpp devicehandler.cpp \
rfcpopup.cpp obexpopup.cpp obexftpopup.cpp obexftpdialog.cpp \
- rfcommhelper.cpp panpopup.cpp dunpopup.cpp rfcommconfhandler.cpp
+ rfcommhelper.cpp panpopup.cpp dunpopup.cpp rfcommconfhandler.cpp \
+ servicesdialog.cpp btconfhandler.cpp
INCLUDEPATH += $(OPIEDIR)/include
INCLUDEPATH += $(OPIEDIR)/noncore/net/opietooth/lib
DEPENDPATH += $(OPIEDIR)/include
LIBS += -lqpe -lbluetooth -lopietooth1 -lopiecore2 -lopieui2 -lopenobex
INTERFACES = bluetoothbase.ui devicedialog.ui rfcommassigndialogbase.ui \
- rfcommdialogitembase.ui obexftpdialogbase.ui
+ rfcommdialogitembase.ui obexftpdialogbase.ui \
+ servicesdialogbase.ui
TARGET = bluetooth-manager
include( $(OPIEDIR)/include.pro )
!isEmpty( LIBOBEXFTP_INC_DIR ) {
INCLUDEPATH += $$LIBOBEXFTP_INC_DIR
}
!isEmpty( LIBOBEXFTP_LIB_DIR ) {
LIBS += $$LIBOBEXFTP_LIB_DIR/libobexftp.a
LIBS += $$LIBOBEXFTP_LIB_DIR/libmulticobex.a
LIBS += $$LIBOBEXFTP_LIB_DIR/libbfb.a
}
diff --git a/noncore/net/opietooth/manager/servicesdialog.cpp b/noncore/net/opietooth/manager/servicesdialog.cpp
new file mode 100644
index 0000000..114c360
--- a/dev/null
+++ b/noncore/net/opietooth/manager/servicesdialog.cpp
@@ -0,0 +1,120 @@
+/* $Id$ */
+/* Bluetooth services configuration dialog */
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include "servicesdialog.h"
+#include "btconfhandler.h"
+#include <opie2/odebug.h>
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+using namespace Opie::Core;
+
+using namespace OpieTooth;
+
+ServicesDialog::ServicesDialog(const QString& conf,
+ QWidget* parent, const char* name, bool modal, WFlags fl) :
+ ServicesDialogBase(parent, name, modal, fl),
+ cfg(conf)
+{
+ int i; //just an index
+ QString role;
+ hcidEnableCBox->setChecked(cfg.getHcidEnable());
+ hiddEnableCBox->setChecked(cfg.getHiddEnable());
+ sdpdEnableCBox->setChecked(cfg.getSdpdEnable());
+ rfcommEnableCBox->setChecked(cfg.getRfcommEnable());
+ dundEnableCBox->setChecked(cfg.getDundEnable());
+ dundDisableSDPCBox->setChecked(cfg.getDunDisableSDP());
+ dundPersistCBox->setChecked(cfg.getDunPersist());
+ dundPersistEdit->setText(cfg.getDunPersistPeriod());
+ dundCacheCBox->setChecked(cfg.getDunCache());
+ dundCacheEdit->setText(cfg.getDunCachePeriod());
+ for (i = 1; i < 32; i++)
+ dundChannelCBox->insertItem(QString::number(i));
+ role = cfg.getDunChannel();
+ for (i = 0; i < dundChannelCBox->count(); i++) {
+ if (role == dundChannelCBox->text(i)) {
+ dundChannelCBox->setCurrentItem(i);
+ break;
+ }
+ }
+ dundMsdunCBox->setChecked(cfg.getDunMsdun());
+ dundMsdunTimeoutEdit->setText(cfg.getDunMsdunTimeout());
+ dundPPPdCBox->setChecked(cfg.getDunPPPd());
+ dundPPPdPathEdit->setText(cfg.getDunPPPdPath());
+ dundPPPdOptionsEdit->setText(cfg.getDunPPPdOptions());
+
+ pandEnableCBox->setChecked(cfg.getPanEnable());
+ pandEncryptCBox->setChecked(cfg.getPanEncrypt());
+ pandSecureCBox->setChecked(cfg.getPanSecure());
+ pandMasterCBox->setChecked(cfg.getPanMaster());
+ role = cfg.getPanRole();
+ for (i = 0; i < pandRoleComboBox->count(); i++) {
+ if (role == pandRoleComboBox->text(i)) {
+ pandRoleComboBox->setCurrentItem(i);
+ break;
+ }
+ }
+ pandDisableSDPCBox->setChecked(cfg.getPanDisableSDP());
+ pandPersistCBox->setChecked(cfg.getPanPersist());
+ pandPersistEdit->setText(cfg.getPanPersistPeriod());
+ pandCacheCBox->setChecked(cfg.getPanCache());
+ pandCacheEdit->setText(cfg.getPanCachePeriod());
+}
+
+ServicesDialog::~ServicesDialog()
+{
+}
+
+void ServicesDialog::accept()
+{
+ QString tmp;
+ odebug << "save configuration" << oendl;
+ cfg.setHcidEnable(hcidEnableCBox->isChecked());
+ cfg.setHiddEnable(hiddEnableCBox->isChecked());
+ cfg.setSdpdEnable(sdpdEnableCBox->isChecked());
+ cfg.setRfcommEnable(rfcommEnableCBox->isChecked());
+ cfg.setDundEnable(dundEnableCBox->isChecked());
+ cfg.setDunDisableSDP(dundDisableSDPCBox->isChecked());
+ cfg.setDunPersist(dundPersistCBox->isChecked());
+ tmp = dundPersistEdit->text();
+ cfg.setDunPersistPeriod(tmp);
+ cfg.setDunCache(dundCacheCBox->isChecked());
+ tmp = dundCacheEdit->text();
+ cfg.setDunCachePeriod(tmp);
+ tmp = dundChannelCBox->currentText();
+ cfg.setDunChannel(tmp);
+ cfg.setDunMsdun(dundMsdunCBox->isChecked());
+ tmp = dundMsdunTimeoutEdit->text();
+ cfg.setDunMsdunTimeout(tmp);
+ cfg.setDunPPPd(dundPPPdCBox->isChecked());
+ tmp = dundPPPdPathEdit->text();
+ cfg.setDunPPPdPath(tmp);
+ tmp = dundPPPdOptionsEdit->text();
+ cfg.setDunPPPdOptions(tmp);
+
+ cfg.setPanEnable(pandEnableCBox->isChecked());
+ cfg.setPanEncrypt(pandEncryptCBox->isChecked());
+ cfg.setPanSecure(pandSecureCBox->isChecked());
+ cfg.setPanMaster(pandMasterCBox->isChecked());
+ cfg.setPanDisableSDP(pandDisableSDPCBox->isChecked());
+ tmp = pandRoleComboBox->currentText();
+ cfg.setPanRole(tmp);
+ cfg.setPanPersist(pandPersistCBox->isChecked());
+ tmp = pandPersistEdit->text();
+ cfg.setPanPersistPeriod(tmp);
+ cfg.setPanCache(pandCacheCBox->isChecked());
+ tmp = pandCacheEdit->text();
+ cfg.setPanCachePeriod(tmp);
+ cfg.saveConfig();
+ ServicesDialogBase::accept();
+}
+
+//eof
diff --git a/noncore/net/opietooth/manager/servicesdialog.h b/noncore/net/opietooth/manager/servicesdialog.h
new file mode 100644
index 0000000..b42f290
--- a/dev/null
+++ b/noncore/net/opietooth/manager/servicesdialog.h
@@ -0,0 +1,30 @@
+/* $Id$ */
+/* Bluetooth services configuration dialog */
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#ifndef _SERVICESDIALOG_H_
+#define _SERVICESDIALOG_H_
+#include "servicesdialogbase.h"
+#include "btconfhandler.h"
+namespace OpieTooth {
+ class ServicesDialog : public ServicesDialogBase {
+ Q_OBJECT
+ public:
+ ServicesDialog(const QString& conf,
+ QWidget* parent = 0, const char* name = 0, bool modal = TRUE,
+ WFlags fl = 0);
+ ~ServicesDialog();
+ public:
+ BTConfHandler cfg; //configuration file
+ protected slots:
+ virtual void accept();
+ };
+};
+#endif
+//eof
diff --git a/noncore/net/opietooth/manager/servicesdialogbase.ui b/noncore/net/opietooth/manager/servicesdialogbase.ui
new file mode 100644
index 0000000..410e513
--- a/dev/null
+++ b/noncore/net/opietooth/manager/servicesdialogbase.ui
@@ -0,0 +1,658 @@
+<!DOCTYPE UI><UI>
+<class>ServicesDialogBase</class>
+<widget>
+ <class>QDialog</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>ServicesDialogBase</cstring>
+ </property>
+ <property stdset="1">
+ <name>geometry</name>
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>258</width>
+ <height>368</height>
+ </rect>
+ </property>
+ <property stdset="1">
+ <name>sizePolicy</name>
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ </sizepolicy>
+ </property>
+ <property stdset="1">
+ <name>baseSize</name>
+ <size>
+ <width>240</width>
+ <height>320</height>
+ </size>
+ </property>
+ <property stdset="1">
+ <name>caption</name>
+ <string>Configure Services</string>
+ </property>
+ <property>
+ <name>layoutMargin</name>
+ </property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>0</number>
+ </property>
+ <widget>
+ <class>QTabWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>servicesTab</cstring>
+ </property>
+ <property stdset="1">
+ <name>tabShape</name>
+ <enum>Rounded</enum>
+ </property>
+ <property>
+ <name>layoutMargin</name>
+ </property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
+ <widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>tab</cstring>
+ </property>
+ <attribute>
+ <name>title</name>
+ <string>HCID</string>
+ </attribute>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>0</number>
+ </property>
+ <widget>
+ <class>QGroupBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property stdset="1">
+ <name>title</name>
+ <string>Host Controller Interface</string>
+ </property>
+ <property>
+ <name>layoutMargin</name>
+ </property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>11</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget row="0" column="0" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>hcidEnableCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Enable</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>tab</cstring>
+ </property>
+ <attribute>
+ <name>title</name>
+ <string>SDPD</string>
+ </attribute>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>0</number>
+ </property>
+ <widget>
+ <class>QGroupBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>GroupBox4</cstring>
+ </property>
+ <property stdset="1">
+ <name>title</name>
+ <string>Service Discovery Protocol </string>
+ </property>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>11</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget row="0" column="0" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>sdpdEnableCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Enable</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>tab</cstring>
+ </property>
+ <attribute>
+ <name>title</name>
+ <string>HIDD</string>
+ </attribute>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>0</number>
+ </property>
+ <widget row="0" column="0" >
+ <class>QGroupBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>GroupBox6</cstring>
+ </property>
+ <property stdset="1">
+ <name>title</name>
+ <string>Human Interface Devices</string>
+ </property>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>11</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget row="0" column="0" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>hiddEnableCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Enable</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>tab</cstring>
+ </property>
+ <attribute>
+ <name>title</name>
+ <string>RFCOMM</string>
+ </attribute>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>0</number>
+ </property>
+ <widget>
+ <class>QGroupBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>GroupBox5</cstring>
+ </property>
+ <property stdset="1">
+ <name>title</name>
+ <string>RFCOMM</string>
+ </property>
+ <property>
+ <name>layoutMargin</name>
+ </property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>11</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget row="0" column="0" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>rfcommEnableCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Enable</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>tab</cstring>
+ </property>
+ <attribute>
+ <name>title</name>
+ <string>DUND</string>
+ </attribute>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>0</number>
+ </property>
+ <widget>
+ <class>QGroupBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>GroupBox7</cstring>
+ </property>
+ <property stdset="1">
+ <name>title</name>
+ <string>DialUp Network</string>
+ </property>
+ <property>
+ <name>layoutMargin</name>
+ </property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>4</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>2</number>
+ </property>
+ <widget row="0" column="0" rowspan="1" colspan="3" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundEnableCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Enable</string>
+ </property>
+ </widget>
+ <widget row="1" column="3" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundCacheCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Cache</string>
+ </property>
+ </widget>
+ <widget row="1" column="0" rowspan="1" colspan="2" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundPersistCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Persist</string>
+ </property>
+ </widget>
+ <widget row="1" column="2" >
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundPersistEdit</cstring>
+ </property>
+ </widget>
+ <widget row="1" column="4" >
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundCacheEdit</cstring>
+ </property>
+ </widget>
+ <widget row="0" column="3" rowspan="1" colspan="2" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundDisableSDPCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Disable SDP</string>
+ </property>
+ </widget>
+ <widget row="2" column="0" rowspan="1" colspan="5" >
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundPPPdLabel</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>PPPD Options:</string>
+ </property>
+ </widget>
+ <widget row="3" column="0" rowspan="1" colspan="5" >
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundPPPdOptionsEdit</cstring>
+ </property>
+ </widget>
+ <widget row="4" column="0" rowspan="1" colspan="5" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundPPPdCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Specify pppd path</string>
+ </property>
+ </widget>
+ <widget row="7" column="1" rowspan="1" colspan="4" >
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundMsdunTimeoutEdit</cstring>
+ </property>
+ </widget>
+ <widget row="7" column="0" >
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundMsdunLabel</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Timeout: </string>
+ </property>
+ </widget>
+ <widget row="6" column="0" rowspan="1" colspan="5" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundMsdunCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Enable Microsoft dialup networking</string>
+ </property>
+ </widget>
+ <widget row="5" column="0" rowspan="1" colspan="5" >
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundPPPdPathEdit</cstring>
+ </property>
+ </widget>
+ <widget row="8" column="0" rowspan="1" colspan="2" >
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundChannelLabel</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Channel:</string>
+ </property>
+ </widget>
+ <widget row="8" column="2" rowspan="1" colspan="3" >
+ <class>QComboBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>dundChannelCBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>tab</cstring>
+ </property>
+ <attribute>
+ <name>title</name>
+ <string>PAND</string>
+ </attribute>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>0</number>
+ </property>
+ <widget>
+ <class>QGroupBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>GroupBox6_2</cstring>
+ </property>
+ <property stdset="1">
+ <name>title</name>
+ <string>Personal Area Network</string>
+ </property>
+ <property>
+ <name>layoutMargin</name>
+ </property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>4</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>2</number>
+ </property>
+ <widget row="0" column="0" rowspan="1" colspan="3" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandEnableCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Enable</string>
+ </property>
+ </widget>
+ <widget row="1" column="2" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandSecureCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Secure</string>
+ </property>
+ </widget>
+ <widget row="2" column="2" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandDisableSDPCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Disable SDP</string>
+ </property>
+ </widget>
+ <widget row="3" column="0" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandPersistCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Persist</string>
+ </property>
+ </widget>
+ <widget row="3" column="1" rowspan="1" colspan="2" >
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandPersistEdit</cstring>
+ </property>
+ </widget>
+ <widget row="4" column="0" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandCacheCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Cache</string>
+ </property>
+ </widget>
+ <widget row="4" column="1" rowspan="1" colspan="2" >
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandCacheEdit</cstring>
+ </property>
+ </widget>
+ <widget row="2" column="0" rowspan="1" colspan="2" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandMasterCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Master</string>
+ </property>
+ </widget>
+ <widget row="1" column="0" >
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandEncryptCBox</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Encrypt</string>
+ </property>
+ </widget>
+ <widget row="5" column="0" >
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandRoleLabel</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Role: </string>
+ </property>
+ </widget>
+ <widget row="5" column="1" rowspan="1" colspan="2" >
+ <class>QComboBox</class>
+ <item>
+ <property>
+ <name>text</name>
+ <string>PANU</string>
+ </property>
+ </item>
+ <item>
+ <property>
+ <name>text</name>
+ <string>NAP</string>
+ </property>
+ </item>
+ <item>
+ <property>
+ <name>text</name>
+ <string>GN</string>
+ </property>
+ </item>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>pandRoleComboBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+</UI>