9 NetMsgs Run-Time Library Packing and Unpacking Stream Buffer Module. 76 import NetMsgsBase
as nmBase
77 from NetMsgsLib
import *
80 space =
lambda indent:
"%*s" % (indent,
'')
86 """ RoadNarrows Net Messages Stream Buffer Virtual Base Class. 88 NetMsgsStreamBuf supports serialized packing and de-serialized 89 unpacking of a registered set of message definitions. 91 Packing and unpacking operations are multi-thread safe. 96 """ Initialize NetMsgsStreamBuf instance. 99 msgdefset - Set of message definitions. 100 kwargs - Optional keyword arguments. 101 msgsetname=str - Name. Default: "MessageSet" 102 encoding=val - Message stream encoding. 104 endian=val - Byte ordering. Default: big 105 nowarn=bool - Disable warnings. Default: False. 106 trace=bool - Trace packing/unpacking. 138 warnings.simplefilter(
'ignore', RuntimeWarning)
151 nmBase.NMFCode(
'pad'):
153 nmBase.NMFCode(
'char'):
155 nmBase.NMFCode(
'u8'):
157 nmBase.NMFCode(
's8'):
159 nmBase.NMFCode(
'bool'):
161 nmBase.NMFCode(
'u16'):
163 nmBase.NMFCode(
's16'):
165 nmBase.NMFCode(
'u32'):
167 nmBase.NMFCode(
's32'):
169 nmBase.NMFCode(
'u64'):
171 nmBase.NMFCode(
's64'):
173 nmBase.NMFCode(
'f32'):
175 nmBase.NMFCode(
'f64'):
177 nmBase.NMFCode(
'p32'):
179 nmBase.NMFCode(
'p64'):
181 nmBase.NMFCode(
'string'):
183 nmBase.NMFCode(
'struct'):
185 nmBase.NMFCode(
'vector'):
192 """ Optimize message definition set for packing and unpacking. """ 193 for msgid, msgdef
in self.mMsgDefSet.iteritems():
199 """ Optimize message definition for packing and unpacking. 203 msgdef - Message definition. 205 if type(msgid) != int:
206 self.
Error(
"msgid=%s" % repr(msgid), EMsgBadId)
207 if not msgdef.has_key(
'name'):
208 msgdef[
'name'] =
"Msg%s" % repr(msgid)
209 msgdef[
'msgid'] = msgid
211 epreface=
"MsgDef %s" % (msgdef[
'name']))
213 for fielddef
in fdeflist:
215 if fielddef[
'disposition'] ==
'active':
217 msgdef[
'max_count'] = max_count
222 """ Optimize field definition for packing and unpacking. 225 fielddef - Field definition. 227 fname = self.
GetDefReqVal(fielddef,
'name', epreface=
"FieldDef")
228 fid = self.
GetDefReqVal(fielddef,
'fid', epreface=
"FieldDef")
229 ftype = self.
GetDefReqVal(fielddef,
'ftype', epreface=
"FieldDef")
230 if not fielddef.has_key(
'disposition'):
231 fielddef[
'disposition'] =
'active' 232 if fielddef[
'disposition'] ==
'deprecated':
234 if ftype == nmBase.NMFCode(
'pad'):
235 if not fielddef.has_key(
'count'):
236 fielddef[
'count'] = nmBase.NMPadDftCount
237 elif ftype == nmBase.NMFCode(
'string'):
238 if not fielddef.has_key(
'max_count'):
239 fielddef[
'max_count'] = nmBase.NMStringMaxCount
240 elif ftype == nmBase.NMFCode(
'vector'):
241 if not fielddef.has_key(
'max_count'):
242 fielddef[
'max_count'] = nmBase.NMVectorMaxCount
243 vdef = self.
GetDefReqVal(fielddef,
'vdef', epreface=
"FieldDef")
244 if not vdef.has_key(
'name'):
245 vdef[
'name'] =
"%s_item" % fname
248 elif ftype == nmBase.NMFCode(
'struct'):
249 msgdef = self.
GetDefReqVal(fielddef,
'msgdef', epreface=
"FieldDef")
250 if not msgdef.has_key(
'name'):
251 msgdef[
'name'] =
"%s_struct" % fname
263 """ Add/Overwrite message definition to set. 266 msgid - Unique message identifier number. 267 msgdef - Message definition. 275 """ Delete message definition from set. 278 msgid - Unique message identifier number. 283 self.
Error(repr(msgid), EMsgNoMsgDef)
288 """ Set message packing and unpack field byte order. 291 endian - Byte order. One of: big little native 293 if endian
in nmBase.NMEndian:
297 self.
Error(
"endian=%s" % (endian), EMsgEndian)
307 """ Create a new packing/unpacking operational state. 309 The operational state contains message information plus a stack of 310 current field processing states. Each field state has header, 311 control, run-time determined values, and tracing parameters. 315 op - Operation string. One of: 'pack', 'unpack'. 316 kwargs - Optional initial state overrides and implementation 320 State id which is a key into the specific state. 323 stateId = self.mStateId.next()
332 'fctl': {
'has_hdr':
False,
'noexec':
False},
337 'trace': {
'trace_depth':0,
'trace_start':0,
'trace_end':
None},
344 for k,v
in kwargs.iteritems():
355 """ Delete operational state. 360 if stateId
is not None:
366 """ Get state value at key path. 369 keypath - Optional list of key arguments. 375 return self.
mState[stateId][key]
380 """ Set a list of state values at key path. 383 keypath - Optional list of key arguments. 384 kwargs - List of key=value arguments. 389 for k,v
in kwargs.iteritems():
395 """ Push new field state onto stack. 399 kwargs - Optional initial field state overrides and 400 implementation specifics. 402 parent = self.
mState[stateId][
'fstack'][-1]
406 d[
'fpar'] = parent[
'ftype']
407 d[
'fctl'] = parent[
'fctl'].copy()
412 d[
'trace'] = {
'trace_depth': parent[
'trace'][
'trace_depth']+1,
418 for k,v
in kwargs.iteritems():
422 self.
mState[stateId][
'fstack'] += [d]
427 """ Pop field state stack - deleting top state. 432 self.
mState[stateId][
'fstack'].pop()
437 """ Get top of field stack state value at key path. 440 keypath - Optional list of key arguments. 442 v = self.
mState[stateId][
'fstack'][-1]
450 """ Set a list of top of field stack state values at key path. 453 keypath - Optional list of key arguments. 454 kwargs - List of key=value arguments. 456 d = self.
mState[stateId][
'fstack'][-1]
459 for k,v
in kwargs.iteritems():
470 """ Pack field header. 472 No header is packed in base function. 475 fielddef - Field definition. 476 val - Field value(s). 477 stateId - Packing state id. 488 """ Pack pad byte(s). 490 Count pad bytes are packed. 493 fielddef - Field definition. 494 val - Field value(s) - ignored. 495 stateId - Packing state id. 500 count = fielddef[
'count']
514 """ Pack boolean field. 517 fielddef - Field definition. 519 stateId - Packing state id. 532 """ Pack one character field. 535 fielddef - Field definition. 537 stateId - Packing state id. 550 """ Pack 8-bit unsigned integer field. 553 fielddef - Field definition. 555 stateId - Packing state id. 568 """ Pack 8-bit signed integer field. 571 fielddef - Field definition. 573 stateId - Packing state id. 586 """ Pack 16-bit unsigned integer field. 589 fielddef - Field definition. 591 stateId - Packing state id. 604 """ Pack 16-bit signed integer field. 607 fielddef - Field definition. 609 stateId - Packing state id. 622 """ Pack 32-bit unsigned integer field. 625 fielddef - Field definition. 627 stateId - Packing state id. 640 """ Pack 32-bit signed integer field. 643 fielddef - Field definition. 645 stateId - Packing state id. 658 """ Pack 64-bit unsigned integer field. 661 fielddef - Field definition. 663 stateId - Packing state id. 676 """ Pack 64-bit signed integer field. 679 fielddef - Field definition. 681 stateId - Packing state id. 694 """ Pack 32-bit floating-point number field. 697 fielddef - Field definition. 699 stateId - Packing state id. 712 """ Pack 64-bit floating-point number field. 715 fielddef - Field definition. 717 stateId - Packing state id. 730 """ Pack 32-bit pointer field. 732 Pointer is always packed in natvie byte order. 735 fielddef - Field definition. 737 stateId - Packing state id. 750 """ Pack 64-bit pointer field. 752 Pointer is always packed in natvie byte order. 755 fielddef - Field definition. 757 stateId - Packing state id. 770 """ Pack variable length string into fixed-size field. 772 Field length is fixed max_count bytes. If length of string is less 773 than max_count, the value is right padded with zeros. 776 fielddef - Field definition. 778 stateId - Packing state id. 785 max_count = fielddef[
'max_count']
786 if count > max_count:
787 self.
Error(
"%s" % fielddef[
'name'],
788 "%s %u > %u" % (EMsgStringRange, count, max_count),
799 """ Pack structure field. 802 fielddef - Field definition. 803 fvals - Dictionary of associated field values. 804 stateId - Packing state id. 810 msgdef = fielddef[
'msgdef']
811 max_count = msgdef[
'max_count']
821 """ Pack variable vector into fixed-size field. 823 Vector length is fixed max_count bytes. If length is less than 824 max_count, the value is right padded with vector items of zero value. 827 fielddef - Field definition. 828 vallist - Vector (list) of vector item values. 829 stateId - Packing state id. 835 vdef = fielddef[
'vdef']
837 vtype = vdef[
'ftype']
839 max_count = fielddef[
'max_count']
840 if count > max_count:
841 self.
Error(
"%s" % fielddef[
'name'],
842 "%s %u > %u" % (EMsgVectorRange, count, max_count),
853 val = setfunc(vdef, val, stateId)
854 buf += packfunc(vdef, val, stateId)
859 buf += packfunc(vdef, zval, stateId)
867 """ Pack a stream of fields. 870 msgdef - Message definition. 871 fvals - Dictionary of associated field values. 872 stateId - Packing state id. 877 msgname = msgdef[
'name']
878 fdeflist = msgdef[
'fielddef']
879 count = len(fdeflist)
880 max_count = msgdef[
'max_count']
885 fielddef = fdeflist[i]
886 fname = fielddef[
'name']
887 fid = fielddef[
'fid']
888 ftype = fielddef[
'ftype']
889 if ftype == nmBase.NMFCode(
'pad'):
892 val = fvals.get(fname,
None)
903 """ Pack message header. 905 No header is packed in base function. 908 msgid - Message identifier. 909 msgdef - Message definition. 910 stateId - Packing state id. 924 msgid - Message identifier. 925 fvals - Dictionary of associated field values. 933 self.
Error(
"MsgDefSet", repr(msgid), EMsgNoMsgDef)
934 stateId = self.
StateNew(msgid,
'pack')
936 max_count = msgdef[
'max_count']
937 self.
StateSet(stateId, field_count=max_count)
952 """ Unpack field header. 954 No header is unpacked in base function. 957 buf - Buffer to unpack. 958 offset - Buffer offset where unpacking begins. 959 stateId - Unpacking state id. 970 """ Unpack fixed number of pad bytes from the buffer. 972 No field values are set. 975 fielddef - Field definition. 976 buf - Buffer to unpack. 977 offset - Buffer offset where unpacking begins. 978 fvals - Dictionary to hold unpacked field values. 979 stateId - Unpacking state id. 984 count = fielddef[
'count']
985 if len(buf[offset:]) >= count:
988 nmBase.NetMsgsError(
"unpack pad", EMsgNoMem,
989 "count=%u > buf_size=%u" % (count, len(buf[offset:])),
999 """ Unpack boolean field from the buffer. 1002 fielddef - Field definition. 1003 buf - Buffer to unpack. 1004 offset - Buffer offset where unpacking begins. 1005 fvals - Dictionary to hold unpacked field values. 1006 stateId - Unpacking state id. 1011 fname = fielddef[
'name']
1022 """ Unpack one character field from the buffer. 1025 fielddef - Field definition. 1026 buf - Buffer to unpack. 1027 offset - Buffer offset where unpacking begins. 1028 fvals - Dictionary to hold unpacked field values. 1029 stateId - Unpacking state id. 1034 fname = fielddef[
'name']
1045 """ Unpack 8-bit unsigned integer field from the buffer. 1048 fielddef - Field definition. 1049 buf - Buffer to unpack. 1050 offset - Buffer offset where unpacking begins. 1051 fvals - Dictionary to hold unpacked field values. 1052 stateId - Unpacking state id. 1057 fname = fielddef[
'name']
1068 """ Unpack 8-bit signed integer field from the buffer. 1071 fielddef - Field definition. 1072 buf - Buffer to unpack. 1073 offset - Buffer offset where unpacking begins. 1074 fvals - Dictionary to hold unpacked field values. 1075 stateId - Unpacking state id. 1080 fname = fielddef[
'name']
1091 """ Unpack 16-bit unsigned integer field from the buffer. 1094 fielddef - Field definition. 1095 buf - Buffer to unpack. 1096 offset - Buffer offset where unpacking begins. 1097 fvals - Dictionary to hold unpacked field values. 1098 stateId - Unpacking state id. 1103 fname = fielddef[
'name']
1114 """ Unpack 16-bit signed integer field from the buffer. 1117 fielddef - Field definition. 1118 buf - Buffer to unpack. 1119 offset - Buffer offset where unpacking begins. 1120 fvals - Dictionary to hold unpacked field values. 1121 stateId - Unpacking state id. 1126 fname = fielddef[
'name']
1137 """ Unpack 32-bit unsigned integer field from the buffer. 1140 fielddef - Field definition. 1141 buf - Buffer to unpack. 1142 offset - Buffer offset where unpacking begins. 1143 fvals - Dictionary to hold unpacked field values. 1144 stateId - Unpacking state id. 1149 fname = fielddef[
'name']
1160 """ Unpack 32-bit signed integer field from the buffer. 1163 fielddef - Field definition. 1164 buf - Buffer to unpack. 1165 offset - Buffer offset where unpacking begins. 1166 fvals - Dictionary to hold unpacked field values. 1167 stateId - Unpacking state id. 1172 fname = fielddef[
'name']
1183 """ Unpack 64-bit unsigned integer field from the buffer. 1186 fielddef - Field definition. 1187 buf - Buffer to unpack. 1188 offset - Buffer offset where unpacking begins. 1189 fvals - Dictionary to hold unpacked field values. 1190 stateId - Unpacking state id. 1195 fname = fielddef[
'name']
1206 """ Unpack 64-bit signed integer field from the buffer. 1209 fielddef - Field definition. 1210 buf - Buffer to unpack. 1211 offset - Buffer offset where unpacking begins. 1212 fvals - Dictionary to hold unpacked field values. 1213 stateId - Unpacking state id. 1218 fname = fielddef[
'name']
1229 """ Unpack 32-bit floating-point number field from the buffer. 1232 fielddef - Field definition. 1233 buf - Buffer to unpack. 1234 offset - Buffer offset where unpacking begins. 1235 fvals - Dictionary to hold unpacked field values. 1236 stateId - Unpacking state id. 1241 fname = fielddef[
'name']
1252 """ Unpack 64-bit floating-point number field from the buffer. 1255 fielddef - Field definition. 1256 buf - Buffer to unpack. 1257 offset - Buffer offset where unpacking begins. 1258 fvals - Dictionary to hold unpacked field values. 1259 stateId - Unpacking state id. 1264 fname = fielddef[
'name']
1275 """ Unpack 32-bit pointer field from the buffer. 1277 Pointers are unpacked in native byte order. 1280 fielddef - Field definition. 1281 buf - Buffer to unpack. 1282 offset - Buffer offset where unpacking begins. 1283 fvals - Dictionary to hold unpacked field values. 1284 stateId - Unpacking state id. 1289 fname = fielddef[
'name']
1300 """ Unpack 64-bit pointer field from the buffer. 1302 Pointers are unpacked in native byte order. 1305 fielddef - Field definition. 1306 buf - Buffer to unpack. 1307 offset - Buffer offset where unpacking begins. 1308 fvals - Dictionary to hold unpacked field values. 1309 stateId - Unpacking state id. 1314 fname = fielddef[
'name']
1325 """ Unpack fixed-size string field from the buffer. 1328 fielddef - Field definition. 1329 buf - Buffer to unpack. 1330 offset - Buffer offset where unpacking begins. 1331 fvals - Dictionary to hold unpacked field values. 1332 stateId - Unpacking state id. 1337 fname = fielddef[
'name']
1338 max_count = fielddef[
'max_count']
1339 val, offset =
UnpackString(buf, max_count, offset=offset)
1340 val = val.rstrip(
'\x00')
1351 """ Unpack structure field from the buffer. 1354 fielddef - Field definition. 1355 buf - Buffer to unpack. 1356 offset - Buffer offset where unpacking begins. 1357 fvals - Dictionary to hold unpacked field values. 1358 stateId - Unpacking state id. 1363 fname = fielddef[
'name']
1364 msgdef = fielddef[
'msgdef']
1365 max_count = msgdef[
'max_count']
1379 """ Unpack fixed-size vector field from the buffer. 1381 The unpacked vector length is a fixed max_count items. 1384 fielddef - Field definition. 1385 buf - Buffer to unpack. 1386 offset - Buffer offset where unpacking begins. 1387 fvals - Dictionary to hold unpacked field values. 1388 stateId - Unpacking state id. 1393 fname = fielddef[
'name']
1394 vdef = fielddef[
'vdef']
1395 vname = vdef[
'name']
1396 vtype = vdef[
'ftype']
1397 max_count = fielddef[
'max_count']
1410 while i < max_count:
1413 offset = unpackfunc(vdef, buf, offset, vval, stateId)
1414 val += [vval[vname]]
1423 """ Unpack a field stream from the buffer. 1426 msgdef - Message definition. 1427 buf - Buffer to unpack. 1428 offset - Buffer offset where unpacking begins. 1429 stateId - Unpacking state id. 1434 msgname = msgdef[
'name']
1435 fdeflist = msgdef[
'fielddef']
1436 max_count = msgdef[
'max_count']
1437 count = len(fdeflist)
1441 fielddef = fdeflist[i]
1442 fname = fielddef[
'name']
1443 fid = fielddef[
'fid']
1444 ftype = fielddef[
'ftype']
1450 offset = unpackfunc(fielddef, buf, offset, fvals, stateId)
1459 """ Unpack message header. 1461 No header is unpacked in base function. 1464 msgid - Message identifier. 1465 msgdef - Message definition. 1466 buf - Buffer to unpack. 1467 offset - Buffer offset where unpacking begins. 1468 fvals - Dictionary to hold unpacked field values. 1469 stateId - Unpacking state id. 1480 """ Unpack a message from the buffer. 1483 msgid - Message identifier. 1484 buf - Buffer to unpack. 1485 fvals - Dictionary to hold unpacked field values. 1488 Number of bytes unpacked. 1493 self.
Error(
"MsgDefSet", repr(msgid), EMsgNoMsgDef)
1494 stateId = self.
StateNew(msgid,
'unpack')
1496 offset = self.
nmUnpackMsgHdr(msgid, msgdef, buf, offset, fvals, stateId)
1499 self.
TraceStart(
"Unpacking", msgid, msgdef, buf, stateId)
1501 offset = self.
nmUnpackStream(msgdef, buf, offset, fvals, stateId)
1513 """ Identity function. 1516 fielddef - Field definition. 1524 self.
Error(
"%s" % fielddef[
'name'], EMsgNoFVal, stateId=stateId)
1530 """ Set [un]signed integer value and check any contraints. 1533 fielddef - Field definition. 1534 val - Integer field value. 1538 (Converted) field value. 1540 val = fielddef.get(
'const', val)
1542 self.
Error(
"%s" % fielddef[
'name'], EMsgNoFVal, stateId=stateId)
1543 min = fielddef.get(
'min', val)
1544 max = fielddef.get(
'max', val)
1545 if (val < min)
or (val > max):
1546 self.
Error(
"%s=%s" % (fielddef[
'name'], repr(val)),
1547 "%s %s <= number <= %s" % (EMsgIntRange, repr(min), repr(max)),
1554 """ Set floating-point number value and check any contraints. 1557 fielddef - Field definition. 1558 val - FPN field value. 1562 (Converted) field value. 1564 val = fielddef.get(
'const', val)
1566 self.
Error(
"%s" % fielddef[
'name'], EMsgNoFVal, stateId=stateId)
1567 min = fielddef.get(
'min', val)
1568 max = fielddef.get(
'max', val)
1569 if (val < min)
or (val > max):
1570 self.
Error(
"%s=%s" % (fielddef[
'name'], repr(val)),
1571 "%s %s <= number <= %s" % (EMsgFPNRange, repr(min), repr(max)),
1578 """ Set string value and check any contraints. 1581 fielddef - Field definition. 1582 val - String field value. 1586 (Converted) field value. 1588 val = fielddef.get(
'const', val)
1590 self.
Error(
"%s" % fielddef[
'name'], EMsgNoFVal, stateId=stateId)
1600 """ Make a message template from the given message definition. 1606 Message template dictionary. 1611 self.
Error(
"MsgDefSet", repr(msgid), EMsgNoMsgDef)
1616 def _MakeMsgTemplateR(self, fdeflist):
1617 """ Recursively make a message template helper. 1620 fdeflist - Field definition list. 1623 Message template dictionary. 1626 for fielddef
in fdeflist:
1627 fname = fielddef[
'name']
1628 ftype = fielddef[
'ftype']
1629 if ftype == nmBase.NMFCode(
'struct'):
1631 elif ftype == nmBase.NMFCode(
'vector'):
1632 template[fname] = []
1633 elif ftype == nmBase.NMFCode(
'pad'):
1636 template[fname] = fielddef.get(
'const',
None)
1642 """ Get a NetMsgs message or field definition required keyword value. 1644 Raises NetMsgsError exception of failure. 1647 d - Definition dictionary. 1649 epreface - Optional error preface string on error. 1650 stateId - Optional state id. 1657 except KeyError, inst:
1658 name = d.get(
'name',
'?name?')
1659 self.
Error(epreface, name, inst.args[0], EMsgReqKeyword, stateId=stateId)
1664 """ Check field definition type against field value type. 1667 fielddef - Field definition. 1671 ftype = fielddef[
'ftype']
1673 if ftype == nmBase.NMFCode(
'bool'):
1674 if (type(fval) == bool)
or (type(fval) != int):
1677 elif ftype == nmBase.NMFCode(
'char'):
1678 if (type(fval) == str)
and (len(fval) == 1):
1681 elif ftype
in [nmBase.NMFCode(
'f32'), nmBase.NMFCode(
'f64')]:
1682 if (type(fval) == float)
or (type(fval) == int):
1685 elif ftype == nmBase.NMFCode(
'string'):
1686 if type(fval) == str:
1689 elif ftype == nmBase.NMFCode(
'struct'):
1690 if type(fval) == dict:
1693 elif ftype == nmBase.NMFCode(
'vector'):
1694 if type(fval) == list:
1697 elif (type(fval) != str)
and (type(fval) != dict)
and (type(fval) != list):
1700 self.
Error(
"%s(fid=%u)" % (fielddef[
'name'], fielddef[
'fid']),
1701 "%s(%c)=%s" % (nmBase.NMFTypeCode2Xml[ftype], ftype, repr(fval)),
1708 """ Return "zero" value assocated with field type. 1711 fielddef - Field definition. 1713 ftype = fielddef[
'ftype']
1714 if fielddef[
'disposition'] ==
'deprecated':
1716 elif ftype == nmBase.NMFCode(
'bool'):
1718 elif ftype == nmBase.NMFCode(
'char'):
1720 elif ftype == nmBase.NMFCode(
'string'):
1722 elif ftype
in [nmBase.NMFCode(
'f32'), nmBase.NMFCode(
'f64')]:
1724 elif ftype == nmBase.NMFCode(
'vector'):
1725 return [ self.
ZeroFType(fielddef[
'vdef']) ]
1726 elif ftype == nmBase.NMFCode(
'struct'):
1727 msgdef = fielddef[
'msgdef']
1728 fdeflist = msgdef[
'fielddef']
1730 for fielddef
in fdeflist:
1732 if zval
is not None:
1733 d[fielddef[
'name']] = zval
1741 """ Find field definition with the given identifier in the (sub)message 1745 msgdef - Message definition. 1746 fid - Unique field id within message definition. 1749 Returns field definition on success, None on failure. 1751 fdeflist = msgdef[
'fielddef']
1752 for fielddef
in fdeflist:
1753 if fielddef[
'fid'] == fid:
1760 """ Issue warning message. 1763 *args - List of warning message arguments. 1770 wmsg +=
": %s" % (a)
1771 print >>sys.stderr, wmsg
1776 """ Raise NetMsgsError error. 1779 *args - List of error message arguments. 1780 kwargs - Keyword arguments. 1781 stateId - Optional state id. 1789 emsg +=
": %s" % (a)
1791 raise nmBase.NetMsgsError(emsg)
1795 def TraceStart(self, preface, msgid, msgdef, buf, stateId, fp=sys.stderr):
1796 """ Start of a message trace. 1799 preface - Preface string. 1801 msgdef - Message definition. 1802 buf - Packed buffer. 1803 stateId - Packing/unpacking state id. 1804 fp - Opened output file pointer. 1807 msgname = msgdef[
'name']
1808 max_count = msgdef[
'max_count']
1809 field_count = self.
StateGet(stateId,
'field_count')
1810 text = [
"--- %s Message %s(msgid=%u):\n" % (preface, msgname, msgid)]
1811 text += [
"encoding=%s" % (self.
mEncoding)]
1812 text += [
"endian=%s" % (self.
mEndian)]
1813 text += [
"field_count=%s" % repr(field_count)]
1814 text += [
"max_count=%s" % repr(max_count)]
1820 def TraceField(self, fielddef, fval, buf, stateId, fp=sys.stderr):
1824 fielddef - Field definition. 1826 buf - Packed buffer. 1827 stateId - Packing/unpacking state id. 1828 fp - Opened output file pointer. 1830 fname = fielddef[
'name']
1831 fid = fielddef[
'fid']
1832 ftype = fielddef[
'ftype']
1835 xtype = nmBase.NMFTypeCode2Xml.get(ftype, ftype)
1838 if fstate[
'fpar'] == nmBase.NMFCode(
'vector'):
1839 text = [
"%s[%u] = %s\t" % (xtype, fstate[
'i'], fval)]
1840 elif ftype == nmBase.NMFCode(
'pad'):
1841 count = fstate[
'count']
1842 text = [
"%s:%s(fid=%u, count=%u) =\t" % (xtype,
'pad', fid, count)]
1843 elif ftype == nmBase.NMFCode(
'string'):
1844 max_count = fielddef[
'max_count']
1845 count = fstate[
'count']
1846 text = [
"%s:%s(fid=%u) = %s\t" % (xtype, fname, fid, fval)]
1847 text += [
"count=%s" % repr(count)]
1848 text += [
"max_count=%s" % repr(max_count)]
1849 elif ftype == nmBase.NMFCode(
'vector'):
1850 vdef = fielddef[
'vdef']
1851 vtype = vdef[
'ftype']
1852 max_count = fielddef[
'max_count']
1853 count = fstate[
'count']
1854 text = [
"%s:%s(fid=%u) =\t" % (xtype, fname, fid)]
1855 text += [
"vtype=%s" % (vtype)]
1856 text += [
"count=%s" % repr(count)]
1857 text += [
"max_count=%s" % repr(max_count)]
1858 elif ftype == nmBase.NMFCode(
'struct'):
1859 msgdef = fielddef[
'msgdef']
1860 max_count = msgdef[
'max_count']
1861 count = fstate[
'count']
1862 text = [
"%s:%s(fid=%u) =\t" % (xtype, fname, fid)]
1863 text += [
"count=%s" % repr(count)]
1864 text += [
"max_count=%s" % repr(max_count)]
1866 text = [
"%s:%s(fid=%u) = %s\t" % (xtype, fname, fid, fval)]
1873 """ Trace text and buffer in a two-column format. 1875 Column 1 contains the formatted text output. Column 2 contains the 1876 formatted contents of the buffer. 1879 textList - List of raw text phrases. The phrase are join to fit 1880 into column 1. Special phrase end characters: 1881 '\\t' = Do not append other phrases to this phrase. 1882 '\\n' = Same as above, but also keep column 2 blank. 1883 buf - Packed buffer. 1884 stateId - Packing/unpacking state id. 1885 fp - Opened output file pointer. 1888 start = trace[
'trace_start']
1889 end = trace[
'trace_end']
1891 end = len(buf[start:])
1892 indent = 2 * (trace[
'trace_depth'])
1893 indentb = indent + 5
1900 for phrase
in textList:
1901 if phrase.endswith(
'\n')
or phrase.endswith(
'\t'):
1903 text1 += [sp+phrase]
1909 elif len(line) + 2 + len(phrase) < col2-2:
1910 line +=
', ' + phrase
1922 end = len(buf[start:])
1933 s +=
"0x%02x " % (ord(c))
1943 if line.endswith(
'\n'):
1947 elif line.endswith(
'\t'):
1957 fp.write(
space(col2-col))
1962 while i < len(text2):
1963 fp.write(
space(col2))
1971 """ Trace a block bytes in packed buffer. 1974 preface - Preface string. 1975 buf - Packed buffer. 1976 start - Start position in buffer. 1977 end - End position + 1 in buffer. 1978 fp - Opened output file pointer. 1981 end = len(buf[start:])
1983 fp.write(
"%s Buffer (%u bytes):\n" % (preface, n))
1984 nmBase.PrintBuf(buf[start:], count=n, nlfreq=16, fp=fp)
1989 """ Debug print current operational state. 1994 nmBase.PrettyPrintDict(self.
StateGet(stateId), name=
"StateId=%u" % stateId)
def UnpackU8(buf, offset=0, endian='big')
def nmPackMsgHdr(self, msgid, msgdef, stateId)
def nmUnpackStruct(self, fielddef, buf, offset, fvals, stateId)
def nmUnpackU64(self, fielddef, buf, offset, fvals, stateId)
def StateDelete(self, stateId)
SETFUNC
index to set function
def UnpackChar(buf, offset=0, endian='big')
mTrace
disable python runtime warnings
def Error(self, args, kwargs)
def ChkReqFValType(self, fielddef, fval, stateId=None)
def nmPackF64(self, fielddef, val, stateId)
def nmPackPad(self, fielddef, val, stateId)
def nmUnpackU16(self, fielddef, buf, offset, fvals, stateId)
def PackU64(val, endian='big')
def nmUnpackS8(self, fielddef, buf, offset, fvals, stateId)
def StateSet(self, stateId, keypath, kwargs)
PACKFUNC
index to pack function
mEncoding
message encoding
def nmPackChar(self, fielddef, val, stateId)
def nmUnpackPad(self, fielddef, buf, offset, fvals, stateId)
def UnpackBool(buf, offset=0, endian='big')
def AttrSetByteOrder(self, endian)
def nmPackStruct(self, fielddef, fvals, stateId)
def nmPackS8(self, fielddef, val, stateId)
def nmSetStr(self, fielddef, val, stateId)
def nmUnpackU8(self, fielddef, buf, offset, fvals, stateId)
def StateFieldSet(self, stateId, keypath, kwargs)
def PackF64(val, endian='big')
def UnpackU32(buf, offset=0, endian='big')
def AttrDelMsgDef(self, msgid)
def nmPackS32(self, fielddef, val, stateId)
def PackU16(val, endian='big')
mMsgDefSet
Message definition set.
UNPACKFUNC
index to unpack function
def UnpackF32(buf, offset=0, endian='big')
def UnpackString(buf, count, offset=0)
def ZeroFType(self, fielddef)
def nmUnpackString(self, fielddef, buf, offset, fvals, stateId)
def nmPackU64(self, fielddef, val, stateId)
def TraceBufBlock(self, preface, buf, start=0, end=None, fp=sys.stderr)
mMsgDefSetName
message definition set string name
def PackBool(val, endian='big')
def UnpackS8(buf, offset=0, endian='big')
def nmPackP64(self, fielddef, val, stateId)
def _MakeMsgTemplateR(self, fdeflist)
def UnpackF64(buf, offset=0, endian='big')
def PackU32(val, endian='big')
def UnpackP32(buf, offset=0, endian='big')
def nmIdent(self, fielddef, val, stateId)
def OptimizeMsgDef(self, msgid, msgdef)
def UnpackU16(buf, offset=0, endian='big')
def StateFieldGet(self, stateId, keypath)
def nmUnpackS16(self, fielddef, buf, offset, fvals, stateId)
def Trace2Col(self, textList, buf, stateId, fp=sys.stderr)
def nmUnpackU32(self, fielddef, buf, offset, fvals, stateId)
def UnpackS64(buf, offset=0, endian='big')
def PackS32(val, endian='big')
def MakeMsgTemplate(self, msgid)
def nmUnpackP64(self, fielddef, buf, offset, fvals, stateId)
def nmUnpackF64(self, fielddef, buf, offset, fvals, stateId)
def FindFId(self, msgdef, fid)
def __init__(self, msgdefset, kwargs)
mStateId
atomic state counter
def nmPackU8(self, fielddef, val, stateId)
def UnpackU64(buf, offset=0, endian='big')
def nmPackStream(self, msgdef, fvals, stateId)
def nmSetFPN(self, fielddef, val, stateId)
def nmUnpackStream(self, msgdef, buf, offset, fvals, stateId)
def nmPackU32(self, fielddef, val, stateId)
def PackP64(val, endian='big')
mFuncMap
Field Code to Function Mappings.
def PackU8(val, endian='big')
def StateNew(self, msgid, op, kwargs)
def nmUnpackP32(self, fielddef, buf, offset, fvals, stateId)
def OptimizeFieldDef(self, fielddef)
def nmUnpackVector(self, fielddef, buf, offset, fvals, stateId)
def nmPackU16(self, fielddef, val, stateId)
def TraceStart(self, preface, msgid, msgdef, buf, stateId, fp=sys.stderr)
def TraceField(self, fielddef, fval, buf, stateId, fp=sys.stderr)
def PackString(val, count=None)
def nmSetInt(self, fielddef, val, stateId)
def StateFieldPop(self, stateId)
def PackS8(val, endian='big')
def nmUnpackBool(self, fielddef, buf, offset, fvals, stateId)
def nmPackMsg(self, msgid, fvals)
def UnpackS16(buf, offset=0, endian='big')
def nmUnpackFieldHdr(self, buf, offset, stateId)
def nmPackP32(self, fielddef, val, stateId)
def nmUnpackMsgHdr(self, msgid, msgdef, buf, offset, fvals, stateId)
def nmUnpackF32(self, fielddef, buf, offset, fvals, stateId)
def PackChar(val, endian='big')
def nmPackBool(self, fielddef, val, stateId)
def nmPackF32(self, fielddef, val, stateId)
def nmPackS16(self, fielddef, val, stateId)
def nmUnpackMsg(self, msgid, buf, fvals)
def GetDefReqVal(self, d, k, epreface='', stateId=None)
def nmPackString(self, fielddef, val, stateId)
def PackF32(val, endian='big')
def nmPackVector(self, fielddef, vallist, stateId)
def DebugState(self, stateId)
def StateFieldPush(self, stateId, kwargs)
def nmPackFieldHdr(self, fielddef, val, stateId)
def nmPackS64(self, fielddef, val, stateId)
def UnpackS32(buf, offset=0, endian='big')
def PackS16(val, endian='big')
def StateGet(self, stateId, keypath)
def nmUnpackChar(self, fielddef, buf, offset, fvals, stateId)
def PackP32(val, endian='big')
def nmUnpackS64(self, fielddef, buf, offset, fvals, stateId)
def UnpackP64(buf, offset=0, endian='big')
def AttrAddMsgDef(self, msgid, msgdef)
def PackS64(val, endian='big')
def nmUnpackS32(self, fielddef, buf, offset, fvals, stateId)