summaryrefslogtreecommitdiff
path: root/src/helper.cpp
diff options
context:
space:
mode:
authorMateusz Łukasik <mati75@linuxmint.pl>2018-03-12 05:45:30 -0400
committerMateusz Łukasik <mati75@linuxmint.pl>2018-03-12 05:45:30 -0400
commitddef07cab834612d6470fbb4483afde40cd2d708 (patch)
tree183ca1da081ae14e3e05d7ae4374c484e0ff9def /src/helper.cpp
Import smplayer_18.2.2~ds0.orig.tar.bz2
[dgit import orig smplayer_18.2.2~ds0.orig.tar.bz2]
Diffstat (limited to 'src/helper.cpp')
-rw-r--r--src/helper.cpp340
1 files changed, 340 insertions, 0 deletions
diff --git a/src/helper.cpp b/src/helper.cpp
new file mode 100644
index 0000000..5fb29ce
--- /dev/null
+++ b/src/helper.cpp
@@ -0,0 +1,340 @@
+/* smplayer, GUI front-end for mplayer.
+ Copyright (C) 2006-2018 Ricardo Villalba <rvm@users.sourceforge.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "helper.h"
+
+#include <QApplication>
+#include <QFileInfo>
+#include <QColor>
+#include <QDir>
+#include <QTextCodec>
+#include <QWidget>
+#include <QDebug>
+#include "config.h"
+#include "extensions.h"
+
+#ifdef Q_OS_WIN
+#include <windows.h> // For the screensaver stuff
+#endif
+
+#if EXTERNAL_SLEEP
+#include <unistd.h>
+#else
+#include <qthread.h>
+#endif
+
+
+#if !EXTERNAL_SLEEP
+class Sleeper : public QThread
+{
+public:
+ static void sleep(unsigned long secs) {QThread::sleep(secs);}
+ static void msleep(unsigned long msecs) {
+ //qDebug("sleeping...");
+ QThread::msleep(msecs);
+ //qDebug("finished");
+ }
+ static void usleep(unsigned long usecs) {QThread::usleep(usecs);}
+};
+#endif
+
+/*
+QString Helper::dvdForPref(const QString & dvd_id, int title) {
+ return QString("DVD_%1_%2").arg(dvd_id).arg(title);
+}
+*/
+
+QString Helper::formatTime(int secs) {
+ bool negative = (secs < 0);
+ secs = qAbs(secs);
+
+ int t = secs;
+ int hours = (int) t / 3600;
+ t -= hours*3600;
+ int minutes = (int) t / 60;
+ t -= minutes*60;
+ int seconds = t;
+
+ //qDebug() << "Helper::formatTime:" << hours << ":" << minutes << ":" << seconds;
+
+ return QString("%1%2:%3:%4").arg(negative ? "-" : "").arg(hours, 2, 10, QChar('0')).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0'));
+}
+
+QString Helper::formatTime2(double secs) {
+ bool negative = (secs < 0);
+ secs = qAbs(secs);
+
+ double t = secs;
+ int hours = (int) t / 3600;
+ t -= hours*3600;
+ int minutes = (int) t / 60;
+ t -= minutes*60;
+ int seconds = t;
+ t -= seconds;
+ int milliseconds = t*1000;
+
+ //qDebug() << "Helper::formatTime: secs:" << secs << "=" << hours << ":" << minutes << ":" << seconds << "." << milliseconds;
+
+ return QString("%1%2:%3:%4.%5").arg(negative ? "-" : "").arg(hours, 2, 10, QChar('0')).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0')).arg(milliseconds, 3, 10, QChar('0'));
+}
+
+QString Helper::timeForJumps(int secs) {
+ int minutes = (int) secs / 60;
+ int seconds = secs % 60;
+
+ if (minutes==0) {
+ return QObject::tr("%n second(s)", "", seconds);
+ } else {
+ if (seconds==0)
+ return QObject::tr("%n minute(s)", "", minutes);
+ else {
+ QString m = QObject::tr("%n minute(s)", "", minutes);
+ QString s = QObject::tr("%n second(s)", "", seconds);
+ return QObject::tr("%1 and %2").arg(m).arg(s);
+ }
+ }
+}
+
+#ifdef Q_OS_WIN
+// This function has been copied (and modified a little bit) from Scribus (program under GPL license):
+// http://docs.scribus.net/devel/util_8cpp-source.html#l00112
+QString Helper::shortPathName(QString long_path) {
+ if (QFile::exists(long_path)) {
+ QString short_path = long_path;
+
+ const int max_path = 4096;
+ WCHAR shortName[max_path];
+
+ QString nativePath = QDir::toNativeSeparators(long_path);
+ int ret = GetShortPathNameW((LPCWSTR) nativePath.utf16(), shortName, max_path);
+ if (ret != ERROR_INVALID_PARAMETER && ret < MAX_PATH)
+ short_path = QString::fromUtf16((const ushort*) shortName);
+
+ return short_path;
+ } else {
+ return long_path;
+ }
+}
+
+/*
+void Helper::setScreensaverEnabled(bool b) {
+ qDebug("Helper::setScreensaverEnabled: %d", b);
+
+ if (b) {
+ // Activate screensaver
+ SystemParametersInfo( SPI_SETSCREENSAVEACTIVE, true, 0, SPIF_SENDWININICHANGE);
+ SystemParametersInfo( SPI_SETLOWPOWERACTIVE, 1, NULL, 0);
+ SystemParametersInfo( SPI_SETPOWEROFFACTIVE, 1, NULL, 0);
+ } else {
+ SystemParametersInfo( SPI_SETSCREENSAVEACTIVE, false, 0, SPIF_SENDWININICHANGE);
+ SystemParametersInfo( SPI_SETLOWPOWERACTIVE, 0, NULL, 0);
+ SystemParametersInfo( SPI_SETPOWEROFFACTIVE, 0, NULL, 0);
+ }
+}
+*/
+#endif
+
+void Helper::msleep(int ms) {
+#if EXTERNAL_SLEEP
+ //qDebug("Helper::msleep: %d (using usleep)", ms);
+ usleep(ms*1000);
+#else
+ //qDebug("Helper::msleep: %d (using QThread::msleep)", ms);
+ Sleeper::msleep( ms );
+#endif
+}
+
+QString Helper::changeSlashes(QString filename) {
+ // Only change if file exists (it's a local file)
+ if (QFileInfo(filename).exists())
+ return filename.replace('/', '\\');
+ else
+ return filename;
+}
+
+bool Helper::directoryContainsDVD(QString directory) {
+ //qDebug("Helper::directoryContainsDVD: '%s'", directory.latin1());
+
+ QDir dir(directory);
+ QStringList l = dir.entryList();
+ bool valid = false;
+ for (int n=0; n < l.count(); n++) {
+ //qDebug(" * entry %d: '%s'", n, l[n].toUtf8().data());
+ if (l[n].toLower() == "video_ts") valid = true;
+ }
+
+ return valid;
+}
+
+int Helper::qtVersion() {
+ QRegExp rx("(\\d+)\\.(\\d+)\\.(\\d+)");
+ QString v(qVersion());
+
+ int r = 0;
+
+ if (rx.indexIn(v) > -1) {
+ int n1 = rx.cap(1).toInt();
+ int n2 = rx.cap(2).toInt();
+ int n3 = rx.cap(3).toInt();
+ r = n1 * 1000 + n2 * 100 + n3;
+ }
+
+ qDebug("Helper::qtVersion: %d", r);
+
+ return r;
+}
+
+QStringList Helper::searchForConsecutiveFiles(const QString & initial_file) {
+ qDebug("Helper::searchForConsecutiveFiles: initial_file: '%s'", initial_file.toUtf8().constData());
+
+ QStringList files_to_add;
+ QStringList matching_files;
+
+ QFileInfo fi(initial_file);
+ QString basename = fi.completeBaseName();
+ QString extension = fi.suffix();
+ QString path = fi.absolutePath();
+
+ QDir dir(path);
+ dir.setFilter(QDir::Files);
+ dir.setSorting(QDir::Name);
+
+ QRegExp rx("(\\d+)");
+
+ int digits;
+ int current_number;
+ int pos = 0;
+ QString next_name;
+ bool next_found = false;
+ qDebug("Helper::searchForConsecutiveFiles: trying to find consecutive files");
+ while ( ( pos = rx.indexIn(basename, pos) ) != -1 ) {
+ qDebug("Helper::searchForConsecutiveFiles: captured: %s",rx.cap(1).toUtf8().constData());
+ digits = rx.cap(1).length();
+ current_number = rx.cap(1).toInt() + 1;
+ next_name = basename.left(pos) + QString("%1").arg(current_number, digits, 10, QLatin1Char('0'));
+ next_name.replace(QRegExp("([\\[\\]?*])"), "[\\1]");
+ next_name += "*." + extension;
+ qDebug("Helper::searchForConsecutiveFiles: next name = %s",next_name.toUtf8().constData());
+ matching_files = dir.entryList((QStringList)next_name);
+
+ if ( !matching_files.isEmpty() ) {
+ next_found = true;
+ break;
+ }
+ qDebug("Helper::searchForConsecutiveFiles: pos = %d",pos);
+ pos += digits;
+ }
+
+ if (next_found) {
+ qDebug("Helper::searchForConsecutiveFiles: adding consecutive files");
+ while ( !matching_files.isEmpty() ) {
+ qDebug("Helper::searchForConsecutiveFiles: '%s' exists, added to the list", matching_files[0].toUtf8().constData());
+ QString filename = path + "/" + matching_files[0];
+ #ifdef Q_OS_WIN
+ filename = QDir::toNativeSeparators(filename);
+ #endif
+ files_to_add << filename;
+ current_number++;
+ next_name = basename.left(pos) + QString("%1").arg(current_number, digits, 10, QLatin1Char('0'));
+ next_name.replace(QRegExp("([\\[\\]?*])"), "[\\1]");
+ next_name += "*." + extension;
+ matching_files = dir.entryList((QStringList)next_name);
+ qDebug("Helper::searchForConsecutiveFiles: looking for '%s'", next_name.toUtf8().constData());
+ }
+ }
+
+ return files_to_add;
+}
+
+QStringList Helper::filesInDirectory(const QString & initial_file, const QStringList & filter) {
+ qDebug("Helper::filesInDirectory: initial_file: %s", initial_file.toUtf8().constData());
+ //qDebug() << "Helper::filesInDirectory: filter:" << filter;
+
+ QFileInfo fi(initial_file);
+ QString current_file = fi.fileName();
+ QString path = fi.absolutePath();
+
+ QDir d(path);
+ QStringList all_files = d.entryList(filter, QDir::Files);
+
+ QStringList r;
+ for (int n = 0; n < all_files.count(); n++) {
+ //if (all_files[n] != current_file) {
+ QString s = path +"/" + all_files[n];
+ #ifdef Q_OS_WIN
+ s = QDir::toNativeSeparators(s);
+ #endif
+ r << s;
+ //}
+ }
+
+ //qDebug() << "Helper::filesInDirectory: result:" << r;
+
+ return r;
+}
+
+QStringList Helper::filesForPlaylist(const QString & initial_file, Preferences::AutoAddToPlaylistFilter filter) {
+ QStringList res;
+
+ if (filter == Preferences::ConsecutiveFiles) {
+ res = searchForConsecutiveFiles(initial_file);
+ } else {
+ Extensions e;
+ QStringList exts;
+ switch (filter) {
+ case Preferences::VideoFiles: exts = e.video().forDirFilter(); break;
+ case Preferences::AudioFiles: exts = e.audio().forDirFilter(); break;
+ case Preferences::MultimediaFiles: exts = e.multimedia().forDirFilter(); break;
+ default: ;
+ }
+ if (!exts.isEmpty()) res = Helper::filesInDirectory(initial_file, exts);
+ }
+
+ return res;
+}
+
+#ifdef Q_OS_WIN
+// Check for Windows shortcuts
+QStringList Helper::resolveSymlinks(const QStringList & files) {
+ QStringList list = files;
+ for (int n=0; n < list.count(); n++) {
+ QFileInfo fi(list[n]);
+ if (fi.isSymLink()) {
+ list[n] = fi.symLinkTarget();
+ }
+ }
+ return list;
+}
+#endif
+
+#ifndef Q_OS_WIN
+QString Helper::findExecutable(const QString & name) {
+ QByteArray env = qgetenv("PATH");
+ QStringList search_paths = QString::fromLocal8Bit(env.constData()).split(':', QString::SkipEmptyParts);
+ for (int n = 0; n < search_paths.count(); n++) {
+ QString candidate = search_paths[n] + "/" + name;
+ qDebug("Helper::findExecutable: candidate: %s", candidate.toUtf8().constData());
+ QFileInfo info(candidate);
+ if (info.isFile() && info.isExecutable()) {
+ qDebug("Helper::findExecutable: executable found: %s", candidate.toUtf8().constData());
+ return candidate;
+ }
+ }
+ return QString::null;
+}
+#endif