-rw-r--r-- | noncore/net/opietooth/applet/bluezapplet.cpp | 143 | ||||
-rw-r--r-- | noncore/net/opietooth/applet/bluezapplet.h | 6 |
2 files changed, 114 insertions, 35 deletions
diff --git a/noncore/net/opietooth/applet/bluezapplet.cpp b/noncore/net/opietooth/applet/bluezapplet.cpp index 5676e4f..9c6c71d 100644 --- a/noncore/net/opietooth/applet/bluezapplet.cpp +++ b/noncore/net/opietooth/applet/bluezapplet.cpp @@ -35,4 +35,5 @@ #include <opie2/odebug.h> #include <opie2/oresource.h> +#include <opie2/oprocess.h> #include <qpe/applnk.h> #include <qpe/qcopenvelope_qws.h> @@ -50,21 +51,32 @@ using namespace Opie::Core; #include <qtimer.h> #include <qpopupmenu.h> +#include <qmessagebox.h> /* STD */ #include <device.h> -namespace OpieTooth { +// #define OPIE120 // undefine it fo the latest OPIE +namespace OpieTooth { BluezApplet::BluezApplet( QWidget *parent, const char *name ) : QWidget( parent, name ) { setFixedHeight( AppLnk::smallIconSize() ); setFixedWidth( AppLnk::smallIconSize() ); +#ifdef OPIE120 + bluezOnPixmap = Resource::loadPixmap( "bluetoothapplet/bluezon" ); + bluezOffPixmap = Resource::loadPixmap( "bluetoothapplet/bluezoff" ); + bluezDiscoveryOnPixmap = Resource::loadPixmap( "bluetoothapplet/magglass.png" ); +#else bluezOnPixmap = OResource::loadImage( "bluetoothapplet/bluezon", OResource::SmallIcon ); bluezOffPixmap = OResource::loadImage( "bluetoothapplet/bluezoff", Opie::Core::OResource::SmallIcon ); bluezDiscoveryOnPixmap = OResource::loadImage( "bluetoothapplet/bluezondiscovery", Opie::Core::OResource::SmallIcon ); - startTimer(4000); +#endif + startTimer(2000); btDevice = 0; btManager = 0; bluezactive = false; bluezDiscoveryActive = false; + doListDevice = false; + isScanning = false; + m_wasOn = false; // TODO: determine whether this channel has to be closed at destruction time. @@ -72,4 +84,14 @@ namespace OpieTooth { connect(chan, SIGNAL(received(const QCString&,const QByteArray&) ), this, SLOT(slotMessage(const QCString&,const QByteArray&) ) ); + + OProcess* btstart = new OProcess(); + *btstart << "/etc/init.d/bluetooth" << "stop"; + btstart->setUseShell(true); + if (!btstart->start(OProcess::DontCare, OProcess::AllOutput)) + delete btstart; + else { + connect(btstart, SIGNAL(processExited(Opie::Core::OProcess*)), + this, SLOT(slotProcessExited(Opie::Core::OProcess*))); + } } @@ -103,4 +125,5 @@ int BluezApplet::position() int BluezApplet::setBluezStatus(int c) { + OProcess* btstart = new OProcess(); if ( c == 1 ) { switch ( ODevice::inst()->model() ) { @@ -109,11 +132,13 @@ int BluezApplet::position() break; - case Model_iPAQ_H5xxx: - btDevice = new Device( "/dev/tts/1", "any", "921600" ); - break; + case Model_iPAQ_H5xxx: + btDevice = new Device( "/dev/tts/1", "any", "921600" ); + break; +#ifndef OPIE120 case Model_MyPal_716: btDevice = new Device( "/dev/ttyS1", "bcsp", "921600" ); break; +#endif default: @@ -121,5 +146,21 @@ int BluezApplet::position() break; } + *btstart << "/etc/init.d/bluetooth" << "start"; + btstart->setUseShell(true); + if (!btstart->start(OProcess::DontCare, OProcess::AllOutput)) + delete btstart; + else { + connect(btstart, SIGNAL(processExited(Opie::Core::OProcess*)), + this, SLOT(slotProcessExited(Opie::Core::OProcess*))); + } } else { + *btstart << "/etc/init.d/bluetooth" << "stop"; + btstart->setUseShell(true); + if (!btstart->start(OProcess::DontCare, OProcess::AllOutput)) + delete btstart; + else { + connect(btstart, SIGNAL(processExited(Opie::Core::OProcess*)), + this, SLOT(slotProcessExited(Opie::Core::OProcess*))); + } if ( btDevice ) { delete btDevice; @@ -131,9 +172,9 @@ int BluezApplet::position() int BluezApplet::checkBluezDiscoveryStatus() { - return bluezDiscoveryActive; + return isScanning; } int BluezApplet::setBluezDiscoveryStatus(int d) { - return bluezDiscoveryActive=d; + return bluezDiscoveryActive = d; } @@ -142,22 +183,35 @@ int BluezApplet::position() void BluezApplet::slotMessage( const QCString& str, const QByteArray& ) { - if ( str == "enableBluetooth()") { - if (!checkBluezStatus()) { - setBluezStatus(1); - } - } else if ( str == "disableBluetooth()") { - if (checkBluezStatus()) { - // setBluezStatus(0); - } - } else if ( str == "listDevices()") { - if (!btManager) - { - btManager = new Manager("hci0"); - connect( btManager, SIGNAL( foundDevices(const QString&,RemoteDevice::ValueList) ), - this, SLOT( fillList(const QString&,RemoteDevice::ValueList) ) ) ; + if ( str == "enableBluetooth()") { + m_wasOn = checkBluezStatus(); + if (!m_wasOn) { + setBluezStatus(1); + sleep(2); + } + } + else if ( str == "disableBluetooth()") { + /* + * We can down BT only if it was started by qcop. We don't want + * to down BT started from menu an break our networking connection + */ + if (checkBluezStatus() && !m_wasOn) + setBluezStatus(0); + doListDevice = false; } - - btManager->searchDevices(); - } + else if ( str == "listDevices()") { + if (checkBluezStatus()) { + doListDevice = false; + timerEvent(0); + if (!btManager) { + btManager = new Manager("hci0"); + connect( btManager, + SIGNAL( foundDevices(const QString&, RemoteDevice::ValueList) ), + this, SLOT( fillList(const QString&, RemoteDevice::ValueList) ) ) ; + } + btManager->searchDevices(); + isScanning = true; + } else + doListDevice = true; + } } @@ -165,16 +219,15 @@ int BluezApplet::position() void BluezApplet::fillList(const QString&, RemoteDevice::ValueList deviceList) { - QCopEnvelope e("QPE/BluetoothBack", "devices(QStringMap)"); + QCopEnvelope e("QPE/BluetoothBack", "devices(QStringMap)"); - QStringList list; - QMap<QString, QString> btmap; + QMap<QString, QString> btmap; RemoteDevice::ValueList::Iterator it; for( it = deviceList.begin(); it != deviceList.end(); ++it ) - { - btmap[(*it).name()] = (*it).mac(); - } + btmap[(*it).name()] = (*it).mac(); - e << btmap; + e << btmap; + isScanning = false; + timerEvent( 0 ); } @@ -261,6 +314,10 @@ int BluezApplet::position() bluezDiscoveryActive = checkBluezDiscoveryStatus(); - if ((bluezactive != oldactive) || (bluezDiscoveryActive != olddiscovery)) { + if ((bluezactive != oldactive) || + (bluezDiscoveryActive != olddiscovery)) update(); + if (bluezactive && doListDevice) { + const QByteArray arr; + slotMessage("listDevices()", arr); } } @@ -274,16 +331,34 @@ int BluezApplet::position() odebug << "paint bluetooth pixmap" << oendl; - if (bluezactive > 0) { + if (bluezactive) { +#ifdef OPIE120 + p.drawPixmap( 0, -1, bluezOnPixmap ); +#else p.drawPixmap( 0, 0, bluezOnPixmap ); +#endif } else { +#ifdef OPIE120 + p.drawPixmap( 0, -1, bluezOffPixmap ); +#else p.drawPixmap( 0, 0, bluezOffPixmap ); +#endif } - if (bluezDiscoveryActive > 0) { + if (bluezDiscoveryActive) { p.drawPixmap( 0, 0, bluezDiscoveryOnPixmap ); } } + +/** + * Implementation of the process finish + * @param the finished process + */ + void BluezApplet::slotProcessExited(OProcess* proc) + { + delete proc; + } }; + EXPORT_OPIE_APPLET_v1( OpieTooth::BluezApplet ) diff --git a/noncore/net/opietooth/applet/bluezapplet.h b/noncore/net/opietooth/applet/bluezapplet.h index c096e29..85022bb 100644 --- a/noncore/net/opietooth/applet/bluezapplet.h +++ b/noncore/net/opietooth/applet/bluezapplet.h @@ -34,4 +34,5 @@ #include <qtimer.h> #include <manager.h> +#include <opie2/oprocess.h> namespace OpieTooth { @@ -67,8 +68,11 @@ public slots: bool bluezactive; bool bluezDiscoveryActive; + bool doListDevice; //If I have to list devices after bringing BT up? + bool isScanning; //If I'm scanning devices + bool m_wasOn; //If BT was started by menu? private slots: void slotMessage( const QCString& , const QByteArray& ); - + void slotProcessExited(Opie::Core::OProcess* proc); }; |