netmsgs  1.2.2
RoadNarrows Robotics Network Messaging Package
NetMsgsLibStreamBuf.py
Go to the documentation of this file.
1 ###############################################################################
2 #
3 # Package: NetMsgs
4 #
5 # File: NetMsgsLibStreamBuf.py
6 #
7 
8 """
9 NetMsgs Run-Time Library Packing and Unpacking Stream Buffer Module.
10 """
11 
12 ## \file
13 ## \package NetMsgs.NetMsgsLibStreamBuf
14 ##
15 ## $LastChangedDate: 2012-12-11 14:28:44 -0700 (Tue, 11 Dec 2012) $
16 ## $Rev: 2574 $
17 ##
18 ## \brief NetMsgs Run-Time Library Packing and Unpacking Stream Buffer Module.
19 ##
20 ## The NetMsgsLibStreamBuf module defines the base NetMsgsStreamBuf run-time
21 ## class. The NetMsgsStreamBuf class provides all serialized stream buffer
22 ## packing and de-serialized stream buffer unpacking virtual functionality.
23 ## Packed buffers are transportable across a network of heterogenous nodes.
24 ##
25 ## The NetMsgsStreamBuf class assumes a (generated) python data structures of
26 ## the form define by the NetMsgsGenPy module given an NetMsgs XML input
27 ## specification.
28 ##
29 ## The particular message encodings are defined in derived classes such as
30 ## NetMsgsFlat and NetMsgsITV. Other encoded message classes should derive
31 ## from the NetMsgsStreamBuf class.
32 ##
33 ## \sa
34 ## \htmlonly
35 ## <a href="../pydoc/NetMsgs.NetMsgsLibFlat.html">PyDoc Generated Documentation</a>
36 ## \endhtmlonly
37 ##
38 ## \author Robin Knight (robin.knight@roadnarrows.com)
39 ##
40 ## \copyright
41 ## \h_copy 2010-2017. RoadNarrows LLC.\n
42 ## http://www.roadnarrows.com\n
43 ## All Rights Reserved
44 ##
45 
46 # Permission is hereby granted, without written agreement and without
47 # license or royalty fees, to use, copy, modify, and distribute this
48 # software and its documentation for any purpose, provided that
49 # (1) The above copyright notice and the following two paragraphs
50 # appear in all copies of the source code and (2) redistributions
51 # including binaries reproduces these notices in the supporting
52 # documentation. Substantial modifications to this software may be
53 # copyrighted by their authors and need not follow the licensing terms
54 # described here, provided that the new terms are clearly indicated in
55 # all files where they apply.
56 #
57 # IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY MEMBERS/EMPLOYEES
58 # OF ROADNARROW LLC OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY
59 # PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
60 # DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
61 # EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF
62 # THE POSSIBILITY OF SUCH DAMAGE.
63 #
64 # THE AUTHOR AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES,
65 # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
66 # FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
67 # "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO
68 # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
69 #
70 ###############################################################################
71 
72 import sys
73 import warnings
74 import itertools
75 
76 import NetMsgsBase as nmBase
77 from NetMsgsLib import *
78 
79 ## space over
80 space = lambda indent: "%*s" % (indent, '')
81 
82 #-----------------------------------------------------------------------------
83 # CLASS: NetMsgs
84 #-----------------------------------------------------------------------------
86  """ RoadNarrows Net Messages Stream Buffer Virtual Base Class.
87 
88  NetMsgsStreamBuf supports serialized packing and de-serialized
89  unpacking of a registered set of message definitions.
90 
91  Packing and unpacking operations are multi-thread safe.
92  """
93 
94  #--
95  def __init__(self, msgdefset, **kwargs):
96  """ Initialize NetMsgsStreamBuf instance.
97 
98  Parameters:
99  msgdefset - Set of message definitions.
100  kwargs - Optional keyword arguments.
101  msgsetname=str - Name. Default: "MessageSet"
102  encoding=val - Message stream encoding.
103  Default: unknown
104  endian=val - Byte ordering. Default: big
105  nowarn=bool - Disable warnings. Default: False.
106  trace=bool - Trace packing/unpacking.
107  Default: False
108  """
109  ## index to pack function
110  self.PACKFUNC = 0
111 
112  ## index to unpack function
113  self.UNPACKFUNC = 1
114 
115  ## index to set function
116  self.SETFUNC = 2
117 
118  ## Message definition set.
119  self.mMsgDefSet = msgdefset
120 
121  # optimize message definition set
122  self.Optimize()
123 
124  ## message definition set string name
125  self.mMsgDefSetName = kwargs.get('msgsetname', "MessageSet")
126 
127  ## message encoding
128  self.mEncoding = kwargs.get('encoding', 'unknown')
129 
130  ## byte ordering
131  self.AttrSetByteOrder(kwargs.get('endian', 'big'))
132 
133  ## do [not] disable warnings
134  self.mNoWarn = kwargs.get('nowarn', False)
135 
136  ## disable python runtime warnings
137  if self.mNoWarn:
138  warnings.simplefilter('ignore', RuntimeWarning)
139 
140  ## tracing
141  self.mTrace = kwargs.get('trace', False)
142 
143  ## atomic state counter
144  self.mStateId = itertools.count()
145 
146  ## pack/unpack state
147  self.mState = {}
148 
149  ## Field Code to Function Mappings
150  self.mFuncMap = {
151  nmBase.NMFCode('pad'):
152  [self.nmPackPad, self.nmUnpackPad, self.nmIdent],
153  nmBase.NMFCode('char'):
154  [self.nmPackChar, self.nmUnpackChar, self.nmIdent],
155  nmBase.NMFCode('u8'):
156  [self.nmPackU8, self.nmUnpackU8, self.nmSetInt],
157  nmBase.NMFCode('s8'):
158  [self.nmPackS8, self.nmUnpackS8, self.nmSetInt],
159  nmBase.NMFCode('bool'):
160  [self.nmPackBool, self.nmUnpackBool, self.nmIdent],
161  nmBase.NMFCode('u16'):
162  [self.nmPackU16, self.nmUnpackU16, self.nmSetInt],
163  nmBase.NMFCode('s16'):
164  [self.nmPackS16, self.nmUnpackS16, self.nmSetInt],
165  nmBase.NMFCode('u32'):
166  [self.nmPackU32, self.nmUnpackU32, self.nmSetInt],
167  nmBase.NMFCode('s32'):
168  [self.nmPackS32, self.nmUnpackS32, self.nmSetInt],
169  nmBase.NMFCode('u64'):
170  [self.nmPackU64, self.nmUnpackU64, self.nmSetInt],
171  nmBase.NMFCode('s64'):
172  [self.nmPackS64, self.nmUnpackS64, self.nmSetInt],
173  nmBase.NMFCode('f32'):
174  [self.nmPackF32, self.nmUnpackF32, self.nmSetFPN],
175  nmBase.NMFCode('f64'):
176  [self.nmPackF64, self.nmUnpackF64, self.nmSetFPN],
177  nmBase.NMFCode('p32'):
178  [self.nmPackP32, self.nmUnpackP32, self.nmIdent],
179  nmBase.NMFCode('p64'):
180  [self.nmPackP64, self.nmUnpackP64, self.nmIdent],
181  nmBase.NMFCode('string'):
182  [self.nmPackString, self.nmUnpackString, self.nmSetStr],
183  nmBase.NMFCode('struct'):
184  [self.nmPackStruct, self.nmUnpackStruct, self.nmIdent],
185  nmBase.NMFCode('vector'):
186  [self.nmPackVector, self.nmUnpackVector, self.nmIdent],
187  }
188  ##
189 
190  #--
191  def Optimize(self):
192  """ Optimize message definition set for packing and unpacking. """
193  for msgid, msgdef in self.mMsgDefSet.iteritems():
194  self.OptimizeMsgDef(msgid, msgdef)
195  ##
196 
197  #--
198  def OptimizeMsgDef(self, msgid, msgdef):
199  """ Optimize message definition for packing and unpacking.
200 
201  Parameters:
202  msgid - Message id.
203  msgdef - Message definition.
204  """
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
210  fdeflist = self.GetDefReqVal(msgdef, 'fielddef',
211  epreface="MsgDef %s" % (msgdef['name']))
212  max_count = 0
213  for fielddef in fdeflist:
214  self.OptimizeFieldDef(fielddef)
215  if fielddef['disposition'] == 'active':
216  max_count += 1
217  msgdef['max_count'] = max_count
218  ##
219 
220  #--
221  def OptimizeFieldDef(self, fielddef):
222  """ Optimize field definition for packing and unpacking.
223 
224  Parameters:
225  fielddef - Field definition.
226  """
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':
233  return
234  if ftype == nmBase.NMFCode('pad'): # pad
235  if not fielddef.has_key('count'):
236  fielddef['count'] = nmBase.NMPadDftCount
237  elif ftype == nmBase.NMFCode('string'): # string
238  if not fielddef.has_key('max_count'):
239  fielddef['max_count'] = nmBase.NMStringMaxCount
240  elif ftype == nmBase.NMFCode('vector'): # 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
246  vdef['fid'] = 0 # field id not used, but required when packing
247  self.OptimizeFieldDef(vdef)
248  elif ftype == nmBase.NMFCode('struct'): # struct
249  msgdef = self.GetDefReqVal(fielddef, 'msgdef', epreface="FieldDef")
250  if not msgdef.has_key('name'):
251  msgdef['name'] = "%s_struct" % fname
252  msgdef['msgid'] = 0 # field id not used, but required when packing
253  self.OptimizeMsgDef(msgdef['msgid'], msgdef)
254  ##
255 
256 
257  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
258  # Attribute Functions
259  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
260 
261  #--
262  def AttrAddMsgDef(self, msgid, msgdef):
263  """ Add/Overwrite message definition to set.
264 
265  Parameters:
266  msgid - Unique message identifier number.
267  msgdef - Message definition.
268  """
269  self.mMsgDefSet[msgid] = msgdef
270  self.OptimizeMsgDef(msgdef)
271  ##
272 
273  #--
274  def AttrDelMsgDef(self, msgid):
275  """ Delete message definition from set.
276 
277  Parameters:
278  msgid - Unique message identifier number.
279  """
280  try:
281  del self.mMsgDefSet[msgid]
282  except KeyError:
283  self.Error(repr(msgid), EMsgNoMsgDef)
284  ##
285 
286  #--
287  def AttrSetByteOrder(self, endian):
288  """ Set message packing and unpack field byte order.
289 
290  Parameters:
291  endian - Byte order. One of: big little native
292  """
293  if endian in nmBase.NMEndian:
294  ## Byte order
295  self.mEndian = endian
296  else:
297  self.Error("endian=%s" % (endian), EMsgEndian)
298  ##
299 
300 
301  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
302  # Virtual State Functions
303  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
304 
305  #--
306  def StateNew(self, msgid, op, **kwargs):
307  """ Create a new packing/unpacking operational state.
308 
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.
312 
313  Parameters:
314  msgid - Message id.
315  op - Operation string. One of: 'pack', 'unpack'.
316  kwargs - Optional initial state overrides and implementation
317  specifics.
318 
319  Return:
320  State id which is a key into the specific state.
321  """
322  # get next state id (action is atomic)
323  stateId = self.mStateId.next()
324  d = {
325  'msgid': msgid, # message id
326  'op': op, # pack/unpack
327  'field_count': 0, # number of fields in message
328  'msghdr': {}, # message header info
329  'mctl': {}, # message control
330  'fstack': [ # field stack
331  { 'fpar': None, # field parent
332  'fctl': {'has_hdr':False, 'noexec': False}, # field control
333  'fname': None, # field name
334  'fid': 0, # field id
335  'ftype': None, # field type
336  'fhdr': {}, # field header info
337  'trace': {'trace_depth':0, 'trace_start':0, 'trace_end':None},
338  # trace state
339  }
340  ],
341  }
342 
343  # overrides and implementation specifics
344  for k,v in kwargs.iteritems():
345  d[k] = v
346 
347  # add new state (thread safe)
348  self.mState[stateId] = d
349 
350  return stateId
351  ##
352 
353  #--
354  def StateDelete(self, stateId):
355  """ Delete operational state.
356 
357  Parameters:
358  stateId - State id.
359  """
360  if stateId is not None:
361  del self.mState[stateId]
362  ##
363 
364  #--
365  def StateGet(self, stateId, *keypath):
366  """ Get state value at key path.
367 
368  Parameters:
369  keypath - Optional list of key arguments.
370  """
371  v = self.mState[stateId]
372  for key in keypath:
373  v = v[key]
374  return v
375  return self.mState[stateId][key]
376  ##
377 
378  #--
379  def StateSet(self, stateId, *keypath, **kwargs):
380  """ Set a list of state values at key path.
381 
382  Parameters:
383  keypath - Optional list of key arguments.
384  kwargs - List of key=value arguments.
385  """
386  d = self.mState[stateId]
387  for key in keypath:
388  d = d[key]
389  for k,v in kwargs.iteritems():
390  d[k] = v
391  ##
392 
393  #--
394  def StateFieldPush(self, stateId, **kwargs):
395  """ Push new field state onto stack.
396 
397  Parameters:
398  stateId - State id.
399  kwargs - Optional initial field state overrides and
400  implementation specifics.
401  """
402  parent = self.mState[stateId]['fstack'][-1]
403 
404  # defaults and required
405  d = {}
406  d['fpar'] = parent['ftype']
407  d['fctl'] = parent['fctl'].copy()
408  d['fname'] = None,
409  d['fid'] = 0
410  d['ftype'] = None
411  d['fhdr'] = {}
412  d['trace'] = { 'trace_depth': parent['trace']['trace_depth']+1,
413  'trace_start': 0,
414  'trace_end': None
415  }
416 
417  # overrides and implementation specifics
418  for k,v in kwargs.iteritems():
419  d[k] = v
420 
421  # push
422  self.mState[stateId]['fstack'] += [d]
423  ##
424 
425  #--
426  def StateFieldPop(self, stateId):
427  """ Pop field state stack - deleting top state.
428 
429  Parameters:
430  stateId - State id.
431  """
432  self.mState[stateId]['fstack'].pop()
433  ##
434 
435  #--
436  def StateFieldGet(self, stateId, *keypath):
437  """ Get top of field stack state value at key path.
438 
439  Parameters:
440  keypath - Optional list of key arguments.
441  """
442  v = self.mState[stateId]['fstack'][-1]
443  for key in keypath:
444  v = v[key]
445  return v
446  ##
447 
448  #--
449  def StateFieldSet(self, stateId, *keypath, **kwargs):
450  """ Set a list of top of field stack state values at key path.
451 
452  Parameters:
453  keypath - Optional list of key arguments.
454  kwargs - List of key=value arguments.
455  """
456  d = self.mState[stateId]['fstack'][-1]
457  for key in keypath:
458  d = d[key]
459  for k,v in kwargs.iteritems():
460  d[k] = v
461  ##
462 
463 
464  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
465  # Virtual Packing Functions
466  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
467 
468  #--
469  def nmPackFieldHdr(self, fielddef, val, stateId):
470  """ Pack field header.
471 
472  No header is packed in base function.
473 
474  Parameters:
475  fielddef - Field definition.
476  val - Field value(s).
477  stateId - Packing state id.
478 
479  Return:
480  Packed buffer.
481  """
482  self.StateFieldSet(stateId, fhdr={})
483  return ''
484  ##
485 
486  #--
487  def nmPackPad(self, fielddef, val, stateId):
488  """ Pack pad byte(s).
489 
490  Count pad bytes are packed.
491 
492  Parameters:
493  fielddef - Field definition.
494  val - Field value(s) - ignored.
495  stateId - Packing state id.
496 
497  Return:
498  Packed buffer.
499  """
500  count = fielddef['count']
501  buf = ''
502  i = 0
503  while i < count:
504  buf += PackU8(0)
505  i += 1
506  self.StateFieldSet(stateId, count=count)
507  if self.mTrace:
508  self.TraceField(fielddef, 0, buf, stateId)
509  return buf
510  ##
511 
512  #--
513  def nmPackBool(self, fielddef, val, stateId):
514  """ Pack boolean field.
515 
516  Parameters:
517  fielddef - Field definition.
518  val - Field value.
519  stateId - Packing state id.
520 
521  Return:
522  Packed buffer.
523  """
524  buf = self.nmPackFieldHdr(fielddef, val, stateId)
525  buf += PackBool(val, endian=self.mEndian)
526  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
527  return buf
528  ##
529 
530  #--
531  def nmPackChar(self, fielddef, val, stateId):
532  """ Pack one character field.
533 
534  Parameters:
535  fielddef - Field definition.
536  val - Field value.
537  stateId - Packing state id.
538 
539  Return:
540  Packed buffer.
541  """
542  buf = self.nmPackFieldHdr(fielddef, val, stateId)
543  buf += PackChar(val, endian=self.mEndian)
544  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
545  return buf
546  ##
547 
548  #--
549  def nmPackU8(self, fielddef, val, stateId):
550  """ Pack 8-bit unsigned integer field.
551 
552  Parameters:
553  fielddef - Field definition.
554  val - Field value.
555  stateId - Packing state id.
556 
557  Return:
558  Packed buffer.
559  """
560  buf = self.nmPackFieldHdr(fielddef, val, stateId)
561  buf += PackU8(val, endian=self.mEndian)
562  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
563  return buf
564  ##
565 
566  #--
567  def nmPackS8(self, fielddef, val, stateId):
568  """ Pack 8-bit signed integer field.
569 
570  Parameters:
571  fielddef - Field definition.
572  val - Field value.
573  stateId - Packing state id.
574 
575  Return:
576  Packed buffer.
577  """
578  buf = self.nmPackFieldHdr(fielddef, val, stateId)
579  buf += PackS8(val, endian=self.mEndian)
580  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
581  return buf
582  ##
583 
584  #--
585  def nmPackU16(self, fielddef, val, stateId):
586  """ Pack 16-bit unsigned integer field.
587 
588  Parameters:
589  fielddef - Field definition.
590  val - Field value.
591  stateId - Packing state id.
592 
593  Return:
594  Packed buffer.
595  """
596  buf = self.nmPackFieldHdr(fielddef, val, stateId)
597  buf += PackU16(val, endian=self.mEndian)
598  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
599  return buf
600  ##
601 
602  #--
603  def nmPackS16(self, fielddef, val, stateId):
604  """ Pack 16-bit signed integer field.
605 
606  Parameters:
607  fielddef - Field definition.
608  val - Field value.
609  stateId - Packing state id.
610 
611  Return:
612  Packed buffer.
613  """
614  buf = self.nmPackFieldHdr(fielddef, val, stateId)
615  buf += PackS16(val, endian=self.mEndian)
616  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
617  return buf
618  ##
619 
620  #--
621  def nmPackU32(self, fielddef, val, stateId):
622  """ Pack 32-bit unsigned integer field.
623 
624  Parameters:
625  fielddef - Field definition.
626  val - Field value.
627  stateId - Packing state id.
628 
629  Return:
630  Packed buffer.
631  """
632  buf = self.nmPackFieldHdr(fielddef, val, stateId)
633  buf += PackU32(val, endian=self.mEndian)
634  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
635  return buf
636  ##
637 
638  #--
639  def nmPackS32(self, fielddef, val, stateId):
640  """ Pack 32-bit signed integer field.
641 
642  Parameters:
643  fielddef - Field definition.
644  val - Field value.
645  stateId - Packing state id.
646 
647  Return:
648  Packed buffer.
649  """
650  buf = self.nmPackFieldHdr(fielddef, val, stateId)
651  buf += PackS32(val, endian=self.mEndian)
652  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
653  return buf
654  ##
655 
656  #--
657  def nmPackU64(self, fielddef, val, stateId):
658  """ Pack 64-bit unsigned integer field.
659 
660  Parameters:
661  fielddef - Field definition.
662  val - Field value.
663  stateId - Packing state id.
664 
665  Return:
666  Packed buffer.
667  """
668  buf = self.nmPackFieldHdr(fielddef, val, stateId)
669  buf += PackU64(val, endian=self.mEndian)
670  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
671  return buf
672  ##
673 
674  #--
675  def nmPackS64(self, fielddef, val, stateId):
676  """ Pack 64-bit signed integer field.
677 
678  Parameters:
679  fielddef - Field definition.
680  val - Field value.
681  stateId - Packing state id.
682 
683  Return:
684  Packed buffer.
685  """
686  buf = self.nmPackFieldHdr(fielddef, val, stateId)
687  buf += PackS64(val, endian=self.mEndian)
688  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
689  return buf
690  ##
691 
692  #--
693  def nmPackF32(self, fielddef, val, stateId):
694  """ Pack 32-bit floating-point number field.
695 
696  Parameters:
697  fielddef - Field definition.
698  val - Field value.
699  stateId - Packing state id.
700 
701  Return:
702  Packed buffer.
703  """
704  buf = self.nmPackFieldHdr(fielddef, val, stateId)
705  buf += PackF32(val, endian=self.mEndian)
706  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
707  return buf
708  ##
709 
710  #--
711  def nmPackF64(self, fielddef, val, stateId):
712  """ Pack 64-bit floating-point number field.
713 
714  Parameters:
715  fielddef - Field definition.
716  val - Field value.
717  stateId - Packing state id.
718 
719  Return:
720  Packed buffer.
721  """
722  buf = self.nmPackFieldHdr(fielddef, val, stateId)
723  buf += PackF64(val, endian=self.mEndian)
724  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
725  return buf
726  ##
727 
728  #--
729  def nmPackP32(self, fielddef, val, stateId):
730  """ Pack 32-bit pointer field.
731 
732  Pointer is always packed in natvie byte order.
733 
734  Parameters:
735  fielddef - Field definition.
736  val - Field value.
737  stateId - Packing state id.
738 
739  Return:
740  Packed buffer.
741  """
742  buf = self.nmPackFieldHdr(fielddef, val, stateId)
743  buf += PackP32(val, endian=self.mEndian)
744  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
745  return buf
746  ##
747 
748  #--
749  def nmPackP64(self, fielddef, val, stateId):
750  """ Pack 64-bit pointer field.
751 
752  Pointer is always packed in natvie byte order.
753 
754  Parameters:
755  fielddef - Field definition.
756  val - Field value.
757  stateId - Packing state id.
758 
759  Return:
760  Packed buffer.
761  """
762  buf = self.nmPackFieldHdr(fielddef, val, stateId)
763  buf += PackP64(val, endian=self.mEndian)
764  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
765  return buf
766  ##
767 
768  #--
769  def nmPackString(self, fielddef, val, stateId):
770  """ Pack variable length string into fixed-size field.
771 
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.
774 
775  Parameters:
776  fielddef - Field definition.
777  val - Field value.
778  stateId - Packing state id.
779 
780  Return:
781  Packed buffer.
782  """
783  self.ChkReqFValType(fielddef, val, stateId=stateId)
784  count = len(val)
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),
789  stateId=stateId)
790  self.StateFieldSet(stateId, count=max_count)
791  buf = self.nmPackFieldHdr(fielddef, val, stateId)
792  buf += PackString(val, max_count)
793  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
794  return buf
795  ##
796 
797  #--
798  def nmPackStruct(self, fielddef, fvals, stateId):
799  """ Pack structure field.
800 
801  Parameters:
802  fielddef - Field definition.
803  fvals - Dictionary of associated field values.
804  stateId - Packing state id.
805 
806  Return:
807  Packed buffer.
808  """
809  self.ChkReqFValType(fielddef, fvals, stateId=stateId)
810  msgdef = fielddef['msgdef']
811  max_count = msgdef['max_count']
812  self.StateFieldSet(stateId, count=max_count)
813  buf = self.nmPackFieldHdr(fielddef, fvals, stateId)
814  if self.mTrace: self.TraceField(fielddef, fvals, buf, stateId)
815  buf += self.nmPackStream(msgdef, fvals, stateId)
816  return buf
817  ##
818 
819  #--
820  def nmPackVector(self, fielddef, vallist, stateId):
821  """ Pack variable vector into fixed-size field.
822 
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.
825 
826  Parameters:
827  fielddef - Field definition.
828  vallist - Vector (list) of vector item values.
829  stateId - Packing state id.
830 
831  Return:
832  Packed buffer.
833  """
834  self.ChkReqFValType(fielddef, vallist, stateId=stateId)
835  vdef = fielddef['vdef']
836  vname = vdef['name']
837  vtype = vdef['ftype']
838  count = len(vallist)
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),
843  stateId=stateId)
844  self.StateFieldSet(stateId, count=max_count)
845  buf = self.nmPackFieldHdr(fielddef, vallist, stateId)
846  if self.mTrace: self.TraceField(fielddef, vallist, buf, stateId)
847  setfunc = self.mFuncMap[vtype][self.SETFUNC]
848  packfunc = self.mFuncMap[vtype][self.PACKFUNC]
849  i = 0
850  self.StateFieldPush(stateId, fname=vname, fid=0, ftype=vtype)
851  for val in vallist:
852  self.StateFieldSet(stateId, i=i)
853  val = setfunc(vdef, val, stateId)
854  buf += packfunc(vdef, val, stateId)
855  i += 1
856  zval = self.ZeroFType(vdef)
857  while i < max_count:
858  self.StateFieldSet(stateId, i=i)
859  buf += packfunc(vdef, zval, stateId)
860  i += 1
861  self.StateFieldPop(stateId)
862  return buf
863  ##
864 
865  #--
866  def nmPackStream(self, msgdef, fvals, stateId):
867  """ Pack a stream of fields.
868 
869  Parameters:
870  msgdef - Message definition.
871  fvals - Dictionary of associated field values.
872  stateId - Packing state id.
873 
874  Return:
875  Packed buffer.
876  """
877  msgname = msgdef['name']
878  fdeflist = msgdef['fielddef']
879  count = len(fdeflist)
880  max_count = msgdef['max_count']
881  self.StateFieldSet(stateId, count=max_count)
882  buf = ''
883  i = 0
884  while i < count:
885  fielddef = fdeflist[i]
886  fname = fielddef['name']
887  fid = fielddef['fid']
888  ftype = fielddef['ftype']
889  if ftype == nmBase.NMFCode('pad'): # pad field
890  val = 0
891  else:
892  val = fvals.get(fname, None)
893  self.StateFieldPush(stateId, fname=fname, fid=fid, ftype=ftype)
894  val = self.mFuncMap[ftype][self.SETFUNC](fielddef, val, stateId)
895  buf += self.mFuncMap[ftype][self.PACKFUNC](fielddef, val, stateId)
896  self.StateFieldPop(stateId)
897  i += 1
898  return buf
899  ##
900 
901  #--
902  def nmPackMsgHdr(self, msgid, msgdef, stateId):
903  """ Pack message header.
904 
905  No header is packed in base function.
906 
907  Parameters:
908  msgid - Message identifier.
909  msgdef - Message definition.
910  stateId - Packing state id.
911 
912  Return:
913  Packed buffer.
914  """
915  self.StateSet(stateId, msghdr={})
916  return ''
917  ##
918 
919  #--
920  def nmPackMsg(self, msgid, fvals):
921  """ Pack a message.
922 
923  Parameters:
924  msgid - Message identifier.
925  fvals - Dictionary of associated field values.
926 
927  Return:
928  Packed buffer.
929  """
930  try:
931  msgdef = self.mMsgDefSet[msgid]
932  except KeyError:
933  self.Error("MsgDefSet", repr(msgid), EMsgNoMsgDef)
934  stateId = self.StateNew(msgid, 'pack')
935  buf = self.nmPackMsgHdr(msgid, msgdef, stateId)
936  max_count = msgdef['max_count']
937  self.StateSet(stateId, field_count=max_count)
938  if self.mTrace: self.TraceStart("Packing", msgid, msgdef, buf, stateId)
939  buf += self.nmPackStream(msgdef, fvals, stateId)
940  if self.mTrace: self.TraceBufBlock("Output", buf)
941  self.StateDelete(stateId)
942  return buf
943  ##
944 
945 
946  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
947  # Virtual Unpacking Functions
948  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
949 
950  #--
951  def nmUnpackFieldHdr(self, buf, offset, stateId):
952  """ Unpack field header.
953 
954  No header is unpacked in base function.
955 
956  Parameters:
957  buf - Buffer to unpack.
958  offset - Buffer offset where unpacking begins.
959  stateId - Unpacking state id.
960 
961  Return:
962  New buffer offset.
963  """
964  fhdr = self.StateFieldSet(stateId, fhdr={})
965  return offset
966  ##
967 
968  #--
969  def nmUnpackPad(self, fielddef, buf, offset, fvals, stateId):
970  """ Unpack fixed number of pad bytes from the buffer.
971 
972  No field values are set.
973 
974  Parameters:
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.
980 
981  Return:
982  New buffer offset.
983  """
984  count = fielddef['count']
985  if len(buf[offset:]) >= count:
986  offset += count
987  else:
988  nmBase.NetMsgsError("unpack pad", EMsgNoMem,
989  "count=%u > buf_size=%u" % (count, len(buf[offset:])),
990  stateId=stateId)
991  self.StateFieldSet(stateId, count=count)
992  self.StateFieldSet(stateId, 'trace', trace_end=offset)
993  if self.mTrace: self.TraceField(fielddef, nmBase.NMPadFVal, buf, stateId)
994  return offset
995  ##
996 
997  #--
998  def nmUnpackBool(self, fielddef, buf, offset, fvals, stateId):
999  """ Unpack boolean field from the buffer.
1000 
1001  Parameters:
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.
1007 
1008  Return:
1009  New buffer offset.
1010  """
1011  fname = fielddef['name']
1012  val, offset = UnpackBool(buf, offset=offset, endian=self.mEndian)
1013  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1014  fvals[fname] = val
1015  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1016  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1017  return offset
1018  ##
1019 
1020  #--
1021  def nmUnpackChar(self, fielddef, buf, offset, fvals, stateId):
1022  """ Unpack one character field from the buffer.
1023 
1024  Parameters:
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.
1030 
1031  Return:
1032  New buffer offset.
1033  """
1034  fname = fielddef['name']
1035  val, offset = UnpackChar(buf, offset=offset, endian=self.mEndian)
1036  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1037  fvals[fname] = val
1038  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1039  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1040  return offset
1041  ##
1042 
1043  #--
1044  def nmUnpackU8(self, fielddef, buf, offset, fvals, stateId):
1045  """ Unpack 8-bit unsigned integer field from the buffer.
1046 
1047  Parameters:
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.
1053 
1054  Return:
1055  New buffer offset.
1056  """
1057  fname = fielddef['name']
1058  val, offset = UnpackU8(buf, offset=offset, endian=self.mEndian)
1059  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1060  fvals[fname] = val
1061  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1062  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1063  return offset
1064  ##
1065 
1066  #--
1067  def nmUnpackS8(self, fielddef, buf, offset, fvals, stateId):
1068  """ Unpack 8-bit signed integer field from the buffer.
1069 
1070  Parameters:
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.
1076 
1077  Return:
1078  New buffer offset.
1079  """
1080  fname = fielddef['name']
1081  val, offset = UnpackS8(buf, offset=offset, endian=self.mEndian)
1082  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1083  fvals[fname] = val
1084  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1085  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1086  return offset
1087  ##
1088 
1089  #--
1090  def nmUnpackU16(self, fielddef, buf, offset, fvals, stateId):
1091  """ Unpack 16-bit unsigned integer field from the buffer.
1092 
1093  Parameters:
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.
1099 
1100  Return:
1101  New buffer offset.
1102  """
1103  fname = fielddef['name']
1104  val, offset = UnpackU16(buf, offset=offset, endian=self.mEndian)
1105  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1106  fvals[fname] = val
1107  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1108  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1109  return offset
1110  ##
1111 
1112  #--
1113  def nmUnpackS16(self, fielddef, buf, offset, fvals, stateId):
1114  """ Unpack 16-bit signed integer field from the buffer.
1115 
1116  Parameters:
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.
1122 
1123  Return:
1124  New buffer offset.
1125  """
1126  fname = fielddef['name']
1127  val, offset = UnpackS16(buf, offset=offset, endian=self.mEndian)
1128  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1129  fvals[fname] = val
1130  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1131  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1132  return offset
1133  ##
1134 
1135  #--
1136  def nmUnpackU32(self, fielddef, buf, offset, fvals, stateId):
1137  """ Unpack 32-bit unsigned integer field from the buffer.
1138 
1139  Parameters:
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.
1145 
1146  Return:
1147  New buffer offset.
1148  """
1149  fname = fielddef['name']
1150  val, offset = UnpackU32(buf, offset=offset, endian=self.mEndian)
1151  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1152  fvals[fname] = val
1153  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1154  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1155  return offset
1156  ##
1157 
1158  #--
1159  def nmUnpackS32(self, fielddef, buf, offset, fvals, stateId):
1160  """ Unpack 32-bit signed integer field from the buffer.
1161 
1162  Parameters:
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.
1168 
1169  Return:
1170  New buffer offset.
1171  """
1172  fname = fielddef['name']
1173  val, offset = UnpackS32(buf, offset=offset, endian=self.mEndian)
1174  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1175  fvals[fname] = val
1176  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1177  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1178  return offset
1179  ##
1180 
1181  #--
1182  def nmUnpackU64(self, fielddef, buf, offset, fvals, stateId):
1183  """ Unpack 64-bit unsigned integer field from the buffer.
1184 
1185  Parameters:
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.
1191 
1192  Return:
1193  New buffer offset.
1194  """
1195  fname = fielddef['name']
1196  val, offset = UnpackU64(buf, offset=offset, endian=self.mEndian)
1197  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1198  fvals[fname] = val
1199  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1200  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1201  return offset
1202  ##
1203 
1204  #--
1205  def nmUnpackS64(self, fielddef, buf, offset, fvals, stateId):
1206  """ Unpack 64-bit signed integer field from the buffer.
1207 
1208  Parameters:
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.
1214 
1215  Return:
1216  New buffer offset.
1217  """
1218  fname = fielddef['name']
1219  val, offset = UnpackS64(buf, offset=offset, endian=self.mEndian)
1220  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1221  fvals[fname] = val
1222  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1223  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1224  return offset
1225  ##
1226 
1227  #--
1228  def nmUnpackF32(self, fielddef, buf, offset, fvals, stateId):
1229  """ Unpack 32-bit floating-point number field from the buffer.
1230 
1231  Parameters:
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.
1237 
1238  Return:
1239  New buffer offset.
1240  """
1241  fname = fielddef['name']
1242  val, offset = UnpackF32(buf, offset=offset, endian=self.mEndian)
1243  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1244  fvals[fname] = val
1245  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1246  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1247  return offset
1248  ##
1249 
1250  #--
1251  def nmUnpackF64(self, fielddef, buf, offset, fvals, stateId):
1252  """ Unpack 64-bit floating-point number field from the buffer.
1253 
1254  Parameters:
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.
1260 
1261  Return:
1262  New buffer offset.
1263  """
1264  fname = fielddef['name']
1265  val, offset = UnpackF64(buf, offset=offset, endian=self.mEndian)
1266  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1267  fvals[fname] = val
1268  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1269  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1270  return offset
1271  ##
1272 
1273  #--
1274  def nmUnpackP32(self, fielddef, buf, offset, fvals, stateId):
1275  """ Unpack 32-bit pointer field from the buffer.
1276 
1277  Pointers are unpacked in native byte order.
1278 
1279  Parameters:
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.
1285 
1286  Return:
1287  New buffer offset.
1288  """
1289  fname = fielddef['name']
1290  val, offset = UnpackP32(buf, offset=offset, endian=self.mEndian)
1291  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1292  fvals[fname] = val
1293  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1294  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1295  return offset
1296  ##
1297 
1298  #--
1299  def nmUnpackP64(self, fielddef, buf, offset, fvals, stateId):
1300  """ Unpack 64-bit pointer field from the buffer.
1301 
1302  Pointers are unpacked in native byte order.
1303 
1304  Parameters:
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.
1310 
1311  Return:
1312  New buffer offset.
1313  """
1314  fname = fielddef['name']
1315  val, offset = UnpackP64(buf, offset=offset, endian=self.mEndian)
1316  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1317  fvals[fname] = val
1318  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1319  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1320  return offset
1321  ##
1322 
1323  #--
1324  def nmUnpackString(self, fielddef, buf, offset, fvals, stateId):
1325  """ Unpack fixed-size string field from the buffer.
1326 
1327  Parameters:
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.
1333 
1334  Return:
1335  New buffer offset.
1336  """
1337  fname = fielddef['name']
1338  max_count = fielddef['max_count']
1339  val, offset = UnpackString(buf, max_count, offset=offset)
1340  val = val.rstrip('\x00')
1341  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1342  fvals[fname] = val
1343  self.StateFieldSet(stateId, count=max_count)
1344  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1345  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1346  return offset
1347  ##
1348 
1349  #--
1350  def nmUnpackStruct(self, fielddef, buf, offset, fvals, stateId):
1351  """ Unpack structure field from the buffer.
1352 
1353  Parameters:
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.
1359 
1360  Return:
1361  New buffer offset.
1362  """
1363  fname = fielddef['name']
1364  msgdef = fielddef['msgdef']
1365  max_count = msgdef['max_count']
1366  self.StateFieldSet(stateId, count=max_count)
1367  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1368  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1369  fvals[fname] = {}
1370  val = fvals[fname]
1371  else:
1372  val = {}
1373  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1374  return self.nmUnpackStream(msgdef, buf, offset, val, stateId)
1375  ##
1376 
1377  #--
1378  def nmUnpackVector(self, fielddef, buf, offset, fvals, stateId):
1379  """ Unpack fixed-size vector field from the buffer.
1380 
1381  The unpacked vector length is a fixed max_count items.
1382 
1383  Parameters:
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.
1389 
1390  Return:
1391  New buffer offset.
1392  """
1393  fname = fielddef['name']
1394  vdef = fielddef['vdef']
1395  vname = vdef['name']
1396  vtype = vdef['ftype']
1397  max_count = fielddef['max_count']
1398  self.StateFieldSet(stateId, count=max_count)
1399  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1400  if not self.StateFieldGet(stateId, 'fctl', 'noexec'):
1401  fvals[fname] = []
1402  val = fvals[fname]
1403  else:
1404  val = []
1405  if self.mTrace: self.TraceField(fielddef, val, buf, stateId)
1406  unpackfunc = self.mFuncMap[vtype][self.UNPACKFUNC]
1407  vval = {}
1408  i = 0
1409  self.StateFieldPush(stateId, fname=vname, fid=0, ftype=vtype)
1410  while i < max_count:
1411  self.StateFieldSet(stateId, 'trace', trace_start=offset)
1412  self.StateFieldSet(stateId, i=i)
1413  offset = unpackfunc(vdef, buf, offset, vval, stateId)
1414  val += [vval[vname]]
1415  i += 1
1416  vval = {}
1417  self.StateFieldPop(stateId)
1418  return offset
1419  ##
1420 
1421  #--
1422  def nmUnpackStream(self, msgdef, buf, offset, fvals, stateId):
1423  """ Unpack a field stream from the buffer.
1424 
1425  Parameters:
1426  msgdef - Message definition.
1427  buf - Buffer to unpack.
1428  offset - Buffer offset where unpacking begins.
1429  stateId - Unpacking state id.
1430 
1431  Return:
1432  New buffer offset.
1433  """
1434  msgname = msgdef['name']
1435  fdeflist = msgdef['fielddef']
1436  max_count = msgdef['max_count']
1437  count = len(fdeflist)
1438  self.StateFieldSet(stateId, count=max_count)
1439  i = 0
1440  while i < count:
1441  fielddef = fdeflist[i]
1442  fname = fielddef['name']
1443  fid = fielddef['fid']
1444  ftype = fielddef['ftype']
1445  unpackfunc = self.mFuncMap[ftype][self.UNPACKFUNC]
1446 
1447  self.StateFieldPush(stateId, fname=fname, fid=fid, ftype=ftype)
1448  self.StateFieldSet(stateId, 'trace', trace_start=offset)
1449  offset = self.nmUnpackFieldHdr(buf, offset, stateId)
1450  offset = unpackfunc(fielddef, buf, offset, fvals, stateId)
1451  self.StateFieldPop(stateId)
1452 
1453  i += 1
1454  return offset
1455  ##
1456 
1457  #--
1458  def nmUnpackMsgHdr(self, msgid, msgdef, buf, offset, fvals, stateId):
1459  """ Unpack message header.
1460 
1461  No header is unpacked in base function.
1462 
1463  Parameters:
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.
1470 
1471  Return:
1472  New buffer offset.
1473  """
1474  self.StateSet(stateId, msghdr={})
1475  return offset
1476  ##
1477 
1478  #--
1479  def nmUnpackMsg(self, msgid, buf, fvals):
1480  """ Unpack a message from the buffer.
1481 
1482  Parameters:
1483  msgid - Message identifier.
1484  buf - Buffer to unpack.
1485  fvals - Dictionary to hold unpacked field values.
1486 
1487  Return:
1488  Number of bytes unpacked.
1489  """
1490  try:
1491  msgdef = self.mMsgDefSet[msgid]
1492  except KeyError:
1493  self.Error("MsgDefSet", repr(msgid), EMsgNoMsgDef)
1494  stateId = self.StateNew(msgid, 'unpack')
1495  offset = 0
1496  offset = self.nmUnpackMsgHdr(msgid, msgdef, buf, offset, fvals, stateId)
1497  self.StateFieldSet(stateId, 'trace', trace_end=offset)
1498  if self.mTrace:
1499  self.TraceStart("Unpacking", msgid, msgdef, buf, stateId)
1500  self.TraceBufBlock("Input", buf, 0)
1501  offset = self.nmUnpackStream(msgdef, buf, offset, fvals, stateId)
1502  self.StateDelete(stateId)
1503  return offset
1504  ##
1505 
1506 
1507  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1508  # Virtual Set Functions
1509  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1510 
1511  #--
1512  def nmIdent(self, fielddef, val, stateId):
1513  """ Identity function.
1514 
1515  Parameter:
1516  fielddef - Field definition.
1517  val - Field value.
1518  stateId - State id.
1519 
1520  Return:
1521  val
1522  """
1523  if val is None:
1524  self.Error("%s" % fielddef['name'], EMsgNoFVal, stateId=stateId)
1525  return val
1526  ##
1527 
1528  #--
1529  def nmSetInt(self, fielddef, val, stateId):
1530  """ Set [un]signed integer value and check any contraints.
1531 
1532  Parameter:
1533  fielddef - Field definition.
1534  val - Integer field value.
1535  stateId - State id.
1536 
1537  Return:
1538  (Converted) field value.
1539  """
1540  val = fielddef.get('const', val)
1541  if val is None:
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)),
1548  stateId=stateId)
1549  return val
1550  ##
1551 
1552  #--
1553  def nmSetFPN(self, fielddef, val, stateId):
1554  """ Set floating-point number value and check any contraints.
1555 
1556  Parameter:
1557  fielddef - Field definition.
1558  val - FPN field value.
1559  stateId - State id.
1560 
1561  Return:
1562  (Converted) field value.
1563  """
1564  val = fielddef.get('const', val)
1565  if val is None:
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)),
1572  stateId=stateId)
1573  return val
1574  ##
1575 
1576  #--
1577  def nmSetStr(self, fielddef, val, stateId):
1578  """ Set string value and check any contraints.
1579 
1580  Parameter:
1581  fielddef - Field definition.
1582  val - String field value.
1583  stateId - State id.
1584 
1585  Return:
1586  (Converted) field value.
1587  """
1588  val = fielddef.get('const', val)
1589  if val is None:
1590  self.Error("%s" % fielddef['name'], EMsgNoFVal, stateId=stateId)
1591  return val
1592  ##
1593 
1594  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1595  # Support Functions
1596  # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1597 
1598  #--
1599  def MakeMsgTemplate(self, msgid):
1600  """ Make a message template from the given message definition.
1601 
1602  Parameters:
1603  msgid - Message id.
1604 
1605  Return:
1606  Message template dictionary.
1607  """
1608  try:
1609  msgdef = self.mMsgDefSet[msgid]
1610  except KeyError:
1611  self.Error("MsgDefSet", repr(msgid), EMsgNoMsgDef)
1612  return self._MakeMsgTemplateR(msgdef['fielddef'])
1613  ##
1614 
1615  #--
1616  def _MakeMsgTemplateR(self, fdeflist):
1617  """ Recursively make a message template helper.
1618 
1619  Parameters:
1620  fdeflist - Field definition list.
1621 
1622  Return:
1623  Message template dictionary.
1624  """
1625  template = {}
1626  for fielddef in fdeflist:
1627  fname = fielddef['name']
1628  ftype = fielddef['ftype']
1629  if ftype == nmBase.NMFCode('struct'):
1630  template[fname] = self._MakeMsgTemplateR(fielddef['msgdef']['fielddef'])
1631  elif ftype == nmBase.NMFCode('vector'):
1632  template[fname] = []
1633  elif ftype == nmBase.NMFCode('pad'):
1634  pass
1635  else:
1636  template[fname] = fielddef.get('const', None)
1637  return template
1638  ##
1639 
1640  #--
1641  def GetDefReqVal(self, d, k, epreface='', stateId=None):
1642  """ Get a NetMsgs message or field definition required keyword value.
1643 
1644  Raises NetMsgsError exception of failure.
1645 
1646  Parameters:
1647  d - Definition dictionary.
1648  k - Definition key.
1649  epreface - Optional error preface string on error.
1650  stateId - Optional state id.
1651 
1652  Return:
1653  Definition value.
1654  """
1655  try:
1656  return d[k]
1657  except KeyError, inst:
1658  name = d.get('name', '?name?')
1659  self.Error(epreface, name, inst.args[0], EMsgReqKeyword, stateId=stateId)
1660  ##
1661 
1662  #--
1663  def ChkReqFValType(self, fielddef, fval, stateId=None):
1664  """ Check field definition type against field value type.
1665 
1666  Parameters:
1667  fielddef - Field definition.
1668  fval - Field value.
1669  stateId - State id.
1670  """
1671  ftype = fielddef['ftype']
1672  # boolean
1673  if ftype == nmBase.NMFCode('bool'):
1674  if (type(fval) == bool) or (type(fval) != int):
1675  return
1676  # character
1677  elif ftype == nmBase.NMFCode('char'):
1678  if (type(fval) == str) and (len(fval) == 1):
1679  return
1680  # floating-point number
1681  elif ftype in [nmBase.NMFCode('f32'), nmBase.NMFCode('f64')]:
1682  if (type(fval) == float) or (type(fval) == int):
1683  return
1684  # string
1685  elif ftype == nmBase.NMFCode('string'):
1686  if type(fval) == str:
1687  return
1688  # structure
1689  elif ftype == nmBase.NMFCode('struct'):
1690  if type(fval) == dict:
1691  return
1692  # vector
1693  elif ftype == nmBase.NMFCode('vector'):
1694  if type(fval) == list:
1695  return
1696  # simple
1697  elif (type(fval) != str) and (type(fval) != dict) and (type(fval) != list):
1698  return
1699  # error
1700  self.Error("%s(fid=%u)" % (fielddef['name'], fielddef['fid']),
1701  "%s(%c)=%s" % (nmBase.NMFTypeCode2Xml[ftype], ftype, repr(fval)),
1702  EMsgFValType,
1703  stateId=stateId)
1704  ##
1705 
1706  #--
1707  def ZeroFType(self, fielddef):
1708  """ Return "zero" value assocated with field type.
1709 
1710  Parameters:
1711  fielddef - Field definition.
1712  """
1713  ftype = fielddef['ftype']
1714  if fielddef['disposition'] == 'deprecated':
1715  return None
1716  elif ftype == nmBase.NMFCode('bool'):
1717  return False
1718  elif ftype == nmBase.NMFCode('char'):
1719  return '\x00'
1720  elif ftype == nmBase.NMFCode('string'):
1721  return ''
1722  elif ftype in [nmBase.NMFCode('f32'), nmBase.NMFCode('f64')]:
1723  return 0.0
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']
1729  d = {}
1730  for fielddef in fdeflist:
1731  zval = self.ZeroFType(fielddef)
1732  if zval is not None:
1733  d[fielddef['name']] = zval
1734  return d
1735  else:
1736  return 0
1737  ##
1738 
1739  #--
1740  def FindFId(self, msgdef, fid):
1741  """ Find field definition with the given identifier in the (sub)message
1742  definition.
1743 
1744  Parameters:
1745  msgdef - Message definition.
1746  fid - Unique field id within message definition.
1747 
1748  Return:
1749  Returns field definition on success, None on failure.
1750  """
1751  fdeflist = msgdef['fielddef']
1752  for fielddef in fdeflist:
1753  if fielddef['fid'] == fid:
1754  return fielddef
1755  return None
1756  ##
1757 
1758  #--
1759  def Warning(self, *args):
1760  """ Issue warning message.
1761 
1762  Parameters:
1763  *args - List of warning message arguments.
1764  """
1765  if self.mNoWarn:
1766  return
1767  wmsg = 'Warning'
1768  for a in args:
1769  if a:
1770  wmsg += ": %s" % (a)
1771  print >>sys.stderr, wmsg
1772  ##
1773 
1774  #--
1775  def Error(self, *args, **kwargs):
1776  """ Raise NetMsgsError error.
1777 
1778  Parameters:
1779  *args - List of error message arguments.
1780  kwargs - Keyword arguments.
1781  stateId - Optional state id.
1782  """
1783  emsg = ''
1784  for a in args:
1785  if a:
1786  if not emsg:
1787  emsg += "%s" % (a)
1788  else:
1789  emsg += ": %s" % (a)
1790  self.StateDelete(kwargs.get('stateId', None))
1791  raise nmBase.NetMsgsError(emsg)
1792  ##
1793 
1794  #--
1795  def TraceStart(self, preface, msgid, msgdef, buf, stateId, fp=sys.stderr):
1796  """ Start of a message trace.
1797 
1798  Parameters:
1799  preface - Preface string.
1800  msgid - Message id.
1801  msgdef - Message definition.
1802  buf - Packed buffer.
1803  stateId - Packing/unpacking state id.
1804  fp - Opened output file pointer.
1805 
1806  """
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)]
1815  fp.write('\n')
1816  self.Trace2Col(text, buf, stateId)
1817  ##
1818 
1819  #--
1820  def TraceField(self, fielddef, fval, buf, stateId, fp=sys.stderr):
1821  """ Trace a field.
1822 
1823  Parameters:
1824  fielddef - Field definition.
1825  fval - Field value.
1826  buf - Packed buffer.
1827  stateId - Packing/unpacking state id.
1828  fp - Opened output file pointer.
1829  """
1830  fname = fielddef['name']
1831  fid = fielddef['fid']
1832  ftype = fielddef['ftype']
1833  fval = repr(fval)
1834  fstate = self.StateFieldGet(stateId)
1835  xtype = nmBase.NMFTypeCode2Xml.get(ftype, ftype)
1836 
1837  # print field value, info, and buffer
1838  if fstate['fpar'] == nmBase.NMFCode('vector'): # vector item
1839  text = ["%s[%u] = %s\t" % (xtype, fstate['i'], fval)]
1840  elif ftype == nmBase.NMFCode('pad'): # pad
1841  count = fstate['count']
1842  text = ["%s:%s(fid=%u, count=%u) =\t" % (xtype, 'pad', fid, count)]
1843  elif ftype == nmBase.NMFCode('string'): # 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'): # 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'): # 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)]
1865  else: # simple
1866  text = ["%s:%s(fid=%u) = %s\t" % (xtype, fname, fid, fval)]
1867 
1868  self.Trace2Col(text, buf, stateId)
1869  ##
1870 
1871  #--
1872  def Trace2Col(self, textList, buf, stateId, fp=sys.stderr):
1873  """ Trace text and buffer in a two-column format.
1874 
1875  Column 1 contains the formatted text output. Column 2 contains the
1876  formatted contents of the buffer.
1877 
1878  Parameters:
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.
1886  """
1887  trace = self.StateFieldGet(stateId, 'trace')
1888  start = trace['trace_start']
1889  end = trace['trace_end']
1890  if end is None:
1891  end = len(buf[start:])
1892  indent = 2 * (trace['trace_depth'])
1893  indentb = indent + 5 # left column subsequent lines indentation
1894  col2 = 40 # column 2 start position
1895  text1 = [] # formatted left column text lines
1896  text2 = [] # formatted right column text lines
1897 
1898  # format column 1
1899  line = ''
1900  for phrase in textList:
1901  if phrase.endswith('\n') or phrase.endswith('\t'):
1902  sp = space(indent)
1903  text1 += [sp+phrase]
1904  indent = indentb
1905  elif not line:
1906  sp = space(indent)
1907  line = sp + phrase
1908  phrase = ''
1909  elif len(line) + 2 + len(phrase) < col2-2:
1910  line += ', ' + phrase
1911  phrase = ''
1912  else:
1913  text1 += [line]
1914  indent = indentb
1915  sp = space(indent)
1916  line = sp + phrase
1917  if line:
1918  text1 += [line]
1919 
1920  # format column 2
1921  if end is None:
1922  end = len(buf[start:]) # buf end position + 1
1923  n = end - start # number of bytes
1924  while n > 0:
1925  if n >= 8:
1926  m = 8
1927  else:
1928  m = n
1929  s = ''
1930  i = 0
1931  while i < m:
1932  c = buf[start+i]
1933  s += "0x%02x " % (ord(c))
1934  i += 1
1935  text2 += [s]
1936  start += m
1937  n -= m
1938 
1939  # output two column text
1940  col = 0
1941  i = 0
1942  for line in text1:
1943  if line.endswith('\n'):
1944  fp.write(line)
1945  col = 0
1946  continue
1947  elif line.endswith('\t'):
1948  fp.write(line[:-1])
1949  col = len(line) - 1
1950  else:
1951  fp.write(line)
1952  col = len(line)
1953  if i < len(text2):
1954  if col > col2-2:
1955  fp.write('\n')
1956  col = 0
1957  fp.write(space(col2-col))
1958  fp.write(text2[i])
1959  i += 1
1960  fp.write('\n')
1961 
1962  while i < len(text2):
1963  fp.write(space(col2)) # space over to column 2
1964  fp.write(text2[i]) # line
1965  fp.write('\n')
1966  i += 1
1967  ##
1968 
1969  #--
1970  def TraceBufBlock(self, preface, buf, start=0, end=None, fp=sys.stderr):
1971  """ Trace a block bytes in packed buffer.
1972 
1973  Parameters:
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.
1979  """
1980  if end is None:
1981  end = len(buf[start:]) # buf end position + 1
1982  n = end - start
1983  fp.write("%s Buffer (%u bytes):\n" % (preface, n))
1984  nmBase.PrintBuf(buf[start:], count=n, nlfreq=16, fp=fp)
1985  ##
1986 
1987  #--
1988  def DebugState(self, stateId):
1989  """ Debug print current operational state.
1990 
1991  Parameters:
1992  stateId - State id.
1993  """
1994  nmBase.PrettyPrintDict(self.StateGet(stateId), name="StateId=%u" % stateId)
1995  ##
1996 
1997 ##
def UnpackU8(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:600
def nmPackMsgHdr(self, msgid, msgdef, stateId)
def nmUnpackStruct(self, fielddef, buf, offset, fvals, stateId)
def nmUnpackU64(self, fielddef, buf, offset, fvals, stateId)
def UnpackChar(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:581
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')
Definition: NetMsgsLib.py:335
def nmUnpackS8(self, fielddef, buf, offset, fvals, stateId)
def StateSet(self, stateId, keypath, kwargs)
def nmPackChar(self, fielddef, val, stateId)
def nmUnpackPad(self, fielddef, buf, offset, fvals, stateId)
def UnpackBool(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:562
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')
Definition: NetMsgsLib.py:409
def UnpackU32(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:676
def nmPackS32(self, fielddef, val, stateId)
def PackU16(val, endian='big')
Definition: NetMsgsLib.py:267
def UnpackF32(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:782
def UnpackString(buf, count, offset=0)
Definition: NetMsgsLib.py:889
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')
Definition: NetMsgsLib.py:195
def UnpackS8(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:619
def nmPackP64(self, fielddef, val, stateId)
def UnpackF64(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:803
def PackU32(val, endian='big')
Definition: NetMsgsLib.py:301
def UnpackP32(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:825
def nmIdent(self, fielddef, val, stateId)
def UnpackU16(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:638
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')
Definition: NetMsgsLib.py:748
def PackS32(val, endian='big')
Definition: NetMsgsLib.py:318
def nmUnpackP64(self, fielddef, buf, offset, fvals, stateId)
def nmUnpackF64(self, fielddef, buf, offset, fvals, stateId)
def nmPackU8(self, fielddef, val, stateId)
def UnpackU64(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:714
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')
Definition: NetMsgsLib.py:464
mFuncMap
Field Code to Function Mappings.
def PackU8(val, endian='big')
Definition: NetMsgsLib.py:229
def nmUnpackP32(self, fielddef, buf, offset, fvals, stateId)
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)
Definition: NetMsgsLib.py:493
def nmSetInt(self, fielddef, val, stateId)
def PackS8(val, endian='big')
Definition: NetMsgsLib.py:248
def nmUnpackBool(self, fielddef, buf, offset, fvals, stateId)
def UnpackS16(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:657
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')
Definition: NetMsgsLib.py:212
def nmPackBool(self, fielddef, val, stateId)
def nmPackF32(self, fielddef, val, stateId)
def nmPackS16(self, fielddef, val, stateId)
def GetDefReqVal(self, d, k, epreface='', stateId=None)
def nmPackString(self, fielddef, val, stateId)
def PackF32(val, endian='big')
Definition: NetMsgsLib.py:390
def nmPackVector(self, fielddef, vallist, stateId)
def nmPackFieldHdr(self, fielddef, val, stateId)
def nmPackS64(self, fielddef, val, stateId)
def UnpackS32(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:695
def PackS16(val, endian='big')
Definition: NetMsgsLib.py:284
def nmUnpackChar(self, fielddef, buf, offset, fvals, stateId)
def PackP32(val, endian='big')
Definition: NetMsgsLib.py:429
def nmUnpackS64(self, fielddef, buf, offset, fvals, stateId)
def UnpackP64(buf, offset=0, endian='big')
Definition: NetMsgsLib.py:852
def PackS64(val, endian='big')
Definition: NetMsgsLib.py:361
def nmUnpackS32(self, fielddef, buf, offset, fvals, stateId)