#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
));
}
}