*copyc OSD$DEFAULT_PRAGMATS
MODULE iim$open;
?? TITLE := 'MODULE iim$open' ??

?? PUSH (LISTEXT := ON) ??
*copyc AMT$FAP_DECLARATIONS
*copyc IIK$KEYPOINTS
*copyc AMT$FILE_IDENTIFIER
*copyc amc$fap_request_codes
*copyc AME$OPEN_VALIDATION_ERRORS
*copyc amp$access_method
*copyc AMP$SET_FILE_INSTANCE_ABNORMAL
*copyc cle$ecc_lexical
*copyc CLP$CONVERT_INTEGER_TO_STRING
*copyc clp$validate_name
*copyc IIT$CONNECTION_DESCRIPTION
*copyc osp$set_status_abnormal
*copyc OSV$TASK_PRIVATE_HEAP
*copyc OSS$TASK_PRIVATE
*copyc IIP$ADD_SENDER
*copyc IIP$CLEAR_LOCK
*copyc IIP$INIT_OPEN_DESC_ATTRIBUTES
*copyc IIV$INTERACTIVE_TERMINATED
*copyc IIP$SIGN_ON
*copyc IIP$SET_LOCK
*copyc IIV$INT_TASK_OPEN_FILE_COUNT
*copyc IIV$CONNECTION_DESC_PTR
?? POP ??

?? NEWTITLE := 'PROCEDURE iip$open', EJECT ??

  PROCEDURE [XDCL, #GATE] iip$open (file_id: amt$file_identifier;
        open_file_desc_pointer: ^iit$open_file_description;
        file_name: amt$local_file_name;
        layer_number: amt$fap_layer_number;
    VAR status: ost$status);

    VAR
      call_block: amt$call_block,
      lfn: ost$name,
      clt_name: ost$name,
      fetch_file_contents_array: array [1 .. 1] of amt$fetch_item,
      max_task_count_string: ost$string,
      connection_desc_pointer: ^iit$connection_description,
      local_status: ost$status,
      valid_name: boolean;


{ Put the file name into the open file description.

    clp$validate_name (file_name, clt_name, valid_name);
    IF NOT valid_name THEN
      osp$set_status_abnormal ('CL', cle$improper_name, file_name, status);
      RETURN;
    IFEND;
    lfn := clt_name;
    open_file_desc_pointer^.file_name := lfn;

{ Initialize file access information.

    open_file_desc_pointer^.block_number := 1;
    open_file_desc_pointer^.last_get_put_operation := amc$put_next_req;
    open_file_desc_pointer^.last_access_operation := amc$open_req;
    open_file_desc_pointer^.previous_record_length := 0;

{ Put the pointer to the connection description into the open file description.

    iip$set_lock (iiv$connection_desc_lock, osc$wait, local_status);
    connection_desc_pointer := iiv$connection_desc_ptr;
    iip$clear_lock (iiv$connection_desc_lock, local_status);

    open_file_desc_pointer^.connection_desc_pointer := connection_desc_pointer;

    IF iiv$int_task_open_file_count = 0 THEN

{ Increment interactive task count.

      iip$set_lock (iiv$interactive_task_count_lock, osc$wait, local_status);
      IF iiv$interactive_task_count >= 100000 THEN
        iip$clear_lock (iiv$interactive_task_count_lock, local_status);
        clp$convert_integer_to_string (100000, 10, FALSE,
              max_task_count_string, local_status);
        amp$set_file_instance_abnormal (file_id, ame$terminal_task_limit,
              amc$open_req, max_task_count_string.value, status);
        RETURN;
      IFEND;
      iiv$interactive_task_count := iiv$interactive_task_count + 1;
      iip$clear_lock (iiv$interactive_task_count_lock, local_status);

{ Initialize access to the Memory Link.

      iip$sign_on (iiv$int_application_name, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;

      iip$add_sender (iiv$int_application_name, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;

    IFEND;

{ Initialize terminal attributes in the open file description.

    iip$init_open_desc_attributes (file_id, open_file_desc_pointer, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;
    open_file_desc_pointer^.terminal_mode := iic$line;
    fetch_file_contents_array [1].key := amc$file_contents;
    call_block.operation :=  amc$fetch_req;
    call_block.fetch.file_attributes := ^fetch_file_contents_array;
    amp$access_method (file_id,call_block,layer_number,status);
    open_file_desc_pointer^.format_effectors := (fetch_file_contents_array [1].file_contents = amc$list);

{ Increment task open interactive file count.

    iiv$int_task_open_file_count := iiv$int_task_open_file_count + 1;

    IF iiv$downline_data_block_ptr = NIL THEN
      ALLOCATE iiv$downline_data_block_ptr IN osv$task_private_heap^;
    IFEND;


  PROCEND iip$open;

MODEND iim$open;
