blob: 628b843848ddc85a392aea911156a87318c5db56 [file] [log] [blame]
Alexander Afanasyev5ba90362013-07-15 19:58:38 -07001## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
2#
3# Copyright (c) 2011-2013, Regents of the University of California
4# Alexander Afanasyev
5#
6# GNU 3.0 license, See the LICENSE file for more information
7#
8# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
9#
10
11#
12# Based on PyCCN code, copyrighted and licensed as follows
13#
14# Copyright (c) 2011-2013, Regents of the University of California
15# BSD license, See the COPYING file for more information
16# Written by: Derek Kulinski <takeda@takeda.tk>
17# Jeff Burke <jburke@ucla.edu>
18#
19
Alexander Afanasyev76b11572013-07-16 21:49:50 -070020import ns.ndnSIM
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070021
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070022class Name (object):
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070023 _name = None
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070024
Alexander Afanasyev39f53162013-07-18 16:24:31 -070025 def __init__ (self,
26 value = None,
27 name = None):
Alexander Afanasyev36f10532013-08-08 11:25:14 -070028 if name is not None:
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070029 if isinstance (name, ns.ndnSIM.ndn.Name):
Alexander Afanasyev39f53162013-07-18 16:24:31 -070030 self._name = name
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070031 elif isinstance (name, Name):
Alexander Afanasyev39f53162013-07-18 16:24:31 -070032 self._name = name._name
33 else:
34 raise TypeError ("Incorrect type for 'name' parameter [%s]" % type (name))
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070035 else:
Alexander Afanasyev36f10532013-08-08 11:25:14 -070036 if value is not None:
37 if isinstance (value, Name):
38 self._name = ns.ndnSIM.ndn.Name (value._name)
Alexander Afanasyev36f10532013-08-08 11:25:14 -070039 else:
Alexander Afanasyev7ff81b72013-08-08 21:43:16 -070040 self._name = ns.ndnSIM.ndn.Name (value)
Alexander Afanasyev39f53162013-07-18 16:24:31 -070041 else:
42 self._name = ns.ndnSIM.ndn.Name ()
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070043
Alexander Afanasyev76b11572013-07-16 21:49:50 -070044 @staticmethod
45 def fromWire (wire):
Alexander Afanasyev7992ab62013-07-19 16:50:58 -070046 return Name (name = ns.ndnSIM.ndn.Wire.ToName (wire))
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070047
Alexander Afanasyev7992ab62013-07-19 16:50:58 -070048 def toWire (self):
49 return ns.ndnSIM.ndn.Wire.FromName (self._name)
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070050
51 def append (self, value):
Alexander Afanasyev7ff81b72013-08-08 21:43:16 -070052 if isinstance (value, Name):
53 self._name.append (value._name)
54 else:
55 self._name.append (value)
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070056 return self
Alexander Afanasyev76b11572013-07-16 21:49:50 -070057
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070058 def __getattr__ (self, name):
59 return self._name.__getattribute__ (name)
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070060
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070061 def __len__ (self):
62 return self._name.size ()
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070063
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070064 def __add__ (self, other):
65 return self._name.append (other)
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070066
67 def __getitem__(self, key):
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070068 if isinstance (key, int):
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070069 if abs(key) < self._name.size ():
70 return self._name.get (key)
71 else:
72 raise IndexError ("index out of range")
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070073 elif isinstance (key, slice):
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070074 name = ns.ndnSIM.ndn.Name ()
75 for component in xrange (*key.indices (self.size ())):
76 name.append (self._name.get (component))
77 return name
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070078 else:
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070079 raise ValueError("Unknown __getitem__ type: %s" % type (key))
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070080
Alexander Afanasyev7d0a61d2013-07-17 17:33:05 -070081 def __repr__ (self):
Alexander Afanasyev40bc46d2013-08-08 01:27:12 -070082 return "ndn.Name('" + self._name.toUri () + "')"
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070083
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070084 def __str__ (self):
85 return self._name.toUri ()
Alexander Afanasyev40bc46d2013-08-08 01:27:12 -070086
Alexander Afanasyev7ff81b72013-08-08 21:43:16 -070087 def __eq__ (self, other):
88 return self._name == other._name
89
Alexander Afanasyev40bc46d2013-08-08 01:27:12 -070090 def isPrefixOf (self, other):
91 return self[:] == other[:len(self)]
Alexander Afanasyev36f10532013-08-08 11:25:14 -070092
93 @property
94 def keyName (self):
95 return self