summaryrefslogtreecommitdiff
authorzecke <zecke>2002-10-13 15:31:12 (UTC)
committer zecke <zecke>2002-10-13 15:31:12 (UTC)
commit6a9726437a59cf3b18bf57d6e20fb2dfaaa2fc34 (patch) (side-by-side diff)
tree14fa6710ef6d80fa213250a97f13253eb88a80cd
parent5db679753dac04095a2fa4b03297785ed4ba4030 (diff)
downloadopie-6a9726437a59cf3b18bf57d6e20fb2dfaaa2fc34.zip
opie-6a9726437a59cf3b18bf57d6e20fb2dfaaa2fc34.tar.gz
opie-6a9726437a59cf3b18bf57d6e20fb2dfaaa2fc34.tar.bz2
Move some stuff in filetransfer around
make pid == 0 after a finished process. Introduce the FileReceive class it does not parse progress though
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/filereceive.cpp159
-rw-r--r--noncore/apps/opie-console/filereceive.h42
-rw-r--r--noncore/apps/opie-console/filetransfer.cpp7
-rw-r--r--noncore/apps/opie-console/opie-console.pro8
-rw-r--r--noncore/apps/opie-console/receive_layer.cpp33
-rw-r--r--noncore/apps/opie-console/receive_layer.h22
-rw-r--r--noncore/apps/opie-console/test/console.pro6
-rw-r--r--noncore/apps/opie-console/test/sender.ui22
-rw-r--r--noncore/apps/opie-console/test/senderui.cpp7
-rw-r--r--noncore/apps/opie-console/test/senderui.h1
10 files changed, 292 insertions, 15 deletions
diff --git a/noncore/apps/opie-console/filereceive.cpp b/noncore/apps/opie-console/filereceive.cpp
new file mode 100644
index 0000000..26b3dec
--- a/dev/null
+++ b/noncore/apps/opie-console/filereceive.cpp
@@ -0,0 +1,159 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <errno.h>
+
+#include <qsocketnotifier.h>
+
+#include "io_layer.h"
+#include "procctl.h"
+#include "filereceive.h"
+
+FileReceive::FileReceive( Type t, IOLayer* lay, const QString& dir )
+ : ReceiveLayer(lay, dir ), m_type( t )
+{
+ m_fd = -1;
+ m_not = 0l;
+ m_proc = 0l;
+}
+FileReceive::~FileReceive() {
+}
+void FileReceive::receive() {
+ receive( currentDir() );
+}
+void FileReceive::receive( const QString& dir ) {
+ m_prog = -1;
+ m_fd = layer()->rawIO();
+ m_curDir = dir;
+
+ if (pipe( m_comm ) < 0 )
+ m_comm[0] = m_comm[1] = 0;
+ if (pipe( m_info ) < 0 )
+ m_info[0] = m_info[1] = 0;
+
+ m_pid = fork();
+ switch( m_pid ) {
+ case -1:
+ //emit error
+ slotExec();
+ break;
+ /* child */
+ case 0: {
+ setupChild();
+ char* typus = NULL;
+ switch(m_type ) {
+ case SZ:
+ break;
+ case SX:
+ typus = "-X";
+ break;
+ case SY:
+ typus = "--ymodem";
+ break;
+ }
+
+ /* we should never return from here */
+ execlp("rz", "rz", typus, NULL );
+
+ char resultByte = 1;
+ if (m_info[1] )
+ ::write(m_info[1], &resultByte, 1 );
+
+ _exit( -1 );
+ break;
+ }
+ default: {
+ if ( m_info[1] )
+ close( m_info[1] );
+
+ if ( m_info[0] ) for (;;) {
+ char resultByte; int len;
+ len = read(m_info[0], &resultByte, 1 );
+ /* len == 1 start up failed */
+ if ( len == 1 ) {
+ emit error( StartError, tr("Could not start") );
+ return;
+ }
+ if ( len == -1 )
+ if ( (errno == ECHILD ) || (errno == EINTR ) )
+ continue;
+
+ // len == 0 or something like this
+ break;
+ }
+
+ if ( m_info[0] )
+ close( m_info[0] );
+
+ m_not = new QSocketNotifier(m_comm[0], QSocketNotifier::Read );
+ connect(m_not, SIGNAL(activated(int) ),
+ this, SLOT(slotRead() ) );
+ if ( pipe(m_term) < 0 )
+ m_term[0] = m_term[1] = 0;
+
+ ProcCtl::self()->add(m_pid, m_term[1] );
+ m_proc = new QSocketNotifier(m_term[0], QSocketNotifier::Read );
+ connect(m_proc, SIGNAL(activated(int) ),
+ this, SLOT(slotExec() ) );
+
+ }
+ break;
+
+ }
+
+}
+void FileReceive::cancel() {
+ ::kill(m_pid, 9 );
+}
+void FileReceive::setupChild() {
+ changeDir( currentDir() );
+ /*
+ * we do not want to read from our
+ * information channel
+ */
+ if (m_info[0] )
+ close(m_info[0] );
+ /*
+ * FD_CLOEXEC will close the
+ * fd on successfull exec
+ */
+ if (m_info[1] )
+ fcntl(m_info[1], F_SETFD, FD_CLOEXEC );
+
+ if (m_comm[0] )
+ close( m_comm[0] );
+ /*
+ * now set the communication
+ * m_fd STDIN_FILENO
+ * STDOUT_FILENO
+ * STDERR_FILENO
+ */
+ dup2( m_fd, STDIN_FILENO );
+ dup2( m_fd, STDOUT_FILENO );
+ dup2( m_comm[1], STDERR_FILENO );
+}
+void FileReceive::slotRead() {
+ QByteArray ar(4096);
+ int len = read(m_comm[0], ar.data(), 4096 );
+ qWarning("slot read %d", len);
+ for (int i = 0; i < len; i++ ) {
+ // printf("%c", ar[i] );
+ }
+ ar.resize( len );
+ QString str( ar );
+ qWarning(str.simplifyWhiteSpace() );
+}
+void FileReceive::slotExec() {
+ char buf[2];
+ ::read(m_term[0], buf, 1 );
+ delete m_proc;
+ delete m_not;
+ m_not = m_proc = 0l;
+ close( m_term[0] );
+ close( m_term[1] );
+ close( m_comm[0] );
+ close( m_comm[1] );
+ layer()->closeRawIO(m_fd);
+ emit received(QString::null);
+
+}
diff --git a/noncore/apps/opie-console/filereceive.h b/noncore/apps/opie-console/filereceive.h
new file mode 100644
index 0000000..a525439
--- a/dev/null
+++ b/noncore/apps/opie-console/filereceive.h
@@ -0,0 +1,42 @@
+#ifndef OPIE_FILE_RECEIVE_H
+#define OPIE_FILE_RECEIVE_H
+
+/**
+ * This is the receive Implementation
+ * for X-Modem/Y-Modem/Z-Modem
+ */
+#include <sys/types.h>
+
+#include "receive_layer.h"
+
+class QSocketNotifier;
+class FileReceive : public ReceiveLayer {
+ Q_OBJECT
+public:
+ enum Type {
+ SZ = 0,
+ SX,
+ SY
+ };
+ FileReceive( Type t, IOLayer* lay, const QString& startDir = QString::null );
+ ~FileReceive();
+ void receive();
+ void receive( const QString& dir );
+ void cancel();
+private slots:
+ void setupChild();
+ void slotRead();
+ void slotExec();
+private:
+ pid_t m_pid;
+ int m_fd;
+ int m_prog;
+ int m_info[2];
+ int m_comm[2];
+ int m_term[2];
+ Type m_type;
+ QSocketNotifier* m_not;
+ QSocketNotifier* m_proc;
+};
+
+#endif
diff --git a/noncore/apps/opie-console/filetransfer.cpp b/noncore/apps/opie-console/filetransfer.cpp
index 14787f6..8ca0df2 100644
--- a/noncore/apps/opie-console/filetransfer.cpp
+++ b/noncore/apps/opie-console/filetransfer.cpp
@@ -19,2 +19,3 @@ FileTransfer::FileTransfer( Type t, IOLayer* lay )
+ m_pid = 0;
m_not = 0l;
@@ -50,2 +51,3 @@ void FileTransfer::sendFile( const QString& file ) {
emit error( StartError, tr("Was not able to fork") );
+ slotExec();
break;
@@ -179,3 +181,2 @@ void FileTransfer::slotRead() {
qWarning("sent!!!!");
- emit sent();
return;
@@ -238,3 +239,3 @@ void FileTransfer::cancel() {
if(m_pid > 0) ::kill(m_pid,9 );
- delete m_not;
+
}
@@ -251,3 +252,5 @@ void FileTransfer::slotExec() {
close( m_comm[1] );
+ layer()->closeRawIO( m_fd );
emit sent();
+ m_pid = 0;
}
diff --git a/noncore/apps/opie-console/opie-console.pro b/noncore/apps/opie-console/opie-console.pro
index 8e39a48..0b4676b 100644
--- a/noncore/apps/opie-console/opie-console.pro
+++ b/noncore/apps/opie-console/opie-console.pro
@@ -32,3 +32,5 @@ HEADERS = io_layer.h io_serial.h io_irda.h io_bt.h\
emulation_widget.h procctl.h \
- function_keyboard.h script.h
+ function_keyboard.h \
+ receive_layer.h filereceive.h \
+ script.h
@@ -60,3 +62,5 @@ SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \
emulation_widget.cpp default.cpp procctl.cpp \
- function_keyboard.cpp script.cpp
+ function_keyboard.cpp \
+ receive_layer.cpp filereceive.cpp \
+ script.cpp
diff --git a/noncore/apps/opie-console/receive_layer.cpp b/noncore/apps/opie-console/receive_layer.cpp
new file mode 100644
index 0000000..05e2c67
--- a/dev/null
+++ b/noncore/apps/opie-console/receive_layer.cpp
@@ -0,0 +1,33 @@
+#include <unistd.h>
+
+#include <qstring.h>
+#include <qfile.h>
+
+#include "io_layer.h"
+#include "receive_layer.h"
+
+ReceiveLayer::ReceiveLayer( IOLayer* lay, const QString& startDir )
+ : QObject(), m_curDir( startDir ), m_layer(lay )
+{
+
+}
+ReceiveLayer::~ReceiveLayer() {
+
+}
+IOLayer* ReceiveLayer::layer() {
+ return m_layer;
+}
+QString ReceiveLayer::currentDir()const{
+ if (m_curDir.isEmpty() )
+ return QString::fromLocal8Bit( ::getwd(NULL) );
+ return m_curDir;
+}
+void ReceiveLayer::changeDir( const QString& str) {
+ ::chdir( str.latin1() );
+}
+void ReceiveLayer::receive( const QString& dir, Mode, Features ) {
+ receive( dir );
+}
+void ReceiveLayer::cancel() {
+
+}
diff --git a/noncore/apps/opie-console/receive_layer.h b/noncore/apps/opie-console/receive_layer.h
index 0cfe16d..157c7e5 100644
--- a/noncore/apps/opie-console/receive_layer.h
+++ b/noncore/apps/opie-console/receive_layer.h
@@ -47,8 +47,7 @@ public:
/**
- * which protocol to use?
+ * Error codes
*/
- enum Type{
- SZ = 0,
- SX,
- SY
+ enum Error {
+ Unknown = 0,
+ StartError
};
@@ -61,3 +60,3 @@ public:
*/
- ReceiveLayer( IOLayer* lay, Type t, const QString& startDir = QString::null );
+ ReceiveLayer( IOLayer* lay, const QString& startDir = QString::null );
virtual ~ReceiveLayer();
@@ -80,3 +79,3 @@ public slots:
*/
- virtual void receive( const QString& dir, Mode, Features ) {}
+ virtual void receive( const QString& dir, Mode, Features );
@@ -110,2 +109,11 @@ signals:
+protected:
+ QString m_curDir;
+ IOLayer* layer();
+ /* from a variable set from the outside */
+ QString currentDir()const;
+ void changeDir( const QString& );
+private:
+ IOLayer* m_layer;
+
};
diff --git a/noncore/apps/opie-console/test/console.pro b/noncore/apps/opie-console/test/console.pro
index af0e9f7..6de2cd0 100644
--- a/noncore/apps/opie-console/test/console.pro
+++ b/noncore/apps/opie-console/test/console.pro
@@ -5,6 +5,8 @@ CONFIG = qt debug
HEADERS = ../io_layer.h ../io_serial.h ../sz_transfer.h ../file_layer.h\
- senderui.h ../profile.h ../filetransfer.h ../procctl.h
+ senderui.h ../profile.h ../filetransfer.h ../procctl.h \
+ ../filereceive.h ../receive_layer.h
SOURCES = ../io_layer.cpp ../io_serial.cpp \
../profile.cpp ../sz_transfer.cpp ../file_layer.cpp\
- main.cpp senderui.cpp ../filetransfer.cpp ../procctl.cpp
+ main.cpp senderui.cpp ../filetransfer.cpp ../procctl.cpp \
+ ../filereceive.cpp ../receive_layer.cpp
INTERFACES = sender.ui
diff --git a/noncore/apps/opie-console/test/sender.ui b/noncore/apps/opie-console/test/sender.ui
index b946b81..74b9790 100644
--- a/noncore/apps/opie-console/test/sender.ui
+++ b/noncore/apps/opie-console/test/sender.ui
@@ -13,3 +13,3 @@
<y>0</y>
- <width>596</width>
+ <width>592</width>
<height>480</height>
@@ -41,2 +41,13 @@
<name>name</name>
+ <cstring>PushButton3</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Receive File</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
<cstring>PushButton1</cstring>
@@ -68,3 +79,2 @@
</connection>
- <slot access="public">slotSend()</slot>
<connection>
@@ -75,2 +85,10 @@
</connection>
+ <connection>
+ <sender>PushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>Form1</receiver>
+ <slot>slotRev()</slot>
+ </connection>
+ <slot access="public">slotRev()</slot>
+ <slot access="public">slotSend()</slot>
<slot access="public">slotSendFile()</slot>
diff --git a/noncore/apps/opie-console/test/senderui.cpp b/noncore/apps/opie-console/test/senderui.cpp
index 8bc1676..2ce3f6d 100644
--- a/noncore/apps/opie-console/test/senderui.cpp
+++ b/noncore/apps/opie-console/test/senderui.cpp
@@ -11,2 +11,3 @@
#include "../filetransfer.h"
+#include "../filereceive.h"
@@ -68 +69,7 @@ void SenderUI::send() {
}
+void SenderUI::slotRev(){
+qWarning("Going to receive!");
+FileReceive *rev = new FileReceive( FileReceive::SZ, ser );
+rev->receive();
+
+} \ No newline at end of file
diff --git a/noncore/apps/opie-console/test/senderui.h b/noncore/apps/opie-console/test/senderui.h
index 5e613cd..c130dcf 100644
--- a/noncore/apps/opie-console/test/senderui.h
+++ b/noncore/apps/opie-console/test/senderui.h
@@ -21,2 +21,3 @@ public slots:
void slotSend();
+ void slotRev();
void got(const QByteArray& );