| 1 | TMGXPDIL ;TMG/kst/Custom version of XPDIL ;09/17/08
 | 
|---|
| 2 |          ;;1.0;TMG-LIB;**1**;09/17/08
 | 
|---|
| 3 | 
 | 
|---|
| 4 |  ;"Original header....
 | 
|---|
| 5 |  ;"XPDIL   ;SFISC/RSD - load Distribution Global ;05/28/99  09:41
 | 
|---|
| 6 |  ;"       ;;8.0;KERNEL;**15,44,58,68,108**;Jul 10, 1995
 | 
|---|
| 7 | 
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  ;"Kevin Toppenberg MD
 | 
|---|
| 10 |  ;"GNU General Public License (GPL) applies
 | 
|---|
| 11 |  ;"9/17/08
 | 
|---|
| 12 | 
 | 
|---|
| 13 | 
 | 
|---|
| 14 | EN1(Option,Msg)
 | 
|---|
| 15 |         ;"Purpose: Provide an API for KIDS load a distribution
 | 
|---|
| 16 |         ;"Input: Option -- PASS BY REFERENCE.  Entries are required unless marked optional
 | 
|---|
| 17 |         ;"              Option("HFSNAME")=FilePathNameOnHFS
 | 
|---|
| 18 |         ;"              Option("FORCE CONT LOAD")=1 <-- if not given, then load won't continue
 | 
|---|
| 19 |         ;"              Option("DO ENV CHECK")=#  1=do check, 0=don't do check
 | 
|---|
| 20 |         ;"              Option("VERBOSE")=1 for output
 | 
|---|
| 21 |         ;"       Msg -- PASS BY REFERANCE, an OUT PARAMETER
 | 
|---|
| 22 |         ;"              Errors are stored in Msg("ERROR",x)=Message
 | 
|---|
| 23 |         ;"                                   Msg("ERROR")=count of last error
 | 
|---|
| 24 |         ;"              Message are store in Msg(x)=Message
 | 
|---|
| 25 |         ;"                                   Msg=count of last message+1
 | 
|---|
| 26 |         ;"Output: Option -- Option("INSTALL NAME")=Name to use to install package
 | 
|---|
| 27 | 
 | 
|---|
| 28 |         N POP,XPDA,XPDST,XPDIT,XPDT,XPDGP,XPDQUIT,XPDREQAB,XPDSKPE
 | 
|---|
| 29 |         S:'$D(DT) DT=$$DT^XLFDT S:'$D(U) U="^"
 | 
|---|
| 30 |         S XPDST=0
 | 
|---|
| 31 |         set Msg=+$get(Msg,1)
 | 
|---|
| 32 | 
 | 
|---|
| 33 |         new temp set temp=$$ST(.Option,.Msg)  ;"Load in patch
 | 
|---|
| 34 |         if (temp=0)!($G(XPDQUIT)) do  goto EnDone
 | 
|---|
| 35 |         . D ABRTALL^TMGXPDI(1,,.Msg)  ;"(not interactive)
 | 
|---|
| 36 |         . do AddMsg^TMGPAT2("**NOTHING LOADED**",1,.Msg)
 | 
|---|
| 37 | 
 | 
|---|
| 38 |         ;"XPDST= starting Build
 | 
|---|
| 39 |         ;"XPDT("DA",ien)=seq # to install
 | 
|---|
| 40 |         ;"XPDT("NM",build name)=seq #
 | 
|---|
| 41 |         ;"XPDT(seq #)=ien^Build name
 | 
|---|
| 42 |         ;"XPDT("GP",global)= 1-replace, 0-overwrite^ien
 | 
|---|
| 43 |         ;"XPDGP=globals from a Global Package
 | 
|---|
| 44 |         ;"XPDSKPE=1 don't run Environment Check^has question been asked
 | 
|---|
| 45 |         S XPDIT=0,XPDSKPE="0^0"
 | 
|---|
| 46 |         F  S XPDIT=$O(XPDT(XPDIT)) Q:'XPDIT  D  Q:'$D(XPDT)
 | 
|---|
| 47 |         . S XPDA=+XPDT(XPDIT)
 | 
|---|
| 48 |         . if $$CheckLocal^TMGPAT4($name(^XTMP("XPDI",XPDA)),.Option)=1 do
 | 
|---|
| 49 |         . . ;"if $get(Option("VERBOSE"))'=1 quit
 | 
|---|
| 50 |         . . write "WARNING.  This code overwrites local mods!",!
 | 
|---|
| 51 |         . . do PressToCont^TMGUSRIF
 | 
|---|
| 52 |         . ;"Check if this Build has an Envir. Check
 | 
|---|
| 53 |         . I $G(^XTMP("XPDI",XPDA,"PRE"))]"" D
 | 
|---|
| 54 |         . . ;"Quit if we already asked this question
 | 
|---|
| 55 |         . . Q:$P(XPDSKPE,U,2)
 | 
|---|
| 56 |         . . S $P(XPDSKPE,U,2)=1
 | 
|---|
| 57 |         . . set Y=$get(Option("DO ENV CHECK"))
 | 
|---|
| 58 |         . . if Y'=1 set XPDSKPE="1^1"
 | 
|---|
| 59 |         . I $G(XPDQUIT) D ABRTALL^TMGXPDI(1,,.Msg) Q
 | 
|---|
| 60 |         . D PKG^TMGXPDL1(XPDA,.Option,.Msg)
 | 
|---|
| 61 | 
 | 
|---|
| 62 |         ;"Global Package
 | 
|---|
| 63 |         G:$D(XPDGP) ^XPDIGP
 | 
|---|
| 64 |         I $D(XPDT),$D(^XPD(9.7,+XPDST,0)) do
 | 
|---|
| 65 |         . do AddMsg^TMGPAT2("Use INSTALL NAME: "_$P(^(0),U)_" to install this Distribution.",0,.Msg)
 | 
|---|
| 66 |         . set Option("INSTALL NAME")=$P(^(0),U)
 | 
|---|
| 67 | EnDone
 | 
|---|
| 68 |         Q
 | 
|---|
| 69 | 
 | 
|---|
| 70 | 
 | 
|---|
| 71 | ST(Option,Msg)
 | 
|---|
| 72 |         ;"Purpose: 'global input'
 | 
|---|
| 73 |         ;"Input: Option -- PASS BY REFERENCE.  Entries are required unless marked optional
 | 
|---|
| 74 |         ;"              Option("HFSNAME")=FilePathNameOnHFS
 | 
|---|
| 75 |         ;"              Option("FORCE CONT LOAD")=1 <-- if not given, then load won't continue
 | 
|---|
| 76 |         ;"              Option("INTERACTIVE")=1 if 1 then direct user input asked if needed
 | 
|---|
| 77 |         ;"       Msg -- PASS BY REFERENCE, an OUT PARAMETER.
 | 
|---|
| 78 |         ;"              Errors are stored in Msg("ERROR",x)=Message
 | 
|---|
| 79 |         ;"                                   Msg("ERROR")=count of last error
 | 
|---|
| 80 |         ;"              Message are store in Msg(x)=Message
 | 
|---|
| 81 |         ;"                                   Msg=count of last message+1
 | 
|---|
| 82 |         ;"Results: 1=success, 0=error
 | 
|---|
| 83 |         new result set result=1
 | 
|---|
| 84 |         N DIR,DIRUT,GR,IOP,X,Y,Z,%ZIS
 | 
|---|
| 85 |         I '$D(^%ZIS(1,"B","HFS")) do  goto STDone
 | 
|---|
| 86 |         . do AddMsg^TMGPAT2("You must have a device called 'HFS' in order to load a distribution!",1,.Msg)
 | 
|---|
| 87 |         . S XPDQUIT=1
 | 
|---|
| 88 |         D HOME^%ZIS
 | 
|---|
| 89 |         set Y=$get(Option("HFSNAME"))
 | 
|---|
| 90 |         if (Y="")&($get(Option("INTERACTIVE"))=1) do
 | 
|---|
| 91 |         . set DIR("A")="Enter a Host File",DIR("?")="Enter a filename and/or path to input Distribution."
 | 
|---|
| 92 |         . set Y=$$GetFName^TMGIOUTL(DIR("?"),"/tmp/","","","","",DIR("A")_": ")
 | 
|---|
| 93 |         if Y="" do  goto STDone
 | 
|---|
| 94 |         . do AddMsg^TMGPAT2("No host file system filename provided!",1,.Msg)
 | 
|---|
| 95 |         . S XPDQUIT=1
 | 
|---|
| 96 |         S %ZIS="",%ZIS("HFSNAME")=Y,%ZIS("HFSMODE")="R",IOP="HFS"
 | 
|---|
| 97 |         D ^%ZIS
 | 
|---|
| 98 |         I POP do
 | 
|---|
| 99 |         . do AddMsg^TMGPAT2("Couldn't open file or HFS device!!",1,.Msg)
 | 
|---|
| 100 |         . set result=0
 | 
|---|
| 101 |         ;"don't close device if we have a global package, we need to bring in the globals now
 | 
|---|
| 102 |         D GI(.Option,.Msg)  ;"Get file loaded in
 | 
|---|
| 103 |         do ^%ZISC:'$D(XPDGP)!$G(XPDQUIT)
 | 
|---|
| 104 | STDone
 | 
|---|
| 105 |         if $get(XPDQUIT)=1 set result=0
 | 
|---|
| 106 |         Q result
 | 
|---|
| 107 | 
 | 
|---|
| 108 | 
 | 
|---|
| 109 | GI(Option,Msg)    ;"Get In
 | 
|---|
| 110 |         ;"Purpose: Open file and load in.
 | 
|---|
| 111 |         ;"Input: Option -- PASS BY REFERENCE.  Entries are required unless marked optional
 | 
|---|
| 112 |         ;"              Option("HFSNAME")=FilePathNameOnHFS
 | 
|---|
| 113 |         ;"              Option("FORCE CONT LOAD")=1 <-- if not given, then load won't continue
 | 
|---|
| 114 |         ;"       Msg -- PASS BY REFERENCE, an OUT PARAMETER.
 | 
|---|
| 115 |         ;"              Errors are stored in Msg("ERROR",x)=Message
 | 
|---|
| 116 |         ;"                                   Msg("ERROR")=count of last error
 | 
|---|
| 117 |         ;"              Message are store in Msg(x)=Message
 | 
|---|
| 118 |         ;"                                   Msg=count of last message+1
 | 
|---|
| 119 | 
 | 
|---|
| 120 |         N X,XPDSEQ,Y,Z
 | 
|---|
| 121 |         U IO  ;"open KIDS text file for input
 | 
|---|
| 122 |         do DoRead(.X,1)
 | 
|---|
| 123 |         do DoRead(.Y,1)
 | 
|---|
| 124 | 
 | 
|---|
| 125 |         do AddMsg^TMGPAT2(X,0,.Msg)
 | 
|---|
| 126 |         do AddMsg^TMGPAT2("Comment: "_Y,0,.Msg)
 | 
|---|
| 127 |         S XPDST("H")=Y
 | 
|---|
| 128 |         if Y="Extracted from mail message" do
 | 
|---|
| 129 |         . S XPDST("H1")=X
 | 
|---|
| 130 |         else  do
 | 
|---|
| 131 |         . S XPDST("H1")=Y_"  ;Created on "_$P(X,"KIDS Distribution saved on ",2)
 | 
|---|
| 132 |         ;"Z is the string of Builds in this file
 | 
|---|
| 133 |         F X=1:1 do  Q:Z=""
 | 
|---|
| 134 |         . do DoRead(.Z,1)
 | 
|---|
| 135 |         . S Z=$P(Z,"**KIDS**",2,99)
 | 
|---|
| 136 |         . Q:Z=""
 | 
|---|
| 137 |         . S X(X)=Z
 | 
|---|
| 138 |         U IO(0)
 | 
|---|
| 139 |         I $G(X(1))="" do  goto GIDone
 | 
|---|
| 140 |         . do AddMsg^TMGPAT2("This is not a Distribution HFS File!",1,.Msg)
 | 
|---|
| 141 |         . S XPDQUIT=1
 | 
|---|
| 142 | 
 | 
|---|
| 143 |         ;"global package, set XPDGP=flag;global^flag;global^...  flag=1 replace
 | 
|---|
| 144 |         I $P(X(1),":")="GLOBALS" S XPDGP=$P(X(1),U,2,99),X(1)=$P(X(1),U)
 | 
|---|
| 145 |         S XPDIT=0,X(1)=$P(X(1),":",2,99)
 | 
|---|
| 146 | 
 | 
|---|
| 147 |         do AddMsg^TMGPAT2("This Distribution contains Transport Globals for the following Package(s):",0,.Msg)
 | 
|---|
| 148 |         kill XPDQUIT
 | 
|---|
| 149 |         F X=1:1:X-1 do  Q:$get(XPDQUIT)=1
 | 
|---|
| 150 |         . F Z=1:1 do  Q:(Y="")!($get(XPDQUIT)=1)
 | 
|---|
| 151 |         . . S Y=$P(X(X),U,Z)
 | 
|---|
| 152 |         . . Q:Y=""
 | 
|---|
| 153 |         . . ;"can't install if global exist, that means Build never finish install
 | 
|---|
| 154 |         . . ;"INST will show name
 | 
|---|
| 155 |         . . S XPDIT=XPDIT+1
 | 
|---|
| 156 |         . . new temp set temp=$$INST^TMGXPDL1(Y,.Option,.Msg)
 | 
|---|
| 157 |         . . ;" //kt removed I temp=0 S XPDQUIT=1 Q
 | 
|---|
| 158 |         if $G(XPDQUIT) goto GIDone
 | 
|---|
| 159 | 
 | 
|---|
| 160 |         do AddMsg^TMGPAT2("Distribution OK",0,.Msg)
 | 
|---|
| 161 | 
 | 
|---|
| 162 |         if $D(XPDGP) do DISP^TMGXPDIG(Msg)
 | 
|---|
| 163 |         if $get(Option("FORCE CONT LOAD"))'=1 do  goto GIDone
 | 
|---|
| 164 |         . do AddMsg^TMGPAT2("Option(""FORCE CONT LOAD"")=1 not found in passed options.",1,.Msg)
 | 
|---|
| 165 |         . S XPDQUIT=1
 | 
|---|
| 166 |         do AddMsg^TMGPAT2("Loading Distribution...",0,.Msg)
 | 
|---|
| 167 | 
 | 
|---|
| 168 |         ;"reset expiration date to T+7 on transport global
 | 
|---|
| 169 |         S ^XTMP("XPDI",0)=$$FMADD^XLFDT(DT,7)_U_DT
 | 
|---|
| 170 |         ;"start reading the HFS again
 | 
|---|
| 171 |         U IO
 | 
|---|
| 172 |         do DoRead(.X,0)
 | 
|---|
| 173 |         do DoRead(.Y,0)
 | 
|---|
| 174 |         ;"R X:0,Y:0
 | 
|---|
| 175 |         ;"the next read must be the INSTALL NAME
 | 
|---|
| 176 |         I X'="**INSTALL NAME**"!'$D(XPDT("NM",Y)) do  goto GIDone
 | 
|---|
| 177 |         . do AddMsg^TMGPAT2("ERROR in HFS file format!",1,.Msg)
 | 
|---|
| 178 |         . S XPDQUIT=1
 | 
|---|
| 179 | 
 | 
|---|
| 180 |         ;"XPDSEQ is the disk sequence number
 | 
|---|
| 181 |         S %=XPDT("NM",Y)
 | 
|---|
| 182 |         set GR="^XTMP(""XPDI"","_+XPDT(%)_","
 | 
|---|
| 183 |         set XPDSEQ=1
 | 
|---|
| 184 |         ;"X=global ref, Y=global value.
 | 
|---|
| 185 |         F  do DoRead(.X,0) Q:X="**END**"  D  I $D(DIRUT) S XPDQUIT=1 Q
 | 
|---|
| 186 |         . do DoRead(.Y,0)
 | 
|---|
| 187 |         . I X="**INSTALL NAME**" D  Q
 | 
|---|
| 188 |         . . S %=+$G(XPDT("NM",Y))
 | 
|---|
| 189 |         . . set GR=""  ;"//kt added  Allows ignoring parts of multipatch not needed
 | 
|---|
| 190 |         . . ;"I '% S DIRUT=1 Q  ;"//kt
 | 
|---|
| 191 |         . . I '% Q  ;"//kt
 | 
|---|
| 192 |         . . S GR="^XTMP(""XPDI"","_+XPDT(%)_","
 | 
|---|
| 193 |         . if GR'="" S @(GR_X)=Y
 | 
|---|
| 194 |         U IO(0)
 | 
|---|
| 195 | GIDone
 | 
|---|
| 196 |         Q
 | 
|---|
| 197 | 
 | 
|---|
| 198 | DoRead(S,timeOut)
 | 
|---|
| 199 |         ;"Purpose: Do Read, but strip trailling #13 if needed.
 | 
|---|
| 200 |         ;"Input: S -- pass by reference, and OUT PARAMETER
 | 
|---|
| 201 |         ;"       timeOut -- time out var to pass to READ command
 | 
|---|
| 202 |         ;"Results: none
 | 
|---|
| 203 |         read S:timeOut
 | 
|---|
| 204 |         new l set l=$length(S)
 | 
|---|
| 205 |         new ch set ch=$ascii($extract(S,l))
 | 
|---|
| 206 |         if ch=13 set S=$extract(S,1,l-1)
 | 
|---|
| 207 |         quit
 | 
|---|
| 208 | 
 | 
|---|
| 209 | 
 | 
|---|
| 210 | NEXTD   I ^%ZOSF("OS")'["MSM" U IO(0) W !!,"Error in disk, ABORTING load!!" S XPDQUIT=1 Q
 | 
|---|
| 211 |         N DIR
 | 
|---|
| 212 |         ;"close current device
 | 
|---|
| 213 |         C IO U IO(0)
 | 
|---|
| 214 |         S XPDSEQ=XPDSEQ+1,DIR(0)="E"
 | 
|---|
| 215 |         S DIR("A")="Insert the next diskette, #"_XPDSEQ_", and Press the return key"
 | 
|---|
| 216 |         S DIR("?")="This distribution is continued on another diskette"
 | 
|---|
| 217 |         D ^DIR Q:$D(DIRUT)
 | 
|---|
| 218 |         W "  OK",!
 | 
|---|
| 219 |         ;MSM specific code to open HFS
 | 
|---|
| 220 |         O @(""""_IO_""":"_IOPAR) U IO
 | 
|---|
| 221 |         ;"R X:0,Y:0
 | 
|---|
| 222 |         do DoRead(.X,1)
 | 
|---|
| 223 |         do DoRead(.Y,1)
 | 
|---|
| 224 | 
 | 
|---|
| 225 |         ;"quit if comments are not the same on each diskette
 | 
|---|
| 226 |         G:Y'=XPDST("H") NEXTQ
 | 
|---|
| 227 |         ;"quit if not the expected sequence, Z is for the blank line
 | 
|---|
| 228 |         ;"R Y:0,Z:0
 | 
|---|
| 229 |         do DoRead(.Y,1)
 | 
|---|
| 230 |         do DoRead(.Z,1)
 | 
|---|
| 231 |         G:Y'=("**SEQ**:"_XPDSEQ) NEXTQ
 | 
|---|
| 232 |         Q
 | 
|---|
| 233 |         ;
 | 
|---|
| 234 | NEXTQ   U IO(0) W !!,"This is NOT the correct diskette!!  The comment on this diskette is:",!,X,!!
 | 
|---|
| 235 |         S XPDSEQ=XPDSEQ-1
 | 
|---|
| 236 |         G NEXTD
 | 
|---|
| 237 |         ;
 | 
|---|
| 238 | NONE    W !!,"**NOTHING LOADED**",!
 | 
|---|
| 239 |         Q
 | 
|---|
| 240 | 
 | 
|---|
| 241 | 
 | 
|---|
| 242 | USER
 | 
|---|
| 243 |         ;"Purpose: Ask user questions questions before running silent EN1^TMGXPDIL
 | 
|---|
| 244 | 
 | 
|---|
| 245 |         new Options
 | 
|---|
| 246 |         new Option,Msg
 | 
|---|
| 247 |         new DIR
 | 
|---|
| 248 |         set DIR("A")="Enter a Host File"
 | 
|---|
| 249 |         set DIR("?")="Enter a filename and/or path to input Distribution."
 | 
|---|
| 250 |         if $get(TMGPATNM)'="" set Y=TMGPATNM  ;"allow preset file name
 | 
|---|
| 251 |         set Option("HFSNAME")=$$GetFName^TMGIOUTL(DIR("?"),"/tmp/","","","","",DIR("A")_": ")
 | 
|---|
| 252 | 
 | 
|---|
| 253 |         new %
 | 
|---|
| 254 |         set %=2
 | 
|---|
| 255 |         write "Do Environmental check" do YN^DICN write !
 | 
|---|
| 256 |         if %=-1 goto UDone
 | 
|---|
| 257 |         set Option("DO ENV CHECK")=(%=1)
 | 
|---|
| 258 | 
 | 
|---|
| 259 |         set %=1
 | 
|---|
| 260 |         write "Force continue load" do YN^DICN write !
 | 
|---|
| 261 |         if %=-1 goto UDone
 | 
|---|
| 262 |         set Option("FORCE CONT LOAD")=(%=1)
 | 
|---|
| 263 | 
 | 
|---|
| 264 |         do EN1(.Option,.Msg)
 | 
|---|
| 265 |         if $data(Msg) zwr Msg
 | 
|---|
| 266 | 
 | 
|---|
| 267 | UDone
 | 
|---|