------------main.c--------------
#include <QtGui/QApplication>
#include <iostream>
#include "client.h"
using namespace std;
/*int main(int argc, char *argv[])
{
QApplication a(argc, argv);
client w;
w.show();
return a.exec();
}*/
int main(int argc, char *argv[])
{
argc = 2;
//*argv ="ftp://qt.nokia.com";
if (args.count() != 2) {
cerr << "Usage: spider url" << endl
<< "Example:" << endl
<< "spider ftp://ftp.trolltech.com/freebies/leafnode"<< endl;
return 1;
}
Spider spider;
if (!spider.
getDirectory(QUrl("ftp://localhost/supriya/supri.c"))) return 1;
QObject::connect(&spider,
SIGNAL(done
()),
&app,
SLOT(quit
()));
return app.exec();
}
-----------------client.cpp-------------
#include "client.h"
#include <iostream>
using namespace std;
{
}
client::~client()
{
}
{
connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));
connect(&ftp,
SIGNAL(listInfo
(const QUrlInfo &)),
this,
SLOT(ftpListInfo
(const QUrlInfo &)));
}
bool Spider
::getDirectory(const QUrl &url
) {
if (!url.isValid()) {
cerr << "Error: Invalid URL" << endl;
return false;
}
if (url.scheme() != "ftp") {
cerr << "Error: URL must start with ’ftp:’" << endl;
return false;
}
ftp.connectToHost(url.host(), url.port(21));
ftp.login(tr("supriya"),tr("supriya"));
if (path.isEmpty())
path = "/";
pendingDirs.append(path);
processNextDirectory();
return true;
}
void Spider::processNextDirectory()
{
if(!pendingDirs.isEmpty()) {
currentDir = pendingDirs.takeFirst();
currentLocalDir = "downloads/" + currentDir;
QDir(".").
mkpath(currentLocalDir
);
ftp.cd(currentDir);
ftp.list(currentDir);
}else
emit done();
}
void Spider
::ftpListInfo(const QUrlInfo &urlInfo
) {
cout << "list info"<< endl;
if (urlInfo.isFile()) {
if (urlInfo.isReadable()) {
QFile *file = new QFile(currentLocalDir
+ "/"+ urlInfo.
name());
cerr << "Warning: Cannot open file "
<< qPrintable(
QDir::convertSeparators(file
->fileName
())) << endl;
return;
}
ftp.get(urlInfo.name(), file);
openedFiles.append(file);
}
} else if (urlInfo.isDir() && !urlInfo.isSymLink()) {
pendingDirs.append(currentDir + "/" + urlInfo.name());
}
}
void Spider::ftpDone(bool error)
{
if (error) {
cerr << "Error: " << qPrintable(ftp.errorString()) << endl;
} else {
cout << "Downloaded " << qPrintable(currentDir) << " to "<<
qPrintable
(QDir::convertSeparators(QDir(currentLocalDir
).
canonicalPath()));
}
qDeleteAll(openedFiles);
openedFiles.clear();
processNextDirectory();
}
-----------------------client.h-----------------------
#ifndef CLIENT_H
#define CLIENT_H
#include <QUrl>
#include <QtGui/QWidget>
#include <QUrlInfo>
#include <QFtp>
#include <QFile>
#include <QDir>
{
Q_OBJECT
public:
~client();
};
{
Q_OBJECT
public:
bool getDirectory
(const QUrl &url
);
signals:
void done();
private slots:
void ftpDone(bool error);
void ftpListInfo
(const QUrlInfo &urlInfo
);
private:
void processNextDirectory();
QList<QFile *> openedFiles;
};
#endif // CLIENT_H
------------main.c--------------
#include <QtGui/QApplication>
#include <iostream>
#include "client.h"
using namespace std;
/*int main(int argc, char *argv[])
{
QApplication a(argc, argv);
client w;
w.show();
return a.exec();
}*/
int main(int argc, char *argv[])
{
argc = 2;
//*argv ="ftp://qt.nokia.com";
QCoreApplication app(argc, argv);
QStringList args = app.arguments();
if (args.count() != 2) {
cerr << "Usage: spider url" << endl
<< "Example:" << endl
<< "spider ftp://ftp.trolltech.com/freebies/leafnode"<< endl;
return 1;
}
Spider spider;
if (!spider.getDirectory(QUrl("ftp://localhost/supriya/supri.c")))
return 1;
QObject::connect(&spider, SIGNAL(done()), &app, SLOT(quit()));
return app.exec();
}
-----------------client.cpp-------------
#include "client.h"
#include <iostream>
using namespace std;
client::client(QWidget *parent)
: QWidget(parent)
{
}
client::~client()
{
}
Spider::Spider(QObject *parent)
: QObject(parent)
{
connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));
connect(&ftp, SIGNAL(listInfo(const QUrlInfo &)),
this, SLOT(ftpListInfo(const QUrlInfo &)));
}
bool Spider::getDirectory(const QUrl &url)
{
if (!url.isValid()) {
cerr << "Error: Invalid URL" << endl;
return false;
}
if (url.scheme() != "ftp") {
cerr << "Error: URL must start with ’ftp:’" << endl;
return false;
}
ftp.connectToHost(url.host(), url.port(21));
ftp.login(tr("supriya"),tr("supriya"));
QString path = url.path();
if (path.isEmpty())
path = "/";
pendingDirs.append(path);
processNextDirectory();
return true;
}
void Spider::processNextDirectory()
{
if(!pendingDirs.isEmpty()) {
currentDir = pendingDirs.takeFirst();
currentLocalDir = "downloads/" + currentDir;
QDir(".").mkpath(currentLocalDir);
ftp.cd(currentDir);
ftp.list(currentDir);
}else
emit done();
}
void Spider::ftpListInfo(const QUrlInfo &urlInfo)
{
cout << "list info"<< endl;
if (urlInfo.isFile()) {
if (urlInfo.isReadable()) {
QFile *file = new QFile(currentLocalDir + "/"+ urlInfo.name());
if (!file->open(QIODevice::WriteOnly)) {
cerr << "Warning: Cannot open file "
<< qPrintable(
QDir::convertSeparators(file->fileName()))
<< endl;
return;
}
ftp.get(urlInfo.name(), file);
openedFiles.append(file);
}
} else if (urlInfo.isDir() && !urlInfo.isSymLink()) {
pendingDirs.append(currentDir + "/" + urlInfo.name());
}
}
void Spider::ftpDone(bool error)
{
if (error) {
cerr << "Error: " << qPrintable(ftp.errorString()) << endl;
} else {
cout << "Downloaded " << qPrintable(currentDir) << " to "<<
qPrintable(QDir::convertSeparators(QDir(currentLocalDir).canonicalPath()));
}
qDeleteAll(openedFiles);
openedFiles.clear();
processNextDirectory();
}
-----------------------client.h-----------------------
#ifndef CLIENT_H
#define CLIENT_H
#include <QUrl>
#include <QtGui/QWidget>
#include <QUrlInfo>
#include <QFtp>
#include <QFile>
#include <QDir>
class client : public QWidget
{
Q_OBJECT
public:
client(QWidget *parent = 0);
~client();
};
class Spider : public QObject
{
Q_OBJECT
public:
Spider(QObject *parent = 0);
bool getDirectory(const QUrl &url);
signals:
void done();
private slots:
void ftpDone(bool error);
void ftpListInfo(const QUrlInfo &urlInfo);
private:
void processNextDirectory();
QFtp ftp;
QList<QFile *> openedFiles;
QString currentDir;
QString currentLocalDir;
QStringList pendingDirs;
};
#endif // CLIENT_H
To copy to clipboard, switch view to plain text mode
Bookmarks