-rw-r--r-- | noncore/securityplugins/blueping/bluepingplugin.cpp | 86 | ||||
-rw-r--r-- | noncore/securityplugins/blueping/bluepingplugin.h | 7 |
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 @@ -14,21 +14,23 @@ 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"; } @@ -36,19 +38,35 @@ QString BluepingPlugin::pluginName() const { /// 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 @@ -78,24 +96,24 @@ void BluepingPlugin::ping() { } 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 */ @@ -133,23 +151,26 @@ int BluepingPlugin::authenticate() { // 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; @@ -161,35 +182,36 @@ int BluepingPlugin::authenticate() { 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(); 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 @@ -70,14 +70,15 @@ class BluepingPlugin : public QObject, public Opie::Security::MultiauthPluginObj 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 |