diff -r 2e38b5ec4753 -r d9175daf6522 runtime/PyroServer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/PyroServer.py Tue Aug 21 16:11:02 2018 +0200 @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of Beremiz runtime. + +# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD +# Copyright (C) 2017: Andrey Skvortsov +# Copyright (C) 2018: Edouard TISSERANT + +# See COPYING file for copyrights details. + +import sys + +import Pyro +import Pyro.core as pyro +import runtime +from runtime.ServicePublisher import ServicePublisher + +class Server(object): + def __init__(self, servicename, ip_addr, port): + self.continueloop = True + self.daemon = None + self.servicename = servicename + self.ip_addr = ip_addr + self.port = port + self.servicepublisher = None + + def _to_be_published(self): + return self.servicename is not None and \ + self.ip_addr is not None and \ + self.ip_addr != "localhost" and \ + self.ip_addr != "127.0.0.1" + + def PrintServerInfo(self): + print(_("Pyro port :"), self.port) + + if self._to_be_published(): + print(_("Publishing service on local network")) + + sys.stdout.flush() + + def PyroLoop(self, when_ready): + while self.continueloop: + Pyro.config.PYRO_MULTITHREADED = 0 + pyro.initServer() + self.daemon = pyro.Daemon(host=self.ip_addr, port=self.port) + + # pyro never frees memory after connection close if no timeout set + # taking too small timeout value may cause + # unwanted diconnection when IDE is kept busy for long periods + self.daemon.setTimeout(60) + + pyro_obj=Pyro.core.ObjBase() + pyro_obj.delegateTo(runtime.GetPLCObjectSingleton()) + + self.daemon.connect(pyro_obj, "PLCObject") + + if self._to_be_published(): + self.servicepublisher = ServicePublisher() + self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port) + + when_ready() + self.daemon.requestLoop() + self.daemon.sock.close() + + def Restart(self): + self._stop() + + def Quit(self): + self.continueloop = False + self._stop() + + def _stop(self): + if self.servicepublisher is not None: + self.servicepublisher.UnRegisterService() + self.servicepublisher = None + self.daemon.shutdown(True) + + +