| 1 | XOBVLL ;; mjk/alb - VistALink Listen and Spawn Code ; 07/27/2002  13:00 | 
|---|
| 2 | ;;1.5;VistALink;;Sep 09, 2005 | 
|---|
| 3 | ;;Foundations Toolbox Release v1.5 [Build: 1.5.0.026] | 
|---|
| 4 | ; | 
|---|
| 5 | QUIT | 
|---|
| 6 | ; | 
|---|
| 7 | ; ***deprecated*** tag ; Use START^XOBVTCP instead | 
|---|
| 8 | START(SOCKET) ; -- start listener | 
|---|
| 9 | DO START^XOBVTCP(SOCKET) | 
|---|
| 10 | QUIT | 
|---|
| 11 | ; | 
|---|
| 12 | ; ***deprecated*** tag ; Use UCX^XOBVTCP instead | 
|---|
| 13 | UCX ; -- VMS TCPIP (UCX) multi-thread entry point | 
|---|
| 14 | ; -- Called from VistALink .com files | 
|---|
| 15 | GOTO UCX^XOBVTCP | 
|---|
| 16 | ; | 
|---|
| 17 | SPAWN ; -- spawned process | 
|---|
| 18 | NEW X,XOBSTOP,XOBPORT,XOBHDLR,XOBLASTR | 
|---|
| 19 | ; | 
|---|
| 20 | SET XOBSTOP=0 | 
|---|
| 21 | SET XOBPORT=IO | 
|---|
| 22 | SET U="^" | 
|---|
| 23 | ; | 
|---|
| 24 | ; -- initialize timestamp for last time request made (used for debugging) | 
|---|
| 25 | SET XOBLASTR=0 | 
|---|
| 26 | ; | 
|---|
| 27 | ; -- set error trap | 
|---|
| 28 | ;Set up the error trap | 
|---|
| 29 | SET $ETRAP="DO ^%ZTER HALT" | 
|---|
| 30 | ; | 
|---|
| 31 | ; -- attempt to share the license; must have TCP port open first | 
|---|
| 32 | USE XOBPORT IF $TEXT(SHARELIC^%ZOSV)'="" DO SHARELIC^%ZOSV(1) | 
|---|
| 33 | ; | 
|---|
| 34 | ; -- start RUM for VistALink Handler | 
|---|
| 35 | DO LOGRSRC^%ZOSV("$VISTALINK HANDLER$",2,1) | 
|---|
| 36 | ; | 
|---|
| 37 | ; -- cache/initialize startup request handlers | 
|---|
| 38 | SET X=$$CACHE^XOBVRH(.XOBHDLR) | 
|---|
| 39 | IF 'X DO RMERR^XOBVRM(184001,$PIECE(X,U,2)) QUIT | 
|---|
| 40 | ; | 
|---|
| 41 | ; -- initialize tcp processing variables | 
|---|
| 42 | DO INIT^XOBVSKT | 
|---|
| 43 | ; | 
|---|
| 44 | ; -- change job name if possible | 
|---|
| 45 | DO SETNM^%ZOSV("VLink_"_$$CNV^XLFUTL($J,16)) | 
|---|
| 46 | ; | 
|---|
| 47 | ; -- loop until told to stop | 
|---|
| 48 | FOR  DO NXTCALL QUIT:XOBSTOP | 
|---|
| 49 | ; | 
|---|
| 50 | ; -- final/clean tcp processing variables | 
|---|
| 51 | DO FINAL^XOBVSKT | 
|---|
| 52 | ; | 
|---|
| 53 | ; -- stop RUM for VistALink Handler | 
|---|
| 54 | DO LOGRSRC^%ZOSV("$VISTALINK HANDLER$",2,2) | 
|---|
| 55 | ; | 
|---|
| 56 | QUIT | 
|---|
| 57 | ; | 
|---|
| 58 | NXTCALL ; -- do next call | 
|---|
| 59 | NEW X,XOBROOT,XOBREAD,XOBTO,XOBFIRST,XOBOK,XOBRL,XOBDATA | 
|---|
| 60 | ; | 
|---|
| 61 | ; -- set up error trap | 
|---|
| 62 | NEW $ESTACK SET $ETRAP="DO SYSERR^XOBVLL" | 
|---|
| 63 | ; | 
|---|
| 64 | ; -- setup environment variables | 
|---|
| 65 | NEW DIQUIET SET DIQUIET=1 | 
|---|
| 66 | SET U="^",DTIME=$GET(DTIME,900),DT=$$DT^XLFDT() | 
|---|
| 67 | ; | 
|---|
| 68 | ; -- initialize 'current' request handler to empty string | 
|---|
| 69 | SET XOBHDLR="" | 
|---|
| 70 | ; | 
|---|
| 71 | ; -- # of chars to get on first read / read 11 for Broker initial read | 
|---|
| 72 | SET XOBREAD=11 | 
|---|
| 73 | ; | 
|---|
| 74 | ; -- get J2SE heartbet rate for timeout plus network latency factor | 
|---|
| 75 | SET XOBTO=$$GETRATE^XOBVLIB()+$$GETDELTA^XOBVLIB() | 
|---|
| 76 | ; | 
|---|
| 77 | ; -- get J2EE timeout value for app serv environment | 
|---|
| 78 | IF $GET(XOBSYS("ENV"))="j2ee" SET XOBTO=$$GETASTO^XOBVLIB() | 
|---|
| 79 | ; | 
|---|
| 80 | ; -- set first read flag | 
|---|
| 81 | SET XOBFIRST=1 | 
|---|
| 82 | ; | 
|---|
| 83 | ; -- setup intake global | 
|---|
| 84 | SET XOBROOT=$NAME(^TMP("XOBVLL",$JOB)) | 
|---|
| 85 | KILL @XOBROOT | 
|---|
| 86 | ; | 
|---|
| 87 | ; -- read from socket port | 
|---|
| 88 | USE XOBPORT | 
|---|
| 89 | SET XOBOK=$$READ^XOBVSKT(XOBROOT,.XOBREAD,.XOBTO,.XOBFIRST,.XOBSTOP,.XOBDATA,.XOBHDLR) | 
|---|
| 90 | ; | 
|---|
| 91 | ; -- timed out ; cleanup user and exit | 
|---|
| 92 | IF 'XOBOK!(XOBSTOP) DO  GOTO NXTCALLQ | 
|---|
| 93 | . IF $GET(DUZ) DO CLEAN^XOBSCAV1 | 
|---|
| 94 | . SET XOBSTOP=1 | 
|---|
| 95 | ; | 
|---|
| 96 | ; -- need null device | 
|---|
| 97 | IF '$DATA(XOBNULL) DO ERROR(181002,$$EZBLD^DIALOG(181002),XOBPORT) SET XOBSTOP=1 GOTO NXTCALLQ | 
|---|
| 98 | ; | 
|---|
| 99 | ; -- call request manager | 
|---|
| 100 | SET XOBOK=$$EN^XOBVRM(XOBROOT,.XOBDATA,.XOBHDLR) | 
|---|
| 101 | ; -- timestamp last time request made | 
|---|
| 102 | SET XOBLASTR=$$NOW^XLFDT() | 
|---|
| 103 | ; -- cleanup intake global | 
|---|
| 104 | KILL @XOBROOT | 
|---|
| 105 | ; | 
|---|
| 106 | NXTCALLQ ; -- exit | 
|---|
| 107 | QUIT | 
|---|
| 108 | ; | 
|---|
| 109 | ; ---------------------------------------------------------------------------------- | 
|---|
| 110 | ;                                System Error Handler | 
|---|
| 111 | ; ---------------------------------------------------------------------------------- | 
|---|
| 112 | SYSERR ; -- send system error message | 
|---|
| 113 | ; -- If we get an error in the error handler just Halt | 
|---|
| 114 | SET $ETRAP="D ^%ZTER HALT" | 
|---|
| 115 | ; | 
|---|
| 116 | DO ERROR(181001,$$EZBLD^DIALOG(181001,$$EC^%ZOSV),XOBPORT)      ; -- Get the error code | 
|---|
| 117 | QUIT | 
|---|
| 118 | ; | 
|---|
| 119 | ERROR(XOBEC,XOBMSG,XOBPORT) ; -- send error message | 
|---|
| 120 | NEW XOBDAT | 
|---|
| 121 | ; | 
|---|
| 122 | ; -- If we get an error in the error handler just Halt | 
|---|
| 123 | SET $ETRAP="D ^%ZTER HALT" | 
|---|
| 124 | ; | 
|---|
| 125 | ; -- set up error info | 
|---|
| 126 | SET XOBDAT("MESSAGE TYPE")=3 | 
|---|
| 127 | SET XOBDAT("ERRORS",1,"CODE")=XOBEC | 
|---|
| 128 | SET XOBDAT("ERRORS",1,"ERROR TYPE")="system" | 
|---|
| 129 | SET XOBDAT("ERRORS",1,"FAULT STRING")="System Error" | 
|---|
| 130 | SET XOBDAT("ERRORS",1,"CDATA")=1 | 
|---|
| 131 | SET XOBDAT("ERRORS",1,"MESSAGE",1)=XOBMSG | 
|---|
| 132 | ; | 
|---|
| 133 | ; -- if serious error, save error info, logout, and halt | 
|---|
| 134 | IF XOBMSG["<READ>"!(XOBMSG["<WRITE>")!(XOBMSG["<SYSTEM>")!(XOBMSG["READERR")!(XOBMSG["WRITERR")!(XOBMSG["SYSERR") DO  HALT | 
|---|
| 135 | . DO ^%ZTER | 
|---|
| 136 | . IF $GET(DUZ) DO CLEAN^XOBSCAV1 | 
|---|
| 137 | ; | 
|---|
| 138 | ; -- send error back to client | 
|---|
| 139 | USE XOBPORT | 
|---|
| 140 | DO ERROR^XOBVLIB(.XOBDAT) | 
|---|
| 141 | ; | 
|---|
| 142 | ; -- just quit if no slots are available or logins are disabled | 
|---|
| 143 | IF (XOBEC=181003)!(XOBEC=181004) QUIT | 
|---|
| 144 | ; | 
|---|
| 145 | ; -- need to make sure any locks are released since code aborted ungracefully | 
|---|
| 146 | LOCK | 
|---|
| 147 | ; | 
|---|
| 148 | ; -- Save off the error | 
|---|
| 149 | DO ^%ZTER | 
|---|
| 150 | ; | 
|---|
| 151 | ; -- go back to listening | 
|---|
| 152 | SET $ETRAP="Q:($ESTACK&'$QUIT)  Q:$ESTACK -9 S $ECODE="""" DO KILL^XOBVLL G NXTCALLQ^XOBVLL",$ECODE=",U99," | 
|---|
| 153 | QUIT | 
|---|
| 154 | ; | 
|---|
| 155 | KILL ; -- new VistALink variables and then do big KILL | 
|---|
| 156 | NEW XOBPORT,XOBSTOP,XOBNULL,XOBOS,XOBSYS,XOBHDLR,XOBOK | 
|---|
| 157 | DO KILL^XUSCLEAN | 
|---|
| 158 | QUIT | 
|---|
| 159 | ; | 
|---|