def __init__(self, assoc: "Association") -> None: """Create a new DUL service provider for `assoc`. Parameters ---------- assoc : association.Association The DUL's parent :class:`~pynetdicom.association.Association` instance. """ # The association thread self._assoc = assoc self.socket: Optional["AssociationSocket"] = None # Current primitive and PDU # TODO: Don't do it this way self.primitive: Optional[_PDUPrimitiveType] = None self.pdu: Optional[_PDUType] = None # Tracks the events the state machine needs to process self.event_queue: "queue.Queue[str]" = queue.Queue() # These queues provide communication between the DUL service # user and the DUL service provider. # An event occurs when the DUL service user adds to # the to_provider_queue self.to_provider_queue: "queue.Queue[_PDUPrimitiveType]" = ( queue.Queue()) # A primitive is sent to the service user when the DUL service provider # adds to the to_user_queue. self.to_user_queue: "queue.Queue[_PDUPrimitiveType]" = queue.Queue() # Set the (network) idle and ARTIM timers # Timeouts gets set after DUL init so these are temporary self._idle_timer = Timer(60) self.artim_timer = Timer(30) # State machine - PS3.8 Section 9.2 self.state_machine = StateMachine(self) # Controls the minimum delay between loops in run() in seconds # TODO: try and make this event based rather than running loops self._run_loop_delay = 0.001 Thread.__init__(self, target=make_target(self.run_reactor)) self.daemon = False self._kill_thread = False
def __init__(self, assoc): """ Parameters ---------- assoc : association.Association The DUL's parent Association instance. """ # The association thread self._assoc = assoc self.socket = None # Current primitive and PDU # TODO: Don't do it this way self.primitive = None self.pdu = None # Tracks the events the state machine needs to process self.event_queue = queue.Queue() # These queues provide communication between the DUL service # user and the DUL service provider. # An event occurs when the DUL service user adds to # the to_provider_queue self.to_provider_queue = queue.Queue() # A primitive is sent to the service user when the DUL service provider # adds to the to_user_queue. self.to_user_queue = queue.Queue() # Set the (network) idle and ARTIM timers # Timeouts gets set after DUL init so these are temporary self._idle_timer = Timer(60) self.artim_timer = Timer(30) # State machine - PS3.8 Section 9.2 self.state_machine = StateMachine(self) # Controls the minimum delay between loops in run() # TODO: try and make this event based rather than running loops self._run_loop_delay = 0.001 Thread.__init__(self) self.daemon = False self._kill_thread = False
def __init__(self, socket=None, port=None, dul_timeout=None, assoc=None): """ Parameters ---------- socket : socket.socket, optional The local AE's listen socket port : int, optional The port number on which to wait for incoming connections dul_timeout : float, optional The maximum amount of time to wait for connection responses (in seconds) assoc : association.Association The DUL's current Association """ if socket and port: raise ValueError("DULServiceProvider can't be instantiated with " "both socket and port parameters") # The association thread self.assoc = assoc Thread.__init__(self) # Current primitive and PDU self.primitive = None self.pdu = None # The event_queue tracks the events the DUL state machine needs to # process self.event_queue = queue.Queue() # These queues provide communication between the DUL service # user and the DUL service provider. # An event occurs when the DUL service user adds to # the to_provider_queue self.to_provider_queue = queue.Queue() # A primitive is sent to the service user when the DUL service provider # adds to the to_user_queue. self.to_user_queue = queue.Queue() # Setup the idle timer, ARTIM timer and finite state machine # FIXME: Why do we have an idle timer? self._idle_timer = Timer(dul_timeout) # ARTIM timer self.artim_timer = Timer(dul_timeout) # State machine - PS3.8 Section 9.2 self.state_machine = StateMachine(self) if socket: # A client socket has been given, so the local AE is acting as # an SCP # generate an event 5 self.event_queue.put('Evt5') self.scu_socket = socket self.peer_address = None self.scp_socket = None elif port: # A port number has been given, so the local AE is acting as an # SCU. Create a new socket using the given port number self.scp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.scp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # The port number for the local AE to listen on self.local_port = port if self.local_port: # pylint: disable=broad-except try: local_address = os.popen('hostname').read()[:-1] self.scp_socket.bind((local_address, self.local_port)) except Exception as ex: LOGGER.exception(ex) self.scp_socket.listen(1) else: self.scp_socket = None self.scu_socket = None self.peer_address = None else: # No port nor socket self.scp_socket = None self.scu_socket = None self.peer_address = None self._kill_thread = False self.daemon = False # Controls the minimum delay between loops in run() self._run_loop_delay = 0.001