diff options
author | Maia Kozheva <sikon@ubuntu.com> | 2009-11-20 18:22:19 +0600 |
---|---|---|
committer | Maia Kozheva <sikon@ubuntu.com> | 2009-11-20 18:22:19 +0600 |
commit | 263b32f108c15cd1c55a8f4eb4704fac6553f1ac (patch) | |
tree | 1c49e7848aa2d3d64a9d9b96b8852cb1884da2f7 /src/main.cpp |
Imported Upstream version 0.6.8
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..9cd2809 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,272 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2006-2009 Ricardo Villalba <rvm@escomposlinux.org> + + 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 <QApplication> +#include <QFile> +#include <QTime> + +#include "smplayer.h" +#include "global.h" +#include "helper.h" +#include "paths.h" + +#include <stdio.h> + +#define USE_LOCKS 1 +#if USE_LOCKS +#ifdef USE_QXT +#define USE_QXT_LOCKS 1 +#endif // USE_QXT +#endif // USE_LOCKS + +#if USE_LOCKS && USE_QXT_LOCKS +#include <QxtFileLock> +#endif + +using namespace Global; + +BaseGui * basegui_instance = 0; + +void myMessageOutput( QtMsgType type, const char *msg ) { + static QStringList saved_lines; + static QString orig_line; + static QString line2; + static QRegExp rx_log; + + if (pref) { + if (!pref->log_smplayer) return; + rx_log.setPattern(pref->log_filter); + } else { + rx_log.setPattern(".*"); + } + + line2.clear(); + + orig_line = QString::fromUtf8(msg); + + switch ( type ) { + case QtDebugMsg: + if (rx_log.indexIn(orig_line) > -1) { + #ifndef NO_DEBUG_ON_CONSOLE + fprintf( stderr, "Debug: %s\n", orig_line.toLocal8Bit().data() ); + #endif + line2 = orig_line; + } + break; + case QtWarningMsg: + #ifndef NO_DEBUG_ON_CONSOLE + fprintf( stderr, "Warning: %s\n", orig_line.toLocal8Bit().data() ); + #endif + line2 = "WARNING: " + orig_line; + break; + case QtFatalMsg: + #ifndef NO_DEBUG_ON_CONSOLE + fprintf( stderr, "Fatal: %s\n", orig_line.toLocal8Bit().data() ); + #endif + line2 = "FATAL: " + orig_line; + abort(); // deliberately core dump + case QtCriticalMsg: + #ifndef NO_DEBUG_ON_CONSOLE + fprintf( stderr, "Critical: %s\n", orig_line.toLocal8Bit().data() ); + #endif + line2 = "CRITICAL: " + orig_line; + break; + } + + if (line2.isEmpty()) return; + + line2 = "["+ QTime::currentTime().toString("hh:mm:ss:zzz") +"] "+ line2; + + if (basegui_instance) { + if (!saved_lines.isEmpty()) { + // Send saved lines first + for (int n=0; n < saved_lines.count(); n++) { + basegui_instance->recordSmplayerLog(saved_lines[n]); + } + saved_lines.clear(); + } + basegui_instance->recordSmplayerLog(line2); + } else { + // GUI is not created yet, save lines for later + saved_lines.append(line2); + } +} + +#if USE_LOCKS +#if USE_QXT_LOCKS +bool create_lock(QFile * f, QxtFileLock * lock) { + bool success = false; + if (f->open(QIODevice::ReadWrite)) { + if (lock->lock()) { + f->write("smplayer lock file"); + success = true; + } + } + if (!success) f->close(); + return success; +} + +void clean_lock(QFile * f, QxtFileLock * lock) { + qDebug("main: clean_lock: %s", f->fileName().toUtf8().data()); + lock->unlock(); + f->close(); + f->remove(); +} +#else +void remove_lock(QString lock_file) { + if (QFile::exists(lock_file)) { + qDebug("main: remove_lock: %s", lock_file.toUtf8().data()); + QFile::remove(lock_file); + } +} +#endif +#endif + +class MyApplication : public QApplication +{ +public: + MyApplication ( int & argc, char ** argv ) : QApplication(argc, argv) {}; + virtual void commitData ( QSessionManager & /*manager*/ ) { + // Nothing to do, let the application to close + } +}; + +int main( int argc, char ** argv ) +{ + MyApplication a( argc, argv ); + a.setQuitOnLastWindowClosed(false); + //a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); + + // Sets the config path + QString config_path; + +#ifdef PORTABLE_APP + config_path = a.applicationDirPath(); +#else + // If a smplayer.ini exists in the app path, will use that path + // for the config file by default + if (QFile::exists( a.applicationDirPath() + "/smplayer.ini" ) ) { + config_path = a.applicationDirPath(); + qDebug("main: using existing %s", QString(config_path + "/smplayer.ini").toUtf8().data()); + } +#endif + + QStringList args = a.arguments(); + int pos = args.indexOf("-config-path"); + if ( pos != -1) { + if (pos+1 < args.count()) { + pos++; + config_path = args[pos]; + // Delete from list + args.removeAt(pos); + args.removeAt(pos-1); + } else { + printf("Error: expected parameter for -config-path\r\n"); + return SMPlayer::ErrorArgument; + } + } + + qInstallMsgHandler( myMessageOutput ); + +#if USE_LOCKS + //setIniPath will be set later in global_init, but we need it here + if (!config_path.isEmpty()) Paths::setConfigPath(config_path); + + QString lock_file = Paths::iniPath() + "/smplayer_init.lock"; + qDebug("main: lock_file: %s", lock_file.toUtf8().data()); + +#if USE_QXT_LOCKS + QFile f(lock_file); + QxtFileLock write_lock(&f, 0x10, 30, QxtFileLock::WriteLock); + + bool lock_ok = create_lock(&f, &write_lock); + + if (!lock_ok) { + //lock failed + qDebug("main: lock failed"); + + // Wait 10 secs max. + int n = 100; + while ( n > 0) { + Helper::msleep(100); // wait 100 ms + //if (!QFile::exists(lock_file)) break; + if (create_lock(&f, &write_lock)) break; + n--; + if ((n % 10) == 0) qDebug("main: waiting %d...", n); + } + // Continue startup + } +#else + if (QFile::exists(lock_file)) { + qDebug("main: %s exists, waiting...", lock_file.toUtf8().data()); + // Wait 10 secs max. + int n = 100; + while ( n > 0) { + Helper::msleep(100); // wait 100 ms + if (!QFile::exists(lock_file)) break; + n--; + if ((n % 10) == 0) qDebug("main: waiting %d...", n); + } + remove_lock(lock_file); + } else { + // Create lock file + QFile f(lock_file); + if (f.open(QIODevice::WriteOnly)) { + f.write("smplayer lock file"); + f.close(); + } else { + qWarning("main: can't open %s for writing", lock_file.toUtf8().data()); + } + + } +#endif // USE_QXT_LOCKS +#endif // USE_LOCKS + + SMPlayer * smplayer = new SMPlayer(config_path); + SMPlayer::ExitCode c = smplayer->processArgs( args ); + if (c != SMPlayer::NoExit) { +#if USE_LOCKS +#if USE_QXT_LOCKS + clean_lock(&f, &write_lock); +#else + remove_lock(lock_file); +#endif +#endif + return c; + } + + basegui_instance = smplayer->gui(); + a.connect(smplayer->gui(), SIGNAL(quitSolicited()), &a, SLOT(quit())); + smplayer->start(); + +#if USE_LOCKS +#if USE_QXT_LOCKS + clean_lock(&f, &write_lock); +#else + remove_lock(lock_file); +#endif +#endif + + int r = a.exec(); + + basegui_instance = 0; + delete smplayer; + + return r; +} + |