-/**
- * @file Common/env.cpp
- * @brief iEnv interface implementation
- * @author Enar Vaikene
- *
- * Copyright (c) 2011 Enar Vaikene
- *
- * This file is part of the eVaf C++ cross-platform application development framework.
- *
- * This file can be used under the terms of the GNU General Public License
- * version 3.0 as published by the Free Software Foundation and appearing in
- * the file LICENSE included in the packaging of this file. Please review the
- * the following information to ensure the GNU General Public License version
- * 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
- *
- * Alternatively, this file may be used in accordance with the Commercial License
- * Agreement provided with the Software.
- */
-
-#include "env.h"
-#include "iregistry.h"
-#include "globals.h"
-#include "version.h"
-#include "iapp.h"
-
-#include <QtCore>
-
-
-//-------------------------------------------------------------------
-
-using namespace eVaf::Common;
-
-iEnv * iEnv::instance()
-{
- static eVaf::Common::Internal::Env singleton;
- return &singleton;
-}
-
-
-//-------------------------------------------------------------------
-
-using namespace eVaf::Common::Internal;
-
-Env::Env()
- : iEnv()
-{
- setObjectName(QString("%1-iEnv").arg(VER_MODULE_NAME_STR));
-}
-
-Env::~Env()
-{
-}
-
-bool Env::init()
-{
- // Register out interface
- iRegistry::instance()->registerInterface("iEnv", this);
-
- // Set initial bin and root directories
- mRootDir = mBinDir = qApp->applicationDirPath();
- int t = mBinDir.lastIndexOf(QChar('/'), -1);
- if (t >= 0)
- mRootDir = mBinDir.left(t);
-
- if (!mBinDir.endsWith('/'))
- mBinDir.append('/');
- if (!mRootDir.endsWith('/'))
- mRootDir.append('/');
-
- // Clear other directories
- mDataRootDir.clear();
- mQtPluginsDir.clear();
- mEtcDir.clear();
- mLogDir.clear();
- mDocDir.clear();
-
- // Set the data root directory
-#ifdef Q_OS_LINUX
- QString dataLoc = QDir::homePath();
- if (!dataLoc.endsWith('/'))
- dataLoc.append('/');
- dataLoc.append(".local/share/data/");
- mDataRootDir = dataLoc + iApp::instance()->name();
- if (!mDataRootDir.endsWith('/'))
- mDataRootDir.append('/');
-#endif
- /// @TODO: Needs local data directory on Windows
-
- // Process the environment
- QStringList env = QProcessEnvironment::systemEnvironment().toStringList();
- int sz = env.size();
- for (int i = 0; i < sz; ++i) {
- // Get the name/value pair
- QString name = env.at(i).section('=', 0, 0).trimmed();
- QString value = env.at(i).section('=', 1).trimmed();
-
- if (name == "EVAF_ROOT_DIR") {
- mRootDir = value;
- if (!mRootDir.endsWith('/'))
- mRootDir.append('/');
- }
- else if (name == "EVAF_DATA_ROOT_DIR") {
- mDataRootDir = value;
- if (!mDataRootDir.endsWith('/'))
- mDataRootDir.append('/');
- }
- else if (name == "EVAF_ETC_DIR") {
- mEtcDir = value;
- if (!mEtcDir.endsWith('/'))
- mEtcDir.append('/');
- }
- else if (name == "EVAF_LOG_DIR") {
- mLogDir = value;
- if (!mLogDir.endsWith('/'))
- mLogDir.append('/');
- }
- else if (name == "EVAF_DOC_DIR") {
- mDocDir = value;
- if (!mDocDir.endsWith('/'))
- mDocDir.append('/');
- }
- else if (name == "EVAF_QT_PLUGINS_DIR") {
- mQtPluginsDir = value;
- if (!mQtPluginsDir.endsWith('/'))
- mQtPluginsDir.append('/');
- }
- }
-
- // Then process comman-line arguments
- env = QCoreApplication::arguments();
- sz = env.size();
- for (int i = 0; i < sz; ++i) {
- // Get the name and optional value
- QStringList arg = env.at(i).simplified().split(QChar('='));
-
- if (QRegExp("-[-]?root(dir)?").exactMatch(arg.at(0)) && arg.size() > 1) {
- mRootDir = arg.at(1);
- if (!mRootDir.endsWith('/'))
- mRootDir.append('/');
- }
- else if (QRegExp("-[-]?dataroot(dir)?").exactMatch(arg.at(0)) && arg.size() > 1) {
- mDataRootDir = arg.at(1);
- if (!mDataRootDir.endsWith('/'))
- mDataRootDir.append('/');
- }
- else if (QRegExp("-[-]?etc(dir)?").exactMatch(arg.at(0)) && arg.size() > 1) {
- mEtcDir = arg.at(1);
- if (!mEtcDir.endsWith('/'))
- mEtcDir.append('/');
- }
- else if (QRegExp("-[-]?log(dir)?").exactMatch(arg.at(0)) && arg.size() > 1) {
- mLogDir = arg.at(1);
- if (!mLogDir.endsWith('/'))
- mLogDir.append('/');
- }
- else if (QRegExp("-[-]?doc(dir)?").exactMatch(arg.at(0)) && arg.size() > 1) {
- mDocDir = arg.at(1);
- if (!mDocDir.endsWith('/'))
- mDocDir.append('/');
- }
- else if (QRegExp("-[-]?qtplugins(dir)?").exactMatch(arg.at(0)) && arg.size() > 1) {
- mQtPluginsDir = arg.at(1);
- if (!mQtPluginsDir.endsWith('/'))
- mQtPluginsDir.append('/');
- }
- }
-
- return true;
-}
-
-QString const Env::dataRootDir() const
-{
- // Fall-back to the application's root directory if the data root directory is empty
- if (mDataRootDir.isEmpty())
- mDataRootDir = rootDir();
- return mDataRootDir;
-}
-
-QString const Env::etcDir() const
-{
- if (mEtcDir.isEmpty())
- mEtcDir = dataRootDir() + "etc/";
- return mEtcDir;
-}
-
-QString const Env::logDir() const
-{
- if (mLogDir.isEmpty())
- mLogDir = dataRootDir() + "log/";
- return mLogDir;
-}
-
-QString const Env::docDir() const
-{
- if (mDocDir.isEmpty())
- mDocDir = rootDir() + "doc/";
- return mDocDir;
-}
-
-QString const Env::qtPluginsDir() const
-{
- if (mQtPluginsDir.isEmpty())
- mQtPluginsDir = binDir();
- return mQtPluginsDir;
-}