Files
cantata/gui/main.cpp
2013-10-25 20:01:33 +00:00

301 lines
9.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Cantata
*
* Copyright (c) 2011-2013 Craig Drummond <craig.p.drummond@gmail.com>
*
* ----
*
* 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; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "application.h"
#ifdef ENABLE_KDE_SUPPORT
#include <KDE/KUniqueApplication>
#include <KDE/KAboutData>
#include <KDE/KCmdLineArgs>
#include <KDE/KStartupInfo>
#include "contextwidget.h"
#else
#include <QTranslator>
#include <QTextCodec>
#include <QLibraryInfo>
#include <QDir>
#include <QFile>
#include <QSettings>
#endif
#include "utils.h"
#include "config.h"
#include "settings.h"
#include "initialsettingswizard.h"
#include "mainwindow.h"
// To enable debug...
#include "mpdconnection.h"
#include "mpdparseutils.h"
#include "covers.h"
#include "wikipediaengine.h"
#include "lastfmengine.h"
#include "metaengine.h"
#include "coverwidget.h"
#include "backdropcreator.h"
#include "dynamic.h"
#include "streamfetcher.h"
#include "httpserver.h"
#include "songdialog.h"
#ifdef ENABLE_EXTERNAL_TAGS
#include "tagclient.h"
#endif
#include <QMutex>
#include <QMutexLocker>
#include <QTextStream>
#include <QDateTime>
static QMutex msgMutex;
static bool firstMsg=true;
#if QT_VERSION < 0x050000
static void cantataQtMsgHandler(QtMsgType, const char *msg)
#else
static void cantataQtMsgHandler(QtMsgType, const QMessageLogContext &, const QString &msg)
#endif
{
QMutexLocker locker(&msgMutex);
QFile f(Utils::cacheDir(QString(), true)+"cantata.log");
if (f.open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text)) {
QTextStream stream(&f);
if (firstMsg) {
stream << "------------START------------" << endl;
firstMsg=false;
}
stream << QDateTime::currentDateTime().toString(Qt::ISODate).replace("T", " ") << " - " << msg << endl;
}
}
#ifndef ENABLE_KDE_SUPPORT
// Taken from Clementine!
//
// We convert from .po files to .qm files, which loses context information.
// This translator tries loading strings with an empty context if it can't
// find any others.
class PoTranslator : public QTranslator
{
public:
QString translate(const char *context, const char *sourceText, const char *disambiguation = 0) const
{
QString ret = QTranslator::translate(context, sourceText, disambiguation);
return !ret.isEmpty() ? ret : QTranslator::translate(NULL, sourceText, disambiguation);
}
};
static void loadTranslation(const QString &prefix, const QString &path, const QString &overrideLanguage = QString())
{
#if QT_VERSION < 0x040700
// QTranslator::load will try to open and read "cantata" if it exists,
// without checking if it's a file first.
// This was fixed in Qt 4.7
QFileInfo maybeCantataDirectory(path + "/cantata");
if (maybeCantataDirectory.exists() && !maybeCantataDirectory.isFile()) {
return;
}
#endif
QString language = overrideLanguage.isEmpty() ? QLocale::system().name() : overrideLanguage;
QTranslator *t = new PoTranslator;
if (t->load(prefix+"_"+language, path)) {
QCoreApplication::installTranslator(t);
} else {
delete t;
}
#if QT_VERSION < 0x050000
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
#endif
}
#endif
enum Debug {
Dbg_Mpd = 0x0001,
Dbg_MpdParse = 0x0002,
Dbg_Covers = 0x0004,
Dbg_Context_Wikipedia = 0x0008,
Dbg_Context_LastFm = 0x0010,
Dbg_Context_Meta = 0x0020,
Dbg_Context_Widget = 0x0040,
Dbg_Context_Backdrop = 0x0080,
Dbg_Dynamic = 0x0100,
Dbg_StreamFetching = 0x0200,
Dbg_HttpServer = 0x0400,
Dbg_SongDialogs = 0x0800,
Dbg_TagHelper = 0x1000,
// NOTE: MUST UPDATE Dbg_All IF ADD NEW ITEMS!!!
Dbg_All = 0x1FFF
};
int main(int argc, char *argv[])
{
#ifdef ENABLE_KDE_SUPPORT
KAboutData aboutData(PACKAGE_NAME, 0,
ki18n("Cantata"), PACKAGE_VERSION_STRING,
ki18n("A KDE client for MPD"),
KAboutData::License_GPL_V3,
ki18n("Copyright © 20112013 Craig Drummond"),
KLocalizedString(),
"http://"CANTATA_URL, "craig.p.drummond@gmail.com");
aboutData.addAuthor(ki18n("Craig Drummond"), ki18n("Maintainer"), "craig.p.drummond@gmail.com");
aboutData.addAuthor(ki18n("Piotr Wicijowski"), ki18n("UI Improvements"), "piotr.wicijowski@gmail.com");
aboutData.addAuthor(ki18n("Sander Knopper"), ki18n("QtMPC author"), QByteArray(), "http://qtmpc.lowblog.nl");
aboutData.addAuthor(ki18n("Roeland Douma"), ki18n("QtMPC author"), QByteArray(), "http://qtmpc.lowblog.nl");
aboutData.addAuthor(ki18n("Daniel Selinger"), ki18n("QtMPC author"), QByteArray(), "http://qtmpc.lowblog.nl");
aboutData.addAuthor(ki18n("Armin Walland"), ki18n("QtMPC author"), QByteArray(), "http://qtmpc.lowblog.nl");
// if (ContextWidget::constHtbApiKey.latin1()) {
// aboutData.addCredit(ki18n("Home Theater Backdrops"), ki18n("Context view backdrops"), QByteArray(), "www.htbackdrops.com");
// }
aboutData.addCredit(ki18n("FanArt.tv"), ki18n("Context view backdrops (please consider uploading your own music fan-art to fanart.tv)"), QByteArray(), "www.fanart.tv");
aboutData.addCredit(ki18n("Wikipedia"), ki18n("Context view metadata"), QByteArray(), "www.wikipedia.org");
aboutData.addCredit(ki18n("Last.fm"), ki18n("Context view metadata"), QByteArray(), "www.last.fm");
KCmdLineArgs::init(argc, argv, &aboutData);
#ifdef TAGLIB_FOUND
KCmdLineOptions options;
options.add("+[URL]", ki18n("URL to open"));
KCmdLineArgs::addCmdLineOptions(options);
KUniqueApplication::addCmdLineOptions();
#endif
if (!KUniqueApplication::start()) {
exit(0);
}
Application app;
#else // ENABLE_KDE_SUPPORT
QCoreApplication::setApplicationName(PACKAGE_NAME);
#ifdef Q_OS_WIN
QCoreApplication::setOrganizationName("mpd");
#else
QCoreApplication::setOrganizationName(PACKAGE_NAME);
#endif
Application app(argc, argv);
if (!app.start()) {
return 0;
}
// Translations
QString langEnv=qgetenv("CANTATA_LANG");
loadTranslation("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath), langEnv);
#ifdef Q_OS_WIN
loadTranslation("qt", app.applicationDirPath()+QLatin1String("/translations"), langEnv);
loadTranslation("qt", QDir::currentPath()+QLatin1String("/translations"), langEnv);
#endif
loadTranslation("cantata", app.applicationDirPath()+QLatin1String("/translations"), langEnv);
loadTranslation("cantata", QDir::currentPath()+QLatin1String("/translations"), langEnv);
#ifndef Q_OS_WIN
loadTranslation("cantata", INSTALL_PREFIX"/share/cantata/translations/", langEnv);
#endif
// Set the permissions on the config file on Unix - it can contain passwords
// for internet services so it's important that other users can't read it.
// On Windows these are stored in the registry instead.
#ifdef Q_OS_UNIX
QSettings s;
// Create the file if it doesn't exist already
if (!QFile::exists(s.fileName())) {
QFile file(s.fileName());
file.open(QIODevice::WriteOnly);
}
// Set -rw-------
QFile::setPermissions(s.fileName(), QFile::ReadOwner | QFile::WriteOwner);
#endif
QString debug=qgetenv("CANTATA_DEBUG");
if (!debug.isEmpty()) {
int dbg=debug.toInt();
bool logToFile=dbg>0;
if (dbg<0) {
dbg*=-1;
}
if (dbg&Dbg_Mpd) {
MPDConnection::enableDebug();
}
if (dbg&Dbg_MpdParse) {
MPDParseUtils::enableDebug();
}
if (dbg&Dbg_Covers) {
Covers::enableDebug();
}
if (dbg&Dbg_Context_Wikipedia) {
WikipediaEngine::enableDebug();
}
if (dbg&Dbg_Context_LastFm) {
LastFmEngine::enableDebug();
}
if (dbg&Dbg_Context_Meta) {
MetaEngine::enableDebug();
}
if (dbg&Dbg_Context_Widget) {
ContextWidget::enableDebug();
}
if (dbg&Dbg_Context_Backdrop) {
BackdropCreator::enableDebug();
}
if (dbg&Dbg_Dynamic) {
Dynamic::enableDebug();
}
if (dbg&Dbg_StreamFetching) {
StreamFetcher::enableDebug();
}
if (dbg&Dbg_HttpServer) {
HttpServer::enableDebug();
}
if (dbg&Dbg_SongDialogs) {
SongDialog::enableDebug();
}
#ifdef ENABLE_EXTERNAL_TAGS
if (dbg&Dbg_TagHelper) {
TagClient::enableDebug();
}
#endif
if (dbg&Dbg_All && logToFile) {
#if QT_VERSION < 0x050000
qInstallMsgHandler(cantataQtMsgHandler);
#else
qInstallMessageHandler(cantataQtMsgHandler);
#endif
}
}
if (Settings::self()->firstRun()) {
InitialSettingsWizard wz;
if (QDialog::Rejected==wz.exec()) {
return 0;
}
}
MainWindow mw;
#if !defined Q_OS_MAC
app.setActivationWindow(&mw);
#endif // !defined Q_OS_MAC
app.loadFiles();
if (!Settings::self()->startHidden()) {
mw.show();
}
#endif // ENABLE_KDE_SUPPORT
return app.exec();
}