summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-console/default.cpp8
-rw-r--r--noncore/apps/opie-console/file_layer.h21
-rw-r--r--noncore/apps/opie-console/filetransfer.cpp141
-rw-r--r--noncore/apps/opie-console/filetransfer.h15
-rw-r--r--noncore/apps/opie-console/io_layer.cpp3
-rw-r--r--noncore/apps/opie-console/io_layer.h8
-rw-r--r--noncore/apps/opie-console/io_serial.cpp16
-rw-r--r--noncore/apps/opie-console/io_serial.h1
-rw-r--r--noncore/apps/opie-console/opie-console.pro4
-rw-r--r--noncore/apps/opie-console/tabwidget.cpp9
-rw-r--r--noncore/apps/opie-console/tabwidget.h4
11 files changed, 195 insertions, 35 deletions
diff --git a/noncore/apps/opie-console/default.cpp b/noncore/apps/opie-console/default.cpp
index a6c3bc4..b092273 100644
--- a/noncore/apps/opie-console/default.cpp
+++ b/noncore/apps/opie-console/default.cpp
@@ -1,5 +1,5 @@
#include "io_serial.h"
-#include "sz_transfer.h"
+#include "filetransfer.h"
#include "serialconfigwidget.h"
#include "irdaconfigwidget.h"
#include "btconfigwidget.h"
@@ -11,13 +11,13 @@
extern "C" {
// FILE Transfer Stuff
FileTransferLayer* newSZTransfer(IOLayer* lay) {
- return new SzTransfer( SzTransfer::SZ, lay );
+ return new FileTransfer( FileTransfer::SZ, lay );
}
FileTransferLayer* newSYTransfer(IOLayer* lay) {
- return new SzTransfer( SzTransfer::SY, lay );
+ return new FileTransfer( FileTransfer::SY, lay );
}
FileTransferLayer* newSXTransfer(IOLayer* lay) {
- return new SzTransfer( SzTransfer::SX, lay );
+ return new FileTransfer(FileTransfer ::SX, lay );
}
// Layer stuff
diff --git a/noncore/apps/opie-console/file_layer.h b/noncore/apps/opie-console/file_layer.h
index 0bd0fd1..bf31540 100644
--- a/noncore/apps/opie-console/file_layer.h
+++ b/noncore/apps/opie-console/file_layer.h
@@ -1,6 +1,8 @@
#ifndef OPIE_FILE_LAYER_H
#define OPIE_FILE_LAYER_H
+#include <qmap.h>
+
#include "io_layer.h"
class QFile;
@@ -8,10 +10,17 @@ class QFile;
* this is the layer for sending files
*/
class FileTransferLayer : public QObject {
-
Q_OBJECT
public:
+ enum Errors{
+ NotSupported,
+ StartError,
+ NoError,
+ Unknown,
+ Undefined,
+ Incomplete
+ };
/**
*the io layer to be used
*/
@@ -24,6 +33,7 @@ public slots:
*/
virtual void sendFile( const QString& file ) = 0;
virtual void sendFile( const QFile& ) = 0;
+ virtual void cancel() = 0;
signals:
/**
@@ -38,10 +48,15 @@ signals:
void error( int, const QString& );
/*
- * 100 == done
+ * @param file The file to send
+ * @param progress the progress made from 0-100
+ * @param speed Speed in bps
+ * @param hours The hours it take to finish
+ * @param minutes The minutes it takes to finish
+ * @param send The seconds...
*
*/
- void progress( const QString& file, int progress );
+ void progress( const QString& file, int progress, int speed, int hours, int minutes, int seconds );
protected:
IOLayer* layer();
diff --git a/noncore/apps/opie-console/filetransfer.cpp b/noncore/apps/opie-console/filetransfer.cpp
index 78982bd..7b75d35 100644
--- a/noncore/apps/opie-console/filetransfer.cpp
+++ b/noncore/apps/opie-console/filetransfer.cpp
@@ -11,12 +11,26 @@
#include "filetransfer.h"
+/**
+ *
+ *
+class FileTransferControl {
+public:
+ FileTransferControl();
+ ~FileTransferControl();
+
+
+};
+*/
+
bool FileTransfer::terminate = false;
pid_t FileTransfer::m_pid;
FileTransfer::FileTransfer( Type t, IOLayer* lay )
: FileTransferLayer( lay ), m_type( t ) {
+ signal(SIGPIPE, SIG_IGN );
signal( SIGCHLD, signal_handler );
+ m_not = 0l;
}
FileTransfer::~FileTransfer() {
}
@@ -30,21 +44,26 @@ FileTransfer::~FileTransfer() {
* to do direct IO from and to the fd
*/
void FileTransfer::sendFile( const QString& file ) {
+ m_prog =-1;
m_fd = layer()->rawIO();
//
// m_fd = ::open("/dev/ttyS0", O_RDWR);
-
+ m_file = file;
if ( pipe( m_comm ) < 0 )
m_comm[0] = m_comm[1] = 0;
if ( pipe( m_info ) < 0 )
m_info[0] = m_info[1] = 0;
- qWarning("output:"+file );
+
m_pid = fork();
switch( m_pid ) {
+ case -1:
+ emit error( StartError, tr("Was not able to fork") );
+ break;
case 0:{
setupChild();
+ qWarning("output:"+file );
/* exec */
char* verbose = "-vv";
char* binray = "-b";
@@ -67,8 +86,10 @@ void FileTransfer::sendFile( const QString& file ) {
char resultByte; int len;
len = read(m_info[0], &resultByte, 1 );
/* len == 1 start up failed */
- if ( len == 1 )
+ if ( len == 1 ) {
+ emit error( StartError, tr("Could not start") );
return;
+ }
if ( len == -1 )
if ( (errno == ECHILD ) || (errno == EINTR ) )
continue;
@@ -85,35 +106,35 @@ void FileTransfer::sendFile( const QString& file ) {
int sel;
/* replace by QSocketNotifier!!! */
- while (!terminate) {
- FD_ZERO( &fds );
- FD_SET( m_comm[0], &fds );
- sel = select( m_comm[0]+1, &fds, NULL, NULL, &timeout );
- if (sel ) {
- if ( FD_ISSET(m_comm[0], &fds ) ) {
- printf("out:");
- QByteArray ar(4096);
- int len = read(m_comm[0], ar.data(), 4096 );
- for (int i = 0; i < len; i++ ) {
- // printf("%c", ar[i] );
- }
- printf("\n");
- }
- }
+ m_not = new QSocketNotifier(m_comm[0], QSocketNotifier::Read );
+ connect(m_not, SIGNAL(activated(int) ),
+ this, SLOT(slotRead() ) );
}
break;
}
}
-}
+/*
+ * let's call the one with the filename
+ */
void FileTransfer::sendFile( const QFile& file ) {
sendFile( file.name() );
}
+/*
+ * our signal handler to be replaced by
+ * a procctl thingie
+ */
void FileTransfer::signal_handler(int ) {
+ qWarning("Terminated");
int status;
signal( SIGCHLD, signal_handler );
waitpid( m_pid, &status, WNOHANG );
terminate = true;
}
+
+/*
+ * setting up communication
+ * between parent child and ioLayer
+ */
void FileTransfer::setupChild() {
/*
* we do not want to read from our
@@ -140,3 +161,85 @@ void FileTransfer::setupChild() {
dup2( m_fd, STDOUT_FILENO );
dup2( m_comm[1], STDERR_FILENO );
}
+
+/*
+ * read from the stderr of the child
+ * process
+ */
+void FileTransfer::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 );
+ 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 );
+
+
+}
+/*
+ * find the progress
+ */
+void FileTransfer::slotProgress( const QStringList& list ) {
+ bool complete = true;
+ int min, sec;
+ int bps;
+ unsigned long sent, total;
+
+ min = sec = bps = -1;
+ sent = total = 0;
+
+ // Data looks like this
+ // 0 1 2 3 4 5
+ // Bytes Sent 65536/11534336 BPS:7784 ETA 24:33
+ QStringList progi = QStringList::split('/', list[2].simplifyWhiteSpace() );
+ sent = progi[0].toULong(&complete );
+ if (!complete ) return;
+
+ total = progi[1].toULong(&complete );
+ if (!complete || total == 0) {
+ qWarning("returning!!");
+ return;
+ }
+
+ qWarning("%s, %d, %d", progi.join("/").latin1(), sent, total );
+
+ double pro = (double)sent/total;
+ int prog = pro * 100;
+
+ // speed
+ progi = QStringList::split(':', list[3].simplifyWhiteSpace() );
+ bps = progi[1].toInt();
+
+ // time
+ progi = QStringList::split(':', list[5].simplifyWhiteSpace() );
+ min = progi[0].toInt();
+ sec = progi[1].toInt();
+
+
+ qWarning("Prog!:%d", prog );
+ if ( prog > m_prog ) {
+ m_prog = prog;
+ emit progress(m_file, m_prog, bps, -1, min , sec );
+ qWarning("Progress: %s, %d\%, %d, %d:%d", m_file.latin1(), m_prog, bps, min, sec );
+ }
+
+}
+void FileTransfer::cancel() {
+ ::kill(m_pid,9 );
+ delete m_not;
+}
diff --git a/noncore/apps/opie-console/filetransfer.h b/noncore/apps/opie-console/filetransfer.h
index 06c6d12..0829f16 100644
--- a/noncore/apps/opie-console/filetransfer.h
+++ b/noncore/apps/opie-console/filetransfer.h
@@ -4,13 +4,16 @@
#include <sys/types.h>
#include <qfile.h>
+#include <qstringlist.h>
#include "file_layer.h"
class QSocketNotifier;
class OProcess;
+class FileTransferControl;
class FileTransfer : public FileTransferLayer{
Q_OBJECT
+ friend class FileTransferControl;
public:
enum Type {
SZ = 0,
@@ -22,15 +25,27 @@ public:
void sendFile( const QString& file );
void sendFile( const QFile& );
+ void cancel();
private slots:
void setupChild();
+ void slotRead();
+ void slotProgress( const QStringList& );
private:
+ /*
+ * FIXME? What does happen if we've
+ * two FileTransfers at a time?
+ * Have a procctl which does listen
+ * for termination and then send a signal
+ */
static pid_t m_pid;
int m_fd;
+ int m_prog;
int m_info[2];
int m_comm[2];
+ QString m_file;
Type m_type;
+ QSocketNotifier *m_not;
static void signal_handler(int);
static bool terminate;
};
diff --git a/noncore/apps/opie-console/io_layer.cpp b/noncore/apps/opie-console/io_layer.cpp
index 79d47f5..9ba2f70 100644
--- a/noncore/apps/opie-console/io_layer.cpp
+++ b/noncore/apps/opie-console/io_layer.cpp
@@ -15,3 +15,6 @@ IOLayer::~IOLayer() {
int IOLayer::rawIO()const{
return -1;
}
+void IOLayer::closeRawIO(int) {
+
+}
diff --git a/noncore/apps/opie-console/io_layer.h b/noncore/apps/opie-console/io_layer.h
index 7745021..bf5a893 100644
--- a/noncore/apps/opie-console/io_layer.h
+++ b/noncore/apps/opie-console/io_layer.h
@@ -54,8 +54,16 @@ public:
* a file descriptor which opens
* the device for io but does not
* do any ioctling on it...
+ * and it'll stop listening to the before opened
+ * device
*/
virtual int rawIO()const;
+
+ /**
+ * will close the rawIO stuff
+ * and will listen to it's data again...
+ */
+ virtual void closeRawIO(int);
signals:
/**
* received input as QCString
diff --git a/noncore/apps/opie-console/io_serial.cpp b/noncore/apps/opie-console/io_serial.cpp
index 845f4be..4129d64 100644
--- a/noncore/apps/opie-console/io_serial.cpp
+++ b/noncore/apps/opie-console/io_serial.cpp
@@ -27,6 +27,7 @@ void IOSerial::send(const QByteArray &data) {
}
void IOSerial::close() {
+ qWarning("closing!");
if (m_fd) {
delete m_read;
delete m_error;
@@ -117,7 +118,7 @@ bool IOSerial::open() {
connect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured()));
return TRUE;
} else {
- qWarning("opened");
+ qWarning(" already opened");
emit error(Refuse, tr("Device is already connected"));
m_fd = 0;
return FALSE;
@@ -176,7 +177,20 @@ QString IOSerial::name() const {
return "RS232 Serial IO Layer";
}
int IOSerial::rawIO()const {
+ if (m_read )
+ disconnect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived()));
+ if (m_error )
+ disconnect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured()));
+
int fd = ::open(m_device, O_RDWR );
return fd;
};
+void IOSerial::closeRawIO(int fd) {
+ if (m_read )
+ connect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived()));
+ if (m_error )
+ connect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured()));
+
+ ::close( fd );
+}
diff --git a/noncore/apps/opie-console/io_serial.h b/noncore/apps/opie-console/io_serial.h
index 00a6d2c..facbbc1 100644
--- a/noncore/apps/opie-console/io_serial.h
+++ b/noncore/apps/opie-console/io_serial.h
@@ -36,6 +36,7 @@ public:
QString identifier() const;
QString name() const;
int rawIO()const;
+ void closeRawIO(int fd );
signals:
void received(const QByteArray &);
void error(int, const QString &);
diff --git a/noncore/apps/opie-console/opie-console.pro b/noncore/apps/opie-console/opie-console.pro
index 996eb84..37cef92 100644
--- a/noncore/apps/opie-console/opie-console.pro
+++ b/noncore/apps/opie-console/opie-console.pro
@@ -3,7 +3,7 @@ TEMPLATE = app
CONFIG = qt debug
DESTDIR = $(OPIEDIR)/bin
HEADERS = io_layer.h io_serial.h io_irda.h \
- file_layer.h sz_transfer.h \
+ file_layer.h filetransfer.h \
metafactory.h \
session.h \
mainwindow.h \
@@ -31,7 +31,7 @@ HEADERS = io_layer.h io_serial.h io_irda.h \
SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp \
- file_layer.cpp sz_transfer.cpp \
+ file_layer.cpp filetransfer.cpp \
main.cpp \
metafactory.cpp \
session.cpp \
diff --git a/noncore/apps/opie-console/tabwidget.cpp b/noncore/apps/opie-console/tabwidget.cpp
index cfaef91..466b536 100644
--- a/noncore/apps/opie-console/tabwidget.cpp
+++ b/noncore/apps/opie-console/tabwidget.cpp
@@ -2,7 +2,7 @@
#include "tabwidget.h"
TabWidget::TabWidget( QWidget* parent, const char* name )
- : QTabWidget( parent, name ) {
+ : OTabWidget( parent, name ) {
connect(this, SIGNAL( currentChanged(QWidget*) ),
this, SLOT( slotCurChanged(QWidget*) ) );
}
@@ -14,8 +14,8 @@ void TabWidget::add( Session* ses ) {
if ( !ses->widgetStack() ) return;
qWarning("going to add it");
//reparent( ses->widgetStack(), QPoint() );
- //addTab( ses->widgetStack(), "console/konsole", ses->name() );
- addTab( ses->widgetStack(), ses->name() );
+ addTab( ses->widgetStack(), "console/konsole", ses->name() );
+ //addTab( ses->widgetStack(), ses->name() );
m_map.insert( ses->widgetStack(), ses );
}
@@ -37,7 +37,8 @@ void TabWidget::setCurrent( Session* ses ) {
if (!ses )
return;
- showPage( ses->widgetStack() );
+ //showPage( ses->widgetStack() );
+ setCurrentTab( ses->widgetStack() );
}
diff --git a/noncore/apps/opie-console/tabwidget.h b/noncore/apps/opie-console/tabwidget.h
index 42a00ec..cbaa0f1 100644
--- a/noncore/apps/opie-console/tabwidget.h
+++ b/noncore/apps/opie-console/tabwidget.h
@@ -2,14 +2,14 @@
#define OPIE_TAB_WIDGET_H
#include <qmap.h>
-#include <qtabwidget.h>
+#include <opie/otabwidget.h>
#include "session.h"
/**
* This is our central tab widget
* we can add sessions here
*/
-class TabWidget : public QTabWidget{
+class TabWidget : public OTabWidget{
Q_OBJECT
public:
TabWidget(QWidget *parent, const char* name );