source: trunk/examples/network/qftp/ftpwindow.cpp@ 651

Last change on this file since 651 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

  • Property svn:eol-style set to native
File size: 11.4 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the examples of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include <QtGui>
43#include <QtNetwork>
44
45#include "ftpwindow.h"
46
47#ifdef Q_OS_SYMBIAN
48#include "sym_iap_util.h"
49#endif
50
51FtpWindow::FtpWindow(QWidget *parent)
52 : QDialog(parent), ftp(0)
53{
54 ftpServerLabel = new QLabel(tr("Ftp &server:"));
55 ftpServerLineEdit = new QLineEdit("ftp.qt.nokia.com");
56 ftpServerLabel->setBuddy(ftpServerLineEdit);
57
58 statusLabel = new QLabel(tr("Please enter the name of an FTP server."));
59#ifdef Q_OS_SYMBIAN
60 // Use word wrapping to fit the text on screen
61 statusLabel->setWordWrap( true );
62#endif
63
64 fileList = new QTreeWidget;
65 fileList->setEnabled(false);
66 fileList->setRootIsDecorated(false);
67 fileList->setHeaderLabels(QStringList() << tr("Name") << tr("Size") << tr("Owner") << tr("Group") << tr("Time"));
68 fileList->header()->setStretchLastSection(false);
69
70 connectButton = new QPushButton(tr("Connect"));
71 connectButton->setDefault(true);
72
73 cdToParentButton = new QPushButton;
74 cdToParentButton->setIcon(QPixmap(":/images/cdtoparent.png"));
75 cdToParentButton->setEnabled(false);
76
77 downloadButton = new QPushButton(tr("Download"));
78 downloadButton->setEnabled(false);
79
80 quitButton = new QPushButton(tr("Quit"));
81
82 buttonBox = new QDialogButtonBox;
83 buttonBox->addButton(downloadButton, QDialogButtonBox::ActionRole);
84 buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
85
86 progressDialog = new QProgressDialog(this);
87
88 connect(fileList, SIGNAL(itemActivated(QTreeWidgetItem*,int)),
89 this, SLOT(processItem(QTreeWidgetItem*,int)));
90 connect(fileList, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
91 this, SLOT(enableDownloadButton()));
92 connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
93 connect(connectButton, SIGNAL(clicked()), this, SLOT(connectOrDisconnect()));
94 connect(cdToParentButton, SIGNAL(clicked()), this, SLOT(cdToParent()));
95 connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadFile()));
96 connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
97
98 QHBoxLayout *topLayout = new QHBoxLayout;
99 topLayout->addWidget(ftpServerLabel);
100 topLayout->addWidget(ftpServerLineEdit);
101#ifndef Q_OS_SYMBIAN
102 topLayout->addWidget(cdToParentButton);
103 topLayout->addWidget(connectButton);
104#else
105 // Make app better lookin on small screen
106 QHBoxLayout *topLayout2 = new QHBoxLayout;
107 topLayout2->addWidget(cdToParentButton);
108 topLayout2->addWidget(connectButton);
109#endif
110
111 QVBoxLayout *mainLayout = new QVBoxLayout;
112 mainLayout->addLayout(topLayout);
113#ifdef Q_OS_SYMBIAN
114 // Make app better lookin on small screen
115 mainLayout->addLayout(topLayout2);
116#endif
117 mainLayout->addWidget(fileList);
118 mainLayout->addWidget(statusLabel);
119 mainLayout->addWidget(buttonBox);
120 setLayout(mainLayout);
121
122#ifdef Q_OS_SYMBIAN
123 bDefaultIapSet = false;
124#endif
125
126 setWindowTitle(tr("FTP"));
127}
128
129QSize FtpWindow::sizeHint() const
130{
131 return QSize(500, 300);
132}
133
134//![0]
135void FtpWindow::connectOrDisconnect()
136{
137#ifdef Q_OS_SYMBIAN
138 if(!bDefaultIapSet) {
139 qt_SetDefaultIap();
140 bDefaultIapSet = true;
141 }
142#endif
143 if (ftp) {
144 ftp->abort();
145 ftp->deleteLater();
146 ftp = 0;
147//![0]
148 fileList->setEnabled(false);
149 cdToParentButton->setEnabled(false);
150 downloadButton->setEnabled(false);
151 connectButton->setEnabled(true);
152 connectButton->setText(tr("Connect"));
153#ifndef QT_NO_CURSOR
154 setCursor(Qt::ArrowCursor);
155#endif
156 statusLabel->setText(tr("Please enter the name of an FTP server."));
157 return;
158 }
159
160#ifndef QT_NO_CURSOR
161 setCursor(Qt::WaitCursor);
162#endif
163
164//![1]
165 ftp = new QFtp(this);
166 connect(ftp, SIGNAL(commandFinished(int,bool)),
167 this, SLOT(ftpCommandFinished(int,bool)));
168 connect(ftp, SIGNAL(listInfo(QUrlInfo)),
169 this, SLOT(addToList(QUrlInfo)));
170 connect(ftp, SIGNAL(dataTransferProgress(qint64,qint64)),
171 this, SLOT(updateDataTransferProgress(qint64,qint64)));
172
173 fileList->clear();
174 currentPath.clear();
175 isDirectory.clear();
176//![1]
177
178//![2]
179 QUrl url(ftpServerLineEdit->text());
180 if (!url.isValid() || url.scheme().toLower() != QLatin1String("ftp")) {
181 ftp->connectToHost(ftpServerLineEdit->text(), 21);
182 ftp->login();
183 } else {
184 ftp->connectToHost(url.host(), url.port(21));
185
186 if (!url.userName().isEmpty())
187 ftp->login(QUrl::fromPercentEncoding(url.userName().toLatin1()), url.password());
188 else
189 ftp->login();
190 if (!url.path().isEmpty())
191 ftp->cd(url.path());
192 }
193//![2]
194
195 fileList->setEnabled(true);
196 connectButton->setEnabled(false);
197 connectButton->setText(tr("Disconnect"));
198 statusLabel->setText(tr("Connecting to FTP server %1...")
199 .arg(ftpServerLineEdit->text()));
200}
201
202//![3]
203void FtpWindow::downloadFile()
204{
205 QString fileName = fileList->currentItem()->text(0);
206//![3]
207//
208 if (QFile::exists(fileName)) {
209 QMessageBox::information(this, tr("FTP"),
210 tr("There already exists a file called %1 in "
211 "the current directory.")
212 .arg(fileName));
213 return;
214 }
215
216//![4]
217 file = new QFile(fileName);
218 if (!file->open(QIODevice::WriteOnly)) {
219 QMessageBox::information(this, tr("FTP"),
220 tr("Unable to save the file %1: %2.")
221 .arg(fileName).arg(file->errorString()));
222 delete file;
223 return;
224 }
225
226 ftp->get(fileList->currentItem()->text(0), file);
227
228 progressDialog->setLabelText(tr("Downloading %1...").arg(fileName));
229 downloadButton->setEnabled(false);
230 progressDialog->exec();
231}
232//![4]
233
234//![5]
235void FtpWindow::cancelDownload()
236{
237 ftp->abort();
238}
239//![5]
240
241//![6]
242void FtpWindow::ftpCommandFinished(int, bool error)
243{
244#ifndef QT_NO_CURSOR
245 setCursor(Qt::ArrowCursor);
246#endif
247
248 if (ftp->currentCommand() == QFtp::ConnectToHost) {
249 if (error) {
250 QMessageBox::information(this, tr("FTP"),
251 tr("Unable to connect to the FTP server "
252 "at %1. Please check that the host "
253 "name is correct.")
254 .arg(ftpServerLineEdit->text()));
255 connectOrDisconnect();
256 return;
257 }
258 statusLabel->setText(tr("Logged onto %1.")
259 .arg(ftpServerLineEdit->text()));
260 fileList->setFocus();
261 downloadButton->setDefault(true);
262 connectButton->setEnabled(true);
263 return;
264 }
265//![6]
266
267//![7]
268 if (ftp->currentCommand() == QFtp::Login)
269 ftp->list();
270//![7]
271
272//![8]
273 if (ftp->currentCommand() == QFtp::Get) {
274 if (error) {
275 statusLabel->setText(tr("Canceled download of %1.")
276 .arg(file->fileName()));
277 file->close();
278 file->remove();
279 } else {
280 statusLabel->setText(tr("Downloaded %1 to current directory.")
281 .arg(file->fileName()));
282 file->close();
283 }
284 delete file;
285 enableDownloadButton();
286 progressDialog->hide();
287//![8]
288//![9]
289 } else if (ftp->currentCommand() == QFtp::List) {
290 if (isDirectory.isEmpty()) {
291 fileList->addTopLevelItem(new QTreeWidgetItem(QStringList() << tr("<empty>")));
292 fileList->setEnabled(false);
293 }
294 }
295//![9]
296}
297
298//![10]
299void FtpWindow::addToList(const QUrlInfo &urlInfo)
300{
301 QTreeWidgetItem *item = new QTreeWidgetItem;
302 item->setText(0, urlInfo.name());
303 item->setText(1, QString::number(urlInfo.size()));
304 item->setText(2, urlInfo.owner());
305 item->setText(3, urlInfo.group());
306 item->setText(4, urlInfo.lastModified().toString("MMM dd yyyy"));
307
308 QPixmap pixmap(urlInfo.isDir() ? ":/images/dir.png" : ":/images/file.png");
309 item->setIcon(0, pixmap);
310
311 isDirectory[urlInfo.name()] = urlInfo.isDir();
312 fileList->addTopLevelItem(item);
313 if (!fileList->currentItem()) {
314 fileList->setCurrentItem(fileList->topLevelItem(0));
315 fileList->setEnabled(true);
316 }
317}
318//![10]
319
320//![11]
321void FtpWindow::processItem(QTreeWidgetItem *item, int /*column*/)
322{
323 QString name = item->text(0);
324 if (isDirectory.value(name)) {
325 fileList->clear();
326 isDirectory.clear();
327 currentPath += "/" + name;
328 ftp->cd(name);
329 ftp->list();
330 cdToParentButton->setEnabled(true);
331#ifndef QT_NO_CURSOR
332 setCursor(Qt::WaitCursor);
333#endif
334 return;
335 }
336}
337//![11]
338
339//![12]
340void FtpWindow::cdToParent()
341{
342#ifndef QT_NO_CURSOR
343 setCursor(Qt::WaitCursor);
344#endif
345 fileList->clear();
346 isDirectory.clear();
347 currentPath = currentPath.left(currentPath.lastIndexOf('/'));
348 if (currentPath.isEmpty()) {
349 cdToParentButton->setEnabled(false);
350 ftp->cd("/");
351 } else {
352 ftp->cd(currentPath);
353 }
354 ftp->list();
355}
356//![12]
357
358//![13]
359void FtpWindow::updateDataTransferProgress(qint64 readBytes,
360 qint64 totalBytes)
361{
362 progressDialog->setMaximum(totalBytes);
363 progressDialog->setValue(readBytes);
364}
365//![13]
366
367//![14]
368void FtpWindow::enableDownloadButton()
369{
370 QTreeWidgetItem *current = fileList->currentItem();
371 if (current) {
372 QString currentFile = current->text(0);
373 downloadButton->setEnabled(!isDirectory.value(currentFile));
374 } else {
375 downloadButton->setEnabled(false);
376 }
377}
378//![14]
379
Note: See TracBrowser for help on using the repository browser.