//
// Written by Curtis Olson, started April 1998.
//
-// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu
+// Copyright (C) 1998 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
//
// 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#ifndef _OPTIONS_HXX
#define _OPTIONS_HXX
+#include <memory>
+#include <string>
-#ifndef __cplusplus
-# error This library requires C++
-#endif
+#include <simgear/misc/strutils.hxx>
-extern void fgSetDefaults ();
-extern string fgScanForRoot (int argc, char ** argv);
-extern string fgScanForRoot (const string &file_path);
-extern void fgParseOptions (int argc, char ** argv);
-extern void fgParseOptions (const string &file_path);
-extern void fgUsage ();
+// forward decls
+class SGPath;
+namespace flightgear
+{
-/* normans fix */
-#if defined(FX) && defined(XMESA)
-extern bool global_fullscreen;
-#endif
+/// option processing can have various result values
+/// depending on what the user requested. Note processOptions only
+/// returns a subset of these.
+enum OptionResult
+{
+ FG_OPTIONS_OK = 0,
+ FG_OPTIONS_HELP = 1,
+ FG_OPTIONS_ERROR = 2,
+ FG_OPTIONS_EXIT = 3,
+ FG_OPTIONS_VERBOSE_HELP = 4,
+ FG_OPTIONS_SHOW_AIRCRAFT = 5,
+ FG_OPTIONS_SHOW_SOUND_DEVICES = 6,
+ FG_OPTIONS_NO_DEFAULT_CONFIG = 7
+};
+
+class Options
+{
+private:
+ Options();
+
+public:
+ static Options* sharedInstance();
+ ~Options();
+
+ /**
+ * pass command line arguments, read default config files
+ */
+ void init(int argc, char* argv[], const SGPath& appDataPath);
+
+ /**
+ * parse a config file (eg, .fgfsrc)
+ */
+ void readConfig(const SGPath& path);
+
+ /**
+ * read the value for an option, if it has been set
+ */
+ std::string valueForOption(const std::string& key, const std::string& defValue = std::string()) const;
+
+ /**
+ * return all values for a multi-valued option
+ */
+ string_list valuesForOption(const std::string& key) const;
+
+ /**
+ * check if a particular option has been set (so far)
+ */
+ bool isOptionSet(const std::string& key) const;
+
+
+ /**
+ * set an option value, assuming it is not already set (or multiple values
+ * are permitted)
+ * This can be used to inject option values, eg based upon environment variables
+ */
+ int addOption(const std::string& key, const std::string& value);
+
+ /**
+ * apply option values to the simulation state
+ * (set properties, etc).
+ */
+ OptionResult processOptions();
+
+ /**
+ * init the aircraft options
+ */
+ void initAircraft();
+
+ /**
+ * should defualt configuration files be loaded and processed or not?
+ * There's many configuration files we have historically read by default
+ * on startup - preferences.xml, fgfs.rc in various places and so on.
+ * --no-default-config allows this behaviour to be changed, so only
+ * expicitly listed files are read - this is useful for testing. Expose
+ * the value of the option here.
+ */
+ bool shouldLoadDefaultConfig() const;
+private:
+ void showUsage() const;
+
+ int parseOption(const std::string& s);
+
+ void processArgResult(int result);
+
+ void setupRoot();
+
+ std::string platformDefaultRoot() const;
+
+ class OptionsPrivate;
+ std::auto_ptr<OptionsPrivate> p;
+};
+
+} // of namespace flightgear
+
+void fgSetDefaults();
#endif /* _OPTIONS_HXX */