~ubuntu-branches/debian/sid/pyasn1/sid

« back to all changes in this revision

Viewing changes to pyasn1/v1/type/namedtype.py

  • Committer: Bazaar Package Importer
  • Author(s): Deepak Tripathi, Arnaud Fontaine
  • Date: 2010-05-14 16:30:27 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20100514163027-62z2n5f1u8xsp7hi
Tags: 0.0.11a-1
* New upstream release (Closes: #579556).
* Bumped Standard version to 3.8.4 (No changes).
* debian/control:
  + Added myself to Uploaders.
  + Added ${misc:Depends}.
  + Aemoved python-dev and added python.
* debian/copyright
  + Added debian's copyright information.
  + Formated and updated copy information.
* Added debian/python-pyasn1.doc-base.
* debian/source:
  + Switch to dpkg-source 3.0 (quilt) format.
 
[Arnaud Fontaine] 
* debian/control:
   + Remove myself from Maintainer as Jan Lübbe is now the maintainer.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# NamedType specification for constructed types
2
 
from pyasn1 import error
3
 
 
4
 
class NamedType:
5
 
    isOptional = 0
6
 
    isDefaulted = 0
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)
11
 
        )
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
17
 
        raise IndexError()
18
 
    
19
 
class OptionalNamedType(NamedType):
20
 
    isOptional = 1
21
 
class DefaultedNamedType(NamedType):
22
 
    isDefaulted = 1
23
 
    
24
 
class NamedTypes:
25
 
    def __init__(self, *namedTypes):
26
 
        self.__namedTypes = namedTypes
27
 
        self.__minTagSet = None
28
 
        self.__typeMap = {}; self.__tagMap = {}; self.__nameMap = {}
29
 
        self.__ambigiousTypes = {}
30
 
 
31
 
    def __repr__(self):
32
 
        r = '%s(' % self.__class__.__name__
33
 
        for n in self.__namedTypes:
34
 
            r = r + '%s, ' % repr(n)
35
 
        return r + ')'
36
 
    
37
 
    def __getitem__(self, idx): return self.__namedTypes[idx]
38
 
 
39
 
    def __nonzero__(self):
40
 
        if self.__namedTypes: return 1
41
 
        else: return 0
42
 
    def __len__(self): return len(self.__namedTypes)
43
 
    
44
 
    def getTypeByPosition(self, idx):
45
 
        try:
46
 
            return self.__namedTypes[idx].getType()
47
 
        except IndexError:
48
 
            raise error.PyAsn1Error('Type position out of range')
49
 
    def getPositionByType(self, tagSet):
50
 
        if not self.__tagMap:
51
 
            idx = len(self.__namedTypes)
52
 
            while idx > 0:
53
 
                idx = idx - 1
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
58
 
        try:
59
 
            return self.__tagMap[tagSet]
60
 
        except KeyError:
61
 
            raise error.PyAsn1Error('Type %s not found' % tagSet)
62
 
        
63
 
    def getNameByPosition(self, idx):
64
 
        try:
65
 
            return self.__namedTypes[idx].getName()
66
 
        except IndexError:
67
 
            raise error.PyAsn1Error('Type position out of range')
68
 
    def getPositionByName(self, name):
69
 
        if not self.__nameMap:
70
 
            idx = len(self.__namedTypes)
71
 
            while idx > 0:
72
 
                idx = idx - 1
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
77
 
        try:
78
 
            return self.__nameMap[name]
79
 
        except KeyError:
80
 
            raise error.PyAsn1Error('Name %s not found' % name)
81
 
 
82
 
    def __buildAmbigiousTagMap(self):
83
 
        ambigiousTypes = ()
84
 
        idx = len(self.__namedTypes)
85
 
        while idx > 0:
86
 
            idx = idx - 1
87
 
            t = self.__namedTypes[idx]
88
 
            if t.isOptional or t.isDefaulted:
89
 
                ambigiousTypes = (t, ) + ambigiousTypes
90
 
            else:
91
 
                ambigiousTypes = (t, )
92
 
            self.__ambigiousTypes[idx] = apply(NamedTypes, ambigiousTypes)
93
 
        
94
 
    def getTypeMapNearPosition(self, idx):
95
 
        if not self.__ambigiousTypes: self.__buildAmbigiousTagMap()
96
 
        try:
97
 
            return self.__ambigiousTypes[idx].getTypeMap()
98
 
        except KeyError:
99
 
            raise error.PyAsn1Error('Type position out of range')
100
 
 
101
 
    def getPositionNearType(self, tagSet, idx):
102
 
        if not self.__ambigiousTypes: self.__buildAmbigiousTagMap()
103
 
        try:
104
 
            return idx+self.__ambigiousTypes[idx].getPositionByType(tagSet)
105
 
        except KeyError:
106
 
            raise error.PyAsn1Error('Type position out of range')
107
 
 
108
 
    def genMinTagSet(self):
109
 
        if self.__minTagSet is None:
110
 
            for t in self.__namedTypes:
111
 
                __type = t.getType()
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
116
 
    
117
 
    def getTypeMap(self, uniq=None):
118
 
        if not self.__typeMap:
119
 
            for t in self.__namedTypes:
120
 
                __type = t.getType()
121
 
                typeMap = __type.getTypeMap()
122
 
                if uniq:
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)
127
 
                                )
128
 
                        self.__typeMap[k] = __type
129
 
                else:
130
 
                    for k in typeMap.keys():
131
 
                        self.__typeMap[k] = __type
132
 
        return self.__typeMap