diff options
author | randomdan <randomdan@localhost> | 2013-04-05 21:03:07 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2013-04-05 21:03:07 +0000 |
commit | 2524e8c47399136ba6fc504f9412aa985bae7941 (patch) | |
tree | 49b5eb6ecbdb0314fd833740a792ed26ce8c44dc /project2/cgi | |
parent | Hack to workaround p2lib link issue (diff) | |
download | project2-2524e8c47399136ba6fc504f9412aa985bae7941.tar.bz2 project2-2524e8c47399136ba6fc504f9412aa985bae7941.tar.xz project2-2524e8c47399136ba6fc504f9412aa985bae7941.zip |
GCC 4.6 workaround for vector of objects with consts
Make options much more flexible with Boost function interface
Diffstat (limited to 'project2/cgi')
-rw-r--r-- | project2/cgi/cgiContentNegotiate.cpp | 18 | ||||
-rw-r--r-- | project2/cgi/cgiProgRouter.cpp | 11 |
2 files changed, 19 insertions, 10 deletions
diff --git a/project2/cgi/cgiContentNegotiate.cpp b/project2/cgi/cgiContentNegotiate.cpp index 176441e..2ed54c9 100644 --- a/project2/cgi/cgiContentNegotiate.cpp +++ b/project2/cgi/cgiContentNegotiate.cpp @@ -10,11 +10,13 @@ class ContentNegotiateLoader : public PresenterLoader { opts("Content negotiation options") { opts - ("cgi.contentnegotiation.mappedtype", Options::value(&mappedTypes), + ("cgi.contentnegotiation.mappedtype", Options::functions( + [this](const VariableType & v) { mappedTypes.push_back(new MappedType(v)); }, + boost::bind(&MappedTypes::clear, &mappedTypes)), "mimetype=presenter list of types to negotiate") ; } - + const Options * options() const { return &opts; } MultiRowSetPresenter * create(const ScriptNodePtr & s, const ObjectSource & os) const @@ -25,16 +27,16 @@ class ContentNegotiateLoader : public PresenterLoader { const auto mimetype = mimetypeAndWeight.substr(0, mimetypeAndWeight.find(';')); if (mimetype == "*/*") break; BOOST_FOREACH(const auto & t, mappedTypes) { - if (t.Matches(mimetype)) { - return PresenterLoader::getFor(t.present)->create(s, os); + if (t->Matches(mimetype)) { + return PresenterLoader::getFor(t->present)->create(s, os); } } } - return PresenterLoader::getFor(mappedTypes.begin()->present)->create(s, os); + return PresenterLoader::getFor((*mappedTypes.begin())->present)->create(s, os); } Options opts; - class MappedType { + class MappedType : public IntrusivePtrBase { public: MappedType(const std::string & val) : accept(val.substr(0, val.find('='))), @@ -50,7 +52,9 @@ class ContentNegotiateLoader : public PresenterLoader { const std::string accept; const std::string present; }; - std::vector<MappedType> mappedTypes; + typedef boost::intrusive_ptr<MappedType> MappedTypePtr; + typedef std::vector<MappedTypePtr> MappedTypes; + MappedTypes mappedTypes; bool cacheable() const { return false; } }; diff --git a/project2/cgi/cgiProgRouter.cpp b/project2/cgi/cgiProgRouter.cpp index d094598..932242e 100644 --- a/project2/cgi/cgiProgRouter.cpp +++ b/project2/cgi/cgiProgRouter.cpp @@ -12,7 +12,7 @@ typedef std::map<std::string, std::string> VarMap; class RoutingTable { public: - RoutingTable & operator=(const std::string & routeFile) { + void loadRoutesFromFile(const std::string & routeFile) { routeScriptPath = routeFile; if (routeFile.empty()) { routes.clear(); @@ -21,7 +21,10 @@ class RoutingTable { else { setRouteScript(); } - return *this; + } + + void clearRoutes() { + routes.clear(); } void onBefore() @@ -128,7 +131,9 @@ class ProgRouterLoader : public RouterLoader::For<ProgRouter> { opts("CGI Prog Router options") { opts - ("cgi.progRouter.routes", Options::value(&routingTable), + ("cgi.progRouter.routes", Options::functions( + boost::bind(&RoutingTable::loadRoutesFromFile, &routingTable, _1), + boost::bind(&RoutingTable::clearRoutes, &routingTable)), "Script file defining web service routes") ; } |