PROCEDURE activate_nqs (
  maximum_qfiles_per_task, maxqpt: integer 1..20 = 10
  maximum_transfers, maxt: integer 1..20 = 10
  retransmission_interval, ri: time_increment = 0:15:0
  load_map, lm: file = $optional
  dump_file, df: file = $optional
  job_class, jc: name = system
  notify_after_aborting, naa: boolean = false
  protocol_trace, pt: (BY_NAME, ADVANCED) boolean = false
  status)

  VAR
    title: string = 'Network Queueing System (NQS) for NOS/VE'
    ignore_status: status
    local_status: status
    nqs_library : file = $system.nqs.nqf$system_666
    dump_file_value: file = $null
    load_map_value: file = $null
  VAREND

  IF $specified(dump_file) THEN
    dump_file_value = dump_file
  IFEND

  IF $specified(load_map) THEN
    load_map_value = load_map
  IFEND

  IF NOT $file(nqs_library permanent) THEN
    EXIT procedure WITH $status(false 'AM' ame$file_not_known nqs_library 'NQS_ACTIVATION')
  IFEND

  MANAGE_JOBS
    select_job name=network_queueing_system_client job_state=(deferred, queued, initiated) ..
          user_information=title status=local_status
    EXIT procedure WITH local_status WHEN NOT local_status.normal
    IF $size(jmv$selected_jobs) > 0 THEN
      EXIT procedure WITH $status(false 'RA' 0 'An identical NQS job was found. NQS will not be activated')
    IFEND
  QUIT

  JOB jn=network_queueing_system_client job_abort_disposition=terminate job_class=job_class ..
        job_destination_usage=ve_local job_execution_ring=6 job_recovery_disposition=terminate ..
        output_disposition=$system.nqs.nqs_client_output substitution_mark='!' user_information=title ..
        status=local_status

    VAR
      ignore_status: status
      nqs_job_status: status
      abort_file_commands: file = $local.abort_file_commands
    VAREND

COLLECT_TEXT output=abort_file_commands until='** END OF ABORT COMMANDS **' substitution_mark='#'

    VAR
      dump_status: status
      dump_file: file = $fname('$system.nqs.nqs_dump_'//$date('Y2M2D2')//'_'//$time('H24MMSS'))
      notify_after_aborting: boolean = !notify_after_aborting!
    VAREND

    IF !$specified(dump_file)! THEN
      dump_file = !dump_file_value!
    IFEND

    display_message message=' ' to=job
    display_message message='**** Please write a PSR against NQS/VE and provide' to=job
    display_message message='**** as supporting material a permanent file backup' t=job
    display_message message='**** of catalog $SYSTEM.NQS.' t=job
    display_message message=' ' to=job

" The following commands will display the abort information
" through the use of the debugger.

    set_file_attributes dump_file fc=list pf=continuous
    put_line '1***** ABORT DUMP OF NQS' o=dump_file.$eoi
    put_line '       '//$date(iso)//' '//$time(millisecond) o=dump_file.$eoi
    put_line $format_value('       +p - +p - CYBER +p Serial +p' ($job(os_version) $default_family ..
          $processor(model_number, 0) $processor(serial_number, 0))) o=$dump_file.$eoi
    put_lines ('', ' ***** ENVIRONMENT:', '') output=dump_file.$eoi
    display_debugging_environment display_option=user_address output=dump_file.$eoi
    display_debug_task_status task_number=all output=dump_file.$eoi
    put_lines ('', ' ***** TRACEBACK:', '') output=dump_file.$eoi
    display_call count=all start=1 display_option=all_calls output=dump_file.$eoi
    put_lines ('', ' ***** JOB LOG:', '') output=dump_file.$eoi
    display_log display_option=200 output=dump_file.$eoi
    put_lines ('', ' ***** REGISTERS:', '') output=dump_file.$eoi
    display_register kind=all_program number=all type=hex output=dump_file.$eoi
    put_lines ('', ' ***** STACK FRAMES:', '') output=dump_file.$eoi
    display_stack_frame count=all start=1 display_option=all output=dump_file.$eoi
    put_lines ('', ' ***** STATIC SECTION:', '') output=dump_file.$eoi
    display_memory section=$static module=$name($current_module) byte_offset=0 byte_count=16 ..
          repeat_count=all output=dump_file.$eoi status=dump_status
    change_file_attributes dump_file ra=(!$ring! !$ring! !$ring!) status=dump_status

    IF notify_after_aborting THEN
      send_operator_message m='NQS job failed, see '//dump_file oc=system_operator
    IFEND
** END OF ABORT COMMANDS **

    IF !protocol_trace! THEN
      VAR
        ipv$debug_mode: (JOB) integer = 1
      VAREND
    IFEND

    change_message_level il=full status=ignore_status
    IF !$specified(load_map)! THEN
      set_program_attributes load_map=!load_map_value! load_map_options=all
    IFEND

    set_program_attributes abort_file=abort_file_commands preset_value=zero

    controller_parameters = 'maximum_qfiles_per_task=!maximum_qfiles_per_task! maximum_transfers=!maximum_transfers! ..
          retransmission_interval=!retransmission_interval! sender_library=!nqs_library! debug=!protocol_trace!'

    set_debug_ring $ring
    execute_task sp=nqp$_nqs_controller p=controller_parameters ..
          l=!nqs_library! status=nqs_job_status

    display_value nqs_job_status

  JOBEND

  EXIT procedure WITH local_status

PROCEND activate_nqs
