*DECK NETGETF
USETEXT AIPDEF
USETEXT NP$GETS
USETEXT NP$MODE
USETEXT NP$NWL
USETEXT NP$STAT
USETEXT NP$TAA
*IF,DEF,DEBUG
USETEXT NP$DB
*ENDIF
PROC NETGETF((ADR),HA,(NA),TAAA);
*IF DEF,IMS
#
*1DC NETGETF
*
* 1. PROC NAME AUTHOR DATE
* NETGETF J.C. LEE 78/10/10
* NETGTFL
*
* 2. FUNCTIONAL DESCRIPTION
* THIS ROUTINE BUILDS A NETGETF OR A NETGTFL REQUEST IN THE
* NWL WORKLIST, FOR A BLOCK FROM THE SPECIFIED CONNECTION OR
* LIST. REQUESTS FOR SUPERVISORY MESSAGES MAY BE MADE ON
* CONNECTION / LIST ZERO.
*
* 3. METHOD USED
* IF THE APPLICATION IS USING THE UPLINE DATA QUEUE FEATURE, OR
* THE DOWNLINE BUFFERING FEATURE, THIS PROGRAM CANNOT BE CALLED.
* A NETGETF ENTRY IS BUILT IN THE WORKLIST FOR A NON-ZERO ACN.
* A NETGTFL IS BUILT IN THE WORKLIST FOR ALL ALN.
* A NETGTFL MAY HAVE ONE OF THE FOLLOWING FORMAT:
*
* 1. I-----------------------------------------------------I
* I OP CODE WORD WITH A NON-ZERO LOC OF TEXT AREA ARRAY I
* I-----------------------------------------------------I
* I ABH WORD CONTAINING TLMAX AND THE CONNECTION NO I
* I-----------------------------------------------------I
*
* 2. I-----------------------------------------------------I
* I OP CODE WORD WITH A ZERO LOC OF TEXT AREA ARRAY I
* I-----------------------------------------------------I
* I ABH WORD CONTAINING TLMAX AND THE CONNECTION NO I
* I-----------------------------------------------------I
* I A NULL WORD - SO THAT NIP DOES NOT NEED ALLOCATE I
* I ANOTHER BUFFER TO SF.LIST THE TEXT AREA ARRAY. (AN I
* I SF.LIST REQUIRES TWO SUBSYSTEM FUNCTION PARAMETER I
* I WORDS PLUS A WORD FOR NIP"S BUFFER HEADER. I
* I-----------------------------------------------------I
* I TEXT AREA ARRAY CONTAINING SIZES AND LOCATIONS OF I
* I EACH FRAGMENTED BUFFERS. I
* I-----------------------------------------------------I
*
* THE TEXT AREA ARRAY CONTAINING SIZES AND LOCATIONS OF BUFFER
* FRAGMENTS, IS COPIED TO THE NWL IF THERE IS ENOUGH ROOM:
* 2 HEADER WORDS (OP, ABH) + A NULL WORD + LTAA + 2 WORDS FOR A
* GSM ENTRY. FOR A GETF/GTFL ON A ZERO ACN/ALN, A MESSAGE IS
* DELIVERED FROM THE SMB, VIA NP$GSM.
*
* 4. ENTRY CONDITIONS
* ADR - APPLICATION CONNECTION NUMBER / APPLICATION LIST NUMBER
* HA - HEADER AREA
* NEXT - NEXT AVAILABLE SPACE POINTER FOR WORKLIST
* SPACE$LEFT - NUMBER OF CELLS AVAILABLE IN NWL
* NA - NUMBER OF FRAGMENTED BUFFERS
* TAA - TEXT AREA ARRAY
*
* 5. EXIT CONDITIONS
* DEFER$GSM - TRUE FOR ADR=0 IF SMB IS EMPTY
* LTAA - RESET TO ZERO
* NEXT - NEXT AVAILABLE SPACE POINTER, RESET TO INITIAL VALUE
* SPACE$LEFT - NUMBER OF CELLS AVAILABLE IN WORKLIST, RESET TO
* INITIAL VALUE.
*
* 6. COMDECKS CALLED AND SYMPL TEXTS USED.
* AIPDEF NP$CRT NP$DB NP$GETS
* NP$NWL NP$STAT NP$TAA
* NP$MODE
*
* 7. ROUTINES CALLED
* NP$GET - PROCESS A GET REQUEST.
*
* 8. DAYFILE MESSAGES
* * NETWORK APPLICATION ABORTED, RC = 55. *
* * NETGETF: REQUEST INVALID FOR DATA QUEUE. *
*
* * NETWORK APPLICATION ABORTED, RC = 56. *
* * NETGTFL: REQUEST INVALID FOR DATA QUEUE. *
*
#
*ENDIF
BEGIN
*CALL NP$CRT
CONTROL LIST;
#
ROUTINES CALLED
#
XREF
BEGIN
PROC NP$ERR; # ISSUE ERR MSG AND ABORT APP #
PROC NP$GET;
END
#
LOCAL VARIABLES
#
ITEM
ADR I, # APP CONNECTION / LIST NO #
HA I, # HEADER ADDRESS #
NA I, # NO OF FRAGMENTED BUFFERS #
NAA I, # TEMPORARY VARIABLE #
TAAA I, # TEXT ARRAY AREA ADDRESS #
I I, # TEMPORARY VARIABLE #
J I; # TEMPORARY VARIABLE #
#**********************************************************************#
#
NETGETF EXECUTION BEGINS HERE
#
OPCODE = OP$GETF;
*IF,DEF,STAT
IAM = TYPE"GETF";
IF GMBUSE OR DOWNUSE # UPLINE DATA QUEUE OR DOWNLINE#
THEN # BUFFER FEATURE BEING USED. #
BEGIN
NP$ERR("55"); # ABORT APP WITH ERROR MESSAGE #
END
LIST = FALSE; # SET FLAG FOR NOT LIST PROCESS#
*ENDIF
GOTO NETGTF1;
ENTRY PROC NETGTFL((ADR),HA,(NA),TAAA);
OPCODE = OP$GTFL;
*IF,DEF,STAT
IAM = TYPE"GTFL";
IF GMBUSE OR DOWNUSE # UPLINE DATA QUEUE OR DOWNLINE#
THEN # BUFFER FEATURE BEING USED #
BEGIN
NP$ERR("56"); # ABORT APP WITH ERROR MESSAGE #
END
LIST = TRUE; # SET FLAG FOR LIST PROCESSING #
*ENDIF
NETGTF1:
NAA = NA;
#
STORE INPUT PARAMETERS IN COMMON BLOCK
#
ACLN = ADR;
LOC$HA = LOC(HA);
LOC$TA = LOC(TAAA);
TLMX = 0;
LTAA = NAA;
*IF DEF,DEBUG
NP$NA = NA;
*ENDIF
P<TAA> = LOC$TA;
FOR I=1 STEP 1 UNTIL NA DO
TLMX = TLMX + TAASIZE[I];
*IF DEF,DEBUG
#
SET UP PARAMETERS FOR DEBUG MESSAGE LOGGING
#
IF OPCODE EQ OP$GETF
THEN
DB$CALL = LOC(NETGETF);
ELSE
DB$CALL = LOC(NETGTFL);
*ENDIF
#
SET UP GETF OR GTFL NWL ENTRY
#
NWL[NEXT] = 0; # CLEAR NWL OPCODE WORD #
BS = OPABHSIZ; # INITIALIZE NWL ENTRY SIZE #
NWL$LTAA[NEXT] = NAA; # LENGTH OF TEXT AREA ARRAY #
IF NA LQ (SPACE$LEFT - GMMESIZE - NTRYSIZ3 - OPABHSIZ) AND
NAA LQ MAXNA
THEN # SPACE AVAILABLE IN NWL FOR #
BEGIN # TEXT AREA ARRAY #
BS = NA + NTRYSIZ3; # RESET NWL ENTRY SIZE #
I = NEXT + NTRYSIZ3 - 1;
FOR J=1 STEP 1 UNTIL NA DO # COPY TAA TO NWL #
NWL[I+J] = TAAWORD[J];
END
ELSE
NWL$TA[NEXT] = LOC$TA; # TAA CANNOT FIT INTO NWL #
NP$GET; # VALIDATE CALL AND SET UP #
RETURN;
END # NETGETF #
TERM