Data() { if (!Data::name.isEmpty()) file = appDataDir() + QString::fromLatin1("/") + Data::name + QString::fromLatin1(".ini"); else file = appDataDir() + QString::fromLatin1("/") + qApp->applicationName() + QString::fromLatin1(".ini"); if (!QDir(appDataDir()).exists()) { if (!QDir().mkpath(appDataDir())) { qWarning() << "Failed to create appDataDir: " << appDataDir(); } } load(); }
bool SetupDialog::validateAdvancedSetupPage() { bool result = false; setTarsnapVersion(""); _tarsnapDir = Utils::findTarsnapClientInPath(_ui->tarsnapPathLineEdit->text(), true); _tarsnapCacheDir = Utils::validateTarsnapCache(_ui->tarsnapCacheLineEdit->text()); QFileInfo appDataDir(_ui->appDataPathLineEdit->text()); if(appDataDir.exists() && appDataDir.isDir() && appDataDir.isWritable()) _appDataDir = _ui->appDataPathLineEdit->text(); else _appDataDir.clear(); if(_tarsnapDir.isEmpty() || _tarsnapCacheDir.isEmpty() || _appDataDir.isEmpty()) result = false; else result = true; if(result) emit getTarsnapVersion(_tarsnapDir); _ui->advancedPageProceedButton->setEnabled(result); return result; }
QOptions get_common_options() { static QOptions ops = QOptions().addDescription(QString::fromLatin1("Options for QtAV players")) .add(QString::fromLatin1("common options")) ("help,h", QLatin1String("print this")) ("ao", QString(), QLatin1String("audio output. Can be ordered combination of available backends (-ao help). Leave empty to use the default setting. Set 'null' to disable audio.")) ("-egl", QLatin1String("Use EGL. Only works for Qt>=5.5+XCB")) ("-gl", QLatin1String("OpenGL backend for Qt>=5.4(windows). can be 'desktop', 'opengles' and 'software'")) ("x", 0, QString()) ("y", 0, QLatin1String("y")) ("-width", 800, QLatin1String("width of player")) ("height", 450, QLatin1String("height of player")) ("fullscreen", QLatin1String("fullscreen")) ("decoder", QLatin1String("FFmpeg"), QLatin1String("use a given decoder")) ("decoders,-vd", QLatin1String("cuda;vaapi;vda;dxva;cedarv;ffmpeg"), QLatin1String("decoder name list in priority order seperated by ';'")) ("file,f", QString(), QLatin1String("file or url to play")) ("language", QLatin1String("system"), QLatin1String("language on UI. can be 'system', 'none' and locale name e.g. zh_CN")) ("log", QString(), QLatin1String("log level. can be 'off', 'fatal', 'critical', 'warning', 'debug', 'all'")) ("logfile" #if defined(Q_OS_WINRT) || defined(Q_OS_ANDROID) || defined(Q_OS_IOS) , appDataDir().append(QString::fromLatin1("/log-%1.txt")) #else , QString::fromLatin1("log-%1.txt") #endif , QString::fromLatin1("log to file. Set empty to disable log file (-logfile '')")) ; return ops; }
QDir appLogDir() { #ifndef Q_WS_MAC return appDataDir(); #else return QDir( QDir::homePath() + "/Library/Logs" ); #endif }
QString appFontsDir() { #if 0 //qt may return an read only path, for example OSX /System/Library/Fonts #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) const QString dir(QStandardPaths::writableLocation(QStandardPaths::FontsLocation)); if (!dir.isEmpty()) return dir; #endif #endif return appDataDir() + QStringLiteral("/fonts"); }
QString userVariables::getAppDataPath() { QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); //check if folder exists QDir appDataDir(path); if(!appDataDir.exists()) { if(appDataDir.mkpath(path)) qDebug() << "Created path: " << path; } return path.append("/"); }
void AppendGlobalPaths( std::vector<std::string> &paths ) { #if defined(FABRIC_OS_MACOSX) paths.push_back( "/Library/Fabric/Exts" ); #elif defined(FABRIC_OS_LINUX) paths.push_back( "/usr/lib/fabric/Exts" ); #elif defined(FABRIC_OS_WINDOWS) char const *appData = getenv("APPDATA"); if ( appData && *appData ) { std::string appDataDir(appData); paths.push_back( IO::JoinPath( appDataDir, "Fabric" , "Exts" ) ); } #endif }
void do_common_options(const QOptions &options, const QString& appName) { if (options.value(QString::fromLatin1("help")).toBool()) { options.print(); exit(0); } // has no effect if qInstallMessageHandler() called //qSetMessagePattern("%{function} @%{line}: %{message}"); #if !defined(Q_OS_WINRT) && !defined(Q_OS_ANDROID) QString app(appName); if (app.isEmpty() && qApp) app = qApp->applicationName(); QString logfile(options.option(QString::fromLatin1("logfile")).value().toString().arg(app)); if (!logfile.isEmpty()) { if (QDir(logfile).isRelative()) { QString log_path(QString::fromLatin1("%1/%2").arg(qApp->applicationDirPath()).arg(logfile)); QFile f(log_path); if (!f.open(QIODevice::WriteOnly)) { log_path = QString::fromLatin1("%1/%2").arg(appDataDir()).arg(logfile); qDebug() << "executable dir is not writable. log to " << log_path; } logfile = log_path; } qDebug() << "set log file: " << logfile; fileLogger()->setFileName(logfile); if (fileLogger()->open(QIODevice::WriteOnly)) { qDebug() << "Logger"; qInstallMessageHandler(Logger); } else { qWarning() << "Failed to open log file '" << fileLogger()->fileName() << "': " << fileLogger()->errorString(); } } #endif QByteArray level(options.value(QString::fromLatin1("log")).toByteArray()); if (level.isEmpty()) level = Config::instance().logLevel().toLatin1(); if (!level.isEmpty()) qputenv("QTAV_LOG", level); }
int main(int argc, char *argv[]) { const QString runGuardName = getRunGuardName(); Helpers::RunGuard guard(runGuardName); if (!guard.tryToRun()) { std::cerr << "Xpiks is already running"; return -1; } // will call curl_global_init and cleanup Conectivity::CurlInitHelper curlInitHelper; Q_UNUSED(curlInitHelper); // will init thread-unsafe XMP toolkit MetadataIO::Exiv2InitHelper exiv2InitHelper; Q_UNUSED(exiv2InitHelper); const char *highDpiEnvironmentVariable = setHighDpiEnvironmentVariable(); qRegisterMetaTypeStreamOperators<Models::ProxySettings>("ProxySettings"); qRegisterMetaType<Common::SpellCheckFlags>("Common::SpellCheckFlags"); initQSettings(); Helpers::AppSettings appSettings; ensureUserIdExists(&appSettings); Suggestion::LocalLibrary localLibrary; QString appDataPath = XPIKS_USERDATA_PATH; if (!appDataPath.isEmpty()) { QDir appDataDir(appDataPath); QString libraryFilePath = appDataDir.filePath(Constants::LIBRARY_FILENAME); localLibrary.setLibraryPath(libraryFilePath); } else { std::cerr << "AppDataPath is empty!"; } #ifdef WITH_LOGS const QString &logFileDir = QDir::cleanPath(appDataPath + QDir::separator() + "logs"); if (!logFileDir.isEmpty()) { QDir dir(logFileDir); if (!dir.exists()) { bool created = QDir().mkpath(logFileDir); Q_UNUSED(created); } QString time = QDateTime::currentDateTimeUtc().toString("ddMMyyyy-hhmmss-zzz"); QString logFilename = QString("xpiks-qt-%1.log").arg(time); QString logFilePath = dir.filePath(logFilename); Helpers::Logger &logger = Helpers::Logger::getInstance(); logger.setLogFilePath(logFilePath); } #endif QMLExtensions::ColorsModel colorsModel; Models::LogsModel logsModel(&colorsModel); logsModel.startLogging(); #if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) qSetMessagePattern("%{time hh:mm:ss.zzz} %{type} T#%{threadid} %{function} - %{message}"); #endif qInstallMessageHandler(myMessageHandler); LOG_INFO << "Log started. Today is" << QDateTime::currentDateTimeUtc().toString("dd.MM.yyyy"); LOG_INFO << "Xpiks" << XPIKS_VERSION_STRING << "-" << STRINGIZE(BUILDNUMBER); #if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) LOG_INFO << QSysInfo::productType() << QSysInfo::productVersion() << QSysInfo::currentCpuArchitecture(); #else #ifdef Q_OS_WIN LOG_INFO << QLatin1String("Windows Qt<5.4"); #elsif Q_OS_DARWIN LOG_INFO << QLatin1String("OS X Qt<5.4"); #else LOG_INFO << QLatin1String("LINUX Qt<5.4"); #endif #endif QApplication app(argc, argv); LOG_INFO << "Working directory of Xpiks is:" << QDir::currentPath(); LOG_DEBUG << "Extra files search locations:" << QStandardPaths::standardLocations(XPIKS_DATA_LOCATION_TYPE); if (highDpiEnvironmentVariable) { qunsetenv(highDpiEnvironmentVariable); } localLibrary.loadLibraryAsync(); QString userId = appSettings.value(QLatin1String(Constants::USER_AGENT_ID)).toString(); userId.remove(QRegExp("[{}-].")); Models::ArtworksRepository artworkRepository; Models::ArtItemsModel artItemsModel; Models::CombinedArtworksModel combinedArtworksModel; Models::UploadInfoRepository uploadInfoRepository; Warnings::WarningsService warningsService; Models::SettingsModel settingsModel; settingsModel.readAllValues(); Encryption::SecretsManager secretsManager; UndoRedo::UndoRedoManager undoRedoManager; Models::ZipArchiver zipArchiver; Suggestion::KeywordsSuggestor keywordsSuggestor(&localLibrary); Models::FilteredArtItemsProxyModel filteredArtItemsModel; filteredArtItemsModel.setSourceModel(&artItemsModel); Models::RecentDirectoriesModel recentDirectorieModel; Conectivity::FtpCoordinator *ftpCoordinator = new Conectivity::FtpCoordinator(settingsModel.getMaxParallelUploads()); Models::ArtworkUploader artworkUploader(ftpCoordinator); SpellCheck::SpellCheckerService spellCheckerService; SpellCheck::SpellCheckSuggestionModel spellCheckSuggestionModel; MetadataIO::BackupSaverService metadataSaverService; Warnings::WarningsModel warningsModel; warningsModel.setSourceModel(&artItemsModel); warningsModel.setWarningsSettingsModel(warningsService.getWarningsSettingsModel()); Models::LanguagesModel languagesModel; AutoComplete::AutoCompleteModel autoCompleteModel; AutoComplete::AutoCompleteService autoCompleteService(&autoCompleteModel); QMLExtensions::ImageCachingService imageCachingService; Models::FindAndReplaceModel replaceModel(&colorsModel); Models::DeleteKeywordsViewModel deleteKeywordsModel; Conectivity::UpdateService updateService(&settingsModel); MetadataIO::MetadataIOCoordinator metadataIOCoordinator; #if defined(QT_NO_DEBUG) && !defined(TELEMETRY_DISABLED) const bool telemetryEnabled = appSettings.value(Constants::USER_STATISTICS, true).toBool(); #else const bool telemetryEnabled = false; #endif Conectivity::TelemetryService telemetryService(userId, telemetryEnabled); Plugins::PluginManager pluginManager; Plugins::PluginsWithActionsModel pluginsWithActions; pluginsWithActions.setSourceModel(&pluginManager); Helpers::HelpersQmlWrapper helpersQmlWrapper; LOG_INFO << "Models created"; Commands::CommandManager commandManager; commandManager.InjectDependency(&artworkRepository); commandManager.InjectDependency(&artItemsModel); commandManager.InjectDependency(&filteredArtItemsModel); commandManager.InjectDependency(&combinedArtworksModel); commandManager.InjectDependency(&artworkUploader); commandManager.InjectDependency(&uploadInfoRepository); commandManager.InjectDependency(&warningsService); commandManager.InjectDependency(&secretsManager); commandManager.InjectDependency(&undoRedoManager); commandManager.InjectDependency(&zipArchiver); commandManager.InjectDependency(&keywordsSuggestor); commandManager.InjectDependency(&settingsModel); commandManager.InjectDependency(&recentDirectorieModel); commandManager.InjectDependency(&spellCheckerService); commandManager.InjectDependency(&spellCheckSuggestionModel); commandManager.InjectDependency(&metadataSaverService); commandManager.InjectDependency(&telemetryService); commandManager.InjectDependency(&updateService); commandManager.InjectDependency(&logsModel); commandManager.InjectDependency(&localLibrary); commandManager.InjectDependency(&metadataIOCoordinator); commandManager.InjectDependency(&pluginManager); commandManager.InjectDependency(&languagesModel); commandManager.InjectDependency(&colorsModel); commandManager.InjectDependency(&autoCompleteService); commandManager.InjectDependency(&imageCachingService); commandManager.InjectDependency(&replaceModel); commandManager.InjectDependency(&deleteKeywordsModel); commandManager.InjectDependency(&helpersQmlWrapper); commandManager.ensureDependenciesInjected(); keywordsSuggestor.initSuggestionEngines(); // other initializations secretsManager.setMasterPasswordHash(appSettings.value(Constants::MASTER_PASSWORD_HASH, "").toString()); uploadInfoRepository.initFromString(appSettings.value(Constants::UPLOAD_HOSTS, "").toString()); recentDirectorieModel.deserializeFromSettings(appSettings.value(Constants::RECENT_DIRECTORIES, "").toString()); commandManager.connectEntitiesSignalsSlots(); languagesModel.initFirstLanguage(); languagesModel.loadLanguages(); telemetryService.setInterfaceLanguage(languagesModel.getCurrentLanguage()); qmlRegisterType<Helpers::ClipboardHelper>("xpiks", 1, 0, "ClipboardHelper"); qmlRegisterType<QMLExtensions::TriangleElement>("xpiks", 1, 0, "TriangleElement"); QQmlApplicationEngine engine; Helpers::GlobalImageProvider *globalProvider = new Helpers::GlobalImageProvider(QQmlImageProviderBase::Image); QMLExtensions::CachingImageProvider *cachingProvider = new QMLExtensions::CachingImageProvider(QQmlImageProviderBase::Image); cachingProvider->setImageCachingService(&imageCachingService); QQmlContext *rootContext = engine.rootContext(); rootContext->setContextProperty("artItemsModel", &artItemsModel); rootContext->setContextProperty("artworkRepository", &artworkRepository); rootContext->setContextProperty("combinedArtworks", &combinedArtworksModel); rootContext->setContextProperty("appSettings", &appSettings); rootContext->setContextProperty("secretsManager", &secretsManager); rootContext->setContextProperty("undoRedoManager", &undoRedoManager); rootContext->setContextProperty("keywordsSuggestor", &keywordsSuggestor); rootContext->setContextProperty("settingsModel", &settingsModel); rootContext->setContextProperty("filteredArtItemsModel", &filteredArtItemsModel); rootContext->setContextProperty("helpersWrapper", &helpersQmlWrapper); rootContext->setContextProperty("recentDirectories", &recentDirectorieModel); rootContext->setContextProperty("metadataIOCoordinator", &metadataIOCoordinator); rootContext->setContextProperty("pluginManager", &pluginManager); rootContext->setContextProperty("pluginsWithActions", &pluginsWithActions); rootContext->setContextProperty("warningsModel", &warningsModel); rootContext->setContextProperty("languagesModel", &languagesModel); rootContext->setContextProperty("i18", &languagesModel); rootContext->setContextProperty("Colors", &colorsModel); rootContext->setContextProperty("acSource", &autoCompleteModel); rootContext->setContextProperty("replaceModel", &replaceModel); #ifdef QT_DEBUG QVariant isDebug(true); #else QVariant isDebug(false); #endif rootContext->setContextProperty("debug", isDebug); engine.addImageProvider("global", globalProvider); engine.addImageProvider("cached", cachingProvider); LOG_DEBUG << "About to load main view..."; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); LOG_DEBUG << "Main view loaded"; pluginManager.getUIProvider()->setQmlEngine(&engine); QQuickWindow *window = qobject_cast<QQuickWindow *>(engine.rootObjects().at(0)); pluginManager.getUIProvider()->setRoot(window->contentItem()); #ifdef QT_DEBUG if (argc > 1) { QList<QUrl> pathes; for (int i = 1; i < argc; ++i) { pathes.append(QUrl::fromLocalFile(QString::fromUtf8(argv[i]))); } commandManager.addInitialArtworks(pathes); } #endif commandManager.afterConstructionCallback(); return app.exec(); }
QDir appLogDir() { return appDataDir(); }
void load() { // for old config data migration QString dir_old = qApp->applicationDirPath() + QString::fromLatin1("/data"); if (!QDir(dir_old).exists()) { dir_old = QDir::homePath() + QString::fromLatin1("/.QtAV"); } if (QDir(dir_old).exists()) { if (!QFile(file).exists()) { QString old = dir_old + QString::fromLatin1("/") + qApp->applicationName() + QString::fromLatin1(".ini"); if (QFile(old).exists()) { QFile::copy(old, file); QFile::remove(old); } old = dir_old + QString::fromLatin1("/playlist.qds"); if (QFile(old).exists()) { if (!QFile::copy(old, appDataDir() + QString::fromLatin1("/playlist.qds"))) qWarning("error to move old playlist data"); QFile::remove(old); } old = dir_old + QString::fromLatin1("/history.qds"); if (QFile(old).exists()) { if (!QFile::copy(old, appDataDir() + QString::fromLatin1("/history.qds"))) qWarning("error to move old history data"); QFile::remove(old); } } } QSettings settings(file, QSettings::IniFormat); log = settings.value(QString::fromLatin1("log"), QString()).toString(); last_file = settings.value(QString::fromLatin1("last_file"), QString()).toString(); timeout = settings.value(QString::fromLatin1("timeout"), 30.0).toReal(); abort_timeout = settings.value(QString::fromLatin1("abort_timeout"), true).toBool(); force_fps = settings.value(QString::fromLatin1("force_fps"), 0.0).toReal(); settings.beginGroup(QString::fromLatin1("decoder")); settings.beginGroup(QString::fromLatin1("video")); QString decs_default(QString::fromLatin1("FFmpeg")); //decs_default.append(QString::fromLatin1(" CUDA ")).append(QString::fromLatin1(" DXVA ")).append(QString::fromLatin1(" VAAPI ")).append(QString::fromLatin1(" VDA ")); #if 0 QString all_names_string = settings.value("all", QString()).toString(); if (!all_names_string.isEmpty()) { all_names = all_names_string.split(" ", QString::SkipEmptyParts); } #endif video_decoders = settings.value(QString::fromLatin1("priority"), decs_default).toString().split(QString::fromLatin1(" "), QString::SkipEmptyParts); settings.endGroup(); //video settings.endGroup(); //decoder settings.beginGroup(QString::fromLatin1("capture")); capture_dir = settings.value(QString::fromLatin1("dir"), QString()).toString(); if (capture_dir.isEmpty()) { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) capture_dir = QDesktopServices::storageLocation(QDesktopServices::PicturesLocation); #else capture_dir = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); #endif } capture_fmt = settings.value(QString::fromLatin1("format"), QString::fromLatin1("png")).toString(); capture_quality = settings.value(QString::fromLatin1("quality"), 100).toInt(); settings.endGroup(); settings.beginGroup(QString::fromLatin1("subtitle")); subtitle_autoload = settings.value(QString::fromLatin1("autoLoad"), true).toBool(); subtitle_enabled = settings.value(QString::fromLatin1("enabled"), true).toBool(); subtitle_engines = settings.value(QString::fromLatin1("engines"), QStringList() << QString::fromLatin1("FFmpeg") << QString::fromLatin1("LibASS")).toStringList(); subtitle_delay = settings.value(QString::fromLatin1("delay"), 0.0).toInt(); QFont f; f.setPointSize(20); f.setBold(true); subtitle_font = settings.value(QString::fromLatin1("font"), f).value<QFont>(); subtitle_color = settings.value(QString::fromLatin1("color"), QColor("white")).value<QColor>(); subtitle_outline_color = settings.value(QString::fromLatin1("outline_color"), QColor("blue")).value<QColor>(); subtitle_outline = settings.value(QString::fromLatin1("outline"), true).toBool(); subtilte_bottom_margin = settings.value(QString::fromLatin1("bottom margin"), 8).toInt(); settings.beginGroup(QString::fromLatin1("ass")); ass_font_file = settings.value(QString::fromLatin1("font_file"), QString()).toString(); ass_force_font_file = settings.value(QString::fromLatin1("force_font_file"), false).toBool(); ass_fonts_dir = settings.value(QString::fromLatin1("fonts_dir"), QString()).toString(); settings.endGroup(); settings.endGroup(); settings.beginGroup(QString::fromLatin1("preview")); preview_enabled = settings.value(QString::fromLatin1("enabled"), true).toBool(); preview_w = settings.value(QString::fromLatin1("width"), 160).toInt(); preview_h = settings.value(QString::fromLatin1("height"), 90).toInt(); settings.endGroup(); settings.beginGroup(QString::fromLatin1("avformat")); avformat_on = settings.value(QString::fromLatin1("enable"), false).toBool(); direct = settings.value(QString::fromLatin1("avioflags"), 0).toString() == QLatin1String("direct"); probe_size = settings.value(QString::fromLatin1("probesize"), 5000000).toUInt(); analyze_duration = settings.value(QString::fromLatin1("analyzeduration"), 5000000).toInt(); avformat_extra = settings.value(QString::fromLatin1("extra"), QString()).toString(); settings.endGroup(); settings.beginGroup(QString::fromLatin1("avfilterVideo")); avfilterVideo_on = settings.value(QString::fromLatin1("enable"), true).toBool(); avfilterVideo = settings.value(QString::fromLatin1("options"), QString()).toString(); settings.endGroup(); settings.beginGroup(QString::fromLatin1("avfilterAudio")); avfilterAudio_on = settings.value(QString::fromLatin1("enable"), true).toBool(); avfilterAudio = settings.value(QString::fromLatin1("options"), QString()).toString(); settings.endGroup(); settings.beginGroup(QString::fromLatin1("opengl")); egl = settings.value(QString::fromLatin1("egl"), false).toBool(); const QString glname = settings.value(QString::fromLatin1("type"), QString::fromLatin1("OpenGLES")).toString(); opengl = (Config::OpenGLType)Config::staticMetaObject.enumerator(Config::staticMetaObject.indexOfEnumerator("OpenGLType")).keysToValue(glname.toLatin1().constData()); // d3d11 bad performance (gltexsubimage2d) angle_dx = settings.value(QString::fromLatin1("angle_platform"), QString::fromLatin1("d3d9")).toString(); settings.endGroup(); settings.beginGroup(QString::fromLatin1("buffer")); buffer_value = settings.value(QString::fromLatin1("value"), -1).toInt(); settings.endGroup(); }
QString Config::defaultDir() const { return appDataDir(); }