summaryrefslogtreecommitdiff
path: root/src/configuration.cpp
diff options
context:
space:
mode:
authorAndrzej Rybczak <electricityispower@gmail.com>2014-08-28 18:57:16 +0200
committerAndrzej Rybczak <electricityispower@gmail.com>2014-08-29 14:54:09 +0200
commit4b933b29e14d57d4b3a47bd043829618e8abbabe (patch)
treed82d6dd089a5f92820a1c5b2d03dc02c5f54eaec /src/configuration.cpp
parent8a1e4a48dd598b5663fc60668755b0ce0a312c6c (diff)
settings: configuration file processing rewrite
Diffstat (limited to 'src/configuration.cpp')
-rw-r--r--src/configuration.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/configuration.cpp b/src/configuration.cpp
new file mode 100644
index 00000000..c25c2641
--- /dev/null
+++ b/src/configuration.cpp
@@ -0,0 +1,181 @@
+/***************************************************************************
+ * Copyright (C) 2008-2014 by Andrzej Rybczak *
+ * electricityispower@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; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/program_options.hpp>
+#include <iostream>
+
+#include "bindings.h"
+#include "configuration.h"
+#include "config.h"
+#include "mpdpp.h"
+#include "settings.h"
+
+namespace po = boost::program_options;
+
+using std::cerr;
+using std::cout;
+
+namespace {
+
+const char *env_home;
+
+}
+
+void expand_home(std::string &path)
+{
+ if (!path.empty() && path[0] == '~')
+ path.replace(0, 1, env_home);
+}
+
+bool configure(int argc, char **argv)
+{
+ std::string bindings_path, config_path;
+
+ po::options_description options("Options");
+ options.add_options()
+ ("host,h", po::value<std::string>()->default_value("localhost"), "connect to server at host")
+ ("port,p", po::value<int>()->default_value(6600), "connect to server at port")
+ ("config,c", po::value<std::string>(&config_path)->default_value("~/.ncmpcpp/config"), "specify configuration file")
+ ("bindigs,b", po::value<std::string>(&bindings_path)->default_value("~/.ncmpcpp/bindings"), "specify bindings file")
+ ("screen,s", po::value<std::string>(), "specify initial screen")
+ ("help,?", "show help message")
+ ("version,v", "display version information")
+ ;
+
+ po::variables_map vm;
+ try
+ {
+ po::store(po::parse_command_line(argc, argv, options), vm);
+
+ if (vm.count("help"))
+ {
+ cout << "Usage: " << argv[0] << " [options]...\n" << options << "\n";
+ return false;
+ }
+ if (vm.count("version"))
+ {
+ std::cout << "ncmpcpp " << VERSION << "\n\n"
+ << "optional screens compiled-in:\n"
+ # ifdef HAVE_TAGLIB_H
+ << " - tag editor\n"
+ << " - tiny tag editor\n"
+ # endif
+ # ifdef HAVE_CURL_CURL_H
+ << " - artist info\n"
+ # endif
+ # ifdef ENABLE_OUTPUTS
+ << " - outputs\n"
+ # endif
+ # ifdef ENABLE_VISUALIZER
+ << " - visualizer\n"
+ # endif
+ # ifdef ENABLE_CLOCK
+ << " - clock\n"
+ # endif
+ << "\nencoding detection: "
+ # ifdef HAVE_LANGINFO_H
+ << "enabled"
+ # else
+ << "disabled"
+ # endif // HAVE_LANGINFO_H
+ << "\nbuilt with support for:"
+ # ifdef HAVE_CURL_CURL_H
+ << " curl"
+ # endif
+ # ifdef HAVE_FFTW3_H
+ << " fftw"
+ # endif
+ # ifdef USE_PDCURSES
+ << " pdcurses"
+ # else
+ << " ncurses"
+ # endif
+ # ifdef HAVE_TAGLIB_H
+ << " taglib"
+ # endif
+ # ifdef NCMPCPP_UNICODE
+ << " unicode"
+ # endif
+ << "\n";
+ return false;
+ }
+
+ po::notify(vm);
+
+ // get home directory
+ env_home = getenv("HOME");
+ if (env_home == nullptr)
+ {
+ cerr << "Fatal error: HOME environment variable is not defined\n";
+ return false;
+ }
+ expand_home(config_path);
+ expand_home(bindings_path);
+
+ // read configuration
+ if (Config.read(config_path) == false)
+ exit(1);
+
+ // read bindings
+ if (Bindings.read(bindings_path) == false)
+ exit(1);
+ Bindings.generateDefaults();
+
+ // create directories
+ boost::filesystem::create_directory(Config.ncmpcpp_directory);
+ boost::filesystem::create_directory(Config.lyrics_directory);
+
+ // try to get MPD connection details from environment variables
+ // as they take precedence over these from the configuration.
+ auto env_host = getenv("MPD_HOST");
+ auto env_port = getenv("MPD_PORT");
+ if (env_host != nullptr)
+ Mpd.SetHostname(env_host);
+ if (env_port != nullptr)
+ Mpd.SetPort(boost::lexical_cast<int>(env_port));
+
+ // if MPD connection details are provided as command line
+ // parameters, use them as their priority is the highest.
+ if (!vm["host"].defaulted())
+ Mpd.SetHostname(vm["host"].as<std::string>());
+ if (!vm["port"].defaulted())
+ Mpd.SetPort(vm["port"].as<int>());
+ Mpd.SetTimeout(Config.mpd_connection_timeout);
+
+ // custom startup screen
+ if (vm.count("screen"))
+ {
+ auto screen = vm["screen"].as<std::string>();
+ Config.startup_screen_type = stringtoStartupScreenType(screen);
+ if (Config.startup_screen_type == ScreenType::Unknown)
+ {
+ std::cerr << "Unknown screen: " << screen << "\n";
+ exit(1);
+ }
+ }
+ }
+ catch (std::exception &e)
+ {
+ cerr << "Error while processing configuration: " << e.what() << "\n";
+ exit(1);
+ }
+ return true;
+}