From 0c8aea3d0048581583d88a0763f2ef773080a4bf Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 20 Apr 2018 11:39:11 +0200 Subject: [PATCH] fix(VideoCodecsModel): do not replace used codecs on update + many fixes --- src/app/App.cpp | 4 ++ src/components/codecs/VideoCodecsModel.cpp | 56 +++++++++++++------ src/components/codecs/VideoCodecsModel.hpp | 5 +- .../Linphone/Dialog/OnlineInstallerDialog.qml | 4 +- ui/scripts/Utils/utils.js | 9 +-- 5 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/app/App.cpp b/src/app/App.cpp index b761a410f..8880f83e9 100644 --- a/src/app/App.cpp +++ b/src/app/App.cpp @@ -166,6 +166,10 @@ void App::initContentApp () { initLocale(config); } else { + // Update and download codecs. + VideoCodecsModel::updateCodecs(); + VideoCodecsModel::downloadUpdatableCodecs(this); + // Don't quit if last window is closed!!! setQuitOnLastWindowClosed(false); diff --git a/src/components/codecs/VideoCodecsModel.cpp b/src/components/codecs/VideoCodecsModel.cpp index 5488c4e28..0c3932a35 100644 --- a/src/components/codecs/VideoCodecsModel.cpp +++ b/src/components/codecs/VideoCodecsModel.cpp @@ -60,23 +60,19 @@ namespace { VideoCodecsModel::VideoCodecsModel (QObject *parent) : AbstractCodecsModel(parent) { load(); - - // Update codec if it exists a new version. - #if defined(Q_OS_LINUX) || defined(Q_OS_WIN) - updateCodecVersion("H264", cPluginUrlH264, cH264InstallName); - #endif } -bool VideoCodecsModel::updateCodecVersion ( +static bool downloadUpdatableCodec ( + QObject *parent, + const QString &codecsFolder, const QString &mime, const QString &downloadUrl, const QString &installName ) { - QString codecsFolder = Utils::coreStringToAppString(Paths::getCodecsDirPath()); QString versionFilePath = codecsFolder + mime + ".txt"; QFile versionFile(versionFilePath); - if (!versionFile.exists() && !QFileInfo::exists(codecsFolder + cH264InstallName)) + if (!versionFile.exists() && !QFileInfo::exists(codecsFolder + installName)) return false; // Must be downloaded one time before. if (!versionFile.open(QIODevice::ReadOnly)) @@ -86,24 +82,24 @@ bool VideoCodecsModel::updateCodecVersion ( qInfo() << QStringLiteral("Updating `%1` codec...").arg(mime); - FileDownloader *fileDownloader = new FileDownloader(this); - fileDownloader->setUrl(QUrl(cPluginUrlH264)); + FileDownloader *fileDownloader = new FileDownloader(parent); + fileDownloader->setUrl(QUrl(downloadUrl)); fileDownloader->setDownloadFolder(codecsFolder); FileExtractor *fileExtractor = new FileExtractor(fileDownloader); fileExtractor->setExtractFolder(codecsFolder); - fileExtractor->setExtractName(cH264InstallName); + fileExtractor->setExtractName(installName + ".in"); - QObject::connect(fileDownloader, &FileDownloader::downloadFinished, this, [fileExtractor](const QString &filePath) { + QObject::connect(fileDownloader, &FileDownloader::downloadFinished, [fileExtractor](const QString &filePath) { fileExtractor->setFile(filePath); fileExtractor->extract(); }); - QObject::connect(fileDownloader, &FileDownloader::downloadFailed, this, [fileDownloader]() { + QObject::connect(fileDownloader, &FileDownloader::downloadFailed, [fileDownloader]() { fileDownloader->deleteLater(); }); - QObject::connect(fileExtractor, &FileExtractor::extractFinished, this, [fileDownloader, fileExtractor, versionFilePath, downloadUrl]() { + QObject::connect(fileExtractor, &FileExtractor::extractFinished, [fileDownloader, fileExtractor, versionFilePath, downloadUrl]() { QFile versionFile(versionFilePath); if (!versionFile.open(QIODevice::WriteOnly)) { qWarning() << QStringLiteral("Unable to write codec version in: `%1`.").arg(versionFilePath); @@ -119,7 +115,7 @@ bool VideoCodecsModel::updateCodecVersion ( fileDownloader->deleteLater(); }); - QObject::connect(fileExtractor, &FileExtractor::extractFailed, this, [fileDownloader]() { + QObject::connect(fileExtractor, &FileExtractor::extractFailed, [fileDownloader]() { fileDownloader->remove(); fileDownloader->deleteLater(); }); @@ -129,6 +125,32 @@ bool VideoCodecsModel::updateCodecVersion ( return true; } +void VideoCodecsModel::updateCodecs () { + #if defined(Q_OS_LINUX) || defined(Q_OS_WIN) + static const QString codecSuffix = QStringLiteral(".%1").arg(cLibraryExtension); + + QDirIterator it(Utils::coreStringToAppString(Paths::getCodecsDirPath())); + while (it.hasNext()) { + QFileInfo info(it.next()); + if (info.suffix() == "in") { + QString codecName = info.completeBaseName(); + if (codecName.endsWith(codecSuffix)) { + QString codecPath = info.dir().path() + QDir::separator() + codecName; + QFile::remove(codecPath); + QFile::rename(info.filePath(), codecPath); + } + } + } + #endif // if defined(Q_OS_LINUX) || defined(Q_OS_WIN) +} + +void VideoCodecsModel::downloadUpdatableCodecs (QObject *parent) { + #if defined(Q_OS_LINUX) || defined(Q_OS_WIN) + QString codecsFolder = Utils::coreStringToAppString(Paths::getCodecsDirPath()); + downloadUpdatableCodec(parent, codecsFolder, "H264", cPluginUrlH264, cH264InstallName); + #endif // if defined(Q_OS_LINUX) || defined(Q_OS_WIN) +} + void VideoCodecsModel::updateCodecs (list> &codecs) { CoreManager::getInstance()->getCore()->setVideoPayloadTypes(codecs); } @@ -147,7 +169,7 @@ void VideoCodecsModel::load () { QLibrary(info.filePath()).load(); } core->reloadMsPlugins(""); - #endif + #endif // if defined(Q_OS_LINUX) || defined(Q_OS_WIN) // Add codecs. auto codecs = core->getVideoPayloadTypes(); @@ -160,7 +182,7 @@ void VideoCodecsModel::load () { return codec->getMimeType() == "H264"; }) == codecs.end()) addDownloadableCodec("H264", cH264Description, cPluginUrlH264, cH264InstallName); - #endif + #endif // if defined(Q_OS_LINUX) || defined(Q_OS_WIN) } void VideoCodecsModel::reload () { diff --git a/src/components/codecs/VideoCodecsModel.hpp b/src/components/codecs/VideoCodecsModel.hpp index 02037dd4d..65d1d8180 100644 --- a/src/components/codecs/VideoCodecsModel.hpp +++ b/src/components/codecs/VideoCodecsModel.hpp @@ -33,11 +33,12 @@ class VideoCodecsModel : public AbstractCodecsModel { public: VideoCodecsModel (QObject *parent = Q_NULLPTR); + static void updateCodecs (); + static void downloadUpdatableCodecs (QObject *parent); + private: void updateCodecs (std::list> &codecs) override; - bool updateCodecVersion (const QString &mime, const QString &downloadUrl, const QString &installName); - void load (); void reload () override; }; diff --git a/ui/modules/Linphone/Dialog/OnlineInstallerDialog.qml b/ui/modules/Linphone/Dialog/OnlineInstallerDialog.qml index 8732bb9a3..6e1e1cf81 100644 --- a/ui/modules/Linphone/Dialog/OnlineInstallerDialog.qml +++ b/ui/modules/Linphone/Dialog/OnlineInstallerDialog.qml @@ -16,8 +16,8 @@ DialogPlus { property alias downloadUrl: fileDownloader.url property alias installFolder: fileDownloader.downloadFolder property bool extract: false - property string installName - property string mime + property string installName // Right install name. + property string mime // Human readable name. property bool _installing: false property int _exitStatus: -1 // Not downloaded for the moment. diff --git a/ui/scripts/Utils/utils.js b/ui/scripts/Utils/utils.js index 17e703096..e433e7659 100644 --- a/ui/scripts/Utils/utils.js +++ b/ui/scripts/Utils/utils.js @@ -620,15 +620,16 @@ function times (n, cb, context) { function unscapeHtml (str) { return str.replace(/&/g, '&') - .replace(//g, '\u2063>') - .replace(/"/g, '"') - .replace(/'/g, ''') + .replace(//g, '\u2063>') + .replace(/"/g, '"') + .replace(/'/g, ''') } // ----------------------------------------------------------------------------- function write (fileName, text) { + // TODO: Deal with async. var request = new XMLHttpRequest(); request.open('PUT', 'file://' + fileName, false); request.send(text);