1
# NamedType specification for constructed types
2
from pyasn1 import error
7
def __init__(self, name, t):
8
self.__name = name; self.__type = t
9
def __repr__(self): return '%s(%s, %s)' % (
10
self.__class__.__name__, repr(self.__name), repr(self.__type)
12
def getType(self): return self.__type
13
def getName(self): return self.__name
14
def __getitem__(self, idx):
15
if idx == 0: return self.__name
16
if idx == 1: return self.__type
19
class OptionalNamedType(NamedType):
21
class DefaultedNamedType(NamedType):
25
def __init__(self, *namedTypes):
26
self.__namedTypes = namedTypes
27
self.__minTagSet = None
28
self.__typeMap = {}; self.__tagMap = {}; self.__nameMap = {}
29
self.__ambigiousTypes = {}
32
r = '%s(' % self.__class__.__name__
33
for n in self.__namedTypes:
34
r = r + '%s, ' % repr(n)
37
def __getitem__(self, idx): return self.__namedTypes[idx]
39
def __nonzero__(self):
40
if self.__namedTypes: return 1
42
def __len__(self): return len(self.__namedTypes)
44
def getTypeByPosition(self, idx):
46
return self.__namedTypes[idx].getType()
48
raise error.PyAsn1Error('Type position out of range')
49
def getPositionByType(self, tagSet):
51
idx = len(self.__namedTypes)
54
for t in self.__namedTypes[idx].getType().getTypeMap().keys():
55
if self.__tagMap.has_key(t):
56
raise error.PyAsn1Error('Duplicate type %s' % t)
57
self.__tagMap[t] = idx
59
return self.__tagMap[tagSet]
61
raise error.PyAsn1Error('Type %s not found' % tagSet)
63
def getNameByPosition(self, idx):
65
return self.__namedTypes[idx].getName()
67
raise error.PyAsn1Error('Type position out of range')
68
def getPositionByName(self, name):
69
if not self.__nameMap:
70
idx = len(self.__namedTypes)
73
n = self.__namedTypes[idx].getName()
74
if self.__nameMap.has_key(n):
75
raise error.PyAsn1Error('Duplicate name %s' % n)
76
self.__nameMap[n] = idx
78
return self.__nameMap[name]
80
raise error.PyAsn1Error('Name %s not found' % name)
82
def __buildAmbigiousTagMap(self):
84
idx = len(self.__namedTypes)
87
t = self.__namedTypes[idx]
88
if t.isOptional or t.isDefaulted:
89
ambigiousTypes = (t, ) + ambigiousTypes
91
ambigiousTypes = (t, )
92
self.__ambigiousTypes[idx] = apply(NamedTypes, ambigiousTypes)
94
def getTypeMapNearPosition(self, idx):
95
if not self.__ambigiousTypes: self.__buildAmbigiousTagMap()
97
return self.__ambigiousTypes[idx].getTypeMap()
99
raise error.PyAsn1Error('Type position out of range')
101
def getPositionNearType(self, tagSet, idx):
102
if not self.__ambigiousTypes: self.__buildAmbigiousTagMap()
104
return idx+self.__ambigiousTypes[idx].getPositionByType(tagSet)
106
raise error.PyAsn1Error('Type position out of range')
108
def genMinTagSet(self):
109
if self.__minTagSet is None:
110
for t in self.__namedTypes:
112
tagSet = getattr(__type,'getMinTagSet',__type.getTagSet)()
113
if self.__minTagSet is None or tagSet < self.__minTagSet:
114
self.__minTagSet = tagSet
115
return self.__minTagSet
117
def getTypeMap(self, uniq=None):
118
if not self.__typeMap:
119
for t in self.__namedTypes:
121
typeMap = __type.getTypeMap()
123
for k in typeMap.keys():
124
if self.__typeMap.has_key(k):
125
raise error.PyAsn1Error(
126
'Duplicate type %s in map %s'%(k,self.__typeMap)
128
self.__typeMap[k] = __type
130
for k in typeMap.keys():
131
self.__typeMap[k] = __type
132
return self.__typeMap