Completed
Push — dev ( 72aa02...df6b30 )
by Olivier
06:59
created

opcua.ViewAttributes   A

Complexity

Total Complexity 1

Size/Duplication

Total Lines 5
Duplicated Lines 0 %

Test Coverage

Coverage 50%
Metric Value
wmc 1
dl 0
loc 5
ccs 2
cts 4
cp 0.5
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 3 1
1 1
import struct
2 1
import logging
3
4 1
import opcua.uaprotocol_auto as auto
5 1
import opcua.uatypes as uatypes
6 1
import opcua.utils as utils
7 1
from opcua.object_ids import ObjectIds
8 1
from opcua.attribute_ids import AttributeIds
9
10 1
logger = logging.getLogger('opcua.uaprotocol')
11
12
13 1
class AccessLevelMask(object):
14
    """
15
    used by AccessLevel and UserAccessLevel
16
    """
17 1
    CurrentRead = 0
18 1
    CurrentWrite = 1
19 1
    HistoryRead = 2
20 1
    HistoryWrite = 3
21 1
    SemanticChange = 4
22
23
24 1
class Hello(uatypes.FrozenClass):
25
26 1
    def __init__(self):
27 1
        self.ProtocolVersion = 0
28 1
        self.ReceiveBufferSize = 65536
29 1
        self.SendBufferSize = 65536
30 1
        self.MaxMessageSize = 0
31 1
        self.MaxChunkCount = 0
32 1
        self.EndpointUrl = ""
33 1
        self._freeze()
34
35 1
    def to_binary(self):
36 1
        b = []
37 1
        b.append(struct.pack("<I", self.ProtocolVersion))
38 1
        b.append(struct.pack("<I", self.ReceiveBufferSize))
39 1
        b.append(struct.pack("<I", self.SendBufferSize))
40 1
        b.append(struct.pack("<I", self.MaxMessageSize))
41 1
        b.append(struct.pack("<I", self.MaxChunkCount))
42 1
        b.append(uatypes.pack_string(self.EndpointUrl))
43 1
        return b"".join(b)
44
45 1
    @staticmethod
46
    def from_binary(data):
47 1
        hello = Hello()
48 1
        hello.ProtocolVersion = struct.unpack("<I", data.read(4))[0]
49 1
        hello.ReceiveBufferSize = struct.unpack("<I", data.read(4))[0]
50 1
        hello.SendBufferSize = struct.unpack("<I", data.read(4))[0]
51 1
        hello.MaxMessageSize = struct.unpack("<I", data.read(4))[0]
52 1
        hello.MaxChunkCount = struct.unpack("<I", data.read(4))[0]
53 1
        hello.EndpointUrl = uatypes.unpack_string(data)
54 1
        return hello
55
56
57 1
class MessageType(object):
58 1
    Invalid = b"INV"  # FIXME: check value
59 1
    Hello = b"HEL"
60 1
    Acknowledge = b"ACK"
61 1
    Error = b"ERR"
62 1
    SecureOpen = b"OPN"
63 1
    SecureClose = b"CLO"
64 1
    SecureMessage = b"MSG"
65
66
67 1
class ChunkType(object):
68 1
    Invalid = b"0"  # FIXME check
69 1
    Single = b"F"
70 1
    Intermediate = b"C"
71 1
    Final = b"A"
72
73
74 1
class Header(uatypes.FrozenClass):
75
76 1
    def __init__(self, msgType=None, chunkType=None, channelid=0):
77 1
        self.MessageType = msgType
78 1
        self.ChunkType = chunkType
79 1
        self.ChannelId = channelid
80 1
        self.body_size = 0
81 1
        self.packet_size = 0
82 1
        self._freeze()
83
84 1
    def add_size(self, size):
85 1
        self.body_size += size
86
87 1
    def to_binary(self):
88 1
        b = []
89 1
        b.append(struct.pack("<3s", self.MessageType))
90 1
        b.append(struct.pack("<s", self.ChunkType))
91 1
        size = self.body_size + 8
92 1
        if self.MessageType in (MessageType.SecureOpen, MessageType.SecureClose, MessageType.SecureMessage):
93 1
            size += 4
94 1
        b.append(struct.pack("<I", size))
95 1
        if self.MessageType in (MessageType.SecureOpen, MessageType.SecureClose, MessageType.SecureMessage):
96 1
            b.append(struct.pack("<I", self.ChannelId))
97 1
        return b"".join(b)
98
99 1
    @staticmethod
100
    def from_string(data):
101 1
        hdr = Header()
102 1
        hdr.MessageType = struct.unpack("<3s", data.read(3))[0]
103 1
        hdr.ChunkType = struct.unpack("<c", data.read(1))[0]
104 1
        hdr.packet_size = struct.unpack("<I", data.read(4))[0]
105 1
        hdr.body_size =  hdr.packet_size - 8
106 1
        if hdr.MessageType in (MessageType.SecureOpen, MessageType.SecureClose, MessageType.SecureMessage):
107 1
            hdr.body_size -= 4
108 1
            hdr.ChannelId = struct.unpack("<I", data.read(4))[0]
109 1
        return hdr
110
111 1
    def __str__(self):
112
        return "Header(type:{}, chunk_type:{}, body_size:{}, channel:{})".format(self.MessageType, self.ChunkType, self.body_size, self.ChannelId)
113 1
    __repr__ = __str__
114
115
116 1
class ErrorMessage(uatypes.FrozenClass):
117
118 1
    def __init__(self):
119
        self.Error = uatypes.StatusCode()
120
        self.Reason = ""
121
        self._freeze()
122
123 1
    def to_binary(self):
124
        b = []
125
        b.append(self.Error.to_binary())
126
        b.append(uatypes.pack_string(self.Reason))
127
        return b"".join(b)
128
129 1
    @staticmethod
130
    def from_binary(data):
131
        ack = ErrorMessage()
132
        ack.Error = uatypes.StatusCode.from_binary(data)
133
        ack.Reason = uatypes.unpack_string(data)
134
        return ack
135
136 1
    def __str__(self):
137
        return "MessageAbort(error:{}, reason:{})".format(self.Error, self.Reason)
138 1
    __repr__ = __str__
139
140
141 1
class Acknowledge(uatypes.FrozenClass):
142
143 1
    def __init__(self):
144 1
        self.ProtocolVersion = 0
145 1
        self.ReceiveBufferSize = 65536
146 1
        self.SendBufferSize = 65536
147 1
        self.MaxMessageSize = 0  # No limits
148 1
        self.MaxChunkCount = 0  # No limits
149 1
        self._freeze()
150
151 1
    def to_binary(self):
152 1
        b = []
153 1
        b.append(struct.pack("<I", self.ProtocolVersion))
154 1
        b.append(struct.pack("<I", self.ReceiveBufferSize))
155 1
        b.append(struct.pack("<I", self.SendBufferSize))
156 1
        b.append(struct.pack("<I", self.MaxMessageSize))
157 1
        b.append(struct.pack("<I", self.MaxChunkCount))
158 1
        return b"".join(b)
159
160 1
    @staticmethod
161
    def from_binary(data):
162 1
        ack = Acknowledge()
163 1
        ack.ProtocolVersion = struct.unpack("<I", data.read(4))[0]
164 1
        ack.ReceiveBufferSize = struct.unpack("<I", data.read(4))[0]
165 1
        ack.SendBufferSize = struct.unpack("<I", data.read(4))[0]
166 1
        ack.MaxMessageSize = struct.unpack("<I", data.read(4))[0]
167 1
        ack.MaxChunkCount = struct.unpack("<I", data.read(4))[0]
168 1
        return ack
169
170
171 1
class AsymmetricAlgorithmHeader(uatypes.FrozenClass):
172
173 1
    def __init__(self):
174 1
        self.SecurityPolicyURI = "http://opcfoundation.org/UA/SecurityPolicy#None"
175 1
        self.SenderCertificate = b""
176 1
        self.ReceiverCertificateThumbPrint = b""
177 1
        self._freeze()
178
179 1
    def to_binary(self):
180 1
        b = []
181 1
        b.append(uatypes.pack_string(self.SecurityPolicyURI))
182 1
        b.append(uatypes.pack_string(self.SenderCertificate))
183 1
        b.append(uatypes.pack_string(self.ReceiverCertificateThumbPrint))
184 1
        return b"".join(b)
185
186 1
    @staticmethod
187
    def from_binary(data):
188 1
        hdr = AsymmetricAlgorithmHeader()
189 1
        hdr.SecurityPolicyURI = uatypes.unpack_bytes(data)
190 1
        hdr.SenderCertificate = uatypes.unpack_bytes(data)
191 1
        hdr.ReceiverCertificateThumbPrint = uatypes.unpack_bytes(data)
192 1
        return hdr
193
194 1
    def __str__(self):
195
        return "{}(SecurytyPolicy:{}, certificatesize:{}, receiverCertificatesize:{} )".format(self.__class__.__name__, self.SecurityPolicyURI, len(self.SenderCertificate), len(self.ReceiverCertificateThumbPrint))
196 1
    __repr__ = __str__
197
198
199 1
class SymmetricAlgorithmHeader(uatypes.FrozenClass):
200
201 1
    def __init__(self):
202 1
        self.TokenId = 0
203 1
        self._freeze()
204
205 1
    @staticmethod
206
    def from_binary(data):
207 1
        obj = SymmetricAlgorithmHeader()
208 1
        obj.TokenId = struct.unpack("<I", data.read(4))[0]
209 1
        return obj
210
211 1
    def to_binary(self):
212 1
        return struct.pack("<I", self.TokenId)
213
214 1
    def __str__(self):
215
        return "{}(TokenId:{} )".format(self.__class__.__name__, self.TokenId)
216 1
    __repr__ = __str__
217
218
219 1
class SequenceHeader(uatypes.FrozenClass):
220
221 1
    def __init__(self):
222 1
        self.SequenceNumber = None
223 1
        self.RequestId = None
224 1
        self._freeze()
225
226 1
    @staticmethod
227
    def from_binary(data):
228 1
        obj = SequenceHeader()
229 1
        obj.SequenceNumber = struct.unpack("<I", data.read(4))[0]
230 1
        obj.RequestId = struct.unpack("<I", data.read(4))[0]
231 1
        return obj
232
233 1
    def to_binary(self):
234 1
        b = []
235 1
        b.append(struct.pack("<I", self.SequenceNumber))
236 1
        b.append(struct.pack("<I", self.RequestId))
237 1
        return b"".join(b)
238
239 1
    def __str__(self):
240
        return "{}(SequenceNumber:{}, RequestId:{} )".format(self.__class__.__name__, self.SequenceNumber, self.RequestId)
241 1
    __repr__ = __str__
242
243
# FIXES for missing switchfield in NodeAttributes classes
244 1
ana = auto.NodeAttributesMask
245
246
247 1
class ObjectAttributes(auto.ObjectAttributes):
248
249 1
    def __init__(self):
250 1
        auto.ObjectAttributes.__init__(self)
251 1
        self.SpecifiedAttributes = ana.DisplayName | ana.Description | ana.WriteMask | ana.UserWriteMask | ana.EventNotifier
252
253
254 1
class ObjectTypeAttributes(auto.ObjectTypeAttributes):
255
256 1
    def __init__(self):
257 1
        auto.ObjectTypeAttributes.__init__(self)
258 1
        self.SpecifiedAttributes = ana.DisplayName | ana.Description | ana.WriteMask | ana.UserWriteMask | ana.IsAbstract
259
260
261 1
class VariableAttributes(auto.VariableAttributes):
262
263 1
    def __init__(self):
264 1
        auto.VariableAttributes.__init__(self)
265 1
        self.SpecifiedAttributes = ana.DisplayName | ana.Description | ana.WriteMask | ana.UserWriteMask | ana.Value | ana.DataType | ana.ValueRank | ana.ArrayDimensions | ana.AccessLevel | ana.UserAccessLevel | ana.MinimumSamplingInterval | ana.Historizing
266 1
        self.Historizing = False
267
268
269 1
class VariableTypeAttributes(auto.VariableTypeAttributes):
270
271 1
    def __init__(self):
272 1
        auto.VariableTypeAttributes.__init__(self)
273 1
        self.SpecifiedAttributes = ana.DisplayName | ana.Description | ana.WriteMask | ana.UserWriteMask | ana.Value | ana.DataType | ana.ValueRank | ana.ArrayDimensions | ana.IsAbstract
274
275
276 1
class MethodAttributes(auto.MethodAttributes):
277
278 1
    def __init__(self):
279 1
        auto.MethodAttributes.__init__(self)
280 1
        self.SpecifiedAttributes = ana.DisplayName | ana.Description | ana.WriteMask | ana.UserWriteMask | ana.Executable | ana.UserExecutable
281
282
283 1
class ReferenceTypeAttributes(auto.ReferenceTypeAttributes):
284
285 1
    def __init__(self):
286 1
        auto.ReferenceTypeAttributes.__init__(self)
287 1
        self.SpecifiedAttributes = ana.DisplayName | ana.Description | ana.WriteMask | ana.UserWriteMask | ana.IsAbstract | ana.Symmetric | ana.InverseName
288
289
290 1
class DataTypeAttributes(auto.DataTypeAttributes):
291
292 1
    def __init__(self):
293 1
        auto.DataTypeAttributes.__init__(self)
294 1
        self.SpecifiedAttributes = ana.DisplayName | ana.Description | ana.WriteMask | ana.UserWriteMask | ana.IsAbstract
295
296
297 1
class ViewAttributes(auto.ViewAttributes):
298
299 1
    def __init__(self):
300
        auto.ViewAttributes.__init__(self)
301
        self.SpecifiedAttributes = ana.DisplayName | ana.Description | ana.WriteMask | ana.UserWriteMask | ana.ContainsNoLoops | ana.EventNotifier
302
303
304 1
class Argument(auto.Argument):
305
306 1
    def __init__(self):
307 1
        auto.Argument.__init__(self)
308 1
        self.ValueRank = -2
309
310
311 1
ObjectIdsInv = {v: k for k, v in ObjectIds.__dict__.items()}
312
AttributeIdsInv = {v: k for k, v in AttributeIds.__dict__.items()}
313