Subversion Repositories HomeAutomation

Rev

Rev 750 | Blame | Last modification | View Log | SVN | RSS feed

  1. ###########################################################
  2. #
  3. # The default implementation of the packet handler
  4. #
  5. ###########################################################
  6. from CanPktHandlerBase import CanPktHandlerBase
  7. from CanPkt import CanPkt
  8. import logging as log
  9.  
  10. class SpacePort():
  11.    
  12.     filterSpaces = {}
  13.    
  14.     def __init__ (self, filterSpaces):
  15.         for fs in filterSpaces:
  16.             sName = fs.__module__.split('.')[1] # implies module name is statespace.XXX
  17.             self.filterSpaces[sName] = fs
  18.    
  19.     def runAll(self, args):
  20.         for fs in self.filterSpaces.values():
  21.             relatedSpaces = fs.__RELATED_SPACES__
  22.             fs.run(relatedSpaces, args)
  23.         return True
  24.    
  25.     def run(self, spaceName, args):
  26.         if not self.filterSpaces.has_key(spaceName):
  27.             return False
  28.         else:
  29.             relatedSpaces = self.filterSpaces[spaceName].__RELATED_SPACES__
  30.             self.filtersSpaces[spaceName].run(relatedSpaces, args)
  31.             return True
  32.  
  33. class CanPktHandler1(CanPktHandlerBase):
  34.    
  35.     daemonCfg = None
  36.     serverListeners =[]
  37.    
  38.     def __init__ (self, daemonCfg):
  39.         self.daemonCfg = daemonCfg
  40.        
  41.     def input(self, strdata):
  42.         """Make data buffer into CanPkt and do early discard check """
  43.         """Call all filters in chain """
  44.  
  45.         if len(strdata) < 2:
  46.             return
  47.         if strdata[0:3] != 'PKT':
  48.             return
  49.  
  50. #        print strdata
  51.         pkt = CanPkt.stringToCanPkt(self, strdata)
  52. #        print 'incoming: ' + pkt.toString()
  53.  
  54.         for filter in self.daemonCfg.filterChain:
  55.             fObj = self.daemonCfg.filterCfg.filterModules[filter]
  56.             sp = SpacePort(fObj.__ASSOCIATED_SPACES__)
  57.             fObj.filter('', pkt, sp) # FIXME: use if name
  58.            
  59.         for sl in self.serverListeners:
  60.             if not sl.full():
  61.                 sl.write(pkt.toString())
  62.             else:
  63.                 log.debug('WARNING: Overflow in server buffer: ' + sl + ', packet dropped')
  64.  
  65.     def output(self, data):
  66.         pass
  67.    
  68.     def addServerListener(self, serverListener):
  69.         self.serverListeners.append(serverListener)
  70.    
  71.     def remServerListener(self, serverListener):
  72.         self.serverListeners.remove(serverListerner)
  73.