summaryrefslogtreecommitdiff
path: root/core/obex/obex.cc
authorzecke <zecke>2003-02-16 15:49:02 (UTC)
committer zecke <zecke>2003-02-16 15:49:02 (UTC)
commit30a098530260176ac20d75ba6cb7abfb3d998c13 (patch) (side-by-side diff)
treeee5c08ca67fa00574414153921ab2de654c60421 /core/obex/obex.cc
parent7fab90d46144843d32e476ada8d0a5f40f50aa60 (diff)
downloadopie-30a098530260176ac20d75ba6cb7abfb3d998c13.zip
opie-30a098530260176ac20d75ba6cb7abfb3d998c13.tar.gz
opie-30a098530260176ac20d75ba6cb7abfb3d998c13.tar.bz2
disable snd in IrDaApplet it hangs on my machine..
Remove the hacky OBEX Implementation Add a more cleaned up more appealing (not yet working) version which will even be able to do OBEX over Bluetooth in the future -It handles receive better let's you choose what to do with custom files and created a DocLnk -Send lets you beam to multiple devices this needs the IrDa Applet to be present
Diffstat (limited to 'core/obex/obex.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--core/obex/obex.cc195
1 files changed, 195 insertions, 0 deletions
diff --git a/core/obex/obex.cc b/core/obex/obex.cc
new file mode 100644
index 0000000..83d1faf
--- a/dev/null
+++ b/core/obex/obex.cc
@@ -0,0 +1,195 @@
+
+#include <qapplication.h>
+#include <qmessagebox.h>
+#include <qpe/qcopenvelope_qws.h>
+#include <opie/oprocess.h>
+#include "obex.h"
+
+using namespace OpieObex;
+
+Obex::Obex( 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() ),
+ SLOT(slotError() ) );
+};
+Obex::~Obex() {
+ delete m_rec;
+ delete m_send;
+}
+void Obex::receive() {
+ m_receive = true;
+ m_outp = QString::null;
+ qWarning("Receive" );
+ m_rec = new OProcess();
+ *m_rec << "irobex_palm3";
+ // connect to the necessary slots
+ connect(m_rec, SIGNAL(processExited(OProcess*) ),
+ this, SLOT(slotExited(OProcess*) ) );
+
+ connect(m_rec, SIGNAL(receivedStdout(OProcess*, char*, int ) ),
+ this, SLOT(slotStdOut(OProcess*, char*, int) ) );
+
+ if(!m_rec->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) {
+ qWarning("could not start :(");
+ emit done( false );
+ delete m_rec;
+ m_rec = 0;
+ }
+// emit currentTry(m_count );
+
+}
+void Obex::send( const QString& fileName) { // if currently receiving stop it send receive
+ m_count = 0;
+ m_file = fileName;
+ qWarning("send");
+ if (m_rec != 0 ) {
+ qWarning("running");
+ if (m_rec->isRunning() ) {
+ emit error(-1 );
+ qWarning("is running");
+ delete m_rec;
+ m_rec = 0;
+
+ }else{
+ qWarning("is not running");
+ emit error( -1 ); // we did not delete yet but it's not running slotExited is pending
+ return;
+ }
+ }
+ sendNow();
+}
+void Obex::sendNow(){
+ qWarning("sendNow");
+ if ( m_count >= 25 ) { // could not send
+ emit error(-1 );
+ emit sent(false);
+ return;
+ }
+ // OProcess inititialisation
+ m_send = new OProcess();
+ *m_send << "irobex_palm3";
+ *m_send << m_file;
+
+ // connect to slots Exited and and StdOut
+ connect(m_send, SIGNAL(processExited(OProcess*) ),
+ this, SLOT(slotExited(OProcess*)) );
+ connect(m_send, SIGNAL(receivedStdout(OProcess*, char*, int )),
+ this, SLOT(slotStdOut(OProcess*, char*, int) ) );
+
+ // now start it
+ if (!m_send->start(/*OProcess::NotifyOnExit, OProcess::AllOutput*/ ) ) {
+ qWarning("could not send" );
+ m_count = 25;
+ emit error(-1 );
+ delete m_send;
+ m_send=0;
+ }
+ // end
+ m_count++;
+ emit currentTry( m_count );
+}
+
+void Obex::slotExited(OProcess* proc ){
+ if (proc == m_rec ) { // receive process
+ received();
+ }else if ( proc == m_send ) {
+ sendEnd();
+ }
+}
+void Obex::slotStdOut(OProcess* proc, char* buf, int len){
+ if ( proc == m_rec ) { // only receive
+ QCString cstring( buf, len );
+ m_outp.append( cstring.data() );
+ }
+}
+
+void Obex::received() {
+ if (m_rec->normalExit() ) {
+ if ( m_rec->exitStatus() == 0 ) { // we got one
+ QString filename = parseOut();
+ qWarning("ACHTUNG");
+ emit receivedFile( filename );
+ }
+ }else{
+ emit done(false);
+ };
+ delete m_rec;
+ m_rec = 0;
+ receive();
+}
+
+void Obex::sendEnd() {
+ if (m_send->normalExit() ) {
+ if ( m_send->exitStatus() == 0 ) {
+ delete m_send;
+ m_send=0;
+ qWarning("done" );
+ emit sent(true);
+ }else if (m_send->exitStatus() == 255 ) { // it failed maybe the other side wasn't ready
+ // let's try it again
+ delete m_send;
+ m_send = 0;
+ qWarning("try sending again" );
+ sendNow();
+ }
+ }else {
+ emit error( -1 );
+ delete m_send;
+ m_send = 0;
+ }
+}
+QString Obex::parseOut( ){
+ QString path;
+ QStringList list = QStringList::split("\n", m_outp);
+ QStringList::Iterator it;
+ for (it = list.begin(); it != list.end(); ++it ) {
+ if ( (*it).startsWith("Wrote" ) ) {
+ int pos = (*it).findRev('(' );
+ if ( pos > 0 ) {
+ qWarning( "%d %s", pos, (*it).mid(6 ).latin1() ) ;
+ qWarning("%d %d", (*it).length(), (*it).length()-pos );
+
+ path = (*it).remove( pos, (*it).length() - pos );
+ qWarning("%s", path.latin1() );
+ path = path.mid(6 );
+ path = path.stripWhiteSpace();
+ qWarning("path %s", path.latin1() );
+ }
+ }
+ }
+ return path;
+}
+/**
+ * when sent is done slotError is called we will start receive again
+ */
+void Obex::slotError() {
+ qWarning("slotError");
+ if ( m_receive )
+ receive();
+};
+void Obex::setReceiveEnabled( bool receive ) {
+ if ( !receive ) { //
+ m_receive = false;
+ shutDownReceive();
+ }
+}
+
+void Obex::shutDownReceive() {
+ if (m_rec != 0 ) {
+ qWarning("running");
+ if (m_rec->isRunning() ) {
+ emit error(-1 );
+ qWarning("is running");
+ delete m_rec;
+ m_rec = 0;
+ }
+ }
+
+}