'''
Created on Sep 18, 2020
@author: esdev
'''
import zmq
import logging
from slacm.exceptions import UndefinedOperation,PortOperationError
try:
import cPickle
pickle = cPickle
except:
cPickle = None
import pickle
[docs]
class Port(object):
'''
Base class for all port types.
'''
def __init__(self, parent, name, spec=None):
self.logger = logging.getLogger(__name__)
self.parent = parent
self.name = name
self.spec = spec
self.index = self.parent.get_next_index()
self.context = parent.context
self.netInfo = parent.get_netInfo()
self.socket = None
self.owner = None
self.portNum = -1
self.host = None
[docs]
def is_msg_local(self):
raise UndefinedOperation('Port.is_msg_local')
[docs]
def getIndex(self):
return self.index
[docs]
def setup(self,owner,disco):
raise UndefinedOperation('Port.setup')
[docs]
def finalize(self,disco):
raise UndefinedOperation('Port.finalize')
[docs]
def getSocket(self):
return self.socket
[docs]
def inSocket(self):
raise UndefinedOperation('Port.inSocket')
[docs]
def activate(self):
pass
[docs]
def deactivate(self):
pass
[docs]
def terminate(self):
pass
[docs]
def send_pyobj(self,msg):
'''
Send a Python object via the port.
'''
try:
result = self.socket.send_pyobj(msg)
except zmq.error.ZMQError as e:
raise PortOperationError(f"send error [{e.errno}]") from e
return result
[docs]
def recv_pyobj(self):
'''
Receive a Python object via the port.
'''
try:
result = self.socket.recv_pyobj()
except zmq.error.ZMQError as e:
raise PortOperationError(f"recv error [{e.errno}]") from e
return result
[docs]
def send(self,msg):
'''
Send a bytearray via the port.
'''
try:
result = self.socket.send(msg)
except zmq.error.ZMQError as e:
raise PortOperationError(f"send error [{e.errno}]") from e
return result
[docs]
def recv(self):
'''
Receive a bytearray via the port.
'''
try:
result = self.socket.recv()
except zmq.error.ZMQError as e:
raise PortOperationError(f"recv error [{e.errno}]") from e
return result
[docs]
class UniPort(Port):
'''
Base class for uni-directional ports.
'''
def __init__(self, parent, name, spec=None):
super().__init__(parent,name,spec)
self.isLocalPort = self.is_msg_local()
[docs]
def is_msg_local(self):
return self.parent.is_local(self.spec.type)
[docs]
class BiPort(Port):
'''
Base class for bi-directional ports
'''
def __init__(self, parent, name, spec=None):
super().__init__(parent,name,spec)
self.isLocalPort = self.is_msg_local()
[docs]
def is_msg_local(self):
return self.parent.is_local(self.spec.req_type) and \
self.parent.is_local(self.spec.rep_type)