author | josef <josef> | 2002-10-16 17:25:49 (UTC) |
---|---|---|
committer | josef <josef> | 2002-10-16 17:25:49 (UTC) |
commit | 1a305f211913ce4a4d73ed0b36a0be535c0e03ec (patch) (unidiff) | |
tree | 5b6e4a814107750e0edb2b10ab6a04a658f5c4f4 | |
parent | 9a7e223378c2d178f575b14f7632843f39faf461 (diff) | |
download | opie-1a305f211913ce4a4d73ed0b36a0be535c0e03ec.zip opie-1a305f211913ce4a4d73ed0b36a0be535c0e03ec.tar.gz opie-1a305f211913ce4a4d73ed0b36a0be535c0e03ec.tar.bz2 |
- if send/receive child processes exit, clicking on 'cancel' doesn't inform the
user about process cancellation because this is already done at this time.
-rw-r--r-- | noncore/apps/opie-console/transferdialog.cpp | 30 | ||||
-rw-r--r-- | noncore/apps/opie-console/transferdialog.h | 3 |
2 files changed, 27 insertions, 6 deletions
diff --git a/noncore/apps/opie-console/transferdialog.cpp b/noncore/apps/opie-console/transferdialog.cpp index 0083cc1..f9a0b87 100644 --- a/noncore/apps/opie-console/transferdialog.cpp +++ b/noncore/apps/opie-console/transferdialog.cpp | |||
@@ -1,243 +1,261 @@ | |||
1 | #include <qlayout.h> | 1 | #include <qlayout.h> |
2 | #include <qcombobox.h> | 2 | #include <qcombobox.h> |
3 | #include <qlabel.h> | 3 | #include <qlabel.h> |
4 | #include <qlineedit.h> | 4 | #include <qlineedit.h> |
5 | #include <qpushbutton.h> | 5 | #include <qpushbutton.h> |
6 | #include <qmessagebox.h> | 6 | #include <qmessagebox.h> |
7 | #include <qprogressbar.h> | 7 | #include <qprogressbar.h> |
8 | #include <qradiobutton.h> | 8 | #include <qradiobutton.h> |
9 | #include <qbuttongroup.h> | 9 | #include <qbuttongroup.h> |
10 | 10 | ||
11 | #include <opie/ofiledialog.h> | 11 | #include <opie/ofiledialog.h> |
12 | 12 | ||
13 | #include "file_layer.h" | 13 | #include "file_layer.h" |
14 | #include "receive_layer.h" | 14 | #include "receive_layer.h" |
15 | #include "metafactory.h" | 15 | #include "metafactory.h" |
16 | #include "mainwindow.h" | 16 | #include "mainwindow.h" |
17 | 17 | ||
18 | #include "transferdialog.h" | 18 | #include "transferdialog.h" |
19 | 19 | ||
20 | TransferDialog::TransferDialog(MainWindow *parent, const char *name) | 20 | TransferDialog::TransferDialog(MainWindow *parent, const char *name) |
21 | : QDialog(0l, 0l, true), m_win(parent) | 21 | : QDialog(0l, 0l, true), m_win(parent) |
22 | { | 22 | { |
23 | m_lay = 0l; | 23 | m_lay = 0l; |
24 | m_recvlay = 0l; | 24 | m_recvlay = 0l; |
25 | QVBoxLayout *vbox, *vbox2; | 25 | QVBoxLayout *vbox, *vbox2; |
26 | QHBoxLayout *hbox, *hbox2, *hbox3; | 26 | QHBoxLayout *hbox, *hbox2, *hbox3; |
27 | QLabel *file, *mode, *progress, *status; | 27 | QLabel *file, *mode, *progress, *status; |
28 | QButtonGroup *group; | 28 | QButtonGroup *group; |
29 | QRadioButton *mode_send, *mode_receive; | 29 | QRadioButton *mode_send, *mode_receive; |
30 | 30 | ||
31 | m_autocleanup = 0; | ||
32 | |||
31 | group = new QButtonGroup(QObject::tr("Transfer mode"), this); | 33 | group = new QButtonGroup(QObject::tr("Transfer mode"), this); |
32 | mode_send = new QRadioButton(QObject::tr("Send"), group); | 34 | mode_send = new QRadioButton(QObject::tr("Send"), group); |
33 | mode_receive = new QRadioButton(QObject::tr("Receive"), group); | 35 | mode_receive = new QRadioButton(QObject::tr("Receive"), group); |
34 | group->insert(mode_send, id_send); | 36 | group->insert(mode_send, id_send); |
35 | group->insert(mode_receive, id_receive); | 37 | group->insert(mode_receive, id_receive); |
36 | vbox2 = new QVBoxLayout(group, 2); | 38 | vbox2 = new QVBoxLayout(group, 2); |
37 | vbox2->addSpacing(10); | 39 | vbox2->addSpacing(10); |
38 | hbox3 = new QHBoxLayout(vbox2, 2); | 40 | hbox3 = new QHBoxLayout(vbox2, 2); |
39 | hbox3->add(mode_send); | 41 | hbox3->add(mode_send); |
40 | hbox3->add(mode_receive); | 42 | hbox3->add(mode_receive); |
41 | mode_send->setChecked(true); | 43 | mode_send->setChecked(true); |
42 | m_transfermode = id_send; | 44 | m_transfermode = id_send; |
43 | 45 | ||
44 | file = new QLabel(QObject::tr("Send file"), this); | 46 | file = new QLabel(QObject::tr("Send file"), this); |
45 | mode = new QLabel(QObject::tr("Transfer protocol"), this); | 47 | mode = new QLabel(QObject::tr("Transfer protocol"), this); |
46 | progress = new QLabel(QObject::tr("Progress"), this); | 48 | progress = new QLabel(QObject::tr("Progress"), this); |
47 | status = new QLabel(QObject::tr("Status"), this); | 49 | status = new QLabel(QObject::tr("Status"), this); |
48 | 50 | ||
49 | statusbar = new QLabel(QObject::tr("Ready"), this); | 51 | statusbar = new QLabel(QObject::tr("Ready"), this); |
50 | statusbar->setFrameStyle(QFrame::Panel | QFrame::Sunken); | 52 | statusbar->setFrameStyle(QFrame::Panel | QFrame::Sunken); |
51 | 53 | ||
52 | protocol = new QComboBox(this); | 54 | protocol = new QComboBox(this); |
53 | QStringList list = m_win->factory()->fileTransferLayers(); | 55 | QStringList list = m_win->factory()->fileTransferLayers(); |
54 | for (QStringList::Iterator it = list.begin(); it != list.end(); ++it) | 56 | for (QStringList::Iterator it = list.begin(); it != list.end(); ++it) |
55 | protocol->insertItem((*it)); | 57 | protocol->insertItem((*it)); |
56 | 58 | ||
57 | filename = new QLineEdit(this); | 59 | filename = new QLineEdit(this); |
58 | 60 | ||
59 | progressbar = new QProgressBar(this); | 61 | progressbar = new QProgressBar(this); |
60 | progressbar->setProgress(0); | 62 | progressbar->setProgress(0); |
61 | 63 | ||
62 | selector = new QPushButton("...", this); | 64 | selector = new QPushButton("...", this); |
63 | ok = new QPushButton(QObject::tr("Start transfer"), this); | 65 | ok = new QPushButton(QObject::tr("Start transfer"), this); |
64 | cancel = new QPushButton(QObject::tr("Cancel"), this); | 66 | cancel = new QPushButton(QObject::tr("Cancel"), this); |
65 | 67 | ||
66 | vbox = new QVBoxLayout(this, 2); | 68 | vbox = new QVBoxLayout(this, 2); |
67 | vbox->add(group); | 69 | vbox->add(group); |
68 | vbox->add(file); | 70 | vbox->add(file); |
69 | hbox = new QHBoxLayout(vbox, 0); | 71 | hbox = new QHBoxLayout(vbox, 0); |
70 | hbox->add(filename); | 72 | hbox->add(filename); |
71 | hbox->add(selector); | 73 | hbox->add(selector); |
72 | vbox->add(mode); | 74 | vbox->add(mode); |
73 | vbox->add(protocol); | 75 | vbox->add(protocol); |
74 | vbox->add(progress); | 76 | vbox->add(progress); |
75 | vbox->add(progressbar); | 77 | vbox->add(progressbar); |
76 | vbox->add(status); | 78 | vbox->add(status); |
77 | vbox->add(statusbar); | 79 | vbox->add(statusbar); |
78 | vbox->addStretch(1); | 80 | vbox->addStretch(1); |
79 | hbox2 = new QHBoxLayout(vbox, 2); | 81 | hbox2 = new QHBoxLayout(vbox, 2); |
80 | hbox2->add(ok); | 82 | hbox2->add(ok); |
81 | hbox2->add(cancel); | 83 | hbox2->add(cancel); |
82 | 84 | ||
83 | setCaption(QObject::tr("File transfer")); | 85 | setCaption(QObject::tr("File transfer")); |
84 | show(); | 86 | show(); |
85 | 87 | ||
86 | connect(selector, SIGNAL(clicked()), SLOT(slotFilename())); | 88 | connect(selector, SIGNAL(clicked()), SLOT(slotFilename())); |
87 | connect(ok, SIGNAL(clicked()), SLOT(slotTransfer())); | 89 | connect(ok, SIGNAL(clicked()), SLOT(slotTransfer())); |
88 | connect(cancel, SIGNAL(clicked()), SLOT(slotCancel())); | 90 | connect(cancel, SIGNAL(clicked()), SLOT(slotCancel())); |
89 | connect(group, SIGNAL(clicked(int)), SLOT(slotMode(int))); | 91 | connect(group, SIGNAL(clicked(int)), SLOT(slotMode(int))); |
90 | } | 92 | } |
91 | 93 | ||
92 | TransferDialog::~TransferDialog() | 94 | TransferDialog::~TransferDialog() |
93 | { | 95 | { |
94 | } | 96 | } |
95 | 97 | ||
96 | void TransferDialog::slotFilename() | 98 | void TransferDialog::slotFilename() |
97 | { | 99 | { |
98 | QString f; | 100 | QString f; |
99 | 101 | ||
100 | f = OFileDialog::getOpenFileName(0); | 102 | f = OFileDialog::getOpenFileName(0); |
101 | if(!f.isNull()) filename->setText(f); | 103 | if(!f.isNull()) filename->setText(f); |
102 | } | 104 | } |
103 | 105 | ||
104 | void TransferDialog::slotTransfer() | 106 | void TransferDialog::slotTransfer() |
105 | { | 107 | { |
106 | if((m_transfermode == id_send) && (filename->text().isEmpty())) | 108 | if((m_transfermode == id_send) && (filename->text().isEmpty())) |
107 | { | 109 | { |
108 | QMessageBox::information(this, | 110 | QMessageBox::information(this, |
109 | QObject::tr("Attention"), | 111 | QObject::tr("Attention"), |
110 | QObject::tr("No file has been specified.")); | 112 | QObject::tr("No file has been specified.")); |
111 | return; | 113 | return; |
112 | } | 114 | } |
113 | 115 | ||
114 | ok->setEnabled(false); | 116 | ok->setEnabled(false); |
115 | 117 | ||
118 | cleanup(); | ||
119 | m_autocleanup = 0; | ||
120 | |||
116 | if(m_transfermode == id_send) statusbar->setText(QObject::tr("Sending...")); | 121 | if(m_transfermode == id_send) statusbar->setText(QObject::tr("Sending...")); |
117 | else statusbar->setText(QObject::tr("Receiving...")); | 122 | else statusbar->setText(QObject::tr("Receiving...")); |
118 | 123 | ||
119 | if(m_transfermode == id_send) | 124 | if(m_transfermode == id_send) |
120 | { | 125 | { |
121 | m_lay = m_win->factory()->newFileTransfer(protocol->currentText(), m_win->currentSession()->layer()); | 126 | m_lay = m_win->factory()->newFileTransfer(protocol->currentText(), m_win->currentSession()->layer()); |
122 | m_lay->sendFile(filename->text()); | 127 | m_lay->sendFile(filename->text()); |
123 | 128 | ||
124 | connect(m_lay, SIGNAL(progress(const QString&, int, int, int, int, int)), | 129 | connect(m_lay, SIGNAL(progress(const QString&, int, int, int, int, int)), |
125 | SLOT(slotProgress(const QString&, int, int, int, int, int))); | 130 | SLOT(slotProgress(const QString&, int, int, int, int, int))); |
126 | connect(m_lay, SIGNAL(error(int, const QString&)), SLOT(slotError(int, const QString&))); | 131 | connect(m_lay, SIGNAL(error(int, const QString&)), SLOT(slotError(int, const QString&))); |
127 | connect(m_lay, SIGNAL(sent()), SLOT(slotSent())); | 132 | connect(m_lay, SIGNAL(sent()), SLOT(slotSent())); |
128 | } | 133 | } |
129 | else | 134 | else |
130 | { | 135 | { |
131 | m_recvlay = m_win->factory()->newReceive(protocol->currentText(), m_win->currentSession()->layer()); | 136 | m_recvlay = m_win->factory()->newReceive(protocol->currentText(), m_win->currentSession()->layer()); |
132 | m_recvlay->receive(); | 137 | m_recvlay->receive(); |
133 | 138 | ||
134 | connect(m_recvlay, SIGNAL(progress(const QString&, int, int, int, int, int)), | 139 | connect(m_recvlay, SIGNAL(progress(const QString&, int, int, int, int, int)), |
135 | SLOT(slotProgress(const QString&, int, int, int, int, int))); | 140 | SLOT(slotProgress(const QString&, int, int, int, int, int))); |
136 | connect(m_recvlay, SIGNAL(error(int, const QString&)), SLOT(slotError(int, const QString&))); | 141 | connect(m_recvlay, SIGNAL(error(int, const QString&)), SLOT(slotError(int, const QString&))); |
137 | connect(m_recvlay, SIGNAL(received(const QString&)), SLOT(slotReceived(const QString&))); | 142 | connect(m_recvlay, SIGNAL(received(const QString&)), SLOT(slotReceived(const QString&))); |
138 | } | 143 | } |
139 | } | 144 | } |
140 | 145 | ||
141 | void TransferDialog::slotCancel() | 146 | void TransferDialog::cleanup() |
142 | { | ||
143 | ok->setEnabled(true); | ||
144 | statusbar->setText(QObject::tr("Ready")); | ||
145 | |||
146 | if((m_lay) || (m_recvlay)) | ||
147 | { | 147 | { |
148 | if(m_lay) | 148 | if(m_lay) |
149 | { | 149 | { |
150 | m_lay->cancel(); | 150 | m_lay->cancel(); |
151 | delete m_lay; | 151 | delete m_lay; |
152 | m_lay = 0l; | 152 | m_lay = 0l; |
153 | } | 153 | } |
154 | if(m_recvlay) | 154 | if(m_recvlay) |
155 | { | 155 | { |
156 | m_recvlay->cancel(); | 156 | m_recvlay->cancel(); |
157 | delete m_recvlay; | 157 | delete m_recvlay; |
158 | m_recvlay = 0l; | 158 | m_recvlay = 0l; |
159 | } | 159 | } |
160 | } | ||
161 | |||
162 | void TransferDialog::slotCancel() | ||
163 | { | ||
164 | ok->setEnabled(true); | ||
165 | statusbar->setText(QObject::tr("Ready")); | ||
166 | |||
167 | if((m_lay) || (m_recvlay)) | ||
168 | { | ||
169 | cleanup(); | ||
170 | if(m_autocleanup) close(); | ||
171 | else | ||
172 | { | ||
160 | QMessageBox::information(this, | 173 | QMessageBox::information(this, |
161 | QObject::tr("Cancelled"), | 174 | QObject::tr("Cancelled"), |
162 | QObject::tr("The file transfer has been cancelled.")); | 175 | QObject::tr("The file transfer has been cancelled.")); |
163 | } | 176 | } |
177 | } | ||
164 | else | 178 | else |
165 | { | 179 | { |
166 | close(); | 180 | close(); |
167 | } | 181 | } |
168 | } | 182 | } |
169 | 183 | ||
170 | void TransferDialog::slotProgress(const QString& file, int progress, int speed, int hours, int minutes, int seconds) | 184 | void TransferDialog::slotProgress(const QString& file, int progress, int speed, int hours, int minutes, int seconds) |
171 | { | 185 | { |
172 | progressbar->setProgress(progress); | 186 | progressbar->setProgress(progress); |
173 | } | 187 | } |
174 | 188 | ||
175 | void TransferDialog::slotError(int error, const QString& message) | 189 | void TransferDialog::slotError(int error, const QString& message) |
176 | { | 190 | { |
177 | statusbar->setText(QObject::tr("Ready")); | 191 | statusbar->setText(QObject::tr("Ready")); |
178 | 192 | ||
179 | switch(error) | 193 | switch(error) |
180 | { | 194 | { |
181 | case FileTransferLayer::NotSupported: | 195 | case FileTransferLayer::NotSupported: |
182 | QMessageBox::critical(this, | 196 | QMessageBox::critical(this, |
183 | QObject::tr("Error"), | 197 | QObject::tr("Error"), |
184 | QObject::tr("Operation not supported.")); | 198 | QObject::tr("Operation not supported.")); |
185 | break; | 199 | break; |
186 | case FileTransferLayer::StartError: | 200 | case FileTransferLayer::StartError: |
187 | QMessageBox::critical(this, | 201 | QMessageBox::critical(this, |
188 | QObject::tr("Error"), | 202 | QObject::tr("Error"), |
189 | QObject::tr("Transfer could not be started.")); | 203 | QObject::tr("Transfer could not be started.")); |
190 | break; | 204 | break; |
191 | case FileTransferLayer::NoError: | 205 | case FileTransferLayer::NoError: |
192 | QMessageBox::critical(this, | 206 | QMessageBox::critical(this, |
193 | QObject::tr("Error"), | 207 | QObject::tr("Error"), |
194 | QObject::tr("No error.")); | 208 | QObject::tr("No error.")); |
195 | break; | 209 | break; |
196 | case FileTransferLayer::Undefined: | 210 | case FileTransferLayer::Undefined: |
197 | QMessageBox::critical(this, | 211 | QMessageBox::critical(this, |
198 | QObject::tr("Error"), | 212 | QObject::tr("Error"), |
199 | QObject::tr("Undefined error occured.")); | 213 | QObject::tr("Undefined error occured.")); |
200 | break; | 214 | break; |
201 | case FileTransferLayer::Incomplete: | 215 | case FileTransferLayer::Incomplete: |
202 | QMessageBox::critical(this, | 216 | QMessageBox::critical(this, |
203 | QObject::tr("Error"), | 217 | QObject::tr("Error"), |
204 | QObject::tr("Incomplete transfer.")); | 218 | QObject::tr("Incomplete transfer.")); |
205 | break; | 219 | break; |
206 | case FileTransferLayer::Unknown: | 220 | case FileTransferLayer::Unknown: |
207 | default: | 221 | default: |
208 | QMessageBox::critical(this, | 222 | QMessageBox::critical(this, |
209 | QObject::tr("Error"), | 223 | QObject::tr("Error"), |
210 | QObject::tr("Unknown error occured.")); | 224 | QObject::tr("Unknown error occured.")); |
211 | break; | 225 | break; |
212 | } | 226 | } |
227 | |||
228 | m_autocleanup = 1; | ||
213 | } | 229 | } |
214 | 230 | ||
215 | void TransferDialog::slotSent() | 231 | void TransferDialog::slotSent() |
216 | { | 232 | { |
217 | QMessageBox::information(this, QObject::tr("Sent"), QObject::tr("File has been sent.")); | 233 | QMessageBox::information(this, QObject::tr("Sent"), QObject::tr("File has been sent.")); |
218 | ok->setEnabled(true); | 234 | ok->setEnabled(true); |
219 | statusbar->setText(QObject::tr("Ready")); | 235 | statusbar->setText(QObject::tr("Ready")); |
236 | m_autocleanup = 1; | ||
220 | } | 237 | } |
221 | 238 | ||
222 | void TransferDialog::slotReceived(const QString& file) | 239 | void TransferDialog::slotReceived(const QString& file) |
223 | { | 240 | { |
224 | QMessageBox::information(this, QObject::tr("Sent"), QObject::tr("File has been received as %1.").arg(file)); | 241 | QMessageBox::information(this, QObject::tr("Sent"), QObject::tr("File has been received as %1.").arg(file)); |
225 | ok->setEnabled(true); | 242 | ok->setEnabled(true); |
226 | statusbar->setText(QObject::tr("Ready")); | 243 | statusbar->setText(QObject::tr("Ready")); |
244 | m_autocleanup = 1; | ||
227 | } | 245 | } |
228 | 246 | ||
229 | void TransferDialog::slotMode(int id) | 247 | void TransferDialog::slotMode(int id) |
230 | { | 248 | { |
231 | if(id == id_send) | 249 | if(id == id_send) |
232 | { | 250 | { |
233 | selector->setEnabled(true); | 251 | selector->setEnabled(true); |
234 | filename->setEnabled(true); | 252 | filename->setEnabled(true); |
235 | } | 253 | } |
236 | else | 254 | else |
237 | { | 255 | { |
238 | selector->setEnabled(false); | 256 | selector->setEnabled(false); |
239 | filename->setEnabled(false); | 257 | filename->setEnabled(false); |
240 | } | 258 | } |
241 | m_transfermode = id; | 259 | m_transfermode = id; |
242 | } | 260 | } |
243 | 261 | ||
diff --git a/noncore/apps/opie-console/transferdialog.h b/noncore/apps/opie-console/transferdialog.h index de3a5cf..1b27f16 100644 --- a/noncore/apps/opie-console/transferdialog.h +++ b/noncore/apps/opie-console/transferdialog.h | |||
@@ -1,51 +1,54 @@ | |||
1 | #ifndef TRANSFER_DIALOG_H | 1 | #ifndef TRANSFER_DIALOG_H |
2 | #define TRANSFER_DIALOG_H | 2 | #define TRANSFER_DIALOG_H |
3 | 3 | ||
4 | #include "qdialog.h" | 4 | #include "qdialog.h" |
5 | 5 | ||
6 | class QLineEdit; | 6 | class QLineEdit; |
7 | class QComboBox; | 7 | class QComboBox; |
8 | class QProgressBar; | 8 | class QProgressBar; |
9 | class QLabel; | 9 | class QLabel; |
10 | class QPushButton; | 10 | class QPushButton; |
11 | class MainWindow; | 11 | class MainWindow; |
12 | class FileTransferLayer; | 12 | class FileTransferLayer; |
13 | class ReceiveLayer; | 13 | class ReceiveLayer; |
14 | 14 | ||
15 | class TransferDialog : public QDialog | 15 | class TransferDialog : public QDialog |
16 | { | 16 | { |
17 | Q_OBJECT | 17 | Q_OBJECT |
18 | public: | 18 | public: |
19 | TransferDialog(MainWindow *parent = 0l, const char *name = 0l); | 19 | TransferDialog(MainWindow *parent = 0l, const char *name = 0l); |
20 | ~TransferDialog(); | 20 | ~TransferDialog(); |
21 | 21 | ||
22 | public slots: | 22 | public slots: |
23 | void slotFilename(); | 23 | void slotFilename(); |
24 | void slotTransfer(); | 24 | void slotTransfer(); |
25 | void slotCancel(); | 25 | void slotCancel(); |
26 | void slotProgress(const QString&, int, int, int, int, int); | 26 | void slotProgress(const QString&, int, int, int, int, int); |
27 | void slotError(int error, const QString& message); | 27 | void slotError(int error, const QString& message); |
28 | void slotSent(); | 28 | void slotSent(); |
29 | void slotReceived(const QString& file); | 29 | void slotReceived(const QString& file); |
30 | void slotMode(int id); | 30 | void slotMode(int id); |
31 | 31 | ||
32 | private: | 32 | private: |
33 | enum Modes | 33 | enum Modes |
34 | { | 34 | { |
35 | id_send, | 35 | id_send, |
36 | id_receive | 36 | id_receive |
37 | }; | 37 | }; |
38 | 38 | ||
39 | void cleanup(); | ||
40 | |||
39 | QLineEdit *filename; | 41 | QLineEdit *filename; |
40 | QComboBox *protocol; | 42 | QComboBox *protocol; |
41 | QProgressBar *progressbar; | 43 | QProgressBar *progressbar; |
42 | QLabel *statusbar; | 44 | QLabel *statusbar; |
43 | QPushButton *ok, *cancel, *selector; | 45 | QPushButton *ok, *cancel, *selector; |
44 | MainWindow* m_win; | 46 | MainWindow* m_win; |
45 | FileTransferLayer* m_lay; | 47 | FileTransferLayer* m_lay; |
46 | ReceiveLayer *m_recvlay; | 48 | ReceiveLayer *m_recvlay; |
47 | int m_transfermode; | 49 | int m_transfermode; |
50 | int m_autocleanup; | ||
48 | }; | 51 | }; |
49 | 52 | ||
50 | #endif | 53 | #endif |
51 | 54 | ||