diff options
author | randomdan <randomdan@localhost> | 2013-11-30 19:19:47 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2013-11-30 19:19:47 +0000 |
commit | 9e6f4e4da79ce4943289d7ec792e8d54fca05f96 (patch) | |
tree | 29fb14232ad0f74e0bfd88c611cdd9015107bac7 | |
parent | Support for options registering new options sources (diff) | |
download | project2-9e6f4e4da79ce4943289d7ec792e8d54fca05f96.tar.bz2 project2-9e6f4e4da79ce4943289d7ec792e8d54fca05f96.tar.xz project2-9e6f4e4da79ce4943289d7ec792e8d54fca05f96.zip |
Allow registration of a standalone component
Move help display into basics lib
Use onConfigLoad to trigger help after all options have been parsed (enables showing help of libraries defined in config files)
Create a trivial options target for setting a boolean flag
Add help support to p2daemon
-rw-r--r-- | project2/basics/Jamfile.jam | 2 | ||||
-rw-r--r-- | project2/basics/options/flagSet.cpp | 22 | ||||
-rw-r--r-- | project2/basics/options/flagSet.h | 19 | ||||
-rw-r--r-- | project2/basics/options/showHelp.cpp | 25 | ||||
-rw-r--r-- | project2/basics/options/showHelp.h | 19 | ||||
-rw-r--r-- | project2/common/componentLoader.h | 9 | ||||
-rw-r--r-- | project2/console/Jamfile.jam | 1 | ||||
-rw-r--r-- | project2/console/consoleAppEngine.cpp | 24 | ||||
-rw-r--r-- | project2/daemon/p2daemonAppEngine.cpp | 4 |
9 files changed, 104 insertions, 21 deletions
diff --git a/project2/basics/Jamfile.jam b/project2/basics/Jamfile.jam index 02de4c3..d64a617 100644 --- a/project2/basics/Jamfile.jam +++ b/project2/basics/Jamfile.jam @@ -20,5 +20,7 @@ lib p2basics : <library>dl <library>boost_filesystem <library>../common//p2common + : : + <include>. ; diff --git a/project2/basics/options/flagSet.cpp b/project2/basics/options/flagSet.cpp new file mode 100644 index 0000000..bfb905e --- /dev/null +++ b/project2/basics/options/flagSet.cpp @@ -0,0 +1,22 @@ +#include "flagSet.h" + +OptionFlagSet::OptionFlagSet(bool * target) : + targetFlag(target) +{ +} + +bool OptionFlagSet::paramRequired() const +{ + return false; +} + +void OptionFlagSet::reset() const +{ + *targetFlag = false; +} + +void OptionFlagSet::consume(const Glib::ustring &, const VariableType &, const Options::CurrentPlatform &) const +{ + *targetFlag = true; +} + diff --git a/project2/basics/options/flagSet.h b/project2/basics/options/flagSet.h new file mode 100644 index 0000000..0e7830f --- /dev/null +++ b/project2/basics/options/flagSet.h @@ -0,0 +1,19 @@ +#ifndef OPTIONS_FLAGSET_H +#define OPTIONS_FLAGSET_H + +#include <options.h> + +class OptionFlagSet : public Options::Target { + public: + OptionFlagSet(bool * target); + + void reset() const; + bool paramRequired() const; + void consume(const Glib::ustring &, const VariableType &, const Options::CurrentPlatform &) const; + + private: + bool * const targetFlag; +}; + +#endif + diff --git a/project2/basics/options/showHelp.cpp b/project2/basics/options/showHelp.cpp new file mode 100644 index 0000000..feabd45 --- /dev/null +++ b/project2/basics/options/showHelp.cpp @@ -0,0 +1,25 @@ +#include "showHelp.h" +#include <options.h> +#include <boost/bind.hpp> +#include <boost/foreach.hpp> + +void ShowHelpComponent::onConfigLoad() +{ + if (!showHelp) + return; + fprintf(stdout, "Help\n"); + InstanceSet<Options>::OnAll(boost::bind(&ShowHelpComponent::outputOptions, this, _1)); + exit(1); +} + +void ShowHelpComponent::outputOptions(const Options * options) const +{ + fprintf(stdout, " * %s\n", options->name.c_str()); + BOOST_FOREACH(const auto & option, options->allOptions()) { + fprintf(stdout, " * %s - %s\n", option->name().c_str(), option->description().c_str()); + } +} + +bool ShowHelpComponent::showHelp; +DECLARE_COMPONENT("ShowHelpComponent", ShowHelpComponent); + diff --git a/project2/basics/options/showHelp.h b/project2/basics/options/showHelp.h new file mode 100644 index 0000000..e1b95ef --- /dev/null +++ b/project2/basics/options/showHelp.h @@ -0,0 +1,19 @@ +#ifndef SHOWHELP_H +#define SHOWHELP_H + +#include <componentLoader.h> + +class Options; + +class ShowHelpComponent : public ComponentLoader { + public: + void onConfigLoad(); + private: + void outputOptions(const Options * options) const; + + public: + static bool showHelp; +}; + +#endif + diff --git a/project2/common/componentLoader.h b/project2/common/componentLoader.h index 5d14efe..45664e3 100644 --- a/project2/common/componentLoader.h +++ b/project2/common/componentLoader.h @@ -1,6 +1,8 @@ #ifndef COMPONENTLOADER_H #define COMPONENTLOADER_H +#include "plugable.h" + /// Helper for loading and maintaining Project2 components class ComponentLoader { public: @@ -14,5 +16,12 @@ class ComponentLoader { virtual bool cacheable() const { return true; } // The component can be cached for next run }; +typedef PluginsSameBase<ComponentLoader, std::string> Components; +#define DECLARE_COMPONENT(Id, Inst) \ + static void init_optionsSource_##Type() __attribute__ ((constructor(200))); \ + static void init_optionsSource_##Type() { Components::Add(Id, new Inst()); } \ + static void kill_optionsSource_##Type() __attribute__ ((destructor(200))); \ + static void kill_optionsSource_##Type() { Components::Remove(Id); } + #endif diff --git a/project2/console/Jamfile.jam b/project2/console/Jamfile.jam index 260de3e..24d8504 100644 --- a/project2/console/Jamfile.jam +++ b/project2/console/Jamfile.jam @@ -14,6 +14,7 @@ exe p2console : <include>. <library>..//p2parts <library>../common//p2common + <library>../basics//p2basics <library>../cli//p2cli <include>../../libmisc ; diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp index 98e5d4d..8aa4fc0 100644 --- a/project2/console/consoleAppEngine.cpp +++ b/project2/console/consoleAppEngine.cpp @@ -8,6 +8,8 @@ #include "viewHost.h" #include "taskHost.h" #include "scriptLoader.h" +#include <options/flagSet.h> +#include <options/showHelp.h> #include <boost/foreach.hpp> #include <boost/bind.hpp> #include <boost/uuid/uuid_generators.hpp> @@ -16,28 +18,8 @@ StaticMessageException(InvalidScriptName, "Script name should be group/name"); SimpleMessageException(UnknownPlatformAlias); -class ShowHelpTrigger : public Options::Target { - public: - void reset() const { } - bool paramRequired() const { - return false; - } - void consume(const Glib::ustring &, const VariableType &, const Options::CurrentPlatform &) const { - fprintf(stdout, "Help\n"); - InstanceSet<Options>::OnAll(boost::bind(&ShowHelpTrigger::outputOptions, this, _1)); - exit(1); - } - private: - void outputOptions(const Options * options) const { - fprintf(stdout, " * %s\n", options->name.c_str()); - BOOST_FOREACH(const auto & option, options->allOptions()) { - fprintf(stdout, " * %s - %s\n", option->name().c_str(), option->description().c_str()); - } - } -}; - DECLARE_OPTIONS(ConsoleApplicationEngine, "Console options") -("help", new ShowHelpTrigger(), +("help", new OptionFlagSet(&ShowHelpComponent::showHelp), "Print usage and exit")("h") ("console.platform", Options::value(&reqPlatform), "Platform")("p") diff --git a/project2/daemon/p2daemonAppEngine.cpp b/project2/daemon/p2daemonAppEngine.cpp index 7daed70..2330b88 100644 --- a/project2/daemon/p2daemonAppEngine.cpp +++ b/project2/daemon/p2daemonAppEngine.cpp @@ -2,12 +2,16 @@ #include <logger.h> #include <optionsSource.h> #include <dlfcn.h> +#include <options/flagSet.h> +#include <options/showHelp.h> std::string DaemonAppEngine::daemonType; Glib::ustring DaemonAppEngine::reqPlatform; DaemonPtr DaemonAppEngine::daemon; DECLARE_OPTIONS(DaemonAppEngine, "Project2 Daemon options") +("help", new OptionFlagSet(&ShowHelpComponent::showHelp), + "Print usage and exit")("h") ("daemon.type", Options::value(&daemonType), "The core daemon module to run") ("daemon.platform", Options::value(&reqPlatform), "Platform") END_OPTIONS(DaemonAppEngine); |