runtime/PyroServer.py
changeset 2270 d9175daf6522
child 2309 d8fb90a2e11f
child 2311 bef2b4b87370
equal deleted inserted replaced
2269:2e38b5ec4753 2270:d9175daf6522
       
     1 #!/usr/bin/env python
       
     2 # -*- coding: utf-8 -*-
       
     3 
       
     4 # This file is part of Beremiz runtime.
       
     5 
       
     6 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
       
     7 # Copyright (C) 2017: Andrey Skvortsov
       
     8 # Copyright (C) 2018: Edouard TISSERANT
       
     9 
       
    10 # See COPYING file for copyrights details.
       
    11 
       
    12 import sys
       
    13 
       
    14 import Pyro
       
    15 import Pyro.core as pyro
       
    16 import runtime
       
    17 from runtime.ServicePublisher import ServicePublisher
       
    18 
       
    19 class Server(object):
       
    20     def __init__(self, servicename, ip_addr, port):
       
    21         self.continueloop = True
       
    22         self.daemon = None
       
    23         self.servicename = servicename
       
    24         self.ip_addr = ip_addr
       
    25         self.port = port
       
    26         self.servicepublisher = None
       
    27 
       
    28     def _to_be_published(self):
       
    29         return self.servicename is not None and \
       
    30                self.ip_addr is not None and \
       
    31                self.ip_addr != "localhost" and \
       
    32                self.ip_addr != "127.0.0.1"
       
    33 
       
    34     def PrintServerInfo(self):
       
    35         print(_("Pyro port :"), self.port)
       
    36 
       
    37         if self._to_be_published():
       
    38             print(_("Publishing service on local network"))
       
    39 
       
    40         sys.stdout.flush()
       
    41 
       
    42     def PyroLoop(self, when_ready):
       
    43         while self.continueloop:
       
    44             Pyro.config.PYRO_MULTITHREADED = 0
       
    45             pyro.initServer()
       
    46             self.daemon = pyro.Daemon(host=self.ip_addr, port=self.port)
       
    47 
       
    48             # pyro never frees memory after connection close if no timeout set
       
    49             # taking too small timeout value may cause
       
    50             # unwanted diconnection when IDE is kept busy for long periods
       
    51             self.daemon.setTimeout(60)
       
    52 	
       
    53             pyro_obj=Pyro.core.ObjBase()
       
    54             pyro_obj.delegateTo(runtime.GetPLCObjectSingleton())
       
    55 
       
    56             self.daemon.connect(pyro_obj, "PLCObject")
       
    57 
       
    58             if self._to_be_published():
       
    59                 self.servicepublisher = ServicePublisher()
       
    60                 self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port)
       
    61 
       
    62             when_ready()
       
    63             self.daemon.requestLoop()
       
    64             self.daemon.sock.close()
       
    65 
       
    66     def Restart(self):
       
    67         self._stop()
       
    68 
       
    69     def Quit(self):
       
    70         self.continueloop = False
       
    71         self._stop()
       
    72 
       
    73     def _stop(self):
       
    74         if self.servicepublisher is not None:
       
    75             self.servicepublisher.UnRegisterService()
       
    76             self.servicepublisher = None
       
    77         self.daemon.shutdown(True)
       
    78 
       
    79 
       
    80