servlib/naming/IPNScheme.cc
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlib/naming/IPNScheme.cc	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,140 @@
+#ifdef HAVE_CONFIG_H
+#  include <dtn-config.h>
+#endif
+
+#include <oasys/debug/Log.h>
+#include <oasys/util/Glob.h>
+
+#include "IPNScheme.h"
+#include "EndpointID.h"
+
+namespace dtn {
+
+        template <>
+        IPNScheme* oasys::Singleton<IPNScheme>::instance_ = 0;
+
+        bool
+        IPNScheme::validate(const URI& uri, bool is_pattern)
+        {
+                (void) is_pattern;
+
+                u_int64_t ipn_eid = 0, ipn_tag;
+                const char *temp;
+
+                if (!uri.valid())
+                {
+                        log_debug_p("/dtn/scheme/ipn", "IPNScheme::validate: invalid URI");
+                        return false;
+                }
+
+                temp = uri.ssp().c_str();
+
+                if (uri.ssp().length() < 3 || strncmp(temp, "//", 2) != 0)
+                {
+                        printf("Malformed IPN EID. Must be of the form ipn://posint[/posint]\n");
+                        return false;
+                }
+                temp += 2;
+
+		if(sscanf(temp, "%" PRIu64 "/*", &ipn_eid))
+		{
+			return true;
+		}
+                else if(sscanf(temp, "%" PRIu64 "/%" PRIu64, &ipn_eid, &ipn_tag) < 1)
+                {
+                        printf("THIS IS A BAD EID:\t%s\n", uri.ssp().c_str());
+                        return false;
+                }
+                return true;
+        }
+
+        bool
+        IPNScheme::match(const EndpointIDPattern& pattern,
+        const EndpointID& eid)
+        {
+                ASSERT(pattern.scheme() == this);
+
+                u_int64_t pattern_n=0, pattern_s=0;
+		int flag_p;
+                
+		u_int64_t eid_n=0, eid_s=0;
+		int flag_s;
+
+
+                if(!strcmp(eid.c_str(), "dtn:none"))
+                {
+                        return false;
+                }
+
+                flag_s = sscanf(eid.c_str(), "ipn://%" PRIu64 "/%" PRIu64, &eid_n, &eid_s);
+                flag_p = sscanf(pattern.c_str(), "ipn://%" PRIu64 "/%" PRIu64, &pattern_n, &pattern_s);
+
+                if(flag_p < 1 || flag_s < 1)
+                {
+                        return false;
+                }
+
+                if(pattern_n == eid_n)
+                {
+                        if(flag_p == flag_s && pattern_s == eid_s)
+                        {
+                                return true;
+                        }
+                	if(strstr(pattern.c_str(), "/*") > 0)
+				return true;
+		        if(flag_p == 1 && flag_s == 2)
+                        {
+                                return false;
+                        }
+                }
+                return false;
+        }
+
+        Scheme::singleton_info_t
+        IPNScheme::is_singleton(const URI& uri)
+        {
+                (void)uri;
+                return EndpointID::SINGLETON;
+        }
+
+        bool
+        IPNScheme::append_service_tag(URI* uri, const char* tag)
+        {
+                if (uri == NULL) return false;
+
+                u_int64_t temp = 0;
+
+                //if(strcmp(tag, "ping") ==0)
+                //{
+                //        return true;
+                //}
+
+                if(sscanf(tag, "%" PRIu64, &temp) != 1)
+                {
+                        printf("Bad tag!\t%s\n", tag);
+                        return false;
+                }
+
+                if (tag[0] != '/')
+                {
+                        uri->set_path(std::string("/")+tag);
+                }
+                else
+                {
+                        uri->set_path(tag);
+                }
+                return true;
+        }
+
+        bool
+        IPNScheme::remove_service_tag(URI* uri)
+        {
+                if(uri == NULL) return false;
+                uri->set_path("");
+                return true;
+        }
+
+
+
+}
+