summaryrefslogtreecommitdiff
path: root/project2/cgi
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2013-04-05 21:03:07 +0000
committerrandomdan <randomdan@localhost>2013-04-05 21:03:07 +0000
commit2524e8c47399136ba6fc504f9412aa985bae7941 (patch)
tree49b5eb6ecbdb0314fd833740a792ed26ce8c44dc /project2/cgi
parentHack to workaround p2lib link issue (diff)
downloadproject2-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.cpp18
-rw-r--r--project2/cgi/cgiProgRouter.cpp11
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")
;
}