| 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 |  ;
 | 
|---|