#ifndef __QFTP_CLIENT_H__
#define __QFTP_CLIENT_H__
// make sure to add qftp depending on
#include <QTimer>
#include <QFile>
#include <QUrl>
#include <QMap>
#include <QVariant>
#include <QMutex>
#include <QBuffer>
#include <QSet>
#include "qftp.h"
struct RemoteDir;
struct SingleCmd;
class QFtpClient : public QFtp
{
Q_OBJECT
public:
enum QFTP_CMD {
QC_NONE, QC_CD, QC_LIST, QC_RENAME, QC_PUT_FILE, QC_PUT_FILES, QC_PUT_TREE,
QC_GET_BUFFER, QC_GET_FILE, QC_GET_FILES, QC_GET_TREE, QC_RM_FILE, QC_RM_TREE,
QC_MKD, QC_MKDS,
};
enum record_type { rt_success, rt_executing, rt_total, rt_count, };
public:
QFtpClient(QString serverip = "", QString username = "", QString password = "", qint16 port = 21, QObject* parent = 0);
~QFtpClient();
void setIP(const QString& ip, const qint16 port = 21);
void setUser(const QString& username, const QString& password);
void close_host();
bool sync_connect(int msec = 3000);
// 现存缺陷: 不能创建含中文的目录/文件
// 绝对路径操作接口
// 上传文件/目录
bool put_files(const QList< QPair<QString, QString> >& vfiles, int msec = 30000); //list< pir<localfile, remotefile> >
bool put_file(const QString& localabsfile, const QString& remoteabsfile, int msec = 3000);
bool put_tree(const QString& localabspath, const QString& remoteabspath, const QStringList& exceptabspath = {}, int msec = 30000);
// 下载文件/目录
bool get_buffer(const QString& remoteabsfile, int msec = 3000);
bool get_file(const QString& remoteabsfile, const QString& localabsfile, int msec = 3000);
bool get_files(const QList< QPair<QString, QString> >& vfiles, int msec = 30000); //list< pir<remotefile, localfile> >
bool get_tree(const QString& remoteabspath, const QString& localabspath, const QStringList& exceptabspath = {}, int msec = 30000);
// 删除文件/目录
bool rm_file(const QString& remotefile, int msec = 3000);
bool rm_tree(const QString& dir, int msec = 30000);
// 新建目录
bool mk_dir(const QString& dir, int msec = 3000);
bool mk_dir(const QStringList& dirlist, int msec = 3000);
// 重命名
bool _rename(const QString& remotefilepath, const QString& newname, int msec = 3000);
// 显示列表
bool _list(const QString& remotepath, int msec = 3000);
// 当前目录操作接口
bool pwd_put_file(const QString& localabsfile, int msec = 3000);
bool pwd_get_file(const QString& remotefile, const QUrl& localurl, int msec = 3000);
bool pwd_rm_file(const QString& remotefile, int msec = 3000);
bool pwd_rm_tree(const QString& remotedir, int msec = 10000);
bool pwd_mk_dir(const QString& remotedir, int msec = 3000);
bool pwd_rename(const QString& remotefile, const QString& newname, int msec = 3000);
bool pwd_list(int msec = 3000);
bool pwd_cd(const QString& dirname, bool done_list = false, int msec = 3000);
// 是否被占用
bool is_busy()const;
// 是否已连接
bool is_connect()const;
QString pwd();
signals:
void signal_state_changed(int);
void signal_command_finish(int cmdid, QVariantList params, QString errorstring = "");
void signal_ftp_log(const QString&, bool error = false);
void signal_list(const QList<QUrlInfo>&);
void signal_get_buffer(const QByteArray&);
void signal_done(int cmdid, int ok_num, int exec_num, int total_num);
private:
bool inner_put_file(const QString& localabsfile, const QString& remoteabsfile, int msec = 3000);
bool inner_put_files(QVariantList& files, int msec = 30000);
bool inner_put_tree(const QString& localabspath, const QString& remoteabspath, const QStringList& vExcept = {}, int msec = 30000);
bool inner_get_buffer(const QString& remoteabsfile, int msec = 3000);
bool inner_get_file(const QString& remoteabsfile, const QString& localabsfile, int msec = 3000);
bool inner_get_files(QVariantList& files, int msec = 30000);
bool inner_get_tree(const QString& remoteabspath, const QString& localabspath, const QStringList& vExcept = {}, int msec = 30000);
bool inner_rm_file(const QString& remotefile, int msec = 3000);
bool inner_rm_tree(const QString& dir, int msec = 30000);
bool inner_mk_dir(const QString& dir, int msec = 3000);
bool inner_mk_dir(const QStringList& dirlist, int msec = 3000);
bool inner_rename(const QString& remotefilepath, const QString& newname, int msec = 3000);
bool inner_list(const QString& remotepath = "", int msec = 3000);
bool inner_cd(const QString& dirname, bool done_list = false, int msec = 3000); // done_list - 切换完成后, 是否需要list(用于ui显示)
void connect_host();
void connect_result(QString errstr);
void login_result(QString errstr);
void close_result(QString errstr);
void list_result(const SingleCmd& smd);
void get_result(const SingleCmd& smd, QString errstr);
bool has_cmd();
bool next_cmd();
bool next_cmd_util_done(int msec);
void cd_result(const SingleCmd& smd, QString errstr);
void put_result(const SingleCmd& smd, QString errstr);
void mkd_result(const SingleCmd& smd, QString errstr);
void rmd_result(const SingleCmd& smd, QString errstr);
void rm_result(const SingleCmd& smd, QString errstr);
void rename_result(const SingleCmd& smd, QString errstr);
void build_pwd_cd_cmd(const QString& dirname, bool done_list = false); // 当前目录cd
void build_cd_cmd(const QString& remotepath); // 绝对路径cd
void build_cd_cmd(const QString& remotepath, QList<SingleCmd>& l);
void build_mkdir_cmd(const QString& remotepath);
void build_rmdir_cmd(const QString& remotepath);
void build_rm_cmd(const QString& remotepath);
void build_put_cmd(const QString& localfile, const QString& remotefile);
void build_puts_cmd(const QVariantList&);
void build_putree_cmd(const QString& localpath, const QString& remotepath, const QStringList& vExcept = {});
void build_get_buffer_cmd(const QString& remotefile);
void build_get_cmd(const QString& remotefile, const QString& localfile);
void build_gets_cmd(const QVariantList&);
void build_getree_cmd(const QString& remotepath, const QString& localpath, const QStringList& vExcept = {});
void build_rename_cmd(const QString& remotefilepath, const QString& newname);
void build_list_cmd(const QString& remotepath);
void clear_cmd();
void reset_record();
void inc_record(record_type, int = 1);
private slots:
void slot_state_changed(int);
void slot_timer_connect();
void slot_finish(int, bool);
void slot_listinfo(const QUrlInfo&);
void slot_inner_cmd(int cmdid, QVariantList params, QString errorstring);
protected:
QUrl m_url;
QTimer* m_pConnect = Q_NULLPTR;
QPair<QString, QString> m_CurrentPath; // local/remote path
// download member
QList< QPair<QString, QString> > m_PendingPath; // local/remote path
QBuffer* m_buffer = 0;
// rmdir member
QList<SingleCmd> m_rmlist;
// cmd member
QList<SingleCmd> m_lCmd;
QMap<int, SingleCmd> m_mapCmd;
// list member
QFtp::Command m_listcmd = QFtp::Command::None;
QFtp::Command m_prevlistcmd = QFtp::Command::None;
QList<QUrlInfo> m_listresult;
QStringList m_PathSection = {};
QFTP_CMD m_cmd = QC_NONE;
int success_count = 0, execute_count = 0, total_count = 0;
QSet<QString> m_vExcept;
};
#endif
这是QFtpclient.h