summaryrefslogtreecommitdiff
path: root/core/obex/btobex.cpp
authormickeyl <mickeyl>2005-08-22 09:36:38 (UTC)
committer mickeyl <mickeyl>2005-08-22 09:36:38 (UTC)
commit7202ac536ac98e7e433984d98cb9236330b25cc8 (patch) (unidiff)
treec8b5d4e57dd4b9b302999d1f88a89c28e4ee0e5e /core/obex/btobex.cpp
parent140e4dc44a29678de1ae8b2cef5b1d081993223e (diff)
downloadopie-7202ac536ac98e7e433984d98cb9236330b25cc8.zip
opie-7202ac536ac98e7e433984d98cb9236330b25cc8.tar.gz
opie-7202ac536ac98e7e433984d98cb9236330b25cc8.tar.bz2
Replace the existing, apparently non-working, OBEX Send form with a
completely new implementation. The new implementation supports selective send over both IrDA and Bluetooth, to selected receivers (which are discovered as the form pops up). The form also indicates transfer status as the transfers progress. There is a new QT Designer UI form file, integrated into the build. There are also two new source files for the form to supply the abstract methods (typical of QT2). Patch courtesy Michael Haynie - thanks!
Diffstat (limited to 'core/obex/btobex.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/obex/btobex.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/core/obex/btobex.cpp b/core/obex/btobex.cpp
new file mode 100644
index 0000000..a2866f6
--- a/dev/null
+++ b/core/obex/btobex.cpp
@@ -0,0 +1,197 @@
1
2#include "btobex.h"
3
4/* OPIE */
5#include <opie2/oprocess.h>
6#include <opie2/odebug.h>
7
8/* QT */
9#include <qfileinfo.h>
10
11
12
13using namespace OpieObex;
14
15using namespace Opie::Core;
16/* TRANSLATOR OpieObex::Obex */
17
18BtObex::BtObex( QObject *parent, const char* name )
19 : QObject(parent, name )
20{
21 m_rec = 0;
22 m_send=0;
23 m_count = 0;
24 m_receive = false;
25 connect( this, SIGNAL(error(int) ), // for recovering to receive
26 SLOT(slotError() ) );
27 connect( this, SIGNAL(sent(bool) ),
28 SLOT(slotError() ) );
29};
30BtObex::~BtObex() {
31 delete m_rec;
32 delete m_send;
33}
34void BtObex::receive() {
35 m_receive = true;
36 m_outp = QString::null;
37 m_rec = new OProcess();
38
39 // TODO mbhaynie: No idea if this actually works -- maybe opd is better.
40 *m_rec << "obexftpd" << "-b";
41 // connect to the necessary slots
42 connect(m_rec, SIGNAL(processExited(Opie::Core::OProcess*) ),
43 this, SLOT(slotExited(Opie::Core::OProcess*) ) );
44
45 connect(m_rec, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int ) ),
46 this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) );
47
48 if(!m_rec->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) {
49 emit done( false );
50 delete m_rec;
51 m_rec = 0;
52 }
53}
54
55void BtObex::send( const QString& fileName, const QString& bdaddr) {
56 // if currently receiving stop it send receive
57 m_count = 0;
58 m_file = fileName;
59 m_bdaddr = bdaddr;
60 if (m_rec != 0 ) {
61 if (m_rec->isRunning() ) {
62 emit error(-1 );
63 delete m_rec;
64 m_rec = 0;
65
66 }else{
67 emit error( -1 ); // we did not delete yet but it's not running slotExited is pending
68 return;
69 }
70 }
71 sendNow();
72}
73void BtObex::sendNow(){
74 if ( m_count >= 25 ) { // could not send
75 emit error(-1 );
76 emit sent(false);
77 return;
78 }
79 // OProcess inititialisation
80 m_send = new OProcess();
81 m_send->setWorkingDirectory( QFileInfo(m_file).dirPath(true) );
82
83 // obextool push file <bdaddr> [channel]
84 // 9 for phones.
85 // Palm T3 accepts pictures on 1
86 *m_send << "obextool" << "push";
87 *m_send << QFile::encodeName(QFileInfo(m_file).fileName());
88 *m_send << m_bdaddr << "9";
89
90 // connect to slots Exited and and StdOut
91 connect(m_send, SIGNAL(processExited(Opie::Core::OProcess*) ),
92 this, SLOT(slotExited(Opie::Core::OProcess*)) );
93 connect(m_send, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int )),
94 this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) );
95
96 // now start it
97 if (!m_send->start(/*OProcess::NotifyOnExit, OProcess::AllOutput*/ ) ) {
98 m_count = 25;
99 emit error(-1 );
100 delete m_send;
101 m_send=0;
102 }
103 // end
104 m_count++;
105 emit currentTry( m_count );
106}
107
108void BtObex::slotExited(OProcess* proc ){
109 if (proc == m_rec ) // receive process
110 received();
111 else if ( proc == m_send )
112 sendEnd();
113
114}
115void BtObex::slotStdOut(OProcess* proc, char* buf, int len){
116 if ( proc == m_rec ) { // only receive
117 QByteArray ar( len );
118 memcpy( ar.data(), buf, len );
119 m_outp.append( ar );
120 }
121}
122
123void BtObex::received() {
124 if (m_rec->normalExit() ) {
125 if ( m_rec->exitStatus() == 0 ) { // we got one
126 QString filename = parseOut();
127 emit receivedFile( filename );
128 }
129 }else{
130 emit done(false);
131 };
132 delete m_rec;
133 m_rec = 0;
134 receive();
135}
136
137void BtObex::sendEnd() {
138 if (m_send->normalExit() ) {
139 if ( m_send->exitStatus() == 0 ) {
140 delete m_send;
141 m_send=0;
142 emit sent(true);
143 }else if (m_send->exitStatus() == 255 ) { // it failed maybe the other side wasn't ready
144 // let's try it again
145 delete m_send;
146 m_send = 0;
147 sendNow();
148 }
149 }else {
150 emit error( -1 );
151 delete m_send;
152 m_send = 0;
153 }
154}
155
156// This probably doesn't do anything useful for bt.
157QString BtObex::parseOut( ){
158 QString path;
159 QStringList list = QStringList::split("\n", m_outp);
160 QStringList::Iterator it;
161 for (it = list.begin(); it != list.end(); ++it ) {
162 if ( (*it).startsWith("Wrote" ) ) {
163 int pos = (*it).findRev('(' );
164 if ( pos > 0 ) {
165
166 path = (*it).remove( pos, (*it).length() - pos );
167 path = path.mid(6 );
168 path = path.stripWhiteSpace();
169 }
170 }
171 }
172 return path;
173}
174/**
175 * when sent is done slotError is called we will start receive again
176 */
177void BtObex::slotError() {
178 if ( m_receive )
179 receive();
180};
181void BtObex::setReceiveEnabled( bool receive ) {
182 if ( !receive ) { //
183 m_receive = false;
184 shutDownReceive();
185 }
186}
187
188void BtObex::shutDownReceive() {
189 if (m_rec != 0 ) {
190 if (m_rec->isRunning() ) {
191 emit error(-1 );
192 delete m_rec;
193 m_rec = 0;
194 }
195 }
196
197}