00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <dtn-config.h>
00019 #endif
00020
00021 #include <ctype.h>
00022 #include <oasys/debug/Log.h>
00023
00024 #include "TCAScheme.h"
00025 #include "EndpointID.h"
00026
00027 namespace dtn {
00028
00029 template <>
00030 TCAScheme* oasys::Singleton<TCAScheme>::instance_ = 0;
00031
00039 bool
00040 TCAScheme::validate(const URI& uri, bool is_pattern)
00041 {
00042
00043
00044
00045
00046 (void)is_pattern;
00047
00048 if (!uri.valid()) {
00049 return false;
00050 }
00051
00052 return true;
00053 }
00054
00060
00061
00062
00063 bool
00064 TCAScheme::match(const EndpointIDPattern& pattern, const EndpointID& eid)
00065 {
00066
00067 ASSERT(pattern.scheme() == this);
00068
00069
00070 if (!eid.known_scheme() || (eid.scheme() != this)) {
00071 return false;
00072 }
00073
00074
00075
00076 if (pattern.ssp() == "none" || eid.ssp() == "none") {
00077 return false;
00078 }
00079
00080
00081 if (pattern.uri().host() == "*" && pattern.uri().path() == "")
00082 {
00083 return true;
00084 }
00085
00086
00087
00088 if ((pattern.uri().host() != "*") &&
00089 (eid.uri().host() != "*") &&
00090 (pattern.uri().host() != eid.uri().host()))
00091 {
00092 log_debug_p("/scheme/dtn",
00093 "match(%s, %s) failed: url hosts not equal ('%s' != '%s')",
00094 eid.uri().c_str(), pattern.uri().c_str(),
00095 pattern.uri().host().c_str(), eid.uri().host().c_str());
00096 return false;
00097 }
00098
00099
00100 if (pattern.uri().port_num() != eid.uri().port_num())
00101 {
00102 log_debug_p("/scheme/dtn",
00103 "match(%s, %s) failed: url ports not equal (%d != %d)",
00104 eid.uri().c_str(), pattern.uri().c_str(),
00105 pattern.uri().port_num(), eid.uri().port_num());
00106 return false;
00107 }
00108
00109
00110 if ((pattern.uri().path() == "*") ||
00111 (pattern.uri().path() == eid.uri().path()))
00112 {
00113 log_debug_p("/scheme/dtn",
00114 "match(%s, %s) succeeded: pattern '%s' ssp '%s'",
00115 eid.uri().c_str(), pattern.uri().c_str(),
00116 pattern.uri().host().c_str(), eid.uri().host().c_str());
00117 return true;
00118 }
00119
00120
00121 size_t patternlen = pattern.uri().path().length();
00122 if (patternlen >= 1 && pattern.uri().path()[patternlen-1] == '*') {
00123 patternlen--;
00124
00125 if (pattern.uri().path().substr(0, patternlen) ==
00126 eid.uri().path().substr(0, patternlen))
00127 {
00128 log_debug_p("/scheme/dtn",
00129 "match(%s, %s) substring succeeded: "
00130 "pattern '%s' ssp '%s'",
00131 eid.uri().c_str(), pattern.uri().c_str(),
00132 pattern.uri().host().c_str(), eid.uri().host().c_str());
00133 return true;
00134 }
00135 }
00136
00137
00138
00139
00140 return false;
00141 }
00142
00143
00151 bool
00152 TCAScheme::append_service_tag(URI* uri, const char* tag)
00153 {
00154 if (tag[0] != '/') {
00155 uri->set_path(std::string("/") + tag);
00156 } else {
00157 uri->set_path(tag);
00158 }
00159 return true;
00160 }
00161
00162
00163 Scheme::singleton_info_t
00164 TCAScheme::is_singleton(const URI& uri)
00165 {
00166
00167
00168 if (uri.host().find('*') != std::string::npos) {
00169 return EndpointID::MULTINODE;
00170 }
00171
00172 return EndpointID::SINGLETON;
00173 }
00174
00175 }