author | Michael Krelin <hacker@klever.net> | 2008-01-21 19:51:23 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2008-01-21 19:51:23 (UTC) |
commit | 2a116bce75236e46946bb9564790c26c6a59b9a4 (patch) (unidiff) | |
tree | 27b047f773ea2f37d080c8c9c8f583d345649856 /include | |
parent | eee78b62ac9c4aed629fc47eb2af6615ca17d2e2 (diff) | |
download | libopkele-2a116bce75236e46946bb9564790c26c6a59b9a4.zip libopkele-2a116bce75236e46946bb9564790c26c6a59b9a4.tar.gz libopkele-2a116bce75236e46946bb9564790c26c6a59b9a4.tar.bz2 |
Implement URI construction handling append='qxri' xrd:URI attribute.
This is the right thing to do and may come in handy assisting OPs in improving
UI.
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | include/opkele/discovery.h | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/include/opkele/discovery.h b/include/opkele/discovery.h index ab4b9d9..677d7bb 100644 --- a/include/opkele/discovery.h +++ b/include/opkele/discovery.h | |||
@@ -1,86 +1,94 @@ | |||
1 | #ifndef __OPKELE_DISCOVERY_H | 1 | #ifndef __OPKELE_DISCOVERY_H |
2 | #define __OPKELE_DISCOVERY_H | 2 | #define __OPKELE_DISCOVERY_H |
3 | 3 | ||
4 | #include <string> | 4 | #include <string> |
5 | #include <opkele/types.h> | 5 | #include <opkele/types.h> |
6 | #include <opkele/basic_rp.h> | 6 | #include <opkele/basic_rp.h> |
7 | 7 | ||
8 | namespace opkele { | 8 | namespace opkele { |
9 | using std::string; | 9 | using std::string; |
10 | 10 | ||
11 | namespace xrd { | 11 | namespace xrd { |
12 | 12 | ||
13 | struct priority_compare { | 13 | struct priority_compare { |
14 | inline bool operator()(long a,long b) const { | 14 | inline bool operator()(long a,long b) const { |
15 | return (a<0) ? false : (b<0) ? true : (a<b); | 15 | return (a<0) ? false : (b<0) ? true : (a<b); |
16 | } | 16 | } |
17 | }; | 17 | }; |
18 | 18 | ||
19 | template <typename _DT> | 19 | template <typename _DT> |
20 | class priority_map : public multimap<long,_DT,priority_compare> { | 20 | class priority_map : public multimap<long,_DT,priority_compare> { |
21 | typedef multimap<long,_DT,priority_compare> map_type; | 21 | typedef multimap<long,_DT,priority_compare> map_type; |
22 | public: | 22 | public: |
23 | 23 | ||
24 | inline _DT& add(long priority,const _DT& d) { | 24 | inline _DT& add(long priority,const _DT& d) { |
25 | return insert(typename map_type::value_type(priority,d))->second; | 25 | return insert(typename map_type::value_type(priority,d))->second; |
26 | } | 26 | } |
27 | 27 | ||
28 | bool has_value(const _DT& d) const { | 28 | bool has_value(const _DT& d) const { |
29 | for(typename map_type::const_iterator i=this->begin();i!=this->end();++i) | 29 | for(typename map_type::const_iterator i=this->begin();i!=this->end();++i) |
30 | if(i->second==d) return true; | 30 | if(i->second==d) return true; |
31 | return false; | 31 | return false; |
32 | } | 32 | } |
33 | }; | 33 | }; |
34 | 34 | ||
35 | typedef priority_map<string> canonical_ids_t; | 35 | typedef priority_map<string> canonical_ids_t; |
36 | typedef priority_map<string> local_ids_t; | 36 | typedef priority_map<string> local_ids_t; |
37 | typedef set<string> types_t; | 37 | typedef set<string> types_t; |
38 | typedef priority_map<string> uris_t; | 38 | struct uri_t { |
39 | string uri; | ||
40 | string append; | ||
41 | |||
42 | uri_t() { } | ||
43 | uri_t(const string& u) : uri(u) { } | ||
44 | uri_t(const string& u,const string& a) : uri(u), append(a) { } | ||
45 | }; | ||
46 | typedef priority_map<uri_t> uris_t; | ||
39 | 47 | ||
40 | class service_t { | 48 | class service_t { |
41 | public: | 49 | public: |
42 | types_t types; | 50 | types_t types; |
43 | uris_t uris; | 51 | uris_t uris; |
44 | local_ids_t local_ids; | 52 | local_ids_t local_ids; |
45 | string provider_id; | 53 | string provider_id; |
46 | 54 | ||
47 | void clear() { | 55 | void clear() { |
48 | types.clear(); | 56 | types.clear(); |
49 | uris.clear(); local_ids.clear(); | 57 | uris.clear(); local_ids.clear(); |
50 | provider_id.clear(); | 58 | provider_id.clear(); |
51 | } | 59 | } |
52 | }; | 60 | }; |
53 | typedef priority_map<service_t> services_t; | 61 | typedef priority_map<service_t> services_t; |
54 | 62 | ||
55 | class XRD_t { | 63 | class XRD_t { |
56 | public: | 64 | public: |
57 | time_t expires; | 65 | time_t expires; |
58 | 66 | ||
59 | canonical_ids_t canonical_ids; | 67 | canonical_ids_t canonical_ids; |
60 | local_ids_t local_ids; | 68 | local_ids_t local_ids; |
61 | services_t services; | 69 | services_t services; |
62 | string provider_id; | 70 | string provider_id; |
63 | 71 | ||
64 | void clear() { | 72 | void clear() { |
65 | expires = 0; | 73 | expires = 0; |
66 | canonical_ids.clear(); local_ids.clear(); | 74 | canonical_ids.clear(); local_ids.clear(); |
67 | services.clear(); | 75 | services.clear(); |
68 | provider_id.clear(); | 76 | provider_id.clear(); |
69 | } | 77 | } |
70 | bool empty() const { | 78 | bool empty() const { |
71 | return | 79 | return |
72 | canonical_ids.empty() | 80 | canonical_ids.empty() |
73 | && local_ids.empty() | 81 | && local_ids.empty() |
74 | && services.empty(); | 82 | && services.empty(); |
75 | } | 83 | } |
76 | 84 | ||
77 | }; | 85 | }; |
78 | 86 | ||
79 | } | 87 | } |
80 | 88 | ||
81 | typedef util::output_iterator_proxy<openid_endpoint_t> | 89 | typedef util::output_iterator_proxy<openid_endpoint_t> |
82 | endpoint_discovery_iterator; | 90 | endpoint_discovery_iterator; |
83 | 91 | ||
84 | string idiscover( | 92 | string idiscover( |
85 | endpoint_discovery_iterator oi, | 93 | endpoint_discovery_iterator oi, |
86 | const string& identity); | 94 | const string& identity); |