diff options
-rw-r--r-- | project2/cgi/cgiProgRouter.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/project2/cgi/cgiProgRouter.cpp b/project2/cgi/cgiProgRouter.cpp index 9218c89..ff7c864 100644 --- a/project2/cgi/cgiProgRouter.cpp +++ b/project2/cgi/cgiProgRouter.cpp @@ -36,7 +36,7 @@ class RoutingTable { std::string routeScriptPath; const std::string & present(const std::string & path, VarMap & vars) const { - BOOST_FOREACH(const auto route, routes) { + BOOST_FOREACH(const auto & route, routes) { vars.clear(); if (route->matches(path, vars)) { return route->present; @@ -74,12 +74,13 @@ class RoutingTable { public: Route(ScriptNodePtr s) : SourceObject(s), - present(s->value("present").as<std::string>()) + present(s->value("present").as<std::string>()), + path(s->value("path").as<std::string>()) { - boost::filesystem::path path = s->value("path").as<std::string>(); - boost::filesystem::path::iterator p = path.begin(); + boost::filesystem::path fspath = path; + boost::filesystem::path::iterator p = fspath.begin(); p++; - while(p != path.end() && p->string() != ".") { + while(p != fspath.end() && p->string() != ".") { switch (p->string().front()) { case '{': routeElems.push_back(new RouteVar(p->string())); @@ -105,6 +106,7 @@ class RoutingTable { typedef std::list<RouteElemPtr> RouteElems; RouteElems routeElems; const std::string present; + const std::string path; }; typedef boost::intrusive_ptr<Route> RoutePtr; @@ -184,3 +186,34 @@ class ProgRouter : public Router { }; DECLARE_CUSTOM_COMPONENT_LOADER("progRouter", ProgRouter, ProgRouterLoader, RouterLoader); + +class Routes : public RowSet { + public: + Routes(ScriptNodePtr s) : + RowSet(s) { } + class RouteRowState : public RowState { + public: + RouteRowState() { + columns.insert(new Column(0, "present")); + columns.insert(new Column(1, "path")); + fields.resize(2); + } + const Columns & getColumns() const { return columns; } + mutable Columns columns; + friend class Routes; + }; + void execute(const Glib::ustring & filter, const RowProcessor * rp) const + { + RouteRowState rs; + BOOST_FOREACH(const auto & r, ProgRouterLoader::routingTable.routes) { + if (boost::algorithm::starts_with(r->path, filter)) { + rs.fields[0] = VariableType(r->present); + rs.fields[1] = VariableType(r->path); + rs.process(rp); + } + } + } +}; + +DECLARE_LOADER("routes", Routes); + |