OBEx update

Dmitriy Korovkin <[email protected]>
Newsgroups gmane.comp.handhelds.opie.devel
Message-ID <[email protected]>
Dear Colleagues,
I've updated core/obex files. The changes do:
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.

Will apply it so, we'll be able to check them before release.
Thanks in advance,

-- 
Dmitriy

_______________________________________________

http://opie.handhelds.org/cgi-bin/moin.cgi/DeveloperWikiIndex

Opie-devel mailing list
[email protected]
https://handhelds.org/mailman/listinfo/opie-devel
obex.diff (text/plain, 9.4 KB)
Index: btobex.cpp
===================================================================
RCS file: /cvs/opie/core/obex/btobex.cpp,v
retrieving revision 1.1
diff -u -r1.1 btobex.cpp
--- btobex.cpp	22 Aug 2005 09:36:38 -0000	1.1
+++ btobex.cpp	29 Apr 2006 15:30:45 -0000
@@ -1,5 +1,7 @@
 
 #include "btobex.h"
+#include <manager.h>
+#include <services.h>
 
 /* OPIE */
 #include <opie2/oprocess.h>
@@ -7,13 +9,15 @@
 
 /* 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 )
@@ -26,11 +30,16 @@
              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;
@@ -68,8 +77,54 @@
             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 );
@@ -77,24 +132,23 @@
         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 )),
+    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;
@@ -106,6 +160,8 @@
 }
 
 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 ) 
@@ -140,7 +196,7 @@
       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;
@@ -154,11 +210,12 @@
 }
 
 // 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('(' );
         if ( pos > 0 ) {
Index: btobex.h
===================================================================
RCS file: /cvs/opie/core/obex/btobex.h,v
retrieving revision 1.1
diff -u -r1.1 btobex.h
--- btobex.h	22 Aug 2005 09:36:38 -0000	1.1
+++ btobex.h	29 Apr 2006 15:30:45 -0000
@@ -4,9 +4,12 @@
 #define OpieBtObex_H
 
 #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.
   class BtObex : public QObject {
@@ -55,17 +58,20 @@
       QString m_file;
       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();
 
 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:
       void sendNow();
Index: obex.pro
===================================================================
RCS file: /cvs/opie/core/obex/obex.pro,v
retrieving revision 1.12
diff -u -r1.12 obex.pro
--- obex.pro	23 Aug 2005 09:55:13 -0000	1.12
+++ obex.pro	29 Apr 2006 15:30:45 -0000
@@ -5,9 +5,9 @@
 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
 
 include( $(OPIEDIR)/include.pro )
Index: obexsend.cpp
===================================================================
RCS file: /cvs/opie/core/obex/obexsend.cpp,v
retrieving revision 1.13
diff -u -r1.13 obexsend.cpp
--- obexsend.cpp	23 Aug 2005 20:37:03 -0000	1.13
+++ obexsend.cpp	29 Apr 2006 15:30:45 -0000
@@ -20,8 +20,8 @@
 #include <qpushbutton.h>
 #include <qpixmap.h>
 #include <qlistview.h>
-#include <qtimer.h>
 
+#include <unistd.h>
 /* TRANSLATOR OpieObex::SendWidget */
 
 SendWidget::SendWidget( QWidget* parent, const char* name )
@@ -83,7 +83,7 @@
 
 bool SendWidget::receiverSelected(int id)
 {
-    return receivers[id]->pixmap(2);
+    return (bool)(receivers[id]->pixmap(2) != NULL);
 }
 
 void SendWidget::setReceiverStatus( int id, const QString& status ) {
@@ -141,7 +141,7 @@
 void SendWidget::slotStartIrda() {
 	if ( !m_irDa.count() ) return;
     if ( m_irDaIt == m_irDa.end() ) {
-	irdaStatus->setText(tr("complete."));
+        irdaStatus->setText(tr("complete."));
         return;
     }
     setReceiverStatus( m_irDaIt.key(), tr("Start sending") );
@@ -173,7 +173,7 @@
     while((m_btIt != m_bt.end()) && !receiverSelected(m_btIt.key()))
 	  ++m_btIt;
     if (m_btIt == m_bt.end() ) {
-	btStatus->setText(tr("complete."));
+        btStatus->setText(tr("complete."));
         return;
     }
     setReceiverStatus( m_btIt.key(), tr("Start sending") );
@@ -187,7 +187,8 @@
 
 void SendWidget::scan_for_receivers()
 {
-    //FIXME: Clean ListBox prior to (re)scan
+    receiverList->clear();
+    receivers.clear();
     sendButton->setDisabled( true );
 
     if ( !QCopChannel::isRegistered("QPE/IrDaApplet") )
@@ -219,21 +220,22 @@
 {
     // 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;
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.