From 5521b2c0508cf6e6a390bd4796e8c9f2c7a6d05f Mon Sep 17 00:00:00 2001 From: korovkin Date: Wed, 10 May 2006 13:32:46 +0000 Subject: OBEX push functionality moved to libbluetooth1. Made some reformatting in device.cc In bluezapplet.cpp /etc/init.d/bluetooth is started synchronously if it's called from QCopMessage. --- (limited to 'noncore') diff --git a/noncore/net/opietooth/applet/bluezapplet.cpp b/noncore/net/opietooth/applet/bluezapplet.cpp index 90b0c6d..6351d4e 100644 --- a/noncore/net/opietooth/applet/bluezapplet.cpp +++ b/noncore/net/opietooth/applet/bluezapplet.cpp @@ -116,7 +116,7 @@ namespace OpieTooth { } } - int BluezApplet::setBluezStatus(int c) { + int BluezApplet::setBluezStatus(int c, bool sync) { if ( c == 1 ) { switch ( ODevice::inst()->model() ) { @@ -138,8 +138,12 @@ namespace OpieTooth { btDevice = new Device( "/dev/ttySB0", "bcsp", "230400" ); break; } - QCopEnvelope e("QPE/System", "execute(QString)"); - e << QString("/etc/init.d/bluetooth start"); + if (sync) { + ::system("/etc/init.d/bluetooth start >/dev/null 2>/dev/null"); + } else { + QCopEnvelope e("QPE/System", "execute(QString)"); + e << QString("/etc/init.d/bluetooth start"); + } } else { ::system("/etc/init.d/bluetooth stop >/dev/null 2>/dev/null"); if ( btManager ) { @@ -169,7 +173,7 @@ namespace OpieTooth { if ( str == "enableBluetooth()") { m_wasOn = checkBluezStatus(); if (!m_wasOn) { - setBluezStatus(1); + setBluezStatus(1, true); sleep(2); } } diff --git a/noncore/net/opietooth/applet/bluezapplet.h b/noncore/net/opietooth/applet/bluezapplet.h index 90bee3b..1937934 100644 --- a/noncore/net/opietooth/applet/bluezapplet.h +++ b/noncore/net/opietooth/applet/bluezapplet.h @@ -55,7 +55,7 @@ public slots: void paintEvent( QPaintEvent* ); void launchManager(); bool checkBluezStatus(); - int setBluezStatus(int); + int setBluezStatus(int, bool sync = false); int checkBluezDiscoveryStatus(); int setBluezDiscoveryStatus(int); diff --git a/noncore/net/opietooth/lib/device.cc b/noncore/net/opietooth/lib/device.cc index 40acbd2..2f04d46 100644 --- a/noncore/net/opietooth/lib/device.cc +++ b/noncore/net/opietooth/lib/device.cc @@ -16,33 +16,31 @@ using namespace OpieTooth; using Opie::Core::OProcess; namespace { - int parsePid( const QCString& par ) - { - int id=0; - QString string( par ); - QStringList list = QStringList::split( '\n', string ); + int parsePid( const QCString& par ) + { + int id = 0; + QString string( par ); + QStringList list = QStringList::split( '\n', string ); - for( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) - { - owarn << "parsePID: " << (*it).latin1() << oendl; + for( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + owarn << "parsePID: " << (*it).latin1() << oendl; - // FIXME mbhaynie: Surely there is a better way to skip - // verbosity (E.g. the TI device configuration - // script). Apparently the PID is always on a line by - // itself, or is at least the first word of a line. Does - // QString have somethine like startsWithRegex("[0-9]+")? - if( (*it).startsWith("#") ) continue; - if( (*it).startsWith("TI") ) continue; - if( (*it).startsWith("Loading") ) continue; - if( (*it).startsWith("BTS") ) continue; - if( !(*it).startsWith("CSR") ) - { - id = (*it).toInt(); - break; - } - } - return id; + // FIXME mbhaynie: Surely there is a better way to skip + // verbosity (E.g. the TI device configuration + // script). Apparently the PID is always on a line by + // itself, or is at least the first word of a line. Does + // QString have somethine like startsWithRegex("[0-9]+")? + if( (*it).startsWith("#") ) continue; + if( (*it).startsWith("TI") ) continue; + if( (*it).startsWith("Loading") ) continue; + if( (*it).startsWith("BTS") ) continue; + if( !(*it).startsWith("CSR") ) { + id = (*it).toInt(); + break; + } } + return id; + } } Device::Device(const QString &device, const QString &mode, const QString &speed ) @@ -75,13 +73,9 @@ void Device::attach(){ // FIXME -- this is a hack for an odd hciattach interface. if ( ODevice::inst()->modelString() == "HX4700" ) - { - *m_process << "-S" << "/etc/bluetooth/TIInit_3.2.26.bts" << "/dev/ttyS1" << "texas"; - } + *m_process << "-S" << "/etc/bluetooth/TIInit_3.2.26.bts" << "/dev/ttyS1" << "texas"; else - { - *m_process << m_device << m_mode << m_speed; - } + *m_process << m_device << m_mode << m_speed; connect(m_process, SIGNAL( processExited(Opie::Core::OProcess*) ), this, SLOT( slotExited(Opie::Core::OProcess* ) ) ); connect(m_process, SIGNAL( receivedStdout(Opie::Core::OProcess*, char*, int) ), @@ -93,16 +87,18 @@ void Device::attach(){ delete m_process; m_process = 0; } - }; + } } void Device::detach(){ delete m_hci; + m_hci = 0; delete m_process; + m_process = 0; // kill the pid we got if(m_attached ){ //kill the pid owarn << "killing" << oendl; - kill(pid, 9); + ::kill(pid, 9); } owarn << "detached" << oendl; } @@ -121,27 +117,27 @@ void Device::slotExited( OProcess* proc) owarn << "normalExit" << oendl; int ret = m_process->exitStatus(); if( ret == 0 ){ // attached - owarn << "attached" << oendl; - owarn << "Output: " << m_output.data() << oendl; - pid = parsePid( m_output ); - owarn << "Pid = " << pid << oendl; - // now hciconfig hci0 up ( determine hciX FIXME) - // and call hciconfig hci0 up - // FIXME hardcoded to hci0 now :( - m_hci = new OProcess( ); - *m_hci << "hciconfig"; - *m_hci << "hci0 up"; - connect(m_hci, SIGNAL( processExited(Opie::Core::OProcess*) ), + owarn << "attached" << oendl; + owarn << "Output: " << m_output.data() << oendl; + pid = parsePid( m_output ); + owarn << "Pid = " << pid << oendl; + // now hciconfig hci0 up ( determine hciX FIXME) + // and call hciconfig hci0 up + // FIXME hardcoded to hci0 now :( + m_hci = new OProcess( ); + *m_hci << "hciconfig"; + *m_hci << "hci0 up"; + connect(m_hci, SIGNAL( processExited(Opie::Core::OProcess*) ), this, SLOT( slotExited(Opie::Core::OProcess* ) ) ); - if(!m_hci->start() ){ - owarn << "could not start" << oendl; - m_attached = false; - emit device("hci0", false ); - } + if(!m_hci->start() ){ + owarn << "could not start" << oendl; + m_attached = false; + emit device("hci0", false ); + } }else{ owarn << "crass" << oendl; - m_attached = false; - emit device("hci0", false ); + m_attached = false; + emit device("hci0", false ); } } @@ -153,13 +149,13 @@ void Device::slotExited( OProcess* proc) owarn << "normal exit" << oendl; int ret = m_hci->exitStatus(); if( ret == 0 ){ - owarn << "attached really really attached" << oendl; - m_attached = true; - emit device("hci0", true ); + owarn << "attached really really attached" << oendl; + m_attached = true; + emit device("hci0", true ); }else{ - owarn << "failed" << oendl; - emit device("hci0", false ); - m_attached = false; + owarn << "failed" << oendl; + emit device("hci0", false ); + m_attached = false; } }// normal exit delete m_hci; diff --git a/noncore/net/opietooth/lib/lib.pro b/noncore/net/opietooth/lib/lib.pro index 781bf15..e11af9a 100644 --- a/noncore/net/opietooth/lib/lib.pro +++ b/noncore/net/opietooth/lib/lib.pro @@ -1,9 +1,12 @@ TEMPLATE = lib CONFIG += qte warn_on HEADERS = connection.h parser.h device.h manager.h remotedevice.h services.h \ - startpanconnection.h startdunconnection.h bt-serial.h forwarder.h + startpanconnection.h startdunconnection.h obexpush.h \ + bt-serial.h forwarder.h SOURCES = connection.cpp parser.cc device.cc manager.cc remotedevice.cc services.cc \ - startpanconnection.cpp startdunconnection.cpp bt-serial.c forwarder.cc + startpanconnection.cpp startdunconnection.cpp obexpush.cpp \ + bt-serial.c forwarder.cc + TARGET = opietooth1 INCLUDEPATH += $(OPIEDIR)/include . DESTDIR = $(OPIEDIR)/lib diff --git a/noncore/net/opietooth/lib/obexpush.cpp b/noncore/net/opietooth/lib/obexpush.cpp new file mode 100644 index 0000000..e0a4bee --- a/dev/null +++ b/noncore/net/opietooth/lib/obexpush.cpp @@ -0,0 +1,108 @@ +/* $Id$ */ +/* OBEX push functions implementation */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#include "obexpush.h" + +#include +#include + +#include +#include + +using namespace Opie::Core; +using namespace OpieTooth; + +ObexPush::ObexPush() +{ + pushProc = new OProcess(); + connect(pushProc, SIGNAL(processExited(Opie::Core::OProcess*)), + this, SLOT(slotPushExited(Opie::Core::OProcess*))); + connect(pushProc, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int)), + this, SLOT(slotPushOut(Opie::Core::OProcess*, char*, int))); + connect(pushProc, SIGNAL(receivedStderr(Opie::Core::OProcess*, char*, int)), + this, SLOT(slotPushErr(Opie::Core::OProcess*, char*, int))); + +} + +ObexPush::~ObexPush() +{ + if (pushProc->isRunning()) + pushProc->kill(); + delete pushProc; + pushProc = NULL; +} + +/** + * Function that sends a file + * @param mac destination device MAC address + * @param port service port number + * @param src source file name + * @param dst destination file name + * @return 0 on success, -1 on error, 1 if sending process is running + */ +int ObexPush::send(QString& mac, int port, QString& src, QString& dst) +{ + QString dev = mac; + QString execName = "ussp-push"; + if (pushProc->isRunning()) + return 1; + pushProc->clearArguments(); + dev += "@"; + dev += QString::number(port); + if (!dst.isEmpty()) + *pushProc << execName << "--timeo 30" << dev + << QFile::encodeName(src) << QFile::encodeName(dst); + else + *pushProc << execName << "--timeo 30" << dev + << QFile::encodeName(src) + << QFile::encodeName(QFileInfo(src).fileName()); + odebug << execName << " " << dev << " " << src << " " + << ((!dst.isEmpty())? dst: QFileInfo(src).fileName()) << oendl; + pushProc->setUseShell(true); + if (!pushProc->start(OProcess::NotifyOnExit, OProcess::All)) + return -1; + else + return 0; +} + +void ObexPush::slotPushExited(Opie::Core::OProcess* proc) +{ + if (pushProc != proc) + return; + odebug << "Process exited" << oendl; + if (pushProc->normalExit()) + emit sendComplete(pushProc->exitStatus()); + else + emit sendError(-1); +} + +/** + * Function makes a notification from slotPushOut and slotPushErr + */ +void ObexPush::notifyInfo(Opie::Core::OProcess* proc, char* buf, int len) +{ + if (proc != pushProc) + return; + QCString str(buf, len); + odebug << str << oendl; + emit status(str); +} + +void ObexPush::slotPushOut(Opie::Core::OProcess* proc, char* buf, int len) +{ + notifyInfo(proc, buf, len); +} + +void ObexPush::slotPushErr(Opie::Core::OProcess* proc, char* buf, int len) +{ + notifyInfo(proc, buf, len); +} + +//eof diff --git a/noncore/net/opietooth/lib/obexpush.h b/noncore/net/opietooth/lib/obexpush.h new file mode 100644 index 0000000..8147643 --- a/dev/null +++ b/noncore/net/opietooth/lib/obexpush.h @@ -0,0 +1,77 @@ +/* $Id$ */ +/* OBEX push functions declarations */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef _OBEXPUSH_H_ +#define _OBEXPUSH_H_ +#include +#include +#include "services.h" +#include +namespace OpieTooth { + class ObexPush : public QObject { + Q_OBJECT + public: + /** + * Constructor which creates an object + */ + ObexPush(); + + /** + * Public destructor + */ + ~ObexPush(); + + /** + * Function that sends a file + * @param mac destination device MAC address + * @param port service port number + * @param src source file name + * @param dst destination file name + * @return 0 on success, -1 on error, 1 if sending process is running + */ + int send(QString& mac, int port, QString& src, QString& dst); + + /** + * @return true if it's sending and false otherwise + */ + bool isSending() { return pushProc->isRunning(); } + signals: + /** + * Informs that the sending process has completed + * @param status the finish status + */ + void sendComplete(int); + + /** + * Informs that the sending process has finished with error + * @param status the finish status + */ + void sendError(int); + + /** + * Informs that we have a string status update + * @param str status string + */ + void status(QCString&); + protected slots: + void slotPushOut(Opie::Core::OProcess*, char*, int); + void slotPushErr(Opie::Core::OProcess*, char*, int); + void slotPushExited(Opie::Core::OProcess* proc); + protected: + /** + * Function makes a notification from slotPushOut and slotPushErr + */ + void notifyInfo(Opie::Core::OProcess*, char*, int); + protected: + Opie::Core::OProcess* pushProc; //The push process + }; +}; +#endif +//eof diff --git a/noncore/net/opietooth/manager/obexdialog.cpp b/noncore/net/opietooth/manager/obexdialog.cpp index 8d7b593..4b795b7 100644 --- a/noncore/net/opietooth/manager/obexdialog.cpp +++ b/noncore/net/opietooth/manager/obexdialog.cpp @@ -20,7 +20,8 @@ using namespace OpieTooth; using namespace Opie::Core; using namespace Opie::Ui; using namespace Opie::Core; -ObexDialog::ObexDialog(const QString& device, QWidget* parent, const char* name, bool modal, WFlags fl) +ObexDialog::ObexDialog(const QString& device, int port, + QWidget* parent, const char* name, bool modal, WFlags fl) : QDialog( parent, name, modal, fl ) { if ( !name ) @@ -28,9 +29,10 @@ ObexDialog::ObexDialog(const QString& device, QWidget* parent, const char* name setCaption( tr( "beam files " ) ) ; m_device = device; + m_port = port; layout = new QVBoxLayout( this ); - obexSend = new OProcess(); + obexSend = new ObexPush(); info = new QLabel( this ); info->setText( tr("Which file should be beamed?") ); @@ -62,18 +64,16 @@ ObexDialog::ObexDialog(const QString& device, QWidget* parent, const char* name connect( sendButton, SIGNAL( clicked() ), this, SLOT( sendData() ) ); - connect(obexSend, SIGNAL(processExited(Opie::Core::OProcess*)), - this, SLOT(slotProcessExited(Opie::Core::OProcess*))); - connect(obexSend, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int)), - this, SLOT(slotPushOut(Opie::Core::OProcess*, char*, int))); - connect(obexSend, SIGNAL(receivedStderr(Opie::Core::OProcess*, char*, int)), - this, SLOT(slotPushErr(Opie::Core::OProcess*, char*, int))); + connect(obexSend, SIGNAL(sendComplete(int)), + this, SLOT(slotPushComplete(int))); + connect(obexSend, SIGNAL(sendError(int)), + this, SLOT(slotPushError(int))); + connect(obexSend, SIGNAL(status(QCString&)), + this, SLOT(slotPushStatus(QCString&))); } ObexDialog::~ObexDialog() { - if (obexSend->isRunning()) - obexSend->kill(); delete obexSend; obexSend = NULL; } @@ -91,50 +91,32 @@ void ObexDialog::browse() { } void ObexDialog::sendData() { + int result; //function call result QString fileURL = cmdLine->text(); - QString file = QFileInfo( fileURL ).fileName(); QString modifiedName = chNameLine->text(); - QString execName = "ussp-push"; - - if (obexSend->isRunning()) + result = obexSend->send(m_device, m_port, fileURL, modifiedName); + if (result > 0) return; - obexSend->clearArguments(); - // vom popupmenu beziehen - if ( !modifiedName.isEmpty() ) { - *obexSend << execName << "--timeo 30" << m_device << fileURL << modifiedName; - } else { - *obexSend << execName << "--timeo 30" << m_device << fileURL << file; - } - obexSend->setUseShell(true); - if (!obexSend->start(OProcess::NotifyOnExit, OProcess::All) ) { + else if (result < 0) statLine->setText( tr("Error: couln't start process") ); - } else statLine->setText( tr("Sending") ); } -void ObexDialog::slotPushOut(OProcess*, char* buf, int len) { - QCString str(buf, len); +void ObexDialog::slotPushStatus(QCString& str) { status->append(str); } -void ObexDialog::slotPushErr(OProcess*, char* buf, int len) { - QCString str(buf, len); - status->append(str); +void ObexDialog::slotPushComplete(int result) { + status->append( tr("Finished with result ") ); + status->append( QString::number(result) ); + status->append( tr("\n") ); + odebug << result << oendl; + statLine->setText( tr("Finished: ") + tr(strerror(result)) ); } -void ObexDialog::slotProcessExited(OProcess*) { - if (obexSend == NULL) - return; - if (obexSend->normalExit()) { - status->append( tr("Finished with result ") ); - status->append( QString::number(obexSend->exitStatus()) ); - status->append( tr("\n") ); - odebug << obexSend->exitStatus() << oendl; - statLine->setText( tr("Finished: ") + tr(strerror(obexSend->exitStatus())) ); - } - else { - status->append( tr("Exited abnormally\n") ); - statLine->setText( tr("Exited abnormally") ); - } +void ObexDialog::slotPushError(int) { + status->append( tr("Exited abnormally\n") ); + statLine->setText( tr("Exited abnormally") ); } +//eof diff --git a/noncore/net/opietooth/manager/obexdialog.h b/noncore/net/opietooth/manager/obexdialog.h index 44a26f3..063b7f1 100644 --- a/noncore/net/opietooth/manager/obexdialog.h +++ b/noncore/net/opietooth/manager/obexdialog.h @@ -3,9 +3,9 @@ #include -#include #include #include +#include "obexpush.h" class QVBoxLayout; class QPushButton; @@ -20,16 +20,18 @@ namespace OpieTooth { Q_OBJECT public: - ObexDialog( const QString& device = 0, QWidget* parent = 0, const char* name = 0, bool modal = TRUE, WFlags fl = 0); + ObexDialog( const QString& device = 0, int port = 0, + QWidget* parent = 0, const char* name = 0, + bool modal = TRUE, WFlags fl = 0); ~ObexDialog(); private slots: void browse(); void sendData(); - void slotPushOut(Opie::Core::OProcess*, char*, int); - void slotPushErr(Opie::Core::OProcess*, char*, int); - void slotProcessExited(Opie::Core::OProcess* proc); + void slotPushStatus(QCString&); + void slotPushComplete(int); + void slotPushError(int); protected: QVBoxLayout* layout; @@ -42,7 +44,8 @@ private slots: private: // Device that is used QString m_device; - Opie::Core::OProcess *obexSend; + int m_port; //Port used + ObexPush* obexSend; }; } #endif diff --git a/noncore/net/opietooth/manager/obexftpdialog.cpp b/noncore/net/opietooth/manager/obexftpdialog.cpp index efb3ff2..2a578ac 100644 --- a/noncore/net/opietooth/manager/obexftpdialog.cpp +++ b/noncore/net/opietooth/manager/obexftpdialog.cpp @@ -243,7 +243,7 @@ void ObexFtpDialog::slotCd(QListViewItem* item) curdir += file->text(0); } odebug << "Browse " << curdir << oendl; - if (obexftp_setpath(client, curdir, 0) < 0) + if (obexftp_setpath(client, QFile::encodeName(curdir), 0) < 0) log(tr("CD failed: ") + tr(strerror(errno))); doBrowse(); } diff --git a/noncore/net/opietooth/manager/obexpopup.cpp b/noncore/net/opietooth/manager/obexpopup.cpp index d1d1b4a..759a452 100644 --- a/noncore/net/opietooth/manager/obexpopup.cpp +++ b/noncore/net/opietooth/manager/obexpopup.cpp @@ -18,7 +18,7 @@ using namespace OpieTooth; ObexPopup::ObexPopup(const OpieTooth::Services& service, OpieTooth::BTDeviceItem* item) : QPopupMenu(), m_service(service) { - owarn << "ObexPopup c'tor" << oendl; + odebug << "ObexPopup c'tor" << oendl; m_item = item; /* connect action */ @@ -39,10 +39,8 @@ void ObexPopup::slotPush() { QString device = m_item->mac(); int port = m_service.protocolDescriptorList().last().port(); - device += "@"; - device += QString::number(port); - owarn << "push something to " << device << oendl; - ObexDialog obexDialog(device); + odebug << "push something to " << device << " " << port << oendl; + ObexDialog obexDialog(device, port); QPEApplication::execDialog( &obexDialog ); } -- cgit v0.9.0.2