mirror of https://github.com/tp4a/teleport
downloader works.
parent
2f7fc16235
commit
a7b8b68ae6
|
@ -1,6 +1,7 @@
|
|||
#include "downloader.h"
|
||||
#include "record_format.h"
|
||||
|
||||
#include <QEventLoop>
|
||||
#include <QNetworkReply>
|
||||
#include <qelapsedtimer.h>
|
||||
|
||||
|
@ -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<QNetworkReply*>(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<QNetworkReply*>(sender());
|
||||
|
||||
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
|
||||
|
@ -83,14 +97,11 @@ void Downloader::_on_finished() {
|
|||
//qDebug() << strError;
|
||||
m_file.flush();
|
||||
m_file.close();
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -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;}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,28 +291,35 @@ 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 tmp_fname = QString("%1/tp-rdp.tpk.downloading").arg(m_path_base);
|
||||
tmp_fname = QDir::toNativeSeparators(tmp_fname);
|
||||
|
||||
QFileInfo fi_tmp(tmp_fname);
|
||||
if(fi_tmp.isFile()) {
|
||||
QFile::remove(tmp_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";
|
||||
|
||||
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;
|
||||
|
||||
QFile::rename(tmp_fname, tpk_fname);
|
||||
if(!QFile::rename(tmp_fname, tpk_fname))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
qDebug() << "TPK: " << tpk_fname;
|
||||
|
||||
QFile f_kf(tpk_fname);
|
||||
if(!f_kf.open(QFile::ReadOnly)) {
|
||||
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -3,6 +3,8 @@ TARGET = tp-player
|
|||
|
||||
QT += core gui widgets network
|
||||
|
||||
#DEFINES += QT_NO_DEBUG_OUTPUT
|
||||
|
||||
HEADERS += \
|
||||
mainwindow.h \
|
||||
bar.h \
|
||||
|
|
Loading…
Reference in New Issue