Guest User

Untitled

a guest
Jan 4th, 2012
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.95 KB | None | 0 0
  1. from core.appfw.config import Config
  2. from core.lib.logger import RobotLogger
  3. from sikuli.Constants import FOREVER
  4. from sikuli.Screen import Screen
  5. from core.lib.wrapper import Region
  6. from core.appfw.base import ImageRegion
  7. #import threading
  8. from java.lang import Thread
  9. import sys
  10.  
  11.  
  12. class HandleableDialog(object):
  13.    
  14.     log = None
  15.     observerSets = []
  16.     name = "test"
  17.     thread = None
  18.        
  19.     def __init__(self):
  20.         self.log = RobotLogger()
  21.         self.log.debug("Handle init for %s" % self.__class__.__name__)  
  22.         self.thread = Thread.currentThread() # use java thread instead of python, has methods for sleeping    
  23.    
  24.     def handle(self, event):  
  25.  
  26.         region = None
  27.         image = None
  28.  
  29.         # Find the region for this thread
  30.         for observerSet in self.observerSets:
  31.             if observerSet[1] == Thread.currentThread():
  32.                 region = observerSet[0]
  33.                 image = observerSet[2]
  34.  
  35.         self.log.info('Handler triggered by ["%s"](baseline:%s,actual:%s) on ["%s"](%s)' % (event.match, self.log.image(image), self.log.region(event.match), event.region, self.log.region()))    
  36.                
  37.         # Stop everything!!
  38.         self.stopObserving() # stop all the other observing threads        
  39.         self.thread.suspend() # suspend main thread while handling dialog
  40.        
  41.         # Handle the event
  42.         try:
  43.             self.handleDialog(event)
  44.         except Exception, e:
  45.             print e
  46.            
  47.         # Re-start everything                
  48.         self.thread.resume() #resume main thread        
  49.         self.startObserving() # start observing again
  50.        
  51.        
  52.         # Restart observation on this region
  53.         try:
  54.             self.log.debug("Resuming observation on thread %s" % Thread.currentThread())
  55.             #region.observe(FOREVER)
  56.         except:
  57.             self.log.error("Unable to resume observation on %s" % Thread.currentThread())
  58.        
  59.     def handleDialog(self, event):
  60.         self.log.warn("TODO: Implement dialog handler event=%s" % event);
  61.        
  62.     def register(self):    
  63.        
  64.         # format: Classname[handle].png
  65.         ir = ImageRegion(self, state="handle")
  66.         for filename in ir.getImageNames():
  67.            
  68.             # Make sure to get pattern in case png has extra attributes
  69.             pattern, attribs = ir.getPatternFromFilename(filename)
  70.            
  71.             # http://sikuli.org/docx/region.html#Region.observe
  72.             # For each region object, only one observation can be running at a given time.
  73.             region = Region(Config.screen)    
  74.             region.onAppear(pattern, self.handle)                                
  75.            
  76.             # Get the thread for this observance
  77.             threadsBefore = Thread.getAllStackTraces()    
  78.             region.observe(FOREVER, background=True) # thread is created
  79.             threadsAfter = Thread.getAllStackTraces()
  80.             thread = list(set(threadsBefore) ^ set(threadsAfter))[0] # difference of before after
  81.             thread.suspend() # start of suspended
  82.            
  83.             self.observerSets.append([region, thread, filename])
  84.             self.log.debug("adding handle dialog trigger [%s](%s) thread=%s" % (filename, self.log.image(filename), thread))
  85.            
  86.         self.startObserving() # automatically start observing ??
  87.                    
  88.     def startObserving(self):
  89.        
  90.         self.log.debug("starting observing all handleable dialogs")
  91.         for observerSet in self.observerSets:
  92.             observerSet[1].resume()
  93.                
  94.     def stopObserving(self):
  95.        
  96.         self.log.debug("stop observing all handleable dialogs")        
  97.         # stop observing on all regions by suspending threads
  98.         for observerSet in self.observerSets:
  99.            
  100.             # If this is the active thread, don't suspend ourself
  101.             if Thread.currentThread() != observerSet[1]:
  102.                 observerSet[1].suspend()
  103.        
  104.     def formatPrefix(self, *args, **args):
  105.        
  106.         return "[Test] "
  107.    
  108. class DialogHandlerController(object):
  109.     """ Register dialogs to be handled """
  110.    
  111.     log = None
  112.     instances = None
  113.    
  114.     def __init__(self, *args, **kwargs):
  115.  
  116.        
  117.         self.instances = []
  118.         self.log = RobotLogger(entity=self)
  119.         self.log.debug("started")
  120.        
  121.         # Register all classes which subclass HandleableDialog
  122.         for appCls in HandleableDialog.__subclasses__():
  123.             self.log.debug("Adding [%s]" % appCls.__name__)
  124.                                        
  125.             instance = appCls() # create instance of the handleable dialog
  126.             instance.register() # register the observation
  127.             self.instances.append(instance) # keep trace of the handler instance
  128.  
  129.        
  130.  
  131.     def formatPrefix(self, *args, **args):
  132.        
  133.         return "[DialogHandler Controller] "
Advertisement
Add Comment
Please, Sign In to add comment