summaryrefslogtreecommitdiff
path: root/noncore
Side-by-side diff
Diffstat (limited to 'noncore') (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
@@ -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>&amp;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;