*DECK HPGET
USETEXT NIPDEF
USETEXT ACB
USETEXT ACNT
USETEXT AHEADER
USETEXT APPSTAT
USETEXT DBGBUF
USETEXT NP$TAA
USETEXT NWLHEAD
USETEXT NWLNTRY
USETEXT OVERLAY
USETEXT PARAMS
PROC HPGET; # PROCESS *NET GET* AND *NET GETL* #
STARTIMS;
#
*1DC HPGET
*
* 1. PROC NAME AUTHOR DATE
* HPGET E. GEE 85/04/10
*
* 2. FUNCTIONAL DESCRIPTION.
* PROCESS AIP *NETGET*, *NETGETL*, *NETGETF*, AND *NETGTFL*
* WORKLIST ENTRIES
*
* 3. METHOD USED.
* IF FRAGMENTED GET CALL,
* VALIDATE IT IS CORRECT CALL.
* IF GET CALL FOR DATA FROM CONNECTION,
* VALIDATE CONNECTION NUMBER IS CORRECT.
* IF VALID CALL,
* IF ASYNC SUPERVISORY MESSAGE CAN BE DELIVERED,
* CALL BDELINK TO DELINK SUPERVISORY MESSAGE FROM ACB DR.
* ELSE (CHECK IF DATA MESSAGE CAN BE DELIVERED),
* CALL HGETDA TO GET DATA MESSAGE.
* UPDATE GET AWL ENTRY.
* IF MESSAGE TO DELIVER,
* IF TEXT TO WRITE BACK TO APPLICATION TEXT AREA,
* IF FRAGMENTED CALL,
* CALL HPGTF TO WRITE FRAGMENTED TEXT BACK TO APP.
* ELSE (TEXT IS DELIVERED TO ONE BUFFER),
* CALL BWLBLK TO WRITE TEXT BACK TO APP TEXT AREA.
* ELSE (INVALID GET TYPE CALL),
* CALL HLGLERR TO SEND ERR/LGL SUP MSG TO APPLICATION.
*
* 4. ENTRY PARAMETERS.
* WLADDR WORKLIST ENTRY LOCATION
* ACBADDR CURRENT APPLICATION"S ACB
* NWLOP A GET OR GETL REQUEST
*
* 5. EXIT PARAMETERS.
* AWLADR CONNECTION NUMBER
* AWLCB =1,THE COMPLETE BIT
* AWLIBU TRUE,IF INPUT BLOCK IS UNDELIVERABLE
* AWLRC REASON CODE FOR NETGET RESPONSE
* PARAMS1 BAD ACN,TOO MANY FRAGMENTED BUFFERS,
*
* 6. COMDECKS CALLED AND SYMPL TEXTS USED.
* NIPDEF CONSTANT DEFINITIONS
* ACB APPLICATION CONTROL BLOCK
* ACNB APPLICATION CONNECTION BLOCK
* ACNT APPLICATION CONNECTION TABLE
* AHEADER APPLICATION BLOCK HEADER WORD
* APPSTAT APPLICATION STATUS COMMON BLOCK
* AT APPLICATION TABLE
* DBGBUF DEBUG BUFFER
* DRHDR BUFFER HEADER WORD
* NCNB NETWORK CONNECTION BLOCK
* NP$NWNC CHARACTER TYPE/WORD CONVERSION TABLE
* NP$TAA FRAGMENT TEXT ARRAY
* NWLHEAD NETWORK WORKLIST ENTRY HEADER WORD
* NWLNTRY NETWORK WORKLIST ENTRY
* OVERLAY OVERLAY TABLE
* PARAMS PARAMETERS FOR PASSING TO SECONDARY OVERLAY
* PT POINTER TABLE
*
* 7. ROUTINES CALLED.
* BDELINK DELINK DATA BLOCK FROM DATA RING
* BWLBLK XFER A BLOCK TO THE APP FL
* HGETDA GET DATA MESSAGE FOR DELIVERY
* HLGLERR OVL FORM AND ENQUEUE LOGICAL ERROR MESSAGE
* HPGTF OVL READ FRAGMENTED TEXT INTO NIP-S FL
* HRDPUT READ TEXT INTO NIP-S FIELD LENGTH
* MRELS RETURN BUFFER TO FREE BUFFER CHAIN
* OVLCALL LOAD AND EXECUTE OVERLAY
* XTRACE TRACES CALLS
*
* 8. DAYFILE MESSAGES. NONE
*
#
STOPIMS;
#
EXTERNAL VARIABLES
#
XREF BEGIN
PROC BDELINK; # DELINK DATA BLOCK FROM DATA RING #
PROC BWLBLK; # XFER A BLOCK TO THE APP FL #
PROC HGETDA; # GET DATA MESSAGE TO DELIVER #
PROC MRELS; # RETURN BUFFER TO FREE CHAIN #
PROC OVLCALL; # LOAD AND EXECUTE OVERLAY #
PROC XTRACE; # RECORD CALLS #
PROC HRDPUT; # READ TEXT OR TEXT DESCRIPTION FROM APP #
END
#
INTERNAL VARIABLES
#
ITEM ABHWD; # WORD FOR SAVING ABH #
ITEM ACNALN; # ACN/ALN IN GET/GETL CALL #
ITEM ACNTINDX U ; # ACNT INDEX #
ITEM BUFADDR; # ADDR OF BLOCK TO WRITE TO UCP #
ITEM ELTAA ;
ITEM FOUND B; # RESULT FROM DATA SEARCH SCAN #
ITEM FRAG B; # FRAGMENT TYPE CALL FLAG #
ITEM I; # INDEX FOR COUNTING FRAG BUF SZ#
ITEM LIST B; # LIST NUMBER SCAN FLAG #
ITEM OPCODE; # AIP WORKLIST OPCODE #
ITEM SEND U; # STATUS FOR SENDING MSG TO APP #
ITEM SIZE; # SIZE OF DATA MESSAGE TO DELIVR#
ITEM TLW; # TEXT LENGTH IN WORDS #
STATUS BLOCKS NULL,DATA,SM;
#**********************************************************************#
BEGIN
CONTROL IFEQ DEBUG,1 ;
XTRACE("HPGET") ;
CONTROL FI;
P<NWLENTRY> = WLADDR; # WORKLIST ADDRESS #
P<ACB> = ACBADDR; # ACB ADDRESS #
P<ACNT> = ACBACNT[0] ; # ACNT ADDRESS #
ACNALN = NWLADR[0]; # ACN/ALN IN GET/GETL CALL #
ACNTINDX = ACNALN + ACNTHSIZE - ACNTMINACN[0] ;
ACBAWL0[0] = NWLEAIPH[0];
OPCODE = NWLOP[0] ;
FRAG = FALSE; # ASSUME NOT FRAGMENTED CALL #
SEND = BLOCKS"NULL"; # ASSUME NULL BLOCK TO BE DELIV #
PARAMS1 = 0 ;
#
VALIDATE NETGETF/NETGTFL CALL
#
IF (OPCODE EQ WLOPGETF) OR # NETGETF CALL #
(OPCODE EQ WLOPGTFL) # NETGTFL CALL #
THEN # DELIVER SUP MSGS IF ANY #
BEGIN
FRAG = TRUE; # SET FRAGMENT CALL FLAG #
IF NWLTA[0] NQ 0
THEN # TEXT ARRAY NOT ON WL #
BEGIN
ELTAA = NWLELTAA[0];
HRDPUT(ELTAA); # READ TEXT #
P<NWLENTRY> = WLADDR; # NEW WORKLIST ADDR #
END
IF ELTAA GR MAXNA
THEN # THERE ARE MANY FRAGMENT BUFS #
BEGIN
PARAMS1 = RLG"RES" ; # FRAG. IO ERROR RETURN #
END
ELSE # NO OF FRAG BUFS IS OKAY #
BEGIN
P<TAA> = WLADDR + FLSIZE ; # TEMPLATE FOR FRAGMENT ENTRY #
FOR I = 1 STEP 1 WHILE I LQ ELTAA AND PARAMS1 EQ 0
DO
BEGIN
IF TAASIZE[I] GQ 64
THEN # SIZE OF FRAG BUF IS TOO LARGE #
BEGIN
PARAMS1 = RLG"RES" ; # FRAG IO ERROR RETURN CODE #
END
END
END
END
#
VALIDATE NETGET WITH NONZERO ACN CALL
#
IF (OPCODE EQ WLOPGETL) OR # NETGETL CALL #
(OPCODE EQ WLOPGTFL) # NETGTFL CALL #
THEN # GET MSG FROM LIST NUMBER CALL #
BEGIN
LIST = TRUE;
END
ELSE # GET MSG FROM CON NUMBER CALL #
BEGIN
LIST = FALSE;
IF ACNALN NQ 0
THEN # GET DATA FROM CONNECTION #
BEGIN
IF (ACNALN GR ACNTHCN[0]) OR # CONNECTION NUMBER TOO LARGE #
(ACNALN LS ACNTMINACN[0]) OR # CONNECTION NO TOO SMALL #
(ACNTACNB[ACNTINDX] EQ 0) # NONEXISTENT CONNECTION #
THEN # BAD CON NUMBER WAS SPECIFIED #
BEGIN
PARAMS1 = RLG"ACN"; # REASON CODE FOR ERR/LGL SM #
END
END
END
IF PARAMS1 EQ 0
THEN # VALID GET TYPE CALL #
BEGIN
#
CHECK IF ASYNCHRONOUS SUPERVISORY MESSAGE CAN BE DELIVERED
#
ABHWD = 0; # INITIALIZE ABH RESPONSE #
IF (ACNALN EQ 0) AND # ALN/ACN ZERO CALL #
(ACBDRFP[0] NQ 0) # THERE ARE SUP MSGS QUEUED #
THEN # DELIVER SUP MSG TO APP #
BEGIN
P<AHEADER> = ACBDRFP[0] + BLKHSIZE;
ABHWD = ABHWORD[0]; # APP BLOCK HEADER WORD #
P<AHEADER> = LOC(ABHWD);
TLW = ABHTLC[0]; # SIZE OF ASYNC SUP MSG IN WDS #
IF NWLTLC[0] GQ TLW
THEN # BUFFER IS BIG ENOUGH FOR MSG #
BEGIN
BDELINK(ACBADDR,BUFADDR,TLW); # DELINK SUP MSG #
IF ABHABT[0] NQ APPSUP
THEN # NOT SUPERVISION BLOCK TYPE #
BEGIN
ABHABN[0] = 0; # CLEAR ABN IN ABH #
END
SEND = BLOCKS"SM";
END
ELSE # BUFFER IS NOT BIG ENOUGH #
BEGIN
ABHIBU[0] = 1; # SET IBU BIT IN ABH WORD #
END
END
ELSE # NOT DELIVERING SUP MSG #
BEGIN
#
CHECK IF DATA MESSAGE TO DELIVER
#
IF LIST OR # GET DATA FROM LIST CALL #
(NOT LIST AND ACNALN NQ 0) # GET DATA FROM CON NUM CALL #
THEN
BEGIN
BUFADDR = 0; # SET FLAG FOR NOT COPYING MSG #
SIZE = NWLTLC[0]; # APP BUFFER SIZE FOR DATA MSG #
HGETDA(BUFADDR,SIZE,ACNALN,LIST,ABHWD); # GET DATA MSG #
P<AHEADER> = LOC(ABHWD); # ABH WORD OF DELINKED MSG #
IF ABHWD NQ 0
THEN # FOUND DATA BLOCK TO DELIVER #
BEGIN
IF ABHIBU[0] EQ 0
THEN # DATA MSG IS DELIVERABLE #
BEGIN
SEND = BLOCKS"DATA";
TLW = SIZE - ABHSIZE; # SIZE OF TEXT IN WORDS #
END
END
ELSE # NO DATA BLOCK TO DELIVER #
BEGIN
ABHADR[0] = ACNALN; # STORE ACN/ALN IN ABH WORD #
END
END
END
ACBAWL1[0] = ABHWD;
IF SEND NQ BLOCKS"NULL" # MSG TO DELIVER TO APP #
THEN # DELIVER MESSAGE TO APP #
BEGIN
#
FOUND MESSAGE TO DELIVER TO APPLICATION
#
CONTROL IFEQ DEBUG,1;
PNVALUE[0] = ACBAN[0]; # APPL. NUMBER #
BGETW[BGETP] = PNWORD[0] ;
BGETP = BGETP + 1 ;
IF BGETP GR 999
THEN
BEGIN
BGETP = 0;
END
P<TRAP> = BUFADDR + BLKHSIZE;
FOR TRAPINDEX = 0 STEP 1 UNTIL TLW
DO
BEGIN
BGETW[BGETP] = WORD[TRAPINDEX] ;
BGETP = BGETP + 1;
IF BGETP GR 999
THEN
BEGIN
BGETP = 0;
END
END
CONTROL FI;
IF TLW NQ 0
THEN
BEGIN # TEXT WRITEN TO APPL. #
#
THERE IS TEXT TO WRITE BACK TO APPLICATION TEXT AREA
#
IF NOT FRAG
THEN # NOT FRAGMENT TYPE CALL #
BEGIN
BWLBLK(BUFADDR,NWLTA[0],TLW) ;
END
ELSE
BEGIN # HPGTF TO PUT DATA INTO #
PARAMS1 = BUFADDR ;
PARAMS2 = TLW ;
OVLNAME = HPGTFP ;
OVLCALL ;
END
END # TEXT WRITTEN TO APPL. #
ELSE # NO TEXT TO BE WRITTEN TO APP #
BEGIN
MRELS(BUFADDR); # RELEASE BUFFER FOR DATA MSG #
END
END
IF DONE
THEN
BEGIN
ACBAWL0C[0] = 1 ; # SET COMPLETE BIT #
END
END
ELSE # APP TO RECEIVE ERR/LGL #
BEGIN
ACBAWL1[0] = 0 ; # CLEAR AWL RESPONSE WD IN ACB #
OVLNAME = HLGLERRP ; # NAME OF OVERLAY TO LOAD #
OVLCALL; # LOAD AND EXECUTE OVERLAY #
END
RETURN;
END
TERM