diff options
| -rw-r--r-- | project2/cgi/cgiAppEngine.cpp | 2 | ||||
| -rw-r--r-- | project2/cgi/p2webCgi.cpp | 7 | ||||
| -rw-r--r-- | project2/cgi/p2webFCgi.cpp | 7 | ||||
| -rw-r--r-- | project2/console/consoleEnvironment.cpp | 13 | ||||
| -rw-r--r-- | project2/console/p2consoleMain.cpp | 7 | ||||
| -rw-r--r-- | project2/environment.cpp | 45 | ||||
| -rw-r--r-- | project2/sendmailTask.cpp | 26 | ||||
| -rw-r--r-- | project2/sendmailTask.h | 4 | ||||
| -rw-r--r-- | project2/sessionXml.cpp | 26 | ||||
| -rw-r--r-- | project2/sessionXml.h | 5 | ||||
| -rw-r--r-- | project2/xmlObjectLoader.cpp | 30 | ||||
| -rw-r--r-- | project2/xmlObjectLoader.h | 8 | 
12 files changed, 128 insertions, 52 deletions
diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index d601670..2d20614 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -90,7 +90,7 @@ CgiApplicationEngine::process() const  	HttpHeaderPtr header = rs->getHeader();  	if (!sessionID.is_nil()) {  		header->setCookie(cgicc::HTTPCookie(SESSIONID, sessionID.str(), "Session ID", -					_env->getServerName().substr(_env->getServerName().find(".")), 3600, "/", false)); +					_env->getServerName().substr(_env->getServerName().find(".")), env()->sessionTimeOut, "/", false));  	}  	header->render(IO);  	if (currentStage.get<2>()) { diff --git a/project2/cgi/p2webCgi.cpp b/project2/cgi/p2webCgi.cpp index f10573f..6168819 100644 --- a/project2/cgi/p2webCgi.cpp +++ b/project2/cgi/p2webCgi.cpp @@ -1,12 +1,13 @@  #include "cgiCommon.h"  #include "../xmlObjectLoader.h" +#include <boost/bind.hpp>  int  main(void)  {  	cgiServe(NULL, std::cout); -	LoaderBase::onIteration(); -	LoaderBase::onPeriodic(); -	LoaderBase::onIdle(); +	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIteration, _1)); +	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onPeriodic, _1)); +	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIdle, _1));  } diff --git a/project2/cgi/p2webFCgi.cpp b/project2/cgi/p2webFCgi.cpp index d1aa29e..9a47b24 100644 --- a/project2/cgi/p2webFCgi.cpp +++ b/project2/cgi/p2webFCgi.cpp @@ -1,6 +1,7 @@  #include "cgiCommon.h"  #include "FCgiIO.h"  #include "../xmlObjectLoader.h" +#include <boost/bind.hpp>  time_t lastPeriodic = 0;  time_t periodicDelay = 600; @@ -10,7 +11,7 @@ void  p2webPeriodic()  {  	time(&lastPeriodic); -	LoaderBase::onPeriodic(); +	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onPeriodic, _1));  }  static @@ -20,7 +21,7 @@ p2webGoingIdle(int)  	if (time(NULL) > lastPeriodic + periodicDelay) {  		p2webPeriodic();  	} -	LoaderBase::onIdle(); +	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIdle, _1));  }  int @@ -44,7 +45,7 @@ main(void)  			cgicc::FCgiIO IO(request);  			cgiServe(&IO, IO);  			alarm(60); -			LoaderBase::onIteration(); +			LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIteration, _1));  			if (time(NULL) > lastPeriodic + periodicDelay) {  				p2webPeriodic();  			} diff --git a/project2/console/consoleEnvironment.cpp b/project2/console/consoleEnvironment.cpp index 5233a67..6d1471b 100644 --- a/project2/console/consoleEnvironment.cpp +++ b/project2/console/consoleEnvironment.cpp @@ -5,6 +5,7 @@  #include <string.h>  #include "../logger.h"  #include "../exceptions.h" +#include "../xmlObjectLoader.h"  #include <iostream>  #include <string>  #include <boost/algorithm/string/predicate.hpp> @@ -48,6 +49,15 @@ ConsoleEnvironment::addOptions(boost::program_options::positional_options_descri  	return console;  } +static +void +showHelpHelper(const boost::program_options::options_description * options) +{ +	if (options) { +		std::cout << *options << std::endl; +	} +} +  void  ConsoleEnvironment::postinit(const boost::program_options::options_description & options, const boost::program_options::variables_map & settings)  { @@ -56,7 +66,8 @@ ConsoleEnvironment::postinit(const boost::program_options::options_description &  		exit(1);  	}  	if (settings.count("help")) { -		std::cout << options << std::endl; +		showHelpHelper(&options); +		LoaderBase::onAllComponents(boost::bind(showHelpHelper, boost::bind(&ComponentLoader::options, _1)));  		exit(1);  	}  } diff --git a/project2/console/p2consoleMain.cpp b/project2/console/p2consoleMain.cpp index 4584126..40995d2 100644 --- a/project2/console/p2consoleMain.cpp +++ b/project2/console/p2consoleMain.cpp @@ -4,6 +4,7 @@  #include "../xmlObjectLoader.h"  #include "../logger.h"  #include <boost/foreach.hpp> +#include <boost/bind.hpp>  int  main(int argc, char ** argv) @@ -18,9 +19,9 @@ main(int argc, char ** argv)  		app.process();  		Logger()->messagef(LOG_DEBUG, "%s: Complete", __FUNCTION__); -		LoaderBase::onIteration(); +		LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIteration, _1));  	} -	LoaderBase::onPeriodic(); -	LoaderBase::onIdle(); +	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onPeriodic, _1)); +	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIdle, _1));  } diff --git a/project2/environment.cpp b/project2/environment.cpp index bdbc8f5..12591bf 100644 --- a/project2/environment.cpp +++ b/project2/environment.cpp @@ -1,9 +1,11 @@  #include "environment.h"  #include "loggers.h" +#include "xmlObjectLoader.h"  #include <stdio.h>  #include <fstream>  #include <boost/filesystem/convenience.hpp>  #include <boost/foreach.hpp> +#include <boost/bind.hpp>  namespace po = boost::program_options; @@ -11,8 +13,8 @@ const Environment * Environment::currentEnv(NULL);  int Environment::clLevel(-1);  int Environment::slLevel(-1);  bool Environment::optionsBuilt(false); -boost::program_options::options_description Environment::allOptions("Project2 options"); -boost::program_options::positional_options_description Environment::posOptions; +po::options_description Environment::allOptions("Project2 options"); +po::positional_options_description Environment::posOptions;  Environment::Environment(int c, char ** v) :  	argc(c), @@ -21,6 +23,31 @@ Environment::Environment(int c, char ** v) :  	currentEnv = this;  } +static +po::variables_map +injectSettingsHelper(int argc, char ** argv, const po::options_description * opts, po::positional_options_description * posOpts) +{ +	po::variables_map settings; +	if (!opts) { +		return settings; +	} +	if (argc > 0 && argv != NULL) { +		if (posOpts) { +			po::store(po::command_line_parser(argc, argv).options(*opts).positional(*posOpts).allow_unregistered().run(), settings); +		} +		else { +			po::store(po::command_line_parser(argc, argv).options(*opts).allow_unregistered().run(), settings); +		} +	} +	po::store(po::parse_environment(*opts, "P2_"), settings); +	if (boost::filesystem::exists(".p2config")) { +		std::ifstream f(".p2config"); +		po::store(po::parse_config_file(f, *opts, true), settings); +	} +	po::notify(settings); +	return settings; +} +  void  Environment::init()  { @@ -43,18 +70,10 @@ Environment::init()  		allOptions.add(common).add(addOptions(posOptions));  		optionsBuilt = true;  	} -	po::variables_map settings; -	if (argc > 0 && argv != NULL) { -		po::store(po::command_line_parser(argc, argv).options(allOptions).positional(posOptions).run(), settings); -	} -	po::store(po::parse_environment(allOptions, "P2_"), settings); -	if (boost::filesystem::exists(".p2config")) { -		std::ifstream f(".p2config"); -		po::store(po::parse_config_file(f, allOptions, true), settings); -	} -	po::notify(settings); - +	po::variables_map settings(injectSettingsHelper(argc, argv, &allOptions, &posOptions));  	postinit(allOptions, settings); +	LoaderBase::onAllComponents(boost::bind( +				injectSettingsHelper, argc, argv, boost::bind(&ComponentLoader::options, _1), (po::positional_options_description*)NULL));  	if (clLevel >= 0) {  		Logger()->addLogger(new ConsoleLogDriver(stderr, clLevel, false)); diff --git a/project2/sendmailTask.cpp b/project2/sendmailTask.cpp index fa9a4a3..73afb20 100644 --- a/project2/sendmailTask.cpp +++ b/project2/sendmailTask.cpp @@ -11,7 +11,29 @@  #include "transformHtml.h"  #include "transformText.h" -DECLARE_LOADER("sendmail", SendMailTask); +std::string SendMailTask::defaultMailServer; + +namespace po = boost::program_options; +class CustomSendMailTaskLoader : public ElementLoaderImpl<SendMailTask> { +	public: +		CustomSendMailTaskLoader() : +			opts("Send Email Task options") +		{ +			opts.add_options() +				("sendmail.defaultserver", po::value(&SendMailTask::defaultMailServer), +				 "The address of the default mail relay server") +				; +		} +		po::options_description * +		options() +		{ +			return &opts; +		} + +	private: +		po::options_description opts; +}; +DECLARE_CUSTOM_LOADER("sendmail", CustomSendMailTaskLoader);  uint8_t SendMailTask::MailPart::mimeIdx; @@ -28,7 +50,7 @@ SendMailTask::SendMailTask(const xmlpp::Element * p) :  	to(p, "to"),  	subject(p, "subject"),  	from(p, "from"), -	server(p, "server"), +	server(p, "server", defaultMailServer.empty(), defaultMailServer),  	present(p->get_attribute_value("present").raw())  {  } diff --git a/project2/sendmailTask.h b/project2/sendmailTask.h index f871574..fa8427f 100644 --- a/project2/sendmailTask.h +++ b/project2/sendmailTask.h @@ -50,6 +50,10 @@ class SendMailTask : public Task {  		mutable boost::intrusive_ptr<Parts> parts;  		mutable PartList::iterator part; + +		// Configurables +		friend class CustomSendMailTaskLoader; +		static std::string defaultMailServer;  };  #endif diff --git a/project2/sessionXml.cpp b/project2/sessionXml.cpp index fc552a9..c1e2158 100644 --- a/project2/sessionXml.cpp +++ b/project2/sessionXml.cpp @@ -7,6 +7,7 @@  #include <stdio.h>  #include <boost/foreach.hpp>  #include <boost/lexical_cast.hpp> +#include <boost/program_options.hpp>  /// Session implementation that stores its contents in an XML file on the local filesystem  class SessionXml : public Session { @@ -31,8 +32,29 @@ class SessionXml : public Session {  		friend class SessionContainerXml;  }; -const char * xmlFile = "/tmp/project2sessions.xml"; -DECLARE_COMPONENT_LOADER("xml", SessionContainerXml, SessionContainerLoader); +namespace po = boost::program_options; +class CustomSessionContainerLoaderXml : public SessionContainerLoaderImpl<SessionContainerXml> { +	public: +		CustomSessionContainerLoaderXml() : +			opts("SessionXML options") +		{ +			opts.add_options() +				("session.xml.path", po::value(&SessionContainerXml::xmlFile)->default_value("/tmp/project2sessions.xml"), +				 "Path of the XML file in which to store session information") +				; +		} +		po::options_description * +		options() +		{ +			return &opts; +		} + +	private: +		po::options_description opts; +}; + +std::string SessionContainerXml::xmlFile; +DECLARE_CUSTOM_COMPONENT_LOADER("xml", SessionContainerXml, CustomSessionContainerLoaderXml, SessionContainerLoader);  SessionContainerXml::SessionContainerXml()  { diff --git a/project2/sessionXml.h b/project2/sessionXml.h index d8bc8aa..9b5c3e1 100644 --- a/project2/sessionXml.h +++ b/project2/sessionXml.h @@ -14,6 +14,11 @@ class SessionContainerXml : public SessionContainer {  		SessionPtr getSession(UUID & sid);  		typedef boost::intrusive_ptr<SessionXml> SessionXmlPtr;  		SessionXmlPtr currentSession; + +	private: +		// Configurables +		static std::string xmlFile; +		friend class CustomSessionContainerLoaderXml;  };  #endif diff --git a/project2/xmlObjectLoader.cpp b/project2/xmlObjectLoader.cpp index faa5b2a..5cc28f0 100644 --- a/project2/xmlObjectLoader.cpp +++ b/project2/xmlObjectLoader.cpp @@ -94,6 +94,7 @@ LoaderBase::collectAll(const CommonObjects * co, const xmlpp::Element * node, bo  	if (depth != 0) {  		throw std::logic_error("Cannot set CommonObjects in subloader");  	} +	loadedObjects.clear();  	collectAll(node, childrenOnly, uh);  	BOOST_FOREACH(SourceObjectPtr o, loadedObjects) {  		o->loadComplete(co); @@ -102,29 +103,10 @@ LoaderBase::collectAll(const CommonObjects * co, const xmlpp::Element * node, bo  }  void -LoaderBase::onIdle() -{ -	BOOST_FOREACH(ComponentLoaderSet::value_type l, *componentLoaders()) { -		l->onIdle(); -	} -} - -void -LoaderBase::onIteration() -{ -	// This is a fail safe in the event that something goes pearshape -	loadedObjects.clear(); - -	BOOST_FOREACH(ComponentLoaderSet::value_type l, *componentLoaders()) { -		l->onIteration(); -	} -} - -void -LoaderBase::onPeriodic() +LoaderBase::onAllComponents(const boost::function1<void, ComponentLoader *> & func)  {  	BOOST_FOREACH(ComponentLoaderSet::value_type l, *componentLoaders()) { -		l->onPeriodic(); +		func(l.get());  	}  } @@ -159,3 +141,9 @@ ComponentLoader::onPeriodic()  {  } +boost::program_options::options_description * +ComponentLoader::options() +{ +	return NULL; +} + diff --git a/project2/xmlObjectLoader.h b/project2/xmlObjectLoader.h index c86720d..4795717 100644 --- a/project2/xmlObjectLoader.h +++ b/project2/xmlObjectLoader.h @@ -4,6 +4,7 @@  #include <set>  #include <string>  #include <boost/intrusive_ptr.hpp> +#include <boost/function.hpp>  #include <boost/shared_ptr.hpp>  #include "intrusivePtrBase.h"  #include "sourceObject.h" @@ -32,9 +33,7 @@ class LoaderBase {  		std::set<boost::intrusive_ptr<Storer> > supportedStorers; -		static void onIdle(); -		static void onIteration(); -		static void onPeriodic(); +		static void onAllComponents(const boost::function1<void, ComponentLoader *> &);  		static std::set<boost::shared_ptr<ComponentLoader> > * & componentLoaders(); @@ -109,11 +108,14 @@ class LoaderBase {  	DECLARE_COMPONENT_LOADER(N, T, ElementLoader)  /// Helper for loading and maintaining Project2 components +namespace boost { namespace program_options { class options_description; } }  class ComponentLoader {  	public:  		virtual void onIdle();		// When the app engine goes idle  		virtual void onIteration();	// When the app engine has completed an iteration  		virtual void onPeriodic();	// When the app engine feels like it +		virtual boost::program_options::options_description * +			options();	// Options to be populated from the common config file/env/etc  };  /// Helper for loading and maintaining Project2 script components  class ElementLoader : public ComponentLoader {  | 
