summaryrefslogtreecommitdiff
authorkorovkin <korovkin>2006-04-24 16:05:26 (UTC)
committer korovkin <korovkin>2006-04-24 16:05:26 (UTC)
commit71722eacaa44f3b738318d68dc6148c9e2ff643d (patch) (side-by-side diff)
tree2c8eed7019d47db0885c1a0ba0ff6dc0fc16effb
parent2457dde10b8108a74f160b5d1c6bdbb877e0099a (diff)
downloadopie-71722eacaa44f3b738318d68dc6148c9e2ff643d.zip
opie-71722eacaa44f3b738318d68dc6148c9e2ff643d.tar.gz
opie-71722eacaa44f3b738318d68dc6148c9e2ff643d.tar.bz2
On start runs /etc/init.d/bluetooth stop.
On setBluezStatus runs /etc/init.d/bluetooth start or stop. If "listDevices()" is called prior to "enableBluetooth()", postpone the action. If BT was enabled befor "enableBluetooth()" was received, do not disable it on "disableBluetooth()". Timer period became twice shorter. When "listDevices()" received, show browsing icon. Added OPIE120 for compatibility.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/opietooth/applet/bluezapplet.cpp143
-rw-r--r--noncore/net/opietooth/applet/bluezapplet.h6
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
@@ -31,12 +31,13 @@
/* OPIE */
#include <opie2/otaskbarapplet.h>
#include <opie2/odevice.h>
#include <opie2/odebug.h>
#include <opie2/oresource.h>
+#include <opie2/oprocess.h>
#include <qpe/applnk.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/config.h>
using namespace Opie::Core;
/* QT */
@@ -46,34 +47,55 @@ using namespace Opie::Core;
#include <qlayout.h>
#include <qframe.h>
#include <qpixmap.h>
#include <qstring.h>
#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.
QCopChannel* chan = new QCopChannel("QPE/Bluetooth", this );
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*)));
+ }
}
BluezApplet::~BluezApplet() {
if ( btDevice ) {
delete btDevice;
}
@@ -99,86 +121,117 @@ int BluezApplet::position()
return false;
}
}
int BluezApplet::setBluezStatus(int c) {
+ OProcess* btstart = new OProcess();
if ( c == 1 ) {
switch ( ODevice::inst()->model() ) {
case Model_iPAQ_H39xx:
btDevice = new Device( "/dev/tts/1", "bcsp", "921600" );
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:
btDevice = new Device( "/dev/ttySB0", "bcsp", "230400" );
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;
btDevice = 0;
}
}
return 0;
}
int BluezApplet::checkBluezDiscoveryStatus() {
- return bluezDiscoveryActive;
+ return isScanning;
}
int BluezApplet::setBluezDiscoveryStatus(int d) {
- return bluezDiscoveryActive=d;
+ return bluezDiscoveryActive = d;
}
// FIXME mbhaynie
// receiver for QCopChannel("QPE/Bluetooth") messages.
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;
+ }
}
// Once the hcitool scan is complete, report back.
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 );
}
void BluezApplet::mousePressEvent( QMouseEvent *) {
QPopupMenu *menu = new QPopupMenu();
QPopupMenu *signal = new QPopupMenu();
@@ -257,33 +310,55 @@ int BluezApplet::position()
bool oldactive = bluezactive;
int olddiscovery = bluezDiscoveryActive;
bluezactive = checkBluezStatus();
bluezDiscoveryActive = checkBluezDiscoveryStatus();
- if ((bluezactive != oldactive) || (bluezDiscoveryActive != olddiscovery)) {
+ if ((bluezactive != oldactive) ||
+ (bluezDiscoveryActive != olddiscovery))
update();
+ if (bluezactive && doListDevice) {
+ const QByteArray arr;
+ slotMessage("listDevices()", arr);
}
}
/**
* Implementation of the paint event
* @param the QPaintEvent
*/
void BluezApplet::paintEvent( QPaintEvent* ) {
QPainter p(this);
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
@@ -30,12 +30,13 @@
#define __BLUEZAPPLET_H__
#include <qwidget.h>
#include <qpixmap.h>
#include <qtimer.h>
#include <manager.h>
+#include <opie2/oprocess.h>
namespace OpieTooth {
class Device;
class BluezApplet : public QWidget {
Q_OBJECT
@@ -63,16 +64,19 @@ public slots:
Manager *btManager;
QPixmap bluezOnPixmap;
QPixmap bluezOffPixmap;
QPixmap bluezDiscoveryOnPixmap;
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);
};
};
#endif