author | mickeyl <mickeyl> | 2006-05-02 08:57:25 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2006-05-02 08:57:25 (UTC) |
commit | d5b6868cb4f99d2c3dc3587115cd37c09e4610eb (patch) (side-by-side diff) | |
tree | 1397f12f885c849419e511ad203d19696c4ae07e | |
parent | 1295db77f2ab7e9125183e4240de0b92f72940e4 (diff) | |
download | opie-d5b6868cb4f99d2c3dc3587115cd37c09e4610eb.zip opie-d5b6868cb4f99d2c3dc3587115cd37c09e4610eb.tar.gz opie-d5b6868cb4f99d2c3dc3587115cd37c09e4610eb.tar.bz2 |
bluetooth patches courtesy Dmitriy Korovkin (thanks!):
* When sending data to a device, do service discovery in order to get port number.
* Switched to ussp-push for sending.
* Clear receivers list on rescan.
* Changed the way of window closing in order to shut down IRDA and bluetooth correctly.
-rw-r--r-- | core/obex/btobex.cpp | 85 | ||||
-rw-r--r-- | core/obex/btobex.h | 8 | ||||
-rw-r--r-- | core/obex/obex.pro | 4 | ||||
-rw-r--r-- | core/obex/obexsend.cpp | 26 |
4 files changed, 94 insertions, 29 deletions
diff --git a/core/obex/btobex.cpp b/core/obex/btobex.cpp index a2866f6..bb5c06d 100644 --- a/core/obex/btobex.cpp +++ b/core/obex/btobex.cpp @@ -1,4 +1,6 @@ #include "btobex.h" +#include <manager.h> +#include <services.h> /* OPIE */ @@ -8,6 +10,7 @@ /* QT */ #include <qfileinfo.h> - - +#include <qstring.h> +#include <qmap.h> +#include <qmessagebox.h> using namespace OpieObex; @@ -15,4 +18,5 @@ using namespace OpieObex; using namespace Opie::Core; /* TRANSLATOR OpieObex::Obex */ +using namespace OpieTooth; BtObex::BtObex( QObject *parent, const char* name ) @@ -27,9 +31,14 @@ BtObex::BtObex( QObject *parent, const char* name ) connect( this, SIGNAL(sent(bool) ), SLOT(slotError() ) ); + btManager = NULL; }; + BtObex::~BtObex() { + if (btManager) + delete btManager; delete m_rec; delete m_send; } + void BtObex::receive() { m_receive = true; @@ -69,6 +78,52 @@ void BtObex::send( const QString& fileName, const QString& bdaddr) { } } + //Now we need to find out if the OBEX push is supported for this device + //And get the port number + if (!btManager) { + btManager = new Manager("hci0"); + connect(btManager, + SIGNAL(foundServices(const QString&, Services::ValueList)), + this, SLOT(slotFoundServices(const QString&, Services::ValueList))); + } + btManager->searchServices(bdaddr); +} + +/** + * This function reacts on the service discovery finish + */ +void BtObex::slotFoundServices(const QString&, Services::ValueList svcList) +{ + QValueList<OpieTooth::Services>::Iterator it; + QMap<int, QString> classList; //The classes list + QMap<int, QString>::Iterator classIt; //Iterator in the class list + int portNum = -1; //The desired port number + odebug << "BtObex slotFoundServices" << oendl; + if (svcList.isEmpty()) { + QMessageBox::critical(NULL, tr("Object send"), tr("No services found")); + emit error(-1); + return; + } + for (it = svcList.begin(); it != svcList.end(); it++) { + classList = (*it).classIdList(); + classIt = classList.begin(); + if (classIt == classList.end()) + continue; +////We really need symbolic names for service IDs + //Ok, we have found the object push service + if (classIt.key() == 4357) { + portNum = (*it).protocolDescriptorList().last().port(); + break; + } + } + if (portNum == -1) { + QMessageBox::critical(NULL, tr("Object send"), + tr("No OBEX Push service")); + emit error(-1); + return; + } + m_port = portNum; sendNow(); } + void BtObex::sendNow(){ if ( m_count >= 25 ) { // could not send @@ -78,22 +133,21 @@ void BtObex::sendNow(){ } // OProcess inititialisation - m_send = new OProcess(); + m_send = new OProcess(0, "ussp-push"); m_send->setWorkingDirectory( QFileInfo(m_file).dirPath(true) ); - // obextool push file <bdaddr> [channel] - // 9 for phones. - // Palm T3 accepts pictures on 1 - *m_send << "obextool" << "push"; + // ussp-push --timeo 30 <btaddr:port> file file + *m_send << "ussp-push" << "--timeo 30"; + *m_send << m_bdaddr + "@" + QString::number(m_port); *m_send << QFile::encodeName(QFileInfo(m_file).fileName()); - *m_send << m_bdaddr << "9"; - + *m_send << QFile::encodeName(QFileInfo(m_file).fileName()); + m_send->setUseShell(true); + // connect to slots Exited and and StdOut connect(m_send, SIGNAL(processExited(Opie::Core::OProcess*) ), this, SLOT(slotExited(Opie::Core::OProcess*)) ); - connect(m_send, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int )), + connect(m_send, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int)), this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) ); - // now start it - if (!m_send->start(/*OProcess::NotifyOnExit, OProcess::AllOutput*/ ) ) { + if (!m_send->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { m_count = 25; emit error(-1 ); @@ -107,4 +161,6 @@ void BtObex::sendNow(){ void BtObex::slotExited(OProcess* proc ){ + odebug << proc->name() << " exited with result " + << proc->exitStatus() << oendl; if (proc == m_rec ) // receive process received(); @@ -141,5 +197,5 @@ void BtObex::sendEnd() { m_send=0; emit sent(true); - }else if (m_send->exitStatus() == 255 ) { // it failed maybe the other side wasn't ready + }else if (m_send->exitStatus() != 0 ) { // it failed maybe the other side wasn't ready // let's try it again delete m_send; @@ -155,9 +211,10 @@ void BtObex::sendEnd() { // This probably doesn't do anything useful for bt. -QString BtObex::parseOut( ){ +QString BtObex::parseOut(){ QString path; QStringList list = QStringList::split("\n", m_outp); QStringList::Iterator it; for (it = list.begin(); it != list.end(); ++it ) { + odebug << (*it) << oendl; if ( (*it).startsWith("Wrote" ) ) { int pos = (*it).findRev('(' ); diff --git a/core/obex/btobex.h b/core/obex/btobex.h index 5ab591c..099f04a 100644 --- a/core/obex/btobex.h +++ b/core/obex/btobex.h @@ -5,7 +5,10 @@ #include <qobject.h> +#include <services.h> +#include <manager.h> namespace Opie {namespace Core {class OProcess;}} class QCopChannel; +using namespace OpieTooth; namespace OpieObex { // Maybe this should be derved from Obex. @@ -56,7 +59,9 @@ namespace OpieObex { QString m_outp; QString m_bdaddr; + int m_port; Opie::Core::OProcess *m_send; Opie::Core::OProcess *m_rec; bool m_receive : 1; + OpieTooth::Manager* btManager; void shutDownReceive(); @@ -64,7 +69,8 @@ private slots: // the process exited - void slotExited(Opie::Core::OProcess* proc) ; + void slotExited(Opie::Core::OProcess*) ; void slotStdOut(Opie::Core::OProcess*, char*, int); void slotError(); + void slotFoundServices(const QString&, Services::ValueList); private: diff --git a/core/obex/obex.pro b/core/obex/obex.pro index d6b527c..33cb957 100644 --- a/core/obex/obex.pro +++ b/core/obex/obex.pro @@ -6,7 +6,7 @@ TARGET = opieobex DESTDIR = $(OPIEDIR)/plugins/obex INTERFACES = obexsendbase.ui -INCLUDEPATH += $(OPIEDIR)/include $(OPIEDIR)/core/launcher +INCLUDEPATH += $(OPIEDIR)/include $(OPIEDIR)/core/launcher $(OPIEDIR)/noncore/net/opietooth/lib DEPENDPATH += -LIBS += -lqpe -lopiecore2 +LIBS += -lopietooth1 -lqpe -lopiecore2 VERSION = 0.0.3 diff --git a/core/obex/obexsend.cpp b/core/obex/obexsend.cpp index 9cd9972..dbbb7b3 100644 --- a/core/obex/obexsend.cpp +++ b/core/obex/obexsend.cpp @@ -21,6 +21,6 @@ using namespace Opie::Core; #include <qpixmap.h> #include <qlistview.h> -#include <qtimer.h> +#include <unistd.h> /* TRANSLATOR OpieObex::SendWidget */ @@ -84,5 +84,5 @@ int SendWidget::addReceiver(const char *r, const char *icon) bool SendWidget::receiverSelected(int id) { - return receivers[id]->pixmap(2); + return (bool)(receivers[id]->pixmap(2) != NULL); } @@ -142,5 +142,5 @@ void SendWidget::slotStartIrda() { if ( !m_irDa.count() ) return; if ( m_irDaIt == m_irDa.end() ) { - irdaStatus->setText(tr("complete.")); + irdaStatus->setText(tr("complete.")); return; } @@ -174,5 +174,5 @@ void SendWidget::slotStartBt() { ++m_btIt; if (m_btIt == m_bt.end() ) { - btStatus->setText(tr("complete.")); + btStatus->setText(tr("complete.")); return; } @@ -188,5 +188,6 @@ void SendWidget::send_to_receivers() { void SendWidget::scan_for_receivers() { - //FIXME: Clean ListBox prior to (re)scan + receiverList->clear(); + receivers.clear(); sendButton->setDisabled( true ); @@ -220,19 +221,20 @@ void SendWidget::toggle_receiver(QListViewItem* item) // toggle the state of an individual receiver. if(item->pixmap(2)) - item->setPixmap(2,QPixmap()); + item->setPixmap(2,QPixmap()); else - item->setPixmap(2,Resource::loadPixmap("backup/check.png")); + item->setPixmap(2,Resource::loadPixmap("backup/check.png")); } void SendWidget::closeEvent( QCloseEvent* e) { - e->accept(); // make sure - QTimer::singleShot(0, this, SLOT(userDone() ) ); -} -void SendWidget::userDone() { + obexSendBase::closeEvent(e); QCopEnvelope e0("QPE/IrDaApplet", "disableIrda()"); QCopEnvelope e1("QPE/Bluetooth", "disableBluetooth()"); - emit done(); } + +void SendWidget::userDone() { + close(); +} + QString SendWidget::file()const { return m_file; |