Well, here is my code. Thanks.
PresentationUploader.h:
#ifndef PRESENTATIONUPLOADER_H
#define PRESENTATIONUPLOADER_H
#include <QObject>
#include <QStringList>
class PresentationUploader
: public QObject{
Q_OBJECT
public:
enum Result
{
Nothhing,
Success = 1,
AlreadyRunning,
BadInput,
PresentationDirectoryDoesNotExist,
EmptyPresentationDirectory,
AbortedByUser,
CannotConnectToFtpServer,
FtpServerLoginFailed,
ChangeDirectoryFailed,
MakeDirectoryFailed,
CannotOpenFile,
FileUploadFailed
};
PresentationUploader();
void setPresentationId(int presentationId);
void setDirectory(const QString& directory);
void setFtpHost(const QString& host);
void setFtpDirectory(const QString& directory);
void setFtpCredentials(const QString& username, const QString& password);
public slots:
void startUpload();
void abortUpload(PresentationUploader::Result result = PresentationUploader::AbortedByUser);
private slots:
void ftpProgress(qint64 doneBytes, qint64 totalBytes);
void ftpCommandFinished(int commandId, bool error);
private:
void makePresentationDirectory();
void putNextFile();
private:
int m_presentationId;
QString m_ftpUsername, m_ftpPassword;
qint64 m_doneBytes;
qint64 m_totalBytes;
PresentationUploader::Result m_result;
bool m_aborted;
signals:
void nextFile(const QString& file);
void totalProgress(qint64 doneBytes, qint64 totalBytes);
void transferProgress(qint64 doneBytes, qint64 totalBytes);
void finished(int result);
};
#endif // PRESENTATIONUPLOADER_H
#ifndef PRESENTATIONUPLOADER_H
#define PRESENTATIONUPLOADER_H
#include <QObject>
#include <QStringList>
class QFtp;
class PresentationUploader : public QObject
{
Q_OBJECT
public:
enum Result
{
Nothhing,
Success = 1,
AlreadyRunning,
BadInput,
PresentationDirectoryDoesNotExist,
EmptyPresentationDirectory,
AbortedByUser,
CannotConnectToFtpServer,
FtpServerLoginFailed,
ChangeDirectoryFailed,
MakeDirectoryFailed,
CannotOpenFile,
FileUploadFailed
};
PresentationUploader();
void setPresentationId(int presentationId);
void setDirectory(const QString& directory);
void setFtpHost(const QString& host);
void setFtpDirectory(const QString& directory);
void setFtpCredentials(const QString& username, const QString& password);
public slots:
void startUpload();
void abortUpload(PresentationUploader::Result result = PresentationUploader::AbortedByUser);
private slots:
void ftpProgress(qint64 doneBytes, qint64 totalBytes);
void ftpCommandFinished(int commandId, bool error);
private:
void makePresentationDirectory();
void putNextFile();
private:
int m_presentationId;
QString m_directory;
QString m_ftpHost;
QString m_ftpDirectory;
QString m_ftpUsername, m_ftpPassword;
QFtp* m_ftp;
qint64 m_doneBytes;
qint64 m_totalBytes;
QStringList m_files;
PresentationUploader::Result m_result;
bool m_aborted;
signals:
void nextFile(const QString& file);
void totalProgress(qint64 doneBytes, qint64 totalBytes);
void transferProgress(qint64 doneBytes, qint64 totalBytes);
void finished(int result);
};
#endif // PRESENTATIONUPLOADER_H
To copy to clipboard, switch view to plain text mode
PresentationUploader.cpp:
#include "PresentationUploader.h"
#include <QBuffer>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QFtp>
PresentationUploader::PresentationUploader() :
m_presentationId(-1),
m_ftp(0),
m_result(Nothhing)
{
}
void PresentationUploader::setPresentationId(int presentationId)
{
m_presentationId = presentationId;
}
void PresentationUploader::setDirectory(const QString& directory)
{
m_directory = directory;
}
void PresentationUploader::setFtpHost(const QString& host)
{
m_ftpHost = host;
}
void PresentationUploader::setFtpDirectory(const QString& directory)
{
m_ftpDirectory = directory;
}
void PresentationUploader::setFtpCredentials(const QString& username, const QString& password)
{
m_ftpUsername = username;
m_ftpPassword = password;
}
void PresentationUploader::startUpload()
{
if (m_ftp != 0)
{
emit finished(AlreadyRunning);
return;
}
if (m_presentationId < 0 || m_directory.isEmpty() || m_ftpHost.isEmpty() || m_ftpDirectory.isEmpty() || m_ftpUsername.isEmpty() || m_ftpPassword.isEmpty())
{
emit finished(BadInput);
return;
}
if (!directoryInfo.exists())
{
emit finished(PresentationDirectoryDoesNotExist);
return;
}
m_doneBytes = 0;
m_totalBytes = 0;
m_files.clear();
QDir directory
(m_directory
);
foreach
(const QFileInfo
& fileInfo, directory.
entryInfoList(QDir::Files)) {
m_files.append(fileInfo.absoluteFilePath());
m_totalBytes += fileInfo.size();
}
if (m_files.isEmpty())
{
emit finished(EmptyPresentationDirectory);
return;
}
connect(m_ftp, SIGNAL(commandFinished(int, bool)), this, SLOT(ftpCommandFinished(int, bool)));
connect(m_ftp, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(ftpProgress(qint64, qint64)));
connect(m_ftp, SIGNAL(dataTransferProgress(qint64, qint64)), this, SIGNAL(transferProgress(qint64, qint64)));
m_ftp->connectToHost(m_ftpHost, 21);
m_ftp->login(m_ftpUsername, m_ftpPassword);
m_ftp->cd(m_ftpDirectory);
}
void PresentationUploader::abortUpload(PresentationUploader::Result result)
{
m_result = result;
m_ftp->close();
}
void PresentationUploader::ftpProgress(qint64 doneBytes, qint64 totalBytes)
{
Q_UNUSED(totalBytes);
emit totalProgress(m_doneBytes + doneBytes, m_totalBytes);
}
void PresentationUploader::ftpCommandFinished(int commandId, bool error)
{
Q_UNUSED(commandId);
if (m_ftp
->currentCommand
() == QFtp::ConnectToHost) {
if (error)
abortUpload(CannotConnectToFtpServer);
}
else if (m_ftp
->currentCommand
() == QFtp::Login) {
if (error)
abortUpload(FtpServerLoginFailed);
}
else if (m_ftp
->currentCommand
() == QFtp::Cd) {
if (error)
abortUpload(ChangeDirectoryFailed);
else
makePresentationDirectory();
}
else if (m_ftp
->currentCommand
() == QFtp::Mkdir) {
/*if (error)
abortUpload(MakeDirectoryFailed);
else*/
putNextFile();
}
else if (m_ftp
->currentCommand
() == QFtp::Put) {
m_doneBytes += m_ftp->currentDevice()->size();
m_ftp->currentDevice()->close();
m_ftp->currentDevice()->deleteLater();
if (error)
abortUpload(FileUploadFailed);
else if (!m_files.empty())
putNextFile();
else if (!m_ftp->hasPendingCommands())
abortUpload(Success);
}
else if (m_ftp
->currentCommand
() == QFtp::Close) {
m_ftp->deleteLater();
m_ftp = 0;
emit finished(m_result);
}
}
void PresentationUploader::makePresentationDirectory()
{
m_ftp
->mkdir
(QString::number(m_presentationId
));
}
void PresentationUploader::putNextFile()
{
QString filePath
(m_files.
takeFirst());
emit nextFile(fileInfo.fileName());
abortUpload(CannotOpenFile);
m_ftp
->put
(file,
QString("%1/%2").
arg(m_presentationId
).
arg(fileInfo.
fileName()));
if (m_files.isEmpty()) // put complete file after uploading last file
{
m_ftp
->put
(buffer,
QString("%1/complete").
arg(m_presentationId
));
}
}
#include "PresentationUploader.h"
#include <QBuffer>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QFtp>
PresentationUploader::PresentationUploader() :
QObject(),
m_presentationId(-1),
m_ftp(0),
m_result(Nothhing)
{
}
void PresentationUploader::setPresentationId(int presentationId)
{
m_presentationId = presentationId;
}
void PresentationUploader::setDirectory(const QString& directory)
{
m_directory = directory;
}
void PresentationUploader::setFtpHost(const QString& host)
{
m_ftpHost = host;
}
void PresentationUploader::setFtpDirectory(const QString& directory)
{
m_ftpDirectory = directory;
}
void PresentationUploader::setFtpCredentials(const QString& username, const QString& password)
{
m_ftpUsername = username;
m_ftpPassword = password;
}
void PresentationUploader::startUpload()
{
if (m_ftp != 0)
{
emit finished(AlreadyRunning);
return;
}
if (m_presentationId < 0 || m_directory.isEmpty() || m_ftpHost.isEmpty() || m_ftpDirectory.isEmpty() || m_ftpUsername.isEmpty() || m_ftpPassword.isEmpty())
{
emit finished(BadInput);
return;
}
QFileInfo directoryInfo(m_directory);
if (!directoryInfo.exists())
{
emit finished(PresentationDirectoryDoesNotExist);
return;
}
m_doneBytes = 0;
m_totalBytes = 0;
m_files.clear();
QDir directory(m_directory);
foreach(const QFileInfo& fileInfo, directory.entryInfoList(QDir::Files))
{
m_files.append(fileInfo.absoluteFilePath());
m_totalBytes += fileInfo.size();
}
if (m_files.isEmpty())
{
emit finished(EmptyPresentationDirectory);
return;
}
m_ftp = new QFtp(this);
connect(m_ftp, SIGNAL(commandFinished(int, bool)), this, SLOT(ftpCommandFinished(int, bool)));
connect(m_ftp, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(ftpProgress(qint64, qint64)));
connect(m_ftp, SIGNAL(dataTransferProgress(qint64, qint64)), this, SIGNAL(transferProgress(qint64, qint64)));
m_ftp->connectToHost(m_ftpHost, 21);
m_ftp->login(m_ftpUsername, m_ftpPassword);
m_ftp->cd(m_ftpDirectory);
}
void PresentationUploader::abortUpload(PresentationUploader::Result result)
{
m_result = result;
m_ftp->close();
}
void PresentationUploader::ftpProgress(qint64 doneBytes, qint64 totalBytes)
{
Q_UNUSED(totalBytes);
emit totalProgress(m_doneBytes + doneBytes, m_totalBytes);
}
void PresentationUploader::ftpCommandFinished(int commandId, bool error)
{
Q_UNUSED(commandId);
if (m_ftp->currentCommand() == QFtp::ConnectToHost)
{
if (error)
abortUpload(CannotConnectToFtpServer);
}
else if (m_ftp->currentCommand() == QFtp::Login)
{
if (error)
abortUpload(FtpServerLoginFailed);
}
else if (m_ftp->currentCommand() == QFtp::Cd)
{
if (error)
abortUpload(ChangeDirectoryFailed);
else
makePresentationDirectory();
}
else if (m_ftp->currentCommand() == QFtp::Mkdir)
{
/*if (error)
abortUpload(MakeDirectoryFailed);
else*/
putNextFile();
}
else if (m_ftp->currentCommand() == QFtp::Put)
{
m_doneBytes += m_ftp->currentDevice()->size();
m_ftp->currentDevice()->close();
m_ftp->currentDevice()->deleteLater();
if (error)
abortUpload(FileUploadFailed);
else if (!m_files.empty())
putNextFile();
else if (!m_ftp->hasPendingCommands())
abortUpload(Success);
}
else if (m_ftp->currentCommand() == QFtp::Close)
{
m_ftp->deleteLater();
m_ftp = 0;
emit finished(m_result);
}
}
void PresentationUploader::makePresentationDirectory()
{
m_ftp->mkdir(QString::number(m_presentationId));
}
void PresentationUploader::putNextFile()
{
QString filePath(m_files.takeFirst());
QFileInfo fileInfo(filePath);
QFile* file = new QFile(filePath);
emit nextFile(fileInfo.fileName());
if (!file->open(QIODevice::ReadOnly))
abortUpload(CannotOpenFile);
m_ftp->put(file, QString("%1/%2").arg(m_presentationId).arg(fileInfo.fileName()));
if (m_files.isEmpty()) // put complete file after uploading last file
{
QByteArray* byteArray = new QByteArray("OK");
QBuffer* buffer = new QBuffer(byteArray);
m_ftp->put(buffer, QString("%1/complete").arg(m_presentationId));
}
}
To copy to clipboard, switch view to plain text mode
I move PresentationUploader object to its own thread after creation like this:
PresentationUploader* uploader = new PresentationUploader();
uploader.moveToThread(uploaderThread);
connect(uploaderThread, SIGNAL(started()), uploader, SLOT(startUpload()));
...
uploaderThread->start();
QThread* uploaderThread = new QThread();
PresentationUploader* uploader = new PresentationUploader();
uploader.moveToThread(uploaderThread);
connect(uploaderThread, SIGNAL(started()), uploader, SLOT(startUpload()));
...
uploaderThread->start();
To copy to clipboard, switch view to plain text mode
Bookmarks