diff options
Diffstat (limited to 'sca-cpp/trunk/modules')
-rw-r--r-- | sca-cpp/trunk/modules/atom/atom.hpp | 29 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/http/http.hpp | 5 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/http/httpd.hpp | 26 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/http/mod-openauth.cpp | 6 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/http/openauth.hpp | 6 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/json/json.hpp | 4 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/oauth/mod-oauth1.cpp | 32 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/oauth/mod-oauth2.cpp | 28 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/rss/rss.hpp | 23 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/scdl/scdl-test.cpp | 8 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/scheme/primitive.hpp | 59 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/scheme/test.scm | 2 |
12 files changed, 140 insertions, 88 deletions
diff --git a/sca-cpp/trunk/modules/atom/atom.hpp b/sca-cpp/trunk/modules/atom/atom.hpp index 2f6e688bcb..259769e2cb 100644 --- a/sca-cpp/trunk/modules/atom/atom.hpp +++ b/sca-cpp/trunk/modules/atom/atom.hpp @@ -45,23 +45,24 @@ const value entry("entry"); * Convert a list of elements to a list of element values representing an ATOM entry. */ const list<value> entryElementValues(const list<value>& e) { - const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), e); + const list<value> lt = elementChildren("title", e); const list<value> t = nilListValue + element + value("title") + (isNil(lt)? value(emptyString) : elementValue(car(lt))); - const list<value> li = filter<value>(selector(mklist<value>(element, "id")), e); + const list<value> li = elementChildren("id", e); const list<value> i = nilListValue + element + value("id") + (isNil(li)? value(emptyString) : elementValue(car(li))); - const list<value> la = filter<value>(selector(mklist<value>(element, "author")), e); - const list<value> lan = isNil(la)? nilListValue : filter<value>(selector(mklist<value>(element, "name")), car(la)); - const list<value> lae = isNil(la)? nilListValue : filter<value>(selector(mklist<value>(element, "email")), car(la)); + const list<value> la = elementChildren("author", e); + const list<value> lan = isNil(la)? nilListValue : elementChildren("name", car(la)); + const list<value> lae = isNil(la)? nilListValue : elementChildren("email", car(la)); const list<value> laa = isNil(lan)? lae : lan; const list<value> a = isNil(laa)? nilListValue : mklist<value>(nilListValue + element + value("author") + elementValue(car(laa))); - const list<value> lu = filter<value>(selector(mklist<value>(element, "updated")), e); + const list<value> lu = elementChildren("updated", e); const list<value> u = isNil(lu)? nilListValue : mklist<value>(nilListValue + element + value("updated") + elementValue(car(lu))); - const list<value> lc = filter<value>(selector(mklist<value>(element, "content")), e); - const list<value> c = isNil(lc)? nilListValue : mklist<value>(nilListValue + element + value("content") + elementValue(car(lc))); + const list<value> lc = elementChildren("content", e); + const list<value> c = isNil(lc)? nilListValue : isAttribute(elementValue(car(lc)))? nilListValue : + mklist<value>(nilListValue + element + value("content") + elementValue(car(lc))); return append<value>(append<value>(append<value>(nilListValue + element + entry + value(t) + value(i), a), u), c); } @@ -110,9 +111,9 @@ const failable<list<value> > readATOMFeed(const list<string>& ilist) { const list<value> f = content(xml::readElements(ilist)); if (isNil(f)) return mkfailure<list<value> >("Empty feed"); - const list<value> t = filter<value>(selector(mklist<value>(element, "title")), car(f)); - const list<value> i = filter<value>(selector(mklist<value>(element, "id")), car(f)); - const list<value> e = filter<value>(selector(mklist<value>(element, entry)), car(f)); + const list<value> t = elementChildren("title", car(f)); + const list<value> i = elementChildren("id", car(f)); + const list<value> e = elementChildren(entry, car(f)); return mklist<value>(append<value>(nilListValue + element + feed + value(nilListValue + element + value("title") + elementValue(car(t))) + value(nilListValue + element + value("id") + elementValue(car(i))), @@ -182,9 +183,9 @@ const failable<list<string> > writeATOMEntry(const list<value>& l) { */ template<typename R> const failable<R> writeATOMFeed(const lambda<const R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) { const list<value> l = isNil(ll)? ll : (list<value>)car(ll); - const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), l); + const list<value> lt = elementChildren("title", l); const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); - const list<value> li = filter<value>(selector(mklist<value>(element, "id")), l); + const list<value> li = elementChildren("id", l); const value i = isNil(li)? value(emptyString) : elementValue(car(li)); const list<value> f = nilListValue + element + feed + (nilListValue + attribute + "xmlns" + "http://www.w3.org/2005/Atom") @@ -192,7 +193,7 @@ template<typename R> const failable<R> writeATOMFeed(const lambda<const R(const + (nilListValue + element + "id" + i); // Write ATOM entries - const list<value> le = filter<value>(selector(mklist<value>(element, entry)), l); + const list<value> le = elementChildren(entry, l); if (isNil(le)) return xml::writeElements<R>(reduce, initial, mklist<value>(f)); diff --git a/sca-cpp/trunk/modules/http/http.hpp b/sca-cpp/trunk/modules/http/http.hpp index 1153f61840..cd0eb6c04b 100644 --- a/sca-cpp/trunk/modules/http/http.hpp +++ b/sca-cpp/trunk/modules/http/http.hpp @@ -87,7 +87,6 @@ public: return; if (h.h == NULL) return; - debug(h.h, "http::~CURLSession::cleanup::h"); curl_easy_cleanup(h.h); } @@ -943,7 +942,7 @@ const failable<size_t> recv(char* const c, const size_t l, const CURLSession& cs /** * Converts a list of key value pairs to a query string. */ -ostringstream& queryString(const list<list<value> > args, ostringstream& os) { +ostringstream& queryString(const list<value>& args, ostringstream& os) { if (isNil(args)) return os; const list<value> arg = car(args); @@ -956,7 +955,7 @@ ostringstream& queryString(const list<list<value> > args, ostringstream& os) { return queryString(cdr(args), os); } -const string queryString(const list<list<value> > args) { +const string queryString(const list<value>& args) { ostringstream os; return str(queryString(args, os)); } diff --git a/sca-cpp/trunk/modules/http/httpd.hpp b/sca-cpp/trunk/modules/http/httpd.hpp index e090c2fc35..255f0aa31b 100644 --- a/sca-cpp/trunk/modules/http/httpd.hpp +++ b/sca-cpp/trunk/modules/http/httpd.hpp @@ -330,13 +330,13 @@ const string unescape(const string& uri) { /** * Unescape a list of key of value pairs representing query args. */ -const list<value> unescapeArg(const list<value> a) { - return mklist<value>(car(a), unescape(cadr(a))); +const value unescapeArg(const value& a) { + return mklist<value>(car<value>(a), unescape(cadr<value>(a))); } -const list<list<value> > unescapeArgs(const list<list<value> > args) { +const list<value> unescapeArgs(const list<value>& args) { debug(args, "httpd::unescape::args"); - const list<list<value> > uargs = map<list<value>, list<value>>(unescapeArg, args); + const list<value> uargs = map<value, value>(unescapeArg, args); debug(uargs, "httpd::unescape::result"); return uargs; } @@ -344,7 +344,7 @@ const list<list<value> > unescapeArgs(const list<list<value> > args) { /** * Returns a list of key value pairs from the args in a query string. */ -const list<value> queryArg(const string& s) { +const value queryArg(const string& s) { debug(s, "httpd::queryArg::string"); const list<string> t = tokenize("=", s); if (isNil(cdr(t))) @@ -359,27 +359,27 @@ const string fixupQueryArgs(const string& a) { return join("&", t); } -const list<list<value> > queryArgs(const string& a) { - return map<string, list<value>>(queryArg, tokenize("&", fixupQueryArgs(a))); +const list<value> queryArgs(const string& a) { + return map<string, value>(queryArg, tokenize("&", fixupQueryArgs(a))); } /** * Returns a list of key value pairs from the args in an HTTP request. */ -const list<list<value> > queryArgs(const request_rec* const r) { +const list<value> queryArgs(const request_rec* const r) { if (r->args == NULL) - return list<list<value> >(); + return nilListValue; return queryArgs(r->args); } /** * Converts the args received in a POST to a list of key value pairs. */ -const list<list<value> > postArgs(const list<value>& a) { +const list<value> postArgs(const list<value>& a) { if (isNil(a)) - return list<list<value> >(); + return nilListValue; const list<value> l = car(a); - return cons(l, postArgs(cdr(a))); + return cons<value>(l, postArgs(cdr(a))); } /** @@ -397,7 +397,7 @@ const int setupReadPolicy(request_rec* const r) { } /** - * Read the content of a POST or PUT. + * Read the content of an HTTP request. */ const list<string> read(request_rec* const r) { char b[1024]; diff --git a/sca-cpp/trunk/modules/http/mod-openauth.cpp b/sca-cpp/trunk/modules/http/mod-openauth.cpp index 797e8c10b5..1b70f27744 100644 --- a/sca-cpp/trunk/modules/http/mod-openauth.cpp +++ b/sca-cpp/trunk/modules/http/mod-openauth.cpp @@ -178,7 +178,7 @@ const failable<value> userInfoFromSession(const string& realm, request_rec* cons * Return the user info from a form auth session cookie. */ const failable<value> userInfoFromCookie(const value& sid, const string& realm, request_rec* const r) { - const list<list<value>> info = httpd::queryArgs(sid); + const list<value> info = httpd::queryArgs(sid); debug(info, "modopenauth::userInfoFromCookie::info"); const list<value> user = assoc<value>(realm + "-user", info); if(isNil(user)) @@ -212,7 +212,7 @@ const failable<value> userInfoFromHeader(const char* header, const string& realm /** * Handle an authenticated request. */ -const failable<int> authenticated(const list<list<value> >& info, request_rec* const r) { +const failable<int> authenticated(const list<value>& info, request_rec* const r) { debug(info, "modopenauth::authenticated::info"); // Store user info in the request @@ -248,7 +248,7 @@ static int checkAuthn(request_rec* const r) { debug(atype, "modopenauth::checkAuthn::auth_type"); // Get the request args - const list<list<value> > args = httpd::queryArgs(r); + const list<value> args = httpd::queryArgs(r); // Get session id from the request const maybe<string> sid = sessionID(r, "TuscanyOpenAuth"); diff --git a/sca-cpp/trunk/modules/http/openauth.hpp b/sca-cpp/trunk/modules/http/openauth.hpp index dcf405d487..1c49c4254c 100644 --- a/sca-cpp/trunk/modules/http/openauth.hpp +++ b/sca-cpp/trunk/modules/http/openauth.hpp @@ -92,9 +92,9 @@ const string cookie(const string& key, const string& sid, const string& domain) * Redirect to the configured login page. */ const failable<int> login(const string& page, const value& ref, const value& attempt, request_rec* const r) { - const list<list<value> > rarg = ref == string("/")? list<list<value> >() : mklist<list<value> >(mklist<value>("openauth_referrer", httpd::escape(httpd::url(isNil(ref)? r->uri : ref, r)))); - const list<list<value> > aarg = isNil(attempt)? list<list<value> >() : mklist<list<value> >(mklist<value>("openauth_attempt", attempt)); - const list<list<value> > largs = append<list<value> >(rarg, aarg); + const list<value> rarg = ref == string("/")? nilListValue : mklist<value>(mklist<value>("openauth_referrer", httpd::escape(httpd::url(isNil(ref)? r->uri : ref, r)))); + const list<value> aarg = isNil(attempt)? nilListValue : mklist<value>(mklist<value>("openauth_attempt", attempt)); + const list<value> largs = append(rarg, aarg); const string loc = isNil(largs)? httpd::url(page, r) : httpd::url(page, r) + string("?") + http::queryString(largs); debug(loc, "openauth::login::uri"); return httpd::externalRedirect(loc, r); diff --git a/sca-cpp/trunk/modules/json/json.hpp b/sca-cpp/trunk/modules/json/json.hpp index b3545476a1..497624070b 100644 --- a/sca-cpp/trunk/modules/json/json.hpp +++ b/sca-cpp/trunk/modules/json/json.hpp @@ -389,13 +389,13 @@ inline const string funcName(const string& f) { * Returns a list of param values other than the id and method args from a list * of key value pairs. */ -inline const list<value> queryParams(const list<list<value> >& a) { +inline const list<value> queryParams(const list<value>& a) { if (isNil(a)) return nilListValue; const list<value> p = car(a); if (car(p) == value("id") || car(p) == value("method")) return queryParams(cdr(a)); - return cons(cadr(p), queryParams(cdr(a))); + return cons<value>(cadr(p), queryParams(cdr(a))); } } diff --git a/sca-cpp/trunk/modules/oauth/mod-oauth1.cpp b/sca-cpp/trunk/modules/oauth/mod-oauth1.cpp index c9d8607144..a7238804f8 100644 --- a/sca-cpp/trunk/modules/oauth/mod-oauth1.cpp +++ b/sca-cpp/trunk/modules/oauth/mod-oauth1.cpp @@ -64,7 +64,7 @@ public: gc_mutable_ref<string> ca; gc_mutable_ref<string> cert; gc_mutable_ref<string> key; - gc_mutable_ref<list<list<value> > > appkeys; + gc_mutable_ref<list<value> > appkeys; gc_mutable_ref<list<string> > mcaddrs; gc_mutable_ref<memcache::MemCached> mc; gc_mutable_ref<perthread_ptr<http::CURLSession> > cs; @@ -96,7 +96,7 @@ public: const char* const dir; bool enabled; gc_mutable_ref<string> login; - gc_mutable_ref<list<list<value> > > scopeattrs; + gc_mutable_ref<list<value> > scopeattrs; gc_mutable_ref<list<AuthnProviderConf> > apcs; }; @@ -139,7 +139,7 @@ const failable<value> userInfo(const value& sid, const memcache::MemCached& mc) /** * Handle an authenticated request. */ -const failable<int> authenticated(const list<list<value> >& userinfo, const bool check, request_rec* const r, const list<list<value> >& scopeattrs, const list<AuthnProviderConf>& apcs) { +const failable<int> authenticated(const list<value>& userinfo, const bool check, request_rec* const r, const list<value>& scopeattrs, const list<AuthnProviderConf>& apcs) { debug(userinfo, "modoauth2::authenticated::userinfo"); if (isNil(scopeattrs)) { @@ -179,7 +179,7 @@ const failable<int> authenticated(const list<list<value> >& userinfo, const bool * Convert a query string containing oauth args to an authorization header. */ const string header(const string& qs, const string& redir, const string& verif) { - const list<list<value> > args = httpd::queryArgs(qs); + const list<value> args = httpd::queryArgs(qs); ostringstream hdr; hdr << "Authorization: OAuth " << "oauth_nonce=\"" << string(cadr(assoc<value>("oauth_nonce", args))) << "\", "; @@ -220,7 +220,7 @@ const list<string> sign(const string& verb, const string& uri, const list<value> /** * Handle an authorize request. */ -const failable<int> authorize(const list<list<value> >& args, request_rec* const r, const list<list<value> >& appkeys, const memcache::MemCached& mc) { +const failable<int> authorize(const list<value>& args, request_rec* const r, const list<value>& appkeys, const memcache::MemCached& mc) { // Extract authorize, access_token, client ID and info URIs const list<value> ref = assoc<value>("openauth_referrer", args); if (isNil(ref) || isNil(cdr(ref))) @@ -242,7 +242,7 @@ const failable<int> authorize(const list<list<value> >& args, request_rec* const return mkfailure<int>("Missing oauth1_info parameter"); // Build the redirect URI - const list<list<value> > redirargs = mklist<list<value> >(tok, cid, info, ref); + const list<value> redirargs = mklist<value>(tok, cid, info, ref); const string redir = httpd::url("/oauth1/access_token/", r) + string("?") + http::queryString(redirargs); debug(redir, "modoauth1::authorize::redir"); @@ -253,7 +253,7 @@ const failable<int> authorize(const list<list<value> >& args, request_rec* const list<value> appkey = cadr(app); // Build and sign the request token URI - const string requri = httpd::unescape(cadr(req)) + string("&") + http::queryString(mklist<list<value> >(mklist<value>("oauth_callback", httpd::escape(redir)))); + const string requri = httpd::unescape(cadr(req)) + string("&") + http::queryString(mklist<value>(mklist<value>("oauth_callback", httpd::escape(redir)))); const list<string> srequri = sign("POST", requri, appkey, emptyString, emptyString); debug(srequri, "modoauth1::authorize::srequri"); @@ -267,7 +267,7 @@ const failable<int> authorize(const list<list<value> >& args, request_rec* const const string res(pres); free(pres); debug(res, "modoauth1::authorize::res"); - const list<list<value> > resargs = httpd::queryArgs(res); + const list<value> resargs = httpd::queryArgs(res); // Retrieve the request token const list<value> conf = assoc<value>("oauth_callback_confirmed", resargs); @@ -286,7 +286,7 @@ const failable<int> authorize(const list<list<value> >& args, request_rec* const return mkfailure<int>(prc); // Redirect to the authorize URI - const string authuri = httpd::unescape(cadr(auth)) + string("?") + http::queryString(mklist<list<value> >(tv)); + const string authuri = httpd::unescape(cadr(auth)) + string("?") + http::queryString(mklist<value>(tv)); debug(authuri, "modoauth1::authorize::authuri"); return httpd::externalRedirect(authuri, r); } @@ -343,7 +343,7 @@ const failable<list<value> > profileUserInfo(const value& cid, const string& inf /** * Handle an access_token request. */ -const failable<int> accessToken(const list<list<value> >& args, request_rec* r, const list<list<value> >& appkeys, const list<list<value> >& scopeattrs, const list<AuthnProviderConf>& apcs, const memcache::MemCached& mc) { +const failable<int> accessToken(const list<value>& args, request_rec* r, const list<value>& appkeys, const list<value>& scopeattrs, const list<AuthnProviderConf>& apcs, const memcache::MemCached& mc) { // Extract access_token URI, client ID and verification code const list<value> ref = assoc<value>("openauth_referrer", args); @@ -377,7 +377,7 @@ const failable<int> accessToken(const list<list<value> >& args, request_rec* r, return mkfailure<int>(sv); // Build and sign access token request URI - const string tokuri = httpd::unescape(cadr(tok)) + string("?") + http::queryString(mklist<list<value> >(vv)); + const string tokuri = httpd::unescape(cadr(tok)) + string("?") + http::queryString(mklist<value>(vv)); const list<string> stokuri = sign("POST", tokuri, appkey, cadr(tv), content(sv)); debug(stokuri, "modoauth1::access_token::stokuri"); @@ -391,7 +391,7 @@ const failable<int> accessToken(const list<list<value> >& args, request_rec* r, const string tokres(ptokres); free(ptokres); debug(tokres, "modoauth1::access_token::res"); - const list<list<value> > tokresargs = httpd::queryArgs(tokres); + const list<value> tokresargs = httpd::queryArgs(tokres); // Retrieve the access token const list<value> atv = assoc<value>("oauth_token", tokresargs); @@ -475,7 +475,7 @@ static int checkAuthn(request_rec *r) { } // Get the request args - const list<list<value> > args = httpd::queryArgs(r); + const list<value> args = httpd::queryArgs(r); // Handle OAuth authorize request step if (string(r->uri) == "/oauth1/authorize/") { @@ -515,7 +515,7 @@ int postConfigMerge(const ServerConf& mainsc, server_rec* const s) { debug(httpd::serverName(s), "modoauth1::postConfigMerge::serverName"); // Merge configuration from main server - if (isNil((list<list<value> >)sc.appkeys)) + if (isNil((list<value>)sc.appkeys)) sc.appkeys = mainsc.appkeys; if (isNil((list<string>)sc.mcaddrs)) sc.mcaddrs = mainsc.mcaddrs; @@ -575,7 +575,7 @@ void childInit(apr_pool_t* const p, server_rec* const s) { char* const confAppKey(cmd_parms* cmd, unused void *c, char *arg1, char* arg2, char* arg3) { const gc_scoped_pool sp(cmd->pool); ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_oauth1); - sc.appkeys = cons<list<value> >(mklist<value>(arg1, mklist<value>(arg2, arg3)), (list<list<value> >)sc.appkeys); + sc.appkeys = cons<value>(mklist<value>(arg1, mklist<value>(arg2, arg3)), (list<value>)sc.appkeys); return NULL; } char* confMemcached(cmd_parms *cmd, unused void *c, char *arg) { @@ -617,7 +617,7 @@ char* confCertKeyFile(cmd_parms *cmd, unused void *c, char *arg) { char* confScopeAttr(cmd_parms *cmd, void* c, char* arg1, char* arg2) { const gc_scoped_pool sp(cmd->pool); DirConf& dc = httpd::dirConf<DirConf>(c); - dc.scopeattrs = cons<list<value> >(mklist<value>(arg1, arg2), (list<list<value> >)dc.scopeattrs); + dc.scopeattrs = cons<value>(mklist<value>(arg1, arg2), (list<value>)dc.scopeattrs); return NULL; } char* confAuthnProvider(cmd_parms *cmd, void *c, char* arg) { diff --git a/sca-cpp/trunk/modules/oauth/mod-oauth2.cpp b/sca-cpp/trunk/modules/oauth/mod-oauth2.cpp index bedf83325f..5bc212a681 100644 --- a/sca-cpp/trunk/modules/oauth/mod-oauth2.cpp +++ b/sca-cpp/trunk/modules/oauth/mod-oauth2.cpp @@ -58,7 +58,7 @@ public: gc_mutable_ref<string> ca; gc_mutable_ref<string> cert; gc_mutable_ref<string> key; - gc_mutable_ref<list<list<value> > > appkeys; + gc_mutable_ref<list<value> > appkeys; gc_mutable_ref<list<string> > mcaddrs; gc_mutable_ref<memcache::MemCached> mc; gc_mutable_ref<perthread_ptr<http::CURLSession> > cs; @@ -90,7 +90,7 @@ public: const char* const dir; bool enabled; gc_mutable_ref<string> login; - gc_mutable_ref<list<list<value> > > scopeattrs; + gc_mutable_ref<list<value> > scopeattrs; gc_mutable_ref<list<AuthnProviderConf> > apcs; }; @@ -133,7 +133,7 @@ const failable<value> userInfo(const value& sid, const memcache::MemCached& mc) /** * Handle an authenticated request. */ -const failable<int> authenticated(const list<list<value> >& userinfo, const bool check, request_rec* const r, const list<list<value> >& scopeattrs, const list<AuthnProviderConf>& apcs) { +const failable<int> authenticated(const list<value>& userinfo, const bool check, request_rec* const r, const list<value>& scopeattrs, const list<AuthnProviderConf>& apcs) { debug(userinfo, "modoauth2::authenticated::userinfo"); if (isNil(scopeattrs)) { @@ -172,7 +172,7 @@ const failable<int> authenticated(const list<list<value> >& userinfo, const bool /** * Handle an authorize request. */ -const failable<int> authorize(const list<list<value> >& args, request_rec* const r, const list<list<value> >& appkeys) { +const failable<int> authorize(const list<value>& args, request_rec* const r, const list<value>& appkeys) { // Extract authorize, access_token, client ID and info URIs const list<value> ref = assoc<value>("openauth_referrer", args); if (isNil(ref) || isNil(cdr(ref))) @@ -199,7 +199,7 @@ const failable<int> authorize(const list<list<value> >& args, request_rec* const debug(redir, "modoauth2::authorize::redir"); // Build the state URI - const list<list<value> > stargs = mklist<list<value> >(tok, cid, info, ref); + const list<value> stargs = mklist<value>(tok, cid, info, ref); const string state = http::queryString(stargs); debug(state, "modoauth2::authorize::state"); @@ -211,7 +211,7 @@ const failable<int> authorize(const list<list<value> >& args, request_rec* const // Redirect to the authorize URI const list<value> adisplay = (isNil(display) || isNil(cdr(display)))? nilListValue : mklist<value>("display", cadr(display)); - const list<list<value> > aargs = mklist<list<value> >(mklist<value>("response_type", "code"), mklist<value>("client_id", car(appkey)), mklist<value>("scope", cadr(scope)), adisplay, mklist<value>("redirect_uri", httpd::escape(redir)), mklist<value>("state", httpd::escape(state))); + const list<value> aargs = mklist<value>(mklist<value>("response_type", "code"), mklist<value>("client_id", car(appkey)), mklist<value>("scope", cadr(scope)), adisplay, mklist<value>("redirect_uri", httpd::escape(redir)), mklist<value>("state", httpd::escape(state))); const string uri = httpd::unescape(cadr(auth)) + string("?") + http::queryString(aargs); debug(uri, "modoauth2::authorize::uri"); return httpd::externalRedirect(uri, r); @@ -229,13 +229,13 @@ const failable<list<value> > profileUserInfo(const value& cid, const list<value> /** * Handle an access_token request. */ -const failable<int> accessToken(const list<list<value> >& args, request_rec* r, const list<list<value> >& appkeys, const http::CURLSession& cs, const list<list<value> >& scopeattrs, const list<AuthnProviderConf>& apcs, const memcache::MemCached& mc) { +const failable<int> accessToken(const list<value>& args, request_rec* r, const list<value>& appkeys, const http::CURLSession& cs, const list<value>& scopeattrs, const list<AuthnProviderConf>& apcs, const memcache::MemCached& mc) { // Extract access_token URI, client ID and authorization code parameters const list<value> state = assoc<value>("state", args); if (isNil(state) || isNil(cdr(state))) return mkfailure<int>("Missing state parameter"); - const list<list<value> >& stargs = httpd::queryArgs(httpd::unescape(cadr(state))); + const list<value>& stargs = httpd::queryArgs(httpd::unescape(cadr(state))); const list<value> ref = assoc<value>("openauth_referrer", stargs); if (isNil(ref) || isNil(cdr(ref))) return mkfailure<int>("Missing openauth_referrer parameter"); @@ -263,7 +263,7 @@ const failable<int> accessToken(const list<list<value> >& args, request_rec* r, debug(redir, "modoauth2::access_token::redir"); // Request access token - const list<list<value> > targs = mklist<list<value> >(mklist<value>("client_id", car(appkey)), mklist<value>("redirect_uri", httpd::escape(redir)), mklist<value>("client_secret", cadr(appkey)), code, mklist<value>("grant_type", "authorization_code")); + const list<value> targs = mklist<value>(mklist<value>("client_id", car(appkey)), mklist<value>("redirect_uri", httpd::escape(redir)), mklist<value>("client_secret", cadr(appkey)), code, mklist<value>("grant_type", "authorization_code")); const string tqs = http::queryString(targs); debug(tqs, "modoauth2::access_token::tokenqs"); const string turi = httpd::unescape(cadr(tok)); @@ -285,7 +285,7 @@ const failable<int> accessToken(const list<list<value> >& args, request_rec* r, // Request user info // TODO Make this step configurable - const list<list<value> > iargs = mklist<list<value> >(tv); + const list<value> iargs = mklist<value>(tv); const string iuri = httpd::unescape(cadr(info)) + string("?") + http::queryString(iargs); debug(iuri, "modoauth2::access_token::infouri"); const failable<value> profres = http::get(iuri, cs); @@ -350,7 +350,7 @@ static int checkAuthn(request_rec *r) { } // Get the request args - const list<list<value> > args = httpd::queryArgs(r); + const list<value> args = httpd::queryArgs(r); // Handle OAuth authorize request step if (string(r->uri) == "/oauth2/authorize/") { @@ -390,7 +390,7 @@ int postConfigMerge(const ServerConf& mainsc, server_rec* const s) { debug(httpd::serverName(s), "modoauth2::postConfigMerge::serverName"); // Merge configuration from main server - if (isNil((list<list<value> >)sc.appkeys)) + if (isNil((list<value>)sc.appkeys)) sc.appkeys = mainsc.appkeys; if (isNil((list<string>)sc.mcaddrs)) sc.mcaddrs = mainsc.mcaddrs; @@ -450,7 +450,7 @@ void childInit(apr_pool_t* const p, server_rec* const s) { char* confAppKey(cmd_parms *cmd, unused void *c, char *arg1, char* arg2, char* arg3) { const gc_scoped_pool sp(cmd->pool); ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_oauth2); - sc.appkeys = cons<list<value> >(mklist<value>(arg1, mklist<value>(arg2, arg3)), (list<list<value> >)sc.appkeys); + sc.appkeys = cons<value>(mklist<value>(arg1, mklist<value>(arg2, arg3)), (list<value>)sc.appkeys); return NULL; } char* confMemcached(cmd_parms *cmd, unused void *c, char *arg) { @@ -492,7 +492,7 @@ char* confCertKeyFile(cmd_parms *cmd, unused void *c, char *arg) { char* confScopeAttr(cmd_parms *cmd, void* c, char* arg1, char* arg2) { const gc_scoped_pool sp(cmd->pool); DirConf& dc = httpd::dirConf<DirConf>(c); - dc.scopeattrs = cons<list<value> >(mklist<value>(arg1, arg2), (list<list<value> >)dc.scopeattrs); + dc.scopeattrs = cons<value>(mklist<value>(arg1, arg2), (list<value>)dc.scopeattrs); return NULL; } char* confAuthnProvider(cmd_parms *cmd, void *c, char* arg) { diff --git a/sca-cpp/trunk/modules/rss/rss.hpp b/sca-cpp/trunk/modules/rss/rss.hpp index 7fba736065..348d50e8f3 100644 --- a/sca-cpp/trunk/modules/rss/rss.hpp +++ b/sca-cpp/trunk/modules/rss/rss.hpp @@ -45,15 +45,16 @@ const value entry("entry"); * Convert a list of elements to a list of element values representing an RSS entry. */ const list<value> entryElementValues(const list<value>& e) { - const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), e); + const list<value> lt = elementChildren("title", e); const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); - const list<value> li = filter<value>(selector(mklist<value>(element, "link")), e); + const list<value> li = elementChildren("link", e); const value i = isNil(li)? value(emptyString) : elementValue(car(li)); - const list<value> ld = filter<value>(selector(mklist<value>(element, "description")), e); + const list<value> ld = elementChildren("description", e); return append<value>(nilListValue + element + entry + value(nilListValue + element + value("title") + t) + value(nilListValue + element + value("id") + i), - isNil(ld)? nilListValue : mklist<value>(value(nilListValue + element + value("content") + elementValue(car(ld))))); + isNil(ld)? nilListValue : isAttribute(elementValue(car(ld)))? nilListValue : + mklist<value>(value(nilListValue + element + value("content") + elementValue(car(ld))))); } /** @@ -91,10 +92,10 @@ const failable<list<value> > readRSSFeed(const list<string>& ilist) { const list<value> f = content(xml::readElements(ilist)); if (isNil(f)) return mkfailure<list<value> >("Empty feed"); - const list<value> c = filter<value>(selector(mklist<value>(element, "channel")), car(f)); - const list<value> t = filter<value>(selector(mklist<value>(element, "title")), car(c)); - const list<value> i = filter<value>(selector(mklist<value>(element, "link")), car(c)); - const list<value> e = filter<value>(selector(mklist<value>(element, "item")), car(c)); + const list<value> c = elementChildren("channel", car(f)); + const list<value> t = elementChildren("title", car(c)); + const list<value> i = elementChildren("link", car(c)); + const list<value> e = elementChildren("item", car(c)); return mklist<value>(append<value>(nilListValue + element + feed + value(nilListValue + element + value("title") + elementValue(car(t))) + value(nilListValue + element + value("id") + elementValue(car(i))), @@ -150,9 +151,9 @@ const failable<list<string> > writeRSSEntry(const list<value>& l) { */ template<typename R> const failable<R> writeRSSFeed(const lambda<const R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) { const list<value> l = isNil(ll)? ll : (list<value>)car(ll); - const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), l); + const list<value> lt = elementChildren("title", l); const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); - const list<value> li = filter<value>(selector(mklist<value>(element, "id")), l); + const list<value> li = elementChildren("id", l); const value i = isNil(li)? value(emptyString) : elementValue(car(li)); const list<value> c = nilListValue + (nilListValue + element + "title" + t) @@ -160,7 +161,7 @@ template<typename R> const failable<R> writeRSSFeed(const lambda<const R(const s + (nilListValue + element + "description" + t); // Write RSS entries - const list<value> le = filter<value>(selector(mklist<value>(element, entry)), l); + const list<value> le = elementChildren(entry, l); if (isNil(le)) { const list<value> fe = nilListValue + element + "rss" + (nilListValue + attribute + "version" + "2.0") diff --git a/sca-cpp/trunk/modules/scdl/scdl-test.cpp b/sca-cpp/trunk/modules/scdl/scdl-test.cpp index 9daacb5559..2c098d3c53 100644 --- a/sca-cpp/trunk/modules/scdl/scdl-test.cpp +++ b/sca-cpp/trunk/modules/scdl/scdl-test.cpp @@ -53,8 +53,8 @@ const bool testComponents() { const value catalog = named(string("Catalog"), c); assert(name(catalog) == string("Catalog")); - const list<value> t = mkbtree(sort(nameToElementAssoc(c))); - assert(assoctree<value>("Catalog", t) == mklist<value>("Catalog" , cadr(c))); + const list<value> t = mkrbtree(sort(nameToElementAssoc(c))); + assert(rbtreeAssoc<value>("Catalog", t) == mklist<value>("Catalog" , cadr(c))); return true; } @@ -89,8 +89,8 @@ const bool testReferences() { assert(uri(binding) == nilValue); assert(bindingType(binding) == "binding.jsonrpc"); - const list<value> t = mkbtree(sort(referenceToTargetAssoc(references(store)))); - assert(assoctree<value>("shoppingCart", t) == mklist<value>(string("shoppingCart"), string("ShoppingCart/Cart"))); + const list<value> t = mkrbtree(sort(referenceToTargetAssoc(references(store)))); + assert(rbtreeAssoc<value>("shoppingCart", t) == mklist<value>(string("shoppingCart"), string("ShoppingCart/Cart"))); return true; } diff --git a/sca-cpp/trunk/modules/scheme/primitive.hpp b/sca-cpp/trunk/modules/scheme/primitive.hpp index 2e0c4f62dd..4815e9a497 100644 --- a/sca-cpp/trunk/modules/scheme/primitive.hpp +++ b/sca-cpp/trunk/modules/scheme/primitive.hpp @@ -26,9 +26,12 @@ * Script evaluator primitive functions. */ +#include <math.h> + #include "stream.hpp" #include "function.hpp" #include "list.hpp" +#include "tree.hpp" #include "value.hpp" #include "parallel.hpp" @@ -90,10 +93,30 @@ inline const value listProc(const list<value>& args) { } inline const value assocProc(const list<value>& args) { - return assoc(car(args), (list<list<value> >)cadr(args)); + return assoc(car(args), (list<value>)cadr(args)); +} + +inline const value delAssocProc(const list<value>& args) { + return delAssoc(car(args), (list<value>)cadr(args)); +} + +inline const value substAssocProc(const list<value>& args) { + return substAssoc(car(args), (list<value>)cadr(args), (list<value>)caddr(args)); +} + +inline const value treeDelAssocProc(const list<value>& args) { + return treeDelAssoc((list<value>)car(args), (list<value>)cadr(args)); +} + +inline const value treeSubstAssocProc(const list<value>& args) { + return treeSubstAssoc((list<value>)car(args), (list<value>)cadr(args), (list<value>)caddr(args)); } -inline const value nulProc(const list<value>& args) { +inline const value treeSelectAssocProc(const list<value>& args) { + return treeSelectAssoc((list<value>)car(args), (list<value>)cadr(args)); +} + +inline const value nullProc(const list<value>& args) { const value v(car(args)); if (isNil(v)) return true; @@ -106,6 +129,14 @@ inline const value equalProc(const list<value>& args) { return (bool)(car(args) == cadr(args)); } +inline const value greaterProc(const list<value>& args) { + return (bool)(car(args) > cadr(args)); +} + +inline const value lesserProc(const list<value>& args) { + return (bool)(car(args) < cadr(args)); +} + inline const value addProc(const list<value>& args) { if (isNil(cdr(args))) return (double)car(args); @@ -126,6 +157,10 @@ inline const value divProc(const list<value>& args) { return (double)car(args) / (double)cadr(args); } +inline const value sqrtProc(const list<value>& args) { + return (double)sqrt((double)car(args)); +} + inline const value displayProc(const list<value>& args) { if (isNil(args)) { displayStream() << endl; @@ -216,14 +251,22 @@ inline const list<value> primitiveProcedureNames() { + "cdr" + "cons" + "list" - + "nul" + + "null?" + "=" + "equal?" + + "<" + + ">" + "+" + "-" + "*" + "/" + + "sqrt" + "assoc" + + "del-assoc" + + "subst-assoc" + + "tree-select-assoc" + + "tree-del-assoc" + + "tree-subst-assoc" + "cadr" + "caddr" + "cadddr" @@ -242,14 +285,22 @@ inline const list<value> primitiveProcedureObjects() { + primitiveProcedure(cdrProc) + primitiveProcedure(consProc) + primitiveProcedure(listProc) - + primitiveProcedure(nulProc) + + primitiveProcedure(nullProc) + primitiveProcedure(equalProc) + primitiveProcedure(equalProc) + + primitiveProcedure(lesserProc) + + primitiveProcedure(greaterProc) + primitiveProcedure(addProc) + primitiveProcedure(subProc) + primitiveProcedure(mulProc) + primitiveProcedure(divProc) + + primitiveProcedure(sqrtProc) + primitiveProcedure(assocProc) + + primitiveProcedure(delAssocProc) + + primitiveProcedure(substAssocProc) + + primitiveProcedure(treeSelectAssocProc) + + primitiveProcedure(treeDelAssocProc) + + primitiveProcedure(treeSubstAssocProc) + primitiveProcedure(cadrProc) + primitiveProcedure(caddrProc) + primitiveProcedure(cadddrProc) diff --git a/sca-cpp/trunk/modules/scheme/test.scm b/sca-cpp/trunk/modules/scheme/test.scm index 4bbff6e5c2..41d6296ba3 100644 --- a/sca-cpp/trunk/modules/scheme/test.scm +++ b/sca-cpp/trunk/modules/scheme/test.scm @@ -22,7 +22,7 @@ ; ATOMPub test case (define (get id) - (if (nul id) + (if (null? id) '((feed (title "Sample Feed") (id "123456789") (entry (((title "Item") (id "111") (content (item (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99)))) ((title "Item") (id "222") (content (item (name "Orange") (currencyCode "USD") (currencySymbol "$") (price 3.55)))) |