summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/securityplugins/blueping/bluepingplugin.cpp86
-rw-r--r--noncore/securityplugins/blueping/bluepingplugin.h7
2 files changed, 58 insertions, 35 deletions
diff --git a/noncore/securityplugins/blueping/bluepingplugin.cpp b/noncore/securityplugins/blueping/bluepingplugin.cpp
index f5d9ad6..1c514e5 100644
--- a/noncore/securityplugins/blueping/bluepingplugin.cpp
+++ b/noncore/securityplugins/blueping/bluepingplugin.cpp
@@ -12,45 +12,63 @@
#include <qtimer.h>
using namespace Opie::Core;
using Opie::Security::MultiauthPluginObject;
using Opie::Security::MultiauthConfigWidget;
/// standard c'tor
-BluepingPlugin::BluepingPlugin() : MultiauthPluginObject(), m_ping(0), m_bluepingW(0) {
- bluetoothAlreadyRestarted = false;
+BluepingPlugin::BluepingPlugin() : MultiauthPluginObject(), m_ping(0), m_bluepingW(0), bluetoothWasOff(false) {
}
-/// cleans m_ping if we need to
+/// cleans m_ping and m_bluepingW if we need to
BluepingPlugin::~BluepingPlugin() {
- delete m_ping;
+ odebug << "closing Blueping plugin..." << oendl;
+ if (m_ping != 0)
+ delete m_ping;
if (m_bluepingW != 0)
delete m_bluepingW;
+ killBluetoothIfNecessary();
}
/// Simply return its name (Blueping plugin)
QString BluepingPlugin::pluginName() const {
return "Blueping plugin";
}
/// returns a BluepingConfigWidget
MultiauthConfigWidget * BluepingPlugin::configWidget(QWidget * parent) {
if (m_bluepingW == 0)
m_bluepingW = new BluepingConfigWidget(parent, "Blueping configuration widget");
return m_bluepingW;
}
+
QString BluepingPlugin::pixmapNameWidget() const {
return "security/bluepingplugin";
}
+
QString BluepingPlugin::pixmapNameConfig() const {
return "security/bluepingplugin";
}
+/// If Bluetooth was off before the plugin ran, we switch it off again
+void BluepingPlugin::killBluetoothIfNecessary() {
+ if (bluetoothWasOff) {
+ OProcess killB;
+ killB << "killall" << "hciattach";
+ odebug << "killing Bluetooth... (since it was up only for Blueping)" << oendl;
+ if ( !killB.start(OProcess::Block) ) {
+ oerr << "could not kill bluetooth" << oendl;
+ }
+ } else {
+ odebug << "keeping Bluetooth on" << oendl;
+ }
+}
+
/// Emit the MultiauthPluginObject::Success emitCode
void BluepingPlugin::success() {
emit emitCode(MultiauthPluginObject::Success);
}
/// Emit the MultiauthPluginObject::Failure emitCode
void BluepingPlugin::failure() {
emit emitCode(MultiauthPluginObject::Failure);
@@ -76,28 +94,28 @@ void BluepingPlugin::ping() {
oerr << "could not start l2ping" << oendl;
this->skip();
}
QObject::connect(m_ping, SIGNAL(processExited(Opie::Core::OProcess*)),
this, SLOT(pingFinished(Opie::Core::OProcess*)) );
}
/// Deals with m_ping result
- void BluepingPlugin::pingFinished(OProcess * ping) {
- if ( ping->normalExit() && (ping->exitStatus() == 0) )
- {
- odebug << "Successful Bluetooth ping!" << oendl;
- success();
- }
- else
- {
- odebug << "Failed Bluetooth ping..." << oendl;
- failure();
- }
+void BluepingPlugin::pingFinished(OProcess * ping) {
+ if ( ping->normalExit() && (ping->exitStatus() == 0) )
+ {
+ odebug << "Successful Bluetooth ping!" << oendl;
+ success();
}
+ else
+ {
+ odebug << "Failed Bluetooth ping... (normalExit: " << ping->normalExit() << ", exitStatus: " << ping->exitStatus() << ")" << oendl;
+ failure();
+ }
+}
/// Make one authentication attempt with this plugin
/**
* (very simple "success" / "failure" buttons in a dialog)
* \return The outcome code of this authentication
*/
int BluepingPlugin::authenticate() {
@@ -131,27 +149,30 @@ int BluepingPlugin::authenticate() {
layout->addWidget(&subTitle2);
layout->addWidget(&pbSkip, 0, Qt::AlignHCenter);
// connect the skip button to the skip signal emitting function
QObject::connect(&pbSkip, SIGNAL(clicked()), this, SLOT(skip()));
// connect the signal emitting functions to the bluepingDialog done(int) finishing function
QObject::connect(this, SIGNAL(emitCode(int)), &bluepingDialog, SLOT(done(int)));
- // we can uncomment the following when testing
- //bluetoothAlreadyRestarted = true;
- if (!bluetoothAlreadyRestarted)
+
+
+ /* let's start Bluetooth if it's not running
+ */
+ OProcess checkB;
+ checkB << "pidof" << "hciattach";
+ odebug << "checking if Bluetooth is running..." << oendl;
+ // now we start bluetooth *only* if the previous command works, exits normally, and
+ // it returns a non-null exit code (which means hciattach is not running)
+ if ( checkB.start(OProcess::Block) && checkB.normalExit() && (checkB.exitStatus() != 0) )
{
- // we have just started or resumed the device, so Bluetooth has to be (re)started
- OProcess killB;
- killB << "killall" << "hciattach";
- odebug << "killing Bluetooth..." << oendl;
- if ( !killB.start(OProcess::Block) ) {
- oerr << "could not kill bluetooth" << oendl;
- }
+ // remember to switch off Bluetooth once we're finished...
+ bluetoothWasOff = true;
+ odebug << "Bluetooth is not running, we must start it now" << oendl;
OProcess startB;
switch ( ODevice::inst()->model() ) {
case Model_iPAQ_H39xx:
startB << "/sbin/hciattach" << "/dev/tts/1" << "bcsp" << "921600";
break;
case Model_iPAQ_H5xxx:
@@ -159,39 +180,40 @@ int BluepingPlugin::authenticate() {
break;
default:
startB << "/sbin/hciattach" << "/dev/ttySB0" << "bcsp" << "230400";
break;
} // end switch on device models
if ( !startB.start(OProcess::Block) ) {
- oerr << "could not (re)start bluetooth" << oendl;
+ oerr << "could not start Bluetooth" << oendl;
return MultiauthPluginObject::Skip;
}
else
{
- if ( startB.normalExit() && (startB.exitStatus() == 0) )
+ if ( (startB.normalExit()) && (startB.exitStatus() == 0) )
{
- odebug << "hciattach exited normally."<< oendl;
- bluetoothAlreadyRestarted = true;
+ odebug << "hciattach exited normally, Bluetooth is probably on now, let's wait 500 ms and ping" << oendl;
// 500 ms timer, so l2ping won't try to find a route before bluetooth has \em really started
QTimer::singleShot( 500, this, SLOT(ping()) );
}
else
{
- owarn << "hciattach exited anormally (error code: " << startB.exitStatus() << ")" << oendl;
- } // end if startBluetooth exit status == 0
+ owarn << "hciattach exited anormally (normalExit: " << startB.normalExit() << ", exit status: " << startB.exitStatus() << ")" << oendl;
+ return MultiauthPluginObject::Skip;
+ } // end if startB exited normaly
} // end if startBluetooth started
}
else
{
// we don't need to wait, since bluetooth has been started long enough ago
+ odebug << "Bluetooth is already running, we can try to ping now" << oendl;
ping();
- } // end if bluetooth not restarted
+ } // end if Bluetooth was off
// start the dialog event loop, while the ping is starting (or will start soon) in the background
return bluepingDialog.exec();
}
else
diff --git a/noncore/securityplugins/blueping/bluepingplugin.h b/noncore/securityplugins/blueping/bluepingplugin.h
index b8d6734..56ff22d 100644
--- a/noncore/securityplugins/blueping/bluepingplugin.h
+++ b/noncore/securityplugins/blueping/bluepingplugin.h
@@ -68,16 +68,17 @@ class BluepingPlugin : public QObject, public Opie::Security::MultiauthPluginObj
private slots:
void success();
void failure();
void skip();
void ping();
void pingFinished(Opie::Core::OProcess * ping);
private:
- Opie::Core::OProcess *m_ping;
+ void killBluetoothIfNecessary();
+ Opie::Core::OProcess * m_ping;
+ Config * m_config;
BluepingConfigWidget * m_bluepingW;
- bool bluetoothAlreadyRestarted;
+ bool bluetoothWasOff;
QString macToPing;
-
};
#endif