def test_association_acse_timeout(self): """ Check that the Association timeouts are being set correctly """ scp = AEVerificationSCP() scp.ae.acse_timeout = 0 scp.ae.dimse_timeout = 0 ae = AE(scu_sop_class=[VerificationSOPClass]) ae.acse_timeout = 0 ae.dimse_timeout = 0 assoc = ae.associate('localhost', 11112) self.assertTrue(scp.ae.active_associations[0].acse_timeout == 0) self.assertTrue(scp.ae.active_associations[0].dimse_timeout == 0) self.assertTrue(assoc.acse_timeout == 0) self.assertTrue(assoc.dimse_timeout == 0) assoc.release() scp.ae.acse_timeout = 21 scp.ae.dimse_timeout = 22 ae.acse_timeout = 31 ae.dimse_timeout = 32 assoc = ae.associate('localhost', 11112) self.assertTrue(scp.ae.active_associations[0].acse_timeout == 21) self.assertTrue(scp.ae.active_associations[0].dimse_timeout == 22) self.assertTrue(assoc.acse_timeout == 31) self.assertTrue(assoc.dimse_timeout == 32) assoc.release() self.assertRaises(SystemExit, scp.stop)
def test_acse_timeout(self): """ Check AE ACSE timeout change produces good value """ ae = AE(scu_sop_class=['1.2.840.10008.1.1']) ae.acse_timeout = None self.assertTrue(ae.acse_timeout == 0) ae.acse_timeout = -100 self.assertTrue(ae.acse_timeout == 0) ae.acse_timeout = 'a' self.assertTrue(ae.acse_timeout == 0) ae.acse_timeout = 0 self.assertTrue(ae.acse_timeout == 0) ae.acse_timeout = 30 self.assertTrue(ae.acse_timeout == 30)
dcm_files = [os.path.join(basedir, x) for x in dcm_files] for dcm in dcm_files: data = read_file(dcm, force=True) d = Dataset() d.QueryRetrieveLevel = dataset.QueryRetrieveLevel d.RetrieveAETitle = args.aetitle d.PatientName = data.PatientName yield d # Create application entity ae = AE( ae_title=args.aetitle, port=args.port, scu_sop_class=[], scp_sop_class=QueryRetrieveSOPClassList, transfer_syntax=transfer_syntax, ) ae.maximum_pdu_size = args.max_pdu # Set timeouts ae.network_timeout = args.timeout ae.acse_timeout = args.acse_timeout ae.dimse_timeout = args.dimse_timeout ae.on_c_find = on_c_find ae.start()
def main(args=None): """Run the application.""" if args is not None: sys.argv = args args = _setup_argparser() if args.version: print('getscu.py v{}'.format(__version__)) sys.exit() APP_LOGGER = setup_logging(args, 'getscu') APP_LOGGER.debug('getscu.py v{0!s}'.format(__version__)) APP_LOGGER.debug('') # Create query (identifier) dataset try: # If you're looking at this to see how QR Get works then `identifer` # is a pydicom Dataset instance with your query keys, e.g.: # identifier = Dataset() # identifier.QueryRetrieveLevel = 'PATIENT' # identifier.PatientName = '*' identifier = create_dataset(args, APP_LOGGER) except Exception as exc: APP_LOGGER.exception(exc) sys.exit(1) # Exclude these SOP Classes _exclusion = [ PlannedImagingAgentAdministrationSRStorage, PerformedImagingAgestAdministrationSRStorage, EncapsulatedSTLStorage, ] store_contexts = [ cx for cx in StoragePresentationContexts if cx.abstract_syntax not in _exclusion ] # Create application entity # Binding to port 0 lets the OS pick an available port ae = AE(ae_title=args.calling_aet) ae.acse_timeout = args.acse_timeout ae.dimse_timeout = args.dimse_timeout ae.network_timeout = args.network_timeout ext_neg = [] ae.add_requested_context(PatientRootQueryRetrieveInformationModelGet) ae.add_requested_context(StudyRootQueryRetrieveInformationModelGet) ae.add_requested_context(PatientStudyOnlyQueryRetrieveInformationModelGet) for cx in store_contexts: ae.add_requested_context(cx.abstract_syntax) # Add SCP/SCU Role Selection Negotiation to the extended negotiation # We want to act as a Storage SCP ext_neg.append(build_role(cx.abstract_syntax, scp_role=True)) if args.study: query_model = StudyRootQueryRetrieveInformationModelGet elif args.psonly: query_model = PatientStudyOnlyQueryRetrieveInformationModelGet else: query_model = PatientRootQueryRetrieveInformationModelGet # Request association with remote assoc = ae.associate(args.addr, args.port, ae_title=args.called_aet, ext_neg=ext_neg, evt_handlers=[(evt.EVT_C_STORE, handle_store, [args, APP_LOGGER])], max_pdu=args.max_pdu) if assoc.is_established: # Send query responses = assoc.send_c_get(identifier, query_model) for (status, rsp_identifier) in responses: # If `status.Status` is one of the 'Pending' statuses then # `rsp_identifier` is the C-GET response's Identifier dataset if status and status.Status in [0xFF00, 0xFF01]: # `rsp_identifier` is a pydicom Dataset containing a query # response. You may want to do something interesting here... pass assoc.release() else: sys.exit(1)
yield len(dcm_files) # Matching datasets to send for dcm in dcm_files: ds = dcmread(dcm, force=True) yield 0xff00, ds handlers = [(evt.EVT_C_MOVE, handle_move)] # Create application entity ae = AE(ae_title=args.aetitle) # Add the requested Storage Service presentation contexts # Used when sending the dataset to the move destination Storage SCP for context in StoragePresentationContexts: ae.add_requested_context(context.abstract_syntax, transfer_syntax) # Add the supported QR Service presentation contexts for context in QueryRetrievePresentationContexts: ae.add_supported_context(context.abstract_syntax, transfer_syntax) ae.maximum_pdu_size = args.max_pdu # Set timeouts ae.network_timeout = args.timeout ae.acse_timeout = args.acse_timeout ae.dimse_timeout = args.dimse_timeout ae.start_server(('', args.port), evt_handlers=handlers)
def main(args=None): """Run the application.""" if args is not None: sys.argv = args args = _setup_argparser() if args.version: print('movescu.py v{}'.format(__version__)) sys.exit() APP_LOGGER = setup_logging(args, 'movescu') APP_LOGGER.debug('movescu.py v{0!s}'.format(__version__)) APP_LOGGER.debug('') # Create query (identifier) dataset try: # If you're looking at this to see how QR Move works then `identifer` # is a pydicom Dataset instance with your query keys, e.g.: # identifier = Dataset() # identifier.QueryRetrieveLevel = 'PATIENT' # identifier.PatientName = '*' identifier = create_dataset(args, APP_LOGGER) except Exception as exc: APP_LOGGER.exception(exc) sys.exit(1) # Create application entity ae = AE() # Start the Store SCP (optional) scp = None if args.store: transfer_syntax = ALL_TRANSFER_SYNTAXES[:] store_handlers = [(evt.EVT_C_STORE, handle_store, [args, APP_LOGGER])] ae.ae_title = args.store_aet for cx in AllStoragePresentationContexts: ae.add_supported_context(cx.abstract_syntax, transfer_syntax) scp = ae.start_server(('', args.store_port), block=False, evt_handlers=store_handlers) ae.ae_title = args.calling_aet ae.acse_timeout = args.acse_timeout ae.dimse_timeout = args.dimse_timeout ae.network_timeout = args.network_timeout ae.requested_contexts = QueryRetrievePresentationContexts ae.supported_contexts = [] # Query/Retrieve Information Models if args.study: query_model = StudyRootQueryRetrieveInformationModelMove elif args.psonly: query_model = PatientStudyOnlyQueryRetrieveInformationModelMove else: query_model = PatientRootQueryRetrieveInformationModelMove # Request association with remote AE assoc = ae.associate(args.addr, args.port, ae_title=args.called_aet, max_pdu=args.max_pdu) if assoc.is_established: # Send query move_aet = args.move_aet or args.calling_aet responses = assoc.send_c_move(identifier, move_aet, query_model) for (status, rsp_identifier) in responses: # If `status.Status` is one of the 'Pending' statuses then # `rsp_identifier` is the C-MOVE response's Identifier dataset if status and status.Status in [0xFF00, 0xFF01]: # `rsp_identifier` is a pydicom Dataset containing a query # response. You may want to do something interesting here... pass assoc.release() _EXIT_VALUE = 0 else: _EXIT_VALUE = 1 # Shutdown the Storage SCP (if used) if scp: scp.shutdown() sys.exit(_EXIT_VALUE)