-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 @@ | |||
1 | #include <unistd.h> | ||
2 | #include <fcntl.h> | ||
3 | #include <signal.h> | ||
4 | #include <errno.h> | ||
5 | |||
6 | #include <qsocketnotifier.h> | ||
7 | |||
8 | #include "io_layer.h" | ||
9 | #include "procctl.h" | ||
10 | #include "filereceive.h" | ||
11 | |||
12 | FileReceive::FileReceive( Type t, IOLayer* lay, const QString& dir ) | ||
13 | : ReceiveLayer(lay, dir ), m_type( t ) | ||
14 | { | ||
15 | m_fd = -1; | ||
16 | m_not = 0l; | ||
17 | m_proc = 0l; | ||
18 | } | ||
19 | FileReceive::~FileReceive() { | ||
20 | } | ||
21 | void FileReceive::receive() { | ||
22 | receive( currentDir() ); | ||
23 | } | ||
24 | void FileReceive::receive( const QString& dir ) { | ||
25 | m_prog = -1; | ||
26 | m_fd = layer()->rawIO(); | ||
27 | m_curDir = dir; | ||
28 | |||
29 | if (pipe( m_comm ) < 0 ) | ||
30 | m_comm[0] = m_comm[1] = 0; | ||
31 | if (pipe( m_info ) < 0 ) | ||
32 | m_info[0] = m_info[1] = 0; | ||
33 | |||
34 | m_pid = fork(); | ||
35 | switch( m_pid ) { | ||
36 | case -1: | ||
37 | //emit error | ||
38 | slotExec(); | ||
39 | break; | ||
40 | /* child */ | ||
41 | case 0: { | ||
42 | setupChild(); | ||
43 | char* typus = NULL; | ||
44 | switch(m_type ) { | ||
45 | case SZ: | ||
46 | break; | ||
47 | case SX: | ||
48 | typus = "-X"; | ||
49 | break; | ||
50 | case SY: | ||
51 | typus = "--ymodem"; | ||
52 | break; | ||
53 | } | ||
54 | |||
55 | /* we should never return from here */ | ||
56 | execlp("rz", "rz", typus, NULL ); | ||
57 | |||
58 | char resultByte = 1; | ||
59 | if (m_info[1] ) | ||
60 | ::write(m_info[1], &resultByte, 1 ); | ||
61 | |||
62 | _exit( -1 ); | ||
63 | break; | ||
64 | } | ||
65 | default: { | ||
66 | if ( m_info[1] ) | ||
67 | close( m_info[1] ); | ||
68 | |||
69 | if ( m_info[0] ) for (;;) { | ||
70 | char resultByte; int len; | ||
71 | len = read(m_info[0], &resultByte, 1 ); | ||
72 | /* len == 1 start up failed */ | ||
73 | if ( len == 1 ) { | ||
74 | emit error( StartError, tr("Could not start") ); | ||
75 | return; | ||
76 | } | ||
77 | if ( len == -1 ) | ||
78 | if ( (errno == ECHILD ) || (errno == EINTR ) ) | ||
79 | continue; | ||
80 | |||
81 | // len == 0 or something like this | ||
82 | break; | ||
83 | } | ||
84 | |||
85 | if ( m_info[0] ) | ||
86 | close( m_info[0] ); | ||
87 | |||
88 | m_not = new QSocketNotifier(m_comm[0], QSocketNotifier::Read ); | ||
89 | connect(m_not, SIGNAL(activated(int) ), | ||
90 | this, SLOT(slotRead() ) ); | ||
91 | if ( pipe(m_term) < 0 ) | ||
92 | m_term[0] = m_term[1] = 0; | ||
93 | |||
94 | ProcCtl::self()->add(m_pid, m_term[1] ); | ||
95 | m_proc = new QSocketNotifier(m_term[0], QSocketNotifier::Read ); | ||
96 | connect(m_proc, SIGNAL(activated(int) ), | ||
97 | this, SLOT(slotExec() ) ); | ||
98 | |||
99 | } | ||
100 | break; | ||
101 | |||
102 | } | ||
103 | |||
104 | } | ||
105 | void FileReceive::cancel() { | ||
106 | ::kill(m_pid, 9 ); | ||
107 | } | ||
108 | void FileReceive::setupChild() { | ||
109 | changeDir( currentDir() ); | ||
110 | /* | ||
111 | * we do not want to read from our | ||
112 | * information channel | ||
113 | */ | ||
114 | if (m_info[0] ) | ||
115 | close(m_info[0] ); | ||
116 | /* | ||
117 | * FD_CLOEXEC will close the | ||
118 | * fd on successfull exec | ||
119 | */ | ||
120 | if (m_info[1] ) | ||
121 | fcntl(m_info[1], F_SETFD, FD_CLOEXEC ); | ||
122 | |||
123 | if (m_comm[0] ) | ||
124 | close( m_comm[0] ); | ||
125 | /* | ||
126 | * now set the communication | ||
127 | * m_fd STDIN_FILENO | ||
128 | * STDOUT_FILENO | ||
129 | * STDERR_FILENO | ||
130 | */ | ||
131 | dup2( m_fd, STDIN_FILENO ); | ||
132 | dup2( m_fd, STDOUT_FILENO ); | ||
133 | dup2( m_comm[1], STDERR_FILENO ); | ||
134 | } | ||
135 | void FileReceive::slotRead() { | ||
136 | QByteArray ar(4096); | ||
137 | int len = read(m_comm[0], ar.data(), 4096 ); | ||
138 | qWarning("slot read %d", len); | ||
139 | for (int i = 0; i < len; i++ ) { | ||
140 | // printf("%c", ar[i] ); | ||
141 | } | ||
142 | ar.resize( len ); | ||
143 | QString str( ar ); | ||
144 | qWarning(str.simplifyWhiteSpace() ); | ||
145 | } | ||
146 | void FileReceive::slotExec() { | ||
147 | char buf[2]; | ||
148 | ::read(m_term[0], buf, 1 ); | ||
149 | delete m_proc; | ||
150 | delete m_not; | ||
151 | m_not = m_proc = 0l; | ||
152 | close( m_term[0] ); | ||
153 | close( m_term[1] ); | ||
154 | close( m_comm[0] ); | ||
155 | close( m_comm[1] ); | ||
156 | layer()->closeRawIO(m_fd); | ||
157 | emit received(QString::null); | ||
158 | |||
159 | } | ||
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 @@ | |||
1 | #ifndef OPIE_FILE_RECEIVE_H | ||
2 | #define OPIE_FILE_RECEIVE_H | ||
3 | |||
4 | /** | ||
5 | * This is the receive Implementation | ||
6 | * for X-Modem/Y-Modem/Z-Modem | ||
7 | */ | ||
8 | #include <sys/types.h> | ||
9 | |||
10 | #include "receive_layer.h" | ||
11 | |||
12 | class QSocketNotifier; | ||
13 | class FileReceive : public ReceiveLayer { | ||
14 | Q_OBJECT | ||
15 | public: | ||
16 | enum Type { | ||
17 | SZ = 0, | ||
18 | SX, | ||
19 | SY | ||
20 | }; | ||
21 | FileReceive( Type t, IOLayer* lay, const QString& startDir = QString::null ); | ||
22 | ~FileReceive(); | ||
23 | void receive(); | ||
24 | void receive( const QString& dir ); | ||
25 | void cancel(); | ||
26 | private slots: | ||
27 | void setupChild(); | ||
28 | void slotRead(); | ||
29 | void slotExec(); | ||
30 | private: | ||
31 | pid_t m_pid; | ||
32 | int m_fd; | ||
33 | int m_prog; | ||
34 | int m_info[2]; | ||
35 | int m_comm[2]; | ||
36 | int m_term[2]; | ||
37 | Type m_type; | ||
38 | QSocketNotifier* m_not; | ||
39 | QSocketNotifier* m_proc; | ||
40 | }; | ||
41 | |||
42 | #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 | |||
@@ -18,4 +18,5 @@ FileTransfer::FileTransfer( Type t, IOLayer* lay ) | |||
18 | signal(SIGPIPE, SIG_IGN ); | 18 | signal(SIGPIPE, SIG_IGN ); |
19 | 19 | ||
20 | m_pid = 0; | ||
20 | m_not = 0l; | 21 | m_not = 0l; |
21 | m_proc = 0l; | 22 | m_proc = 0l; |
@@ -49,4 +50,5 @@ void FileTransfer::sendFile( const QString& file ) { | |||
49 | case -1: | 50 | case -1: |
50 | emit error( StartError, tr("Was not able to fork") ); | 51 | emit error( StartError, tr("Was not able to fork") ); |
52 | slotExec(); | ||
51 | break; | 53 | break; |
52 | case 0:{ | 54 | case 0:{ |
@@ -178,5 +180,4 @@ void FileTransfer::slotRead() { | |||
178 | if ( lis[0].simplifyWhiteSpace() == "Transfer" ) { | 180 | if ( lis[0].simplifyWhiteSpace() == "Transfer" ) { |
179 | qWarning("sent!!!!"); | 181 | qWarning("sent!!!!"); |
180 | emit sent(); | ||
181 | return; | 182 | return; |
182 | } | 183 | } |
@@ -237,5 +238,5 @@ void FileTransfer::slotProgress( const QStringList& list ) { | |||
237 | void FileTransfer::cancel() { | 238 | void FileTransfer::cancel() { |
238 | if(m_pid > 0) ::kill(m_pid,9 ); | 239 | if(m_pid > 0) ::kill(m_pid,9 ); |
239 | delete m_not; | 240 | |
240 | } | 241 | } |
241 | void FileTransfer::slotExec() { | 242 | void FileTransfer::slotExec() { |
@@ -250,4 +251,6 @@ void FileTransfer::slotExec() { | |||
250 | close( m_comm[0] ); | 251 | close( m_comm[0] ); |
251 | close( m_comm[1] ); | 252 | close( m_comm[1] ); |
253 | layer()->closeRawIO( m_fd ); | ||
252 | emit sent(); | 254 | emit sent(); |
255 | m_pid = 0; | ||
253 | } | 256 | } |
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 | |||
@@ -31,5 +31,7 @@ HEADERS = io_layer.h io_serial.h io_irda.h io_bt.h\ | |||
31 | atconfigdialog.h dialdialog.h \ | 31 | atconfigdialog.h dialdialog.h \ |
32 | emulation_widget.h procctl.h \ | 32 | emulation_widget.h procctl.h \ |
33 | function_keyboard.h script.h | 33 | function_keyboard.h \ |
34 | receive_layer.h filereceive.h \ | ||
35 | script.h | ||
34 | 36 | ||
35 | SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \ | 37 | SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \ |
@@ -59,5 +61,7 @@ SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \ | |||
59 | atconfigdialog.cpp dialdialog.cpp \ | 61 | atconfigdialog.cpp dialdialog.cpp \ |
60 | emulation_widget.cpp default.cpp procctl.cpp \ | 62 | emulation_widget.cpp default.cpp procctl.cpp \ |
61 | function_keyboard.cpp script.cpp | 63 | function_keyboard.cpp \ |
64 | receive_layer.cpp filereceive.cpp \ | ||
65 | script.cpp | ||
62 | 66 | ||
63 | INTERFACES = configurebase.ui editbase.ui | 67 | INTERFACES = configurebase.ui editbase.ui |
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 @@ | |||
1 | #include <unistd.h> | ||
2 | |||
3 | #include <qstring.h> | ||
4 | #include <qfile.h> | ||
5 | |||
6 | #include "io_layer.h" | ||
7 | #include "receive_layer.h" | ||
8 | |||
9 | ReceiveLayer::ReceiveLayer( IOLayer* lay, const QString& startDir ) | ||
10 | : QObject(), m_curDir( startDir ), m_layer(lay ) | ||
11 | { | ||
12 | |||
13 | } | ||
14 | ReceiveLayer::~ReceiveLayer() { | ||
15 | |||
16 | } | ||
17 | IOLayer* ReceiveLayer::layer() { | ||
18 | return m_layer; | ||
19 | } | ||
20 | QString ReceiveLayer::currentDir()const{ | ||
21 | if (m_curDir.isEmpty() ) | ||
22 | return QString::fromLocal8Bit( ::getwd(NULL) ); | ||
23 | return m_curDir; | ||
24 | } | ||
25 | void ReceiveLayer::changeDir( const QString& str) { | ||
26 | ::chdir( str.latin1() ); | ||
27 | } | ||
28 | void ReceiveLayer::receive( const QString& dir, Mode, Features ) { | ||
29 | receive( dir ); | ||
30 | } | ||
31 | void ReceiveLayer::cancel() { | ||
32 | |||
33 | } | ||
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 | |||
@@ -46,10 +46,9 @@ public: | |||
46 | 46 | ||
47 | /** | 47 | /** |
48 | * which protocol to use? | 48 | * Error codes |
49 | */ | 49 | */ |
50 | enum Type{ | 50 | enum Error { |
51 | SZ = 0, | 51 | Unknown = 0, |
52 | SX, | 52 | StartError |
53 | SY | ||
54 | }; | 53 | }; |
55 | 54 | ||
@@ -60,5 +59,5 @@ public: | |||
60 | * @param startDir In which dir should files be received? | 59 | * @param startDir In which dir should files be received? |
61 | */ | 60 | */ |
62 | ReceiveLayer( IOLayer* lay, Type t, const QString& startDir = QString::null ); | 61 | ReceiveLayer( IOLayer* lay, const QString& startDir = QString::null ); |
63 | virtual ~ReceiveLayer(); | 62 | virtual ~ReceiveLayer(); |
64 | 63 | ||
@@ -79,5 +78,5 @@ public slots: | |||
79 | * advanced method with features and Mode | 78 | * advanced method with features and Mode |
80 | */ | 79 | */ |
81 | virtual void receive( const QString& dir, Mode, Features ) {} | 80 | virtual void receive( const QString& dir, Mode, Features ); |
82 | 81 | ||
83 | /** | 82 | /** |
@@ -109,4 +108,13 @@ signals: | |||
109 | void received( const QString& file ); | 108 | void received( const QString& file ); |
110 | 109 | ||
110 | protected: | ||
111 | QString m_curDir; | ||
112 | IOLayer* layer(); | ||
113 | /* from a variable set from the outside */ | ||
114 | QString currentDir()const; | ||
115 | void changeDir( const QString& ); | ||
116 | private: | ||
117 | IOLayer* m_layer; | ||
118 | |||
111 | }; | 119 | }; |
112 | 120 | ||
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 | |||
@@ -4,8 +4,10 @@ CONFIG = qt debug | |||
4 | #DESTDIR = $(OPIEDIR)/bin | 4 | #DESTDIR = $(OPIEDIR)/bin |
5 | HEADERS = ../io_layer.h ../io_serial.h ../sz_transfer.h ../file_layer.h\ | 5 | HEADERS = ../io_layer.h ../io_serial.h ../sz_transfer.h ../file_layer.h\ |
6 | senderui.h ../profile.h ../filetransfer.h ../procctl.h | 6 | senderui.h ../profile.h ../filetransfer.h ../procctl.h \ |
7 | ../filereceive.h ../receive_layer.h | ||
7 | SOURCES = ../io_layer.cpp ../io_serial.cpp \ | 8 | SOURCES = ../io_layer.cpp ../io_serial.cpp \ |
8 | ../profile.cpp ../sz_transfer.cpp ../file_layer.cpp\ | 9 | ../profile.cpp ../sz_transfer.cpp ../file_layer.cpp\ |
9 | main.cpp senderui.cpp ../filetransfer.cpp ../procctl.cpp | 10 | main.cpp senderui.cpp ../filetransfer.cpp ../procctl.cpp \ |
11 | ../filereceive.cpp ../receive_layer.cpp | ||
10 | INTERFACES = sender.ui | 12 | INTERFACES = sender.ui |
11 | INCLUDEPATH += $(OPIEDIR)/include | 13 | INCLUDEPATH += $(OPIEDIR)/include |
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 | |||
@@ -12,5 +12,5 @@ | |||
12 | <x>0</x> | 12 | <x>0</x> |
13 | <y>0</y> | 13 | <y>0</y> |
14 | <width>596</width> | 14 | <width>592</width> |
15 | <height>480</height> | 15 | <height>480</height> |
16 | </rect> | 16 | </rect> |
@@ -40,4 +40,15 @@ | |||
40 | <property stdset="1"> | 40 | <property stdset="1"> |
41 | <name>name</name> | 41 | <name>name</name> |
42 | <cstring>PushButton3</cstring> | ||
43 | </property> | ||
44 | <property stdset="1"> | ||
45 | <name>text</name> | ||
46 | <string>Receive File</string> | ||
47 | </property> | ||
48 | </widget> | ||
49 | <widget> | ||
50 | <class>QPushButton</class> | ||
51 | <property stdset="1"> | ||
52 | <name>name</name> | ||
42 | <cstring>PushButton1</cstring> | 53 | <cstring>PushButton1</cstring> |
43 | </property> | 54 | </property> |
@@ -67,5 +78,4 @@ | |||
67 | <slot>slotSend()</slot> | 78 | <slot>slotSend()</slot> |
68 | </connection> | 79 | </connection> |
69 | <slot access="public">slotSend()</slot> | ||
70 | <connection> | 80 | <connection> |
71 | <sender>PushButton2</sender> | 81 | <sender>PushButton2</sender> |
@@ -74,4 +84,12 @@ | |||
74 | <slot>slotSendFile()</slot> | 84 | <slot>slotSendFile()</slot> |
75 | </connection> | 85 | </connection> |
86 | <connection> | ||
87 | <sender>PushButton3</sender> | ||
88 | <signal>clicked()</signal> | ||
89 | <receiver>Form1</receiver> | ||
90 | <slot>slotRev()</slot> | ||
91 | </connection> | ||
92 | <slot access="public">slotRev()</slot> | ||
93 | <slot access="public">slotSend()</slot> | ||
76 | <slot access="public">slotSendFile()</slot> | 94 | <slot access="public">slotSendFile()</slot> |
77 | </connections> | 95 | </connections> |
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 | |||
@@ -10,4 +10,5 @@ | |||
10 | #include "../io_serial.h" | 10 | #include "../io_serial.h" |
11 | #include "../filetransfer.h" | 11 | #include "../filetransfer.h" |
12 | #include "../filereceive.h" | ||
12 | 13 | ||
13 | #include <opie/oprocess.h> | 14 | #include <opie/oprocess.h> |
@@ -67,2 +68,8 @@ void SenderUI::send() { | |||
67 | 68 | ||
68 | } | 69 | } |
70 | void SenderUI::slotRev(){ | ||
71 | qWarning("Going to receive!"); | ||
72 | FileReceive *rev = new FileReceive( FileReceive::SZ, ser ); | ||
73 | rev->receive(); | ||
74 | |||
75 | } \ 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 | |||
@@ -20,4 +20,5 @@ public slots: | |||
20 | void slotSendFile(); | 20 | void slotSendFile(); |
21 | void slotSend(); | 21 | void slotSend(); |
22 | void slotRev(); | ||
22 | void got(const QByteArray& ); | 23 | void got(const QByteArray& ); |
23 | void fileTransComplete(); | 24 | void fileTransComplete(); |