From a7b8b68ae6c207e4646f4356311a87a8ed7469e2 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Fri, 1 Nov 2019 03:33:18 +0800 Subject: [PATCH] downloader works. --- client/tp-player/downloader.cpp | 39 +++++++----- client/tp-player/downloader.h | 6 +- client/tp-player/mainwindow.cpp | 32 +++++----- client/tp-player/mainwindow.h | 10 ++-- client/tp-player/thr_data.cpp | 103 ++++++++++++++++++++++++-------- client/tp-player/thr_data.h | 3 +- client/tp-player/tp-player.pro | 2 + 7 files changed, 132 insertions(+), 63 deletions(-) diff --git a/client/tp-player/downloader.cpp b/client/tp-player/downloader.cpp index bee544d..637fbd4 100644 --- a/client/tp-player/downloader.cpp +++ b/client/tp-player/downloader.cpp @@ -1,6 +1,7 @@ #include "downloader.h" #include "record_format.h" +#include #include #include @@ -22,36 +23,50 @@ eventLoop.exec(); //================================================================= Downloader::Downloader() { m_reply = nullptr; - m_code = codeUnknown; + m_code = codeDownloading; } Downloader::~Downloader() { +// qDebug("Downloader destroied."); } -void Downloader::run(QNetworkAccessManager* nam, QString& url, QString& sid, QString& filename) { +void Downloader::run(QNetworkAccessManager* nam, const QString& url, const QString& sid, const QString& filename) { + m_code = codeDownloading; m_filename = filename; if(!m_filename.isEmpty()) { m_file.setFileName(m_filename); if(!m_file.open(QIODevice::WriteOnly | QFile::Truncate)){ qDebug("open file for write failed."); + m_code = codeFailed; return; } } - m_code = codeDownloading; QString cookie = QString("_sid=%1\r\n").arg(sid); QNetworkRequest req; req.setUrl(QUrl(url)); req.setRawHeader("Cookie", cookie.toLatin1()); + QEventLoop eventLoop; m_reply = nam->get(req); + connect(m_reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); connect(m_reply, &QNetworkReply::finished, this, &Downloader::_on_finished); connect(m_reply, &QIODevice::readyRead, this, &Downloader::_on_data_ready); + + eventLoop.exec(); + + disconnect(m_reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); + disconnect(m_reply, &QNetworkReply::finished, this, &Downloader::_on_finished); + disconnect(m_reply, &QIODevice::readyRead, this, &Downloader::_on_data_ready); + delete m_reply; + m_reply = nullptr; + qDebug("Downloader::run(%p) end.", this); } void Downloader::_on_data_ready() { +// qDebug("Downloader::_on_data_ready(%p).", this); QNetworkReply *reply = reinterpret_cast(sender()); if(m_filename.isEmpty()) { @@ -62,17 +77,16 @@ void Downloader::_on_data_ready() { } } -void Downloader::reset() { - m_code = codeUnknown; -} - void Downloader::abort() { - if(m_reply) + if(m_reply) { + qDebug("Downloader::abort(%p);", this); m_reply->abort(); + m_code = codeAbort; + } } void Downloader::_on_finished() { - qDebug("download finished"); +// qDebug("Downloader::_on_finished(%p).", this); QNetworkReply *reply = reinterpret_cast(sender()); QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); @@ -83,14 +97,11 @@ void Downloader::_on_finished() { //qDebug() << strError; m_file.flush(); m_file.close(); - m_code = codeFailed; + if(m_code != codeDownloading) + m_code = codeFailed; return; } - disconnect(m_reply, &QNetworkReply::finished, this, &Downloader::_on_finished); - disconnect(m_reply, &QIODevice::readyRead, this, &Downloader::_on_data_ready); -// reply->deleteLater(); - if(m_filename.isEmpty()) { m_data += reply->readAll(); } diff --git a/client/tp-player/downloader.h b/client/tp-player/downloader.h index 38dcbdf..c2a3df9 100644 --- a/client/tp-player/downloader.h +++ b/client/tp-player/downloader.h @@ -9,9 +9,9 @@ class Downloader : public QObject { public: enum EndCode{ - codeUnknown = 0, codeSuccess, codeDownloading, + codeAbort, codeFailed }; @@ -20,9 +20,9 @@ public: Downloader(); ~Downloader(); - void run(QNetworkAccessManager* nam, QString& url, QString& sid, QString& filename); + void run(QNetworkAccessManager* nam, const QString& url, const QString& sid, const QString& filename); void abort(); - void reset(); +// void reset(); QByteArray& data(){return m_data;} EndCode code() {return m_code;} diff --git a/client/tp-player/mainwindow.cpp b/client/tp-player/mainwindow.cpp index 7440262..7999b7e 100644 --- a/client/tp-player/mainwindow.cpp +++ b/client/tp-player/mainwindow.cpp @@ -93,7 +93,7 @@ MainWindow::MainWindow(QWidget *parent) : m_play_state = PLAY_STATE_UNKNOWN; m_thr_data = nullptr; - m_dl = nullptr; +// m_dl = nullptr; ui->setupUi(this); @@ -150,15 +150,15 @@ MainWindow::~MainWindow() if(m_thr_data) { m_thr_data->stop(); disconnect(m_thr_data, SIGNAL(signal_update_data(UpdateData*)), this, SLOT(_do_update_data(UpdateData*))); - disconnect(m_thr_data, SIGNAL(signal_download(DownloadParam*)), this, SLOT(_do_download(DownloadParam*))); +// disconnect(m_thr_data, SIGNAL(signal_download(DownloadParam*)), this, SLOT(_do_download(DownloadParam*))); delete m_thr_data; m_thr_data = nullptr; } - if(m_dl) { - delete m_dl; - m_dl = nullptr; - } +// if(m_dl) { +// delete m_dl; +// m_dl = nullptr; +// } delete ui; } @@ -170,7 +170,7 @@ void MainWindow::set_resource(const QString &res) { void MainWindow::_do_first_run() { m_thr_data = new ThrData(this, m_res); connect(m_thr_data, SIGNAL(signal_update_data(UpdateData*)), this, SLOT(_do_update_data(UpdateData*))); - connect(m_thr_data, SIGNAL(signal_download(DownloadParam*)), this, SLOT(_do_download(DownloadParam*))); +// connect(m_thr_data, SIGNAL(signal_download(DownloadParam*)), this, SLOT(_do_download(DownloadParam*))); m_thr_data->start(); _start_play_thread(); @@ -481,17 +481,17 @@ void MainWindow::_do_bar_fade() { update(m_bar.rc()); } -void MainWindow::_do_download(DownloadParam* param) { - qDebug("MainWindow::_do_download(). %s %s %s", param->url.toStdString().c_str(), param->sid.toStdString().c_str(), param->fname.toStdString().c_str()); +//void MainWindow::_do_download(DownloadParam* param) { +// qDebug("MainWindow::_do_download(). %s %s %s", param->url.toStdString().c_str(), param->sid.toStdString().c_str(), param->fname.toStdString().c_str()); - if(m_dl) { - delete m_dl; - m_dl = nullptr; - } +// if(m_dl) { +// delete m_dl; +// m_dl = nullptr; +// } - m_dl = new Downloader(); - m_dl->run(&m_nam, param->url, param->sid, param->fname); -} +// m_dl = new Downloader(); +// m_dl->run(&m_nam, param->url, param->sid, param->fname); +//} void MainWindow::mouseMoveEvent(QMouseEvent *e) { if(!m_show_default) { diff --git a/client/tp-player/mainwindow.h b/client/tp-player/mainwindow.h index 031fc2b..feabbf4 100644 --- a/client/tp-player/mainwindow.h +++ b/client/tp-player/mainwindow.h @@ -36,8 +36,8 @@ public: void restart(); void speed(int s); - Downloader* downloader() {return m_dl;} - void reset_downloader() {if(m_dl){delete m_dl;m_dl= nullptr;}} +// Downloader* downloader() {return m_dl;} +// void reset_downloader() {if(m_dl){delete m_dl;m_dl= nullptr;}} private: void paintEvent(QPaintEvent *e); @@ -53,7 +53,7 @@ private slots: void _do_bar_delay_hide(); // void _do_download(Downloader*); - void _do_download(DownloadParam*); +// void _do_download(DownloadParam*); private: Ui::MainWindow *ui; @@ -90,8 +90,8 @@ private: QRect m_rc_message; - QNetworkAccessManager m_nam; - Downloader* m_dl; +// QNetworkAccessManager m_nam; +// Downloader* m_dl; // for test TimeUseTest m_time_imgconvert_normal; diff --git a/client/tp-player/thr_data.cpp b/client/tp-player/thr_data.cpp index f0b0987..5e0b166 100644 --- a/client/tp-player/thr_data.cpp +++ b/client/tp-player/thr_data.cpp @@ -21,6 +21,7 @@ ThrData::ThrData(MainWindow* mainwin, const QString& res) { m_res = res; m_need_download = false; m_need_stop = false; + m_dl = nullptr; #ifdef __APPLE__ QString data_path_base = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); @@ -48,12 +49,19 @@ GenericCacheLocation: "C:/Users/apex/AppData/Local/cache" } ThrData::~ThrData() { + if(m_dl) + delete m_dl; } void ThrData::stop() { if(!isRunning()) return; m_need_stop = true; + + if(m_dl) { + m_dl->abort(); + } + wait(); qDebug("data thread stop() end."); } @@ -70,10 +78,6 @@ void ThrData::_notify_error(const QString& msg) { emit signal_update_data(_msg); } -void ThrData::_notify_download(DownloadParam* param) { - emit signal_download(param); -} - // tp-player.exe http://teleport.domain.com:7190/{sub/path/}tp_1491560510_ca67fceb75a78c9d/1234 (注意,并不直接访问此URI,实际上其并不存在) // TP服务器地址(可能包含子路径哦,例如上例中的{sub/path/}部分)/session-id(用于判断当前授权用户)/录像会话编号 @@ -84,11 +88,11 @@ void ThrData::run() { if(!_load_keyframe()) return; - for(;;) { - if(m_need_stop) - break; - msleep(500); - } +// for(;;) { +// if(m_need_stop) +// break; +// msleep(500); +// } qDebug("ThrData thread run() end."); } @@ -149,8 +153,10 @@ bool ThrData::_load_header() { // return false; // } - Downloader* dl = m_mainwin->downloader(); - QByteArray& data = dl->data(); + //Downloader* dl = m_mainwin->downloader(); + if(!m_dl) + return false; + QByteArray& data = m_dl->data(); if(data.size() != sizeof(TS_RECORD_HEADER)) { qDebug("invalid header file. %d", data.size()); _notify_error(QString("%1\n\n%2").arg(LOCAL8BIT("指定的文件或目录不存在!"), _tmp_res)); @@ -285,29 +291,36 @@ bool ThrData::_load_header() { } bool ThrData::_load_keyframe() { - // _notify_error(QString("%1").arg(LOCAL8BIT("测试!"))); - QString tpk_fname = QString("%1/tp-rdp.tpk").arg(m_path_base); tpk_fname = QDir::toNativeSeparators(tpk_fname); if(m_need_download) { - // download .tpr - QString url(m_url_base); - url += "/audit/get-file?act=read&type=rdp&rid="; - url += m_rid; - url += "&f=tp-rdp.tpk"; - QString tmp_fname = QString("%1/tp-rdp.tpk.downloading").arg(m_path_base); tmp_fname = QDir::toNativeSeparators(tmp_fname); - qDebug() << "TPK(tmp): " << tmp_fname; - qDebug() << "TPK(out): " << tpk_fname; - if(!_download_file(url, tmp_fname)) - return false; + QFileInfo fi_tmp(tmp_fname); + if(fi_tmp.isFile()) { + QFile::remove(tmp_fname); + } - QFile::rename(tmp_fname, tpk_fname); + QFileInfo fi_tpk(tpk_fname); + if(!fi_tpk.exists()) { + QString url(m_url_base); + url += "/audit/get-file?act=read&type=rdp&rid="; + url += m_rid; + url += "&f=tp-rdp.tpk"; + + qDebug() << "TPK(tmp): " << tmp_fname; + if(!_download_file(url, tmp_fname)) + return false; + + if(!QFile::rename(tmp_fname, tpk_fname)) + return false; + } } + qDebug() << "TPK: " << tpk_fname; + QFile f_kf(tpk_fname); if(!f_kf.open(QFile::ReadOnly)) { qDebug() << "Can not open " << tpk_fname << " for read."; @@ -340,6 +353,46 @@ bool ThrData::_load_keyframe() { return true; } +bool ThrData::_download_file(const QString& url, const QString filename) { + if(!m_need_download) { + qDebug() << "download not necessary."; + return false; + } + + if(m_dl) { + delete m_dl; + m_dl = nullptr; + } + + m_dl = new Downloader(); + + QNetworkAccessManager* nam = new QNetworkAccessManager; + + m_dl->run(nam, url, m_sid, filename); +// qDebug("m_dl.run(%p) end.", m_dl); + + for(;;) { + if(m_dl->code() == Downloader::codeDownloading) { + msleep(100); + continue; + } + + if(m_dl->code() != Downloader::codeSuccess) { + qDebug() << "download failed."; + _notify_error(QString("%1").arg(LOCAL8BIT("下载文件失败!"))); + delete nam; + return false; + } + else { + qDebug() << "download ok."; + delete nam; + return true; + } + } + +} + +#if 0 bool ThrData::_download_file(const QString& url, const QString filename) { if(!m_need_download) { qDebug() << "download not necessary."; @@ -373,6 +426,8 @@ bool ThrData::_download_file(const QString& url, const QString filename) { } } } +#endif + #if 0 void ThrData::run() { diff --git a/client/tp-player/thr_data.h b/client/tp-player/thr_data.h index dcb40f8..e4adcbe 100644 --- a/client/tp-player/thr_data.h +++ b/client/tp-player/thr_data.h @@ -72,7 +72,6 @@ private: signals: void signal_update_data(UpdateData*); - void signal_download(DownloadParam*); private: MainWindow* m_mainwin; @@ -90,6 +89,8 @@ private: QString m_rid; QString m_path_base; + Downloader* m_dl; + TS_RECORD_HEADER m_hdr; KeyFrames m_kf; }; diff --git a/client/tp-player/tp-player.pro b/client/tp-player/tp-player.pro index 43f18c6..27a2794 100644 --- a/client/tp-player/tp-player.pro +++ b/client/tp-player/tp-player.pro @@ -3,6 +3,8 @@ TARGET = tp-player QT += core gui widgets network +#DEFINES += QT_NO_DEBUG_OUTPUT + HEADERS += \ mainwindow.h \ bar.h \