-rw-r--r-- | noncore/apps/opie-console/filereceive.cpp | 159 | ||||
-rw-r--r-- | noncore/apps/opie-console/filereceive.h | 42 | ||||
-rw-r--r-- | noncore/apps/opie-console/filetransfer.cpp | 7 | ||||
-rw-r--r-- | noncore/apps/opie-console/opie-console.pro | 8 | ||||
-rw-r--r-- | noncore/apps/opie-console/receive_layer.cpp | 33 | ||||
-rw-r--r-- | noncore/apps/opie-console/receive_layer.h | 22 | ||||
-rw-r--r-- | noncore/apps/opie-console/test/console.pro | 6 | ||||
-rw-r--r-- | noncore/apps/opie-console/test/sender.ui | 22 | ||||
-rw-r--r-- | noncore/apps/opie-console/test/senderui.cpp | 7 | ||||
-rw-r--r-- | noncore/apps/opie-console/test/senderui.h | 1 |
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 @@ -14,12 +14,13 @@ FileTransfer::FileTransfer( Type t, IOLayer* lay ) : FileTransferLayer( lay ), m_type( t ), m_pid ( 0 ) { signal(SIGPIPE, SIG_IGN ); + m_pid = 0; m_not = 0l; m_proc = 0l; } FileTransfer::~FileTransfer() { } @@ -45,12 +46,13 @@ void FileTransfer::sendFile( const QString& file ) { m_pid = fork(); switch( m_pid ) { case -1: emit error( StartError, tr("Was not able to fork") ); + slotExec(); break; case 0:{ setupChild(); qWarning("output:"+file ); /* exec */ char* verbose = "-vv"; @@ -174,13 +176,12 @@ void FileTransfer::slotRead() { QStringList lis = QStringList::split(' ', str ); /* * Transfer finished.. either complete or incomplete */ if ( lis[0].simplifyWhiteSpace() == "Transfer" ) { qWarning("sent!!!!"); - emit sent(); return; } /* * do progress reading */ slotProgress( lis ); @@ -233,21 +234,23 @@ void FileTransfer::slotProgress( const QStringList& list ) { emit progress(m_file, m_prog, bps, -1, min , sec ); } } void FileTransfer::cancel() { if(m_pid > 0) ::kill(m_pid,9 ); - delete m_not; + } void FileTransfer::slotExec() { qWarning("exited!"); char buf[2]; ::read(m_term[0], buf, 1 ); delete m_proc; delete m_not; m_proc = m_not = 0l; close( m_term[0] ); close( m_term[1] ); close( m_comm[0] ); 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 @@ -27,13 +27,15 @@ HEADERS = io_layer.h io_serial.h io_irda.h io_bt.h\ terminalwidget.h \ iolayerbase.h \ serialconfigwidget.h irdaconfigwidget.h \ btconfigwidget.h modemconfigwidget.h \ atconfigdialog.h dialdialog.h \ emulation_widget.h procctl.h \ - function_keyboard.h script.h + function_keyboard.h \ + receive_layer.h filereceive.h \ + script.h SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \ file_layer.cpp filetransfer.cpp \ main.cpp \ metafactory.cpp \ session.cpp \ @@ -55,13 +57,15 @@ SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \ terminalwidget.cpp \ iolayerbase.cpp \ serialconfigwidget.cpp irdaconfigwidget.cpp \ btconfigwidget.cpp modemconfigwidget.cpp \ atconfigdialog.cpp dialdialog.cpp \ emulation_widget.cpp default.cpp procctl.cpp \ - function_keyboard.cpp script.cpp + function_keyboard.cpp \ + receive_layer.cpp filereceive.cpp \ + script.cpp INTERFACES = configurebase.ui editbase.ui INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopie TARGET = opie-console 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 @@ -42,27 +42,26 @@ public: DisableRestrict = 256, Restricted = 512, Overwrite = 1024 }; /** - * which protocol to use? + * Error codes */ - enum Type{ - SZ = 0, - SX, - SY + enum Error { + Unknown = 0, + StartError }; /** * C'tor constructs an new Object * @param lay The Layer to be used * @param t The Type * @param startDir In which dir should files be received? */ - ReceiveLayer( IOLayer* lay, Type t, const QString& startDir = QString::null ); + ReceiveLayer( IOLayer* lay, const QString& startDir = QString::null ); virtual ~ReceiveLayer(); public slots: /** * start receiving in current dir * with protocol from the c'tor @@ -75,13 +74,13 @@ public slots: */ virtual void receive( const QString& dir ) = 0; /** * advanced method with features and Mode */ - virtual void receive( const QString& dir, Mode, Features ) {} + virtual void receive( const QString& dir, Mode, Features ); /** * cancel receive */ virtual void cancel(); @@ -105,9 +104,18 @@ signals: /** * completely received a file */ void received( const QString& file ); +protected: + QString m_curDir; + IOLayer* layer(); + /* from a variable set from the outside */ + QString currentDir()const; + void changeDir( const QString& ); +private: + IOLayer* m_layer; + }; #endif 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 @@ -1,15 +1,17 @@ TEMPLATE = app #CONFIG = qt warn_on release CONFIG = qt debug #DESTDIR = $(OPIEDIR)/bin 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 INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopie TARGET = test 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 @@ -8,13 +8,13 @@ </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> - <width>596</width> + <width>592</width> <height>480</height> </rect> </property> <property stdset="1"> <name>caption</name> <string>Form1</string> @@ -36,12 +36,23 @@ </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <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> </property> <property stdset="1"> <name>text</name> <string>&Send</string> </property> @@ -63,16 +74,23 @@ <connection> <sender>PushButton1</sender> <signal>clicked()</signal> <receiver>Form1</receiver> <slot>slotSend()</slot> </connection> - <slot access="public">slotSend()</slot> <connection> <sender>PushButton2</sender> <signal>clicked()</signal> <receiver>Form1</receiver> <slot>slotSendFile()</slot> </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> </connections> </UI> 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 @@ -6,12 +6,13 @@ #include <qmultilineedit.h> #include <qsocketnotifier.h> #include "../profile.h" #include "../io_serial.h" #include "../filetransfer.h" +#include "../filereceive.h" #include <opie/oprocess.h> #include "senderui.h" SenderUI::SenderUI() @@ -63,6 +64,12 @@ void SenderUI::fileTransComplete() { qWarning("file transfer complete"); } 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 @@ -16,12 +16,13 @@ public: ~SenderUI(); public slots: void send(); void slotSendFile(); void slotSend(); + void slotRev(); void got(const QByteArray& ); void fileTransComplete(); private: IOSerial* ser; FileTransfer* sz; int m_fd; |