author | korovkin <korovkin> | 2006-05-10 13:32:46 (UTC) |
---|---|---|
committer | korovkin <korovkin> | 2006-05-10 13:32:46 (UTC) |
commit | 5521b2c0508cf6e6a390bd4796e8c9f2c7a6d05f (patch) (side-by-side diff) | |
tree | e9ea63a2fe15982e98886af727649dc6a513faac /noncore/net/opietooth/lib | |
parent | 620d55ae3b94fa8d2fa696b6626893e4520c3a02 (diff) | |
download | opie-5521b2c0508cf6e6a390bd4796e8c9f2c7a6d05f.zip opie-5521b2c0508cf6e6a390bd4796e8c9f2c7a6d05f.tar.gz opie-5521b2c0508cf6e6a390bd4796e8c9f2c7a6d05f.tar.bz2 |
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.
-rw-r--r-- | noncore/net/opietooth/lib/device.cc | 16 | ||||
-rw-r--r-- | noncore/net/opietooth/lib/lib.pro | 7 | ||||
-rw-r--r-- | noncore/net/opietooth/lib/obexpush.cpp | 108 | ||||
-rw-r--r-- | noncore/net/opietooth/lib/obexpush.h | 77 |
4 files changed, 196 insertions, 12 deletions
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 @@ -1,186 +1,182 @@ #include "device.h" /* OPIE */ #include <opie2/oprocess.h> #include <opie2/odebug.h> #include <opie2/odevice.h> using namespace Opie::Core; /* STD */ #include <signal.h> 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 ); - for( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) - { + 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") ) - { + if( !(*it).startsWith("CSR") ) { id = (*it).toInt(); break; } } return id; } } Device::Device(const QString &device, const QString &mode, const QString &speed ) : QObject(0, "device") { owarn << "OpieTooth::Device create" << oendl; m_hci = 0; m_process = 0; m_attached = false; m_device = device; m_mode = mode; m_speed = speed; attach(); } Device::~Device(){ detach(); } // FIXME mbhaynie -- If BT is active, and opie is restarted, this // applet thinks bt is down, and will fail to start it again. Not // sure why. void Device::attach(){ owarn << "attaching " << m_device.latin1() << " " << m_mode.latin1() << " " << m_speed.latin1() << oendl; if(m_process == 0 ){ m_output.resize(0); owarn << "new process to create" << oendl; m_process = new OProcess(); *m_process << "hciattach"; *m_process << "-p"; // 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"; - } else - { *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) ), this, SLOT(slotStdOut(Opie::Core::OProcess*,char*,int ) ) ); connect(m_process, SIGNAL(receivedStderr(Opie::Core::OProcess*, char*, int ) ), this, SLOT(slotStdErr(Opie::Core::OProcess*,char*,int) ) ); if(!m_process->start(OProcess::NotifyOnExit, OProcess::AllOutput ) ){ owarn << "Could not start" << oendl; 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; } bool Device::isLoaded()const{ return m_attached; } QString Device::devName()const { return QString::fromLatin1("hci0"); }; void Device::slotExited( OProcess* proc) { owarn << "prcess exited" << oendl; if(proc== m_process ){ owarn << "proc == m_process" << oendl; if( m_process->normalExit() ){ // normal exit 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*) ), this, SLOT( slotExited(Opie::Core::OProcess* ) ) ); 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 ); } } delete m_process; m_process = 0; }else if(proc== m_hci ){ owarn << "M HCI exited" << oendl; if( m_hci->normalExit() ){ 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 ); }else{ owarn << "failed" << oendl; emit device("hci0", false ); m_attached = false; } }// normal exit delete m_hci; m_hci = 0; } } void Device::slotStdOut(OProcess* proc, char* chars, int len) { owarn << "std out" << oendl; if( len <1 ){ owarn << "len < 1 " << oendl; return; } if(proc == m_process ){ QCString string( chars, len+1 ); // \0 == +1 owarn << "output: " << string.data() << oendl; m_output.append( string.data() ); } } void Device::slotStdErr(OProcess* proc, char* chars, int len) { owarn << "std err" << oendl; slotStdOut( proc, chars, len ); } 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,12 +1,15 @@ 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 LIBS += -lopiecore2 include( $(OPIEDIR)/include.pro ) 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 <qfileinfo.h> +#include <qfile.h> + +#include <opie2/odebug.h> +#include <opie2/odebug.h> + +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 <qobject.h> +#include <qstring.h> +#include "services.h" +#include <opie2/oprocess.h> +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 |