PyNDN: Simplified versions of Interset and Name are now seem to be fully working

Refs #1010 (http://redmine.named-data.net/issues/1010)
diff --git a/PyNDN/Interest.py b/PyNDN/Interest.py
index 3256a7c..ddafb65 100644
--- a/PyNDN/Interest.py
+++ b/PyNDN/Interest.py
@@ -17,166 +17,61 @@
 #             Jeff Burke <jburke@ucla.edu>
 #
 
-import ndn.Name
-
-class AOKType(utils.Flag):
-    _prefix = "ndn"
-
-AOK_NONE = AOKType.new_flag('AOK_NONE', 0x0)
-AOK_CS = AOKType.new_flag('AOK_CS', 0x1)  # Answer from content store
-AOK_NEW = AOKType.new_flag('AOK_NEW', 0x2)  # OK to produce new content
-AOK_STALE = AOKType.new_flag('AOK_STALE', 0x4)  # OK to answer with stale data
-AOK_EXPIRE = AOKType.new_flag('AOK_EXPIRE', 0x10) # Mark as stale (requires scope 0)
-
-AOK_DEFAULT = AOK_CS | AOK_NEW
-
-CHILD_SELECTOR_LEFT = 0
-CHILD_SELECTOR_RIGHT = 1
+import ns.ndnSIM
+import ns.core
+import Name
 
 class Interest (object):
-    def __init__(self, name = None, minSuffixComponents = None,
-             maxSuffixComponents = None, publisherPublicKeyDigest = None,
-             exclude = None, childSelector = None, answerOriginKind = None,
-             scope = None, interestLifetime = None, nonce = None):
+    _interest = None
+
+    def __init__(self, name = None, 
+                 scope = None, interestLifetime = None):
+        self._interest = ns.ndnSIM.ndn.Interest ()
         
         self.name = name
-
-        #
-        # Not supported at the moment
-        #
-        # self.minSuffixComponents = minSuffixComponents  # default 0
-        # self.maxSuffixComponents = maxSuffixComponents  # default infinity
-        # self.publisherPublicKeyDigest = publisherPublicKeyDigest  # SHA256 hash
-        # self.exclude = exclude
-        # self.childSelector = childSelector
-        # self.answerOriginKind = answerOriginKind
-
         self.scope = scope
         self.interestLifetime = interestLifetime
-        self.nonce = nonce
 
-        # wire
-        self.wire_dirty = True
-        self.wire = None  # backing charbuf
+    def __getattr__ (self, name):
+        if name == "name":
+            return Name (self._interest.GetName ())
+        elif name == "scope":
+            return self._interest.GetScope ()
+        elif name == "interestLifetime":
+            return self._interest.GetInterestLifetime ().ToDouble (ns.core.Time.S)
+        else:
+            return self._interest.__getattribute__ (name)
 
     def __setattr__(self, name, value):
-        if name != "wire_dirty":
-            self.wire_dirty = True
-        object.__setattr__(self, name, value)
-
-    def __getattribute__(self, name):
-        if name == "wire":
-            # force refresh if components changed
-            if object.__getattribute__(self, 'name') and self.name.wire_dirty:
-                self.wire_dirty = True
-            elif object.__getattribute__(self, 'exclude') and self.exclude.wire_dirty:
-                self.wire_dirty = True
-
-            if object.__getattribute__(self, 'wire_dirty'):
-                self.wire = _ndn.Interest_obj_to_ccn(self)
-                self.wire_dirty = False
-        return object.__getattribute__(self, name)
-
-    def __str__(self):
-        res = []
-        res.append("name: %s" % self.name)
-        res.append("minSuffixComponents: %s" % self.minSuffixComponents)
-        res.append("maxSuffixComponents: %s" % self.maxSuffixComponents)
-        res.append("publisherPublicKeyDigest: %r" % self.publisherPublicKeyDigest)
-        res.append("exclude:\n%s" % self.exclude)
-        res.append("childSelector: %s" % self.childSelector)
-        res.append("answerOriginKind: %s" % self.answerOriginKind)
-        res.append("scope: %s" % self.scope)
-        res.append("interestLifetime: %s" % self.interestLifetime)
-        res.append("nonce: %r" % self.nonce)
-        return "\n".join(res)
+        if name == "_interest":
+            return object.__setattr__ (self, name, value)
+        elif name == "name":
+            if not value:
+                return self._interest.SetName (ns.ndnSIM.ndn.Name ())
+            elif type (value) is Name:
+                return self._interest.SetName (value._name)
+            elif type (value) is ns.ndnSIM.ndn.Name:
+                return self._interest.SetName (value)
+            elif type (value) is str:
+                return self._interest.SetName (ns.ndnSIM.ndn.Name (value))
+            else:
+                raise ValueError ("Invalid name parameter")
+        elif name == "scope":
+            if not value:
+                return self._interest.SetScope (-1)
+            elif type (value) is int:
+                return self._interest.SetScope (value)
+            else:
+                raise ValueError ("Scope parameter should be int, [%s] supplied" % type (value))
+        elif name == "interestLifetime":
+            if not value:
+                return self._interest.SetInterestLifetime (ns.core.Time ())
+            elif type (value) is float or type (value) is int:
+                return self._interest.SetInterestLifetime (ns.core.Seconds (value))
+            else:
+                raise ValueError ("interestLifetime parameter should be fload or int, [%s] supplied" % type (value))
+        else:
+            raise ValueError ("Unknown or unsupported attribute [%s]" % name)
 
     def __repr__(self):
-        args = []
-
-        if self.name is not None:
-            args += ["name=%r" % self.name]
-        if self.minSuffixComponents is not None:
-            args += ["minSuffixComponents=%r" % self.minSuffixComponents]
-        if self.maxSuffixComponents is not None:
-            args += ["maxSuffixComponents=%r" % self.maxSuffixComponents]
-        if self.publisherPublicKeyDigest is not None:
-            args += ["publisherPublicKeyDigest=%r" % self.publisherPublicKeyDigest]
-        if self.exclude is not None:
-            args += ["exclude=%r" % self.exclude]
-        if self.childSelector is not None:
-            args += ["childSelector=%r" % self.childSelector]
-        if self.answerOriginKind is not None:
-            args += ["answerOriginKind=%r" % self.answerOriginKind]
-        if self.scope is not None:
-            args += ["scope=%r" % self.scope]
-        if self.interestLifetime is not None:
-            args += ["interestLifetime=%r" % self.interestLifetime]
-        if self.nonce is not None:
-            args += ["nonce=%r" % self.nonce]
-
-        return "ndn.Interest(%s)" % ", ".join(args)
-
-    def get_aok_value(self):
-        global AOK_DEFAULT
-
-        return AOK_DEFAULT if not self.answerOriginKind else self.answerOriginKind
-
-    def matches_name(self, name):
-        i_name = self.name.components
-        o_name = name.components
-
-        # requested name is longer than ours
-        if len(i_name) > len(o_name):
-            return False
-
-        # at least one of given components don't match
-        if not all(i == j for i, j in zip(i_name, o_name)):
-            return False
-
-        return True
-
-# # Bloom filters will be deprecated, so we do not support them.
-# class ExclusionFilter(object):
-#     def __init__(self):
-#         self.components = []
-
-#         # py-ndn
-#         self.wire_dirty = False
-#         self.wire = None  # backing charbuf
-
-#     def reset(self):
-#         self.components = []
-
-#     def add_names(self, names):
-#         self.wire_dirty = True
-#         self.components.extend(sorted(names))
-
-#     def add_name(self, name):
-#         if not type(name) is Name.Name:
-#             raise TypeError("Name type required")
-
-#         self.wire_dirty = True
-#         self.components.append(name)
-
-#     def add_any(self):
-#         self.components.append(Name.Name(name_type = Name.NAME_ANY))
-
-#     def __setattr__(self, name, value):
-#         if name != "wire_dirty":
-#             self.wire_dirty = True
-#         object.__setattr__(self, name, value)
-
-#     def __getattribute__(self, name):
-#         if name == "wire":
-#             if object.__getattribute__(self, 'wire_dirty'):
-#                 self.wire = _ndn.ExclusionFilter_names_to_ccn(
-#                     self.components)
-#                 self.wire_dirty = False
-#         return object.__getattribute__(self, name)
-
-#     def __str__(self):
-#         comps = []
-#         for n in self.components:
-#             comps.append(str(n))
-#         return str(comps)
+        return "ndnSIM.Interest(%s)" % str (self._interest)
diff --git a/PyNDN/Name.py b/PyNDN/Name.py
index aed9113..a9aaa31 100644
--- a/PyNDN/Name.py
+++ b/PyNDN/Name.py
@@ -17,24 +17,16 @@
 #             Jeff Burke <jburke@ucla.edu>
 #
 
-def toWire (name):
-    buf = ns.network.Buffer (ns.ndnSIM.ndn.Wire.FromNameSize (name))
-    ns.ndnSIM.ndn.Wire.FromName (buf.Begin (), name)
-    
-    output = bytearray (buf.GetSize ())
-    buf.CopyData (output, buf.GetSize ())
-    
-    return buf
-
 import ns.ndnSIM
-import ns.network
 
-from copy import copy
-import time, struct, random
+class Name ():
+    _name = None
 
-class Name (ns.ndnSIM.ndn.Name):
-    def __init__(self, name=None):
-        super (Name, self).__init__ (name)
+    def __init__ (self, value = None):
+        if value:
+            self._name = ns.ndnSIM.ndn.Name (value)
+        else:
+            self._name = ns.ndnSIM.ndn.Name ()
 
     @staticmethod
     def fromWire (wire):
@@ -42,68 +34,31 @@
 
     @staticmethod
     def toWire (name):
-        buf = ns.network.Buffer ()
-        buf.AddToStart (ns.ndnSIM.ndn.Wire.FromNameSize (name))
-        ns.ndnSIM.ndn.Wire.FromName (buf.Begin (), name)
-
-        output = bytearray (buf.GetSize ())
-        buf.CopyData (output, buf.GetSize ())
-        return output
+        return ns.ndnSIM.ndn.Wire.FromName (name)
     
-    def get_ccnb(self):
-        return _ndn.dump_charbuf(self.ccn_data)
+    def __getattr__ (self, name):
+        return self._name.__getattribute__ (name)
 
-    def __repr__(self):
-        global NAME_NORMAL, NAME_ANY
+    def __len__ (self):
+        return self._name.size ()
 
-        if self.type == NAME_NORMAL:
-            return "ndn.Name('ccnx:" + _ndn.name_to_uri(self.ccn_data) + "')"
-        elif self.type == NAME_ANY:
-            return "ndn.Name(name_type=ndn.NAME_ANY)"
-        else:
-            raise ValueError("Name is of wrong type %d" % self.type)
-
-    def __str__(self):
-        global NAME_NORMAL, NAME_ANY
-
-        if self.type == NAME_NORMAL:
-            return _ndn.name_to_uri(self.ccn_data)
-        elif self.type == NAME_ANY:
-            return "<any>"
-        else:
-            raise ValueError("Name is of wrong type %d" % self.type)
-
-    def __len__(self):
-        return len(self.components)
-
-    def __add__(self, other):
-        return self.append(other)
-
-    def __setattr__(self, name, value):
-        raise TypeError("can't modify immutable instance")
-
-    __delattr__ = __setattr__
-
-    def __getattribute__(self, name):
-        if name == "ccn_data":
-            if object.__getattribute__(self, 'ccn_data_dirty'):
-                self._setattr('ccn_data', _ndn.name_comps_to_ccn(self.components))
-                self._setattr('ccn_data_dirty', False)
-        return object.__getattribute__(self, name)
+    def __add__ (self, other):
+        return self._name.append (other)
 
     def __getitem__(self, key):
-        if type(key) is int:
-            return self.components[key]
-        elif type(key) is slice:
-            return Name(self.components[key])
+        if type (key) is int:
+            if abs(key) < self._name.size ():
+                return self._name.get (key)
+            else:
+                raise IndexError ("index out of range")
+        elif type (key) is slice:
+            name = ns.ndnSIM.ndn.Name ()
+            for component in xrange (*key.indices (self.size ())):
+                name.append (self._name.get (component))
+            return name
         else:
-            raise ValueError("Unknown __getitem__ type: %s" % type(key))
+            raise ValueError("Unknown __getitem__ type: %s" % type (key))
 
-    # def __setitem__(self, key, value):
-    #     self.components[key] = value
+    def __repr__ (self):
+        return "ndnSIM.Name('" + self._name.toUri () + "')"
 
-    # def __delitem__(self, key):
-    #     del self.components[key]
-
-    # def __len__(self):
-    #     return len(self.components)