432 import Pyro.core as pyro |
432 import Pyro.core as pyro |
433 |
433 |
434 if not os.path.isdir(WorkingDir): |
434 if not os.path.isdir(WorkingDir): |
435 os.mkdir(WorkingDir) |
435 os.mkdir(WorkingDir) |
436 |
436 |
437 def default_evaluator(callable, *args, **kwargs): |
437 def default_evaluator(tocall, *args, **kwargs): |
438 return callable(*args,**kwargs) |
438 try: |
|
439 res=(tocall(*args,**kwargs), None) |
|
440 except Exception,exp: |
|
441 res=(None, exp) |
|
442 return res |
439 |
443 |
440 class Server(): |
444 class Server(): |
441 def __init__(self, servicename, ip_addr, port, workdir, argv, autostart=False, statuschange=None, evaluator=default_evaluator, website=None): |
445 def __init__(self, servicename, ip_addr, port, workdir, argv, autostart=False, statuschange=None, evaluator=default_evaluator, website=None): |
442 self.continueloop = True |
446 self.continueloop = True |
443 self.daemon = None |
447 self.daemon = None |
679 website = None |
683 website = None |
680 |
684 |
681 if havewx: |
685 if havewx: |
682 from threading import Semaphore |
686 from threading import Semaphore |
683 wx_eval_lock = Semaphore(0) |
687 wx_eval_lock = Semaphore(0) |
684 mythread = currentThread() |
688 main_thread = currentThread() |
685 |
689 |
686 def statuschange(status): |
690 def statuschange(status): |
687 wx.CallAfter(taskbar_instance.UpdateIcon,status) |
691 wx.CallAfter(taskbar_instance.UpdateIcon,status) |
688 |
692 |
689 eval_res = None |
693 def wx_evaluator(obj, *args, **kwargs): |
690 def wx_evaluator(callable, *args, **kwargs): |
694 tocall,args,kwargs = obj.call |
691 global eval_res |
695 obj.res = default_evaluator(tocall, *args, **kwargs) |
692 try: |
696 wx_eval_lock.release() |
693 eval_res=callable(*args,**kwargs) |
697 |
694 except Exception,e: |
698 def evaluator(tocall, *args, **kwargs): |
695 PLCprint("#EXCEPTION : "+str(e)) |
699 global main_thread |
696 finally: |
700 if(main_thread == currentThread()): |
697 wx_eval_lock.release() |
701 # avoid dead lock if called from the wx mainloop |
698 |
702 return default_evaluator(tocall, *args, **kwargs) |
699 def evaluator(callable, *args, **kwargs): |
|
700 # call directly the callable function if call from the wx mainloop (avoid dead lock) |
|
701 if(mythread == currentThread()): |
|
702 callable(*args,**kwargs) |
|
703 else: |
703 else: |
704 wx.CallAfter(wx_evaluator,callable,*args,**kwargs) |
704 o=type('',(object,),dict(call=(tocall, args, kwargs), res=None)) |
|
705 wx.CallAfter(wx_evaluator,o) |
705 wx_eval_lock.acquire() |
706 wx_eval_lock.acquire() |
706 return eval_res |
707 return o.res |
707 |
708 |
708 pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, statuschange, evaluator, website) |
709 pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, statuschange, evaluator, website) |
709 taskbar_instance = BeremizTaskBarIcon(pyroserver, enablewx) |
710 taskbar_instance = BeremizTaskBarIcon(pyroserver, enablewx) |
710 else: |
711 else: |
711 pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, website=website) |
712 pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, website=website) |