#ifndef FMCONTROL_H
#define FMCONTROL_H

#include <QObject>
#include <QTimer>

class FmControl : public QObject
{
    Q_OBJECT
public:
    FmControl();
    ~FmControl();

    /* 功能:开启流程
    * 参数:NULL
    * 返回:NULL
    * */
    void Start();

private:
    // 初始化标志位
    bool m_init_flag;
    // 停止启动程序计数器
    int m_keepsleeptime;
    // 程序守护定时器
    QTimer m_keepTimer;
    // 记录程序所在的目录
    QString m_appDir;
    // 请求数据的方法
    enum RequestType{GET=0, POST};

private:
    /* 功能:获取守护列表里不存在的进程
    * 参数:[1]需要守护的进程(带相对路径)
    * 返回:是否获取成功
    * */
    bool _GetDiedProcess(const QStringList& exeList, QStringList& diedProcList, QString& error);
    /* 功能:启动目标程序
    * 参数:[1]目标程序
    * 返回:是否启动成功
    * */
    bool _LaunchProcess(const QString& exePath, QString& error);
    /* 功能:杀掉目标程序
    * 参数:[1]进程列表
    * 返回:是否杀成功
    * */
    bool _KillProcess(const QStringList& exeList, QString& error);
    /* 功能:检查本地文件与服务器文件差异
    * 参数:[1]服务器文件信息[2]差异文件
    * 返回:是否成功
    * */
    bool _CheckFilesDiff(const QMap<QString, QString>& sFilesMap, QMap<QString, QString>& dFilesMap);
    /* 功能:对比文件Md5与给定的Md5是否一致
    * 参数:[1]文件路径 [2]待对比的Md5
    * 返回:一致返回true
    * */
    bool _CompareFileMd5(const QString& filePath, const QString& md5);
    /* 功能:请求数据
    * 参数:[1]请求地址 [2]返回数据 [3]错误信息 [4]请求类型 [5]POST数据
    * 返回:成功返回true
    * */
    bool _RequestData(const QString& url, QByteArray& recvData, QString& error, RequestType type = GET, const QByteArray& postData = "");
    /* 功能:下载文件
    * 参数:[1]下载路径 [2]保存路径 [3]错误信息
    * 返回:成功返回true
    * */
    bool _DownloadFile(const QString& downloadUrl, const QString& savePath, QString& error);
    /* 功能:解压文件
    * 参数:[1]压缩文件
    * 返回:成功返回true
    * */
    bool _UnzipFile(const QString& zipFile);

private slots:
    /* 功能:守护目标进程
    * 参数:NULL
    * 返回:NULL
    * */
    void onKeepProcess();
    /* 功能:升级检测
    * 参数:NULL
    * 返回:NULL
    * */
    void onCheckUpdate();
};

#endif // FMCONTROL_H
