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 /core/obex/btobex.cpp | |
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 | 79 |
1 files changed, 68 insertions, 11 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,39 +1,48 @@ #include "btobex.h" +#include <manager.h> +#include <services.h> /* OPIE */ #include <opie2/oprocess.h> #include <opie2/odebug.h> /* QT */ #include <qfileinfo.h> - - +#include <qstring.h> +#include <qmap.h> +#include <qmessagebox.h> using namespace OpieObex; using namespace Opie::Core; /* TRANSLATOR OpieObex::Obex */ +using namespace OpieTooth; BtObex::BtObex( QObject *parent, const char* name ) : QObject(parent, name ) { m_rec = 0; m_send=0; m_count = 0; m_receive = false; connect( this, SIGNAL(error(int) ), // for recovering to receive SLOT(slotError() ) ); 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; m_outp = QString::null; m_rec = new OProcess(); // TODO mbhaynie: No idea if this actually works -- maybe opd is better. @@ -65,50 +74,97 @@ void BtObex::send( const QString& fileName, const QString& bdaddr) { }else{ emit error( -1 ); // we did not delete yet but it's not running slotExited is pending return; } } + //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 emit error(-1 ); emit sent(false); return; } // 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 )), 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 ); delete m_send; m_send=0; } // end m_count++; emit currentTry( m_count ); } void BtObex::slotExited(OProcess* proc ){ + odebug << proc->name() << " exited with result " + << proc->exitStatus() << oendl; if (proc == m_rec ) // receive process received(); else if ( proc == m_send ) sendEnd(); } @@ -137,13 +193,13 @@ void BtObex::received() { void BtObex::sendEnd() { if (m_send->normalExit() ) { if ( m_send->exitStatus() == 0 ) { delete m_send; 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; m_send = 0; sendNow(); } }else { @@ -156,12 +212,13 @@ void BtObex::sendEnd() { // This probably doesn't do anything useful for bt. 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('(' ); if ( pos > 0 ) { path = (*it).remove( pos, (*it).length() - pos ); path = path.mid(6 ); |