OLD | NEW |
(Empty) | |
| 1 import time |
| 2 import logging |
| 3 from pyasn1.compat.octets import octs2ints |
| 4 from pyasn1 import error |
| 5 from pyasn1 import __version__ |
| 6 |
| 7 flagNone = 0x0000 |
| 8 flagEncoder = 0x0001 |
| 9 flagDecoder = 0x0002 |
| 10 flagAll = 0xffff |
| 11 |
| 12 flagMap = { |
| 13 'encoder': flagEncoder, |
| 14 'decoder': flagDecoder, |
| 15 'all': flagAll |
| 16 } |
| 17 |
| 18 class Printer: |
| 19 def __init__(self, logger=None, handler=None, formatter=None): |
| 20 if logger is None: |
| 21 logger = logging.getLogger('pyasn1') |
| 22 logger.setLevel(logging.DEBUG) |
| 23 if handler is None: |
| 24 handler = logging.StreamHandler() |
| 25 if formatter is None: |
| 26 formatter = logging.Formatter('%(asctime)s %(name)s: %(message)s') |
| 27 handler.setFormatter(formatter) |
| 28 handler.setLevel(logging.DEBUG) |
| 29 logger.addHandler(handler) |
| 30 self.__logger = logger |
| 31 |
| 32 def __call__(self, msg): self.__logger.debug(msg) |
| 33 def __str__(self): return '<python built-in logging>' |
| 34 |
| 35 if hasattr(logging, 'NullHandler'): |
| 36 NullHandler = logging.NullHandler |
| 37 else: |
| 38 # Python 2.6 and older |
| 39 class NullHandler(logging.Handler): |
| 40 def emit(self, record): |
| 41 pass |
| 42 |
| 43 class Debug: |
| 44 defaultPrinter = None |
| 45 def __init__(self, *flags, **options): |
| 46 self._flags = flagNone |
| 47 if options.get('printer') is not None: |
| 48 self._printer = options.get('printer') |
| 49 elif self.defaultPrinter is not None: |
| 50 self._printer = self.defaultPrinter |
| 51 if 'loggerName' in options: |
| 52 # route our logs to parent logger |
| 53 self._printer = Printer( |
| 54 logger=logging.getLogger(options['loggerName']), |
| 55 handler=NullHandler() |
| 56 ) |
| 57 else: |
| 58 self._printer = Printer() |
| 59 self('running pyasn1 version %s' % __version__) |
| 60 for f in flags: |
| 61 inverse = f and f[0] in ('!', '~') |
| 62 if inverse: |
| 63 f = f[1:] |
| 64 try: |
| 65 if inverse: |
| 66 self._flags &= ~flagMap[f] |
| 67 else: |
| 68 self._flags |= flagMap[f] |
| 69 except KeyError: |
| 70 raise error.PyAsn1Error('bad debug flag %s' % f) |
| 71 |
| 72 self('debug category \'%s\' %s' % (f, inverse and 'disabled' or 'ena
bled')) |
| 73 |
| 74 def __str__(self): |
| 75 return 'logger %s, flags %x' % (self._printer, self._flags) |
| 76 |
| 77 def __call__(self, msg): |
| 78 self._printer(msg) |
| 79 |
| 80 def __and__(self, flag): |
| 81 return self._flags & flag |
| 82 |
| 83 def __rand__(self, flag): |
| 84 return flag & self._flags |
| 85 |
| 86 logger = 0 |
| 87 |
| 88 def setLogger(l): |
| 89 global logger |
| 90 logger = l |
| 91 |
| 92 def hexdump(octets): |
| 93 return ' '.join( |
| 94 [ '%s%.2X' % (n%16 == 0 and ('\n%.5d: ' % n) or '', x) |
| 95 for n,x in zip(range(len(octets)), octs2ints(octets)) ] |
| 96 ) |
| 97 |
| 98 class Scope: |
| 99 def __init__(self): |
| 100 self._list = [] |
| 101 |
| 102 def __str__(self): return '.'.join(self._list) |
| 103 |
| 104 def push(self, token): |
| 105 self._list.append(token) |
| 106 |
| 107 def pop(self): |
| 108 return self._list.pop() |
| 109 |
| 110 scope = Scope() |
OLD | NEW |