| 1 | TMGRPC1C ;TMG/kst-RPC Functions ;07/09/10
 | 
|---|
| 2 |          ;;1.0;TMG-LIB;**1**;07/09/10
 | 
|---|
| 3 | 
 | 
|---|
| 4 |  ;"TMG RPC FUNCTIONS especially related to imaging.
 | 
|---|
| 5 | 
 | 
|---|
| 6 |  ;"Kevin Toppenberg MD
 | 
|---|
| 7 |  ;"GNU General Public License (GPL) applies
 | 
|---|
| 8 |  ;"7/09/10
 | 
|---|
| 9 | 
 | 
|---|
| 10 |  ;"=======================================================================
 | 
|---|
| 11 |  ;" RPC -- Public Functions.
 | 
|---|
| 12 |  ;"=======================================================================
 | 
|---|
| 13 |  ;"GETDEFNL() -- return the default Network Location (file 2005.2) entry
 | 
|---|
| 14 |  ;"GETLOCFPATH(FPATH,LOCIEN) -- get local (absolute) path for storing on host file system
 | 
|---|
| 15 |  ;"GETDROPPATH(LOCIEN,DropBox) -- return path to local dropbox.
 | 
|---|
| 16 |  ;"DOWNLOAD(GREF,FPATH,FNAMEW $$,LOCIEN)
 | 
|---|
| 17 |  ;"UPLOAD(RESULT,FPATH,FNAME,LOCIEN,ARRAY)
 | 
|---|
| 18 |  ;"DOWNDROP(RESULT,FPATH,FNAME,LOCIEN)  -- Download drop box file
 | 
|---|
| 19 |  ;"UPLDDROP(RESULT,FPATH,FNAME,LOCIEN)  -- Upload Dropbox File
 | 
|---|
| 20 |  ;"DELIMAGE(RESULT,IMGIEN,MODE,REASON) -- Delete or Retract Image
 | 
|---|
| 21 |  ;"UNRETRACT(RESULT,TMGIEN) -- reverse retraction process from DELIMAGE above.
 | 
|---|
| 22 |  ;"=======================================================================
 | 
|---|
| 23 |  ;"PRIVATE API FUNCTIONS
 | 
|---|
| 24 |  ;"=======================================================================
 | 
|---|
| 25 |  ;"ENCODE(GRef,incSubscr,encodeFn)
 | 
|---|
| 26 |  ;"DECODE(GRef,incSubscr,decodeFn)
 | 
|---|
| 27 |  ;"$$HEXCODER(INPUT)    ;encode the input string.  Currently using simple hex encoding/
 | 
|---|
| 28 |  ;"$$B64CODER(INPUT)    ;encode the input string via UUENCODE (actually Base64)
 | 
|---|
| 29 |  ;"$$B64DECODER(INPUT)  ;encode the input string via UUDECODE (actually Base64)
 | 
|---|
| 30 |  ;"ENSUREDIV(FPATH,LOCIEN) ;Ensure that the path ends with an appropriate node divider.
 | 
|---|
| 31 | 
 | 
|---|
| 32 |  ;"=======================================================================
 | 
|---|
| 33 |  ;"Dependancies:
 | 
|---|
| 34 |  ;" DIK, TMGDEBUG
 | 
|---|
| 35 |  ;"=======================================================================
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 | GETDEFNL()
 | 
|---|
| 38 |         ;"Purpose: to return the default Network Location (file 2005.2) entry
 | 
|---|
| 39 |         ;"Input: None
 | 
|---|
| 40 |         ;"Results: Returns IEN in file 2005.2,  or 1 if some problem.
 | 
|---|
| 41 |         ;      
 | 
|---|
| 42 |         NEW RESULT SET RESULT=1  ;"Default
 | 
|---|
| 43 |         ;
 | 
|---|
| 44 |         ;"First get default INSTITUTION, stored in KERNEL SYSTEM PARAMETERS file.
 | 
|---|
| 45 |         NEW INSTPTR  SET INSTPTR=+$PIECE($GET(^XTV(8989.3,1,"XUS")),"^",17)  ;"Ptr to file $4 (Institution)
 | 
|---|
| 46 |         IF INSTPTR'>0 GOTO GDFNDN
 | 
|---|
| 47 |         ;
 | 
|---|
| 48 |         ;"Now get IMAGING SITE PARAMETERS for Institution Name
 | 
|---|
| 49 |         NEW IMGSPPTR SET IMGSPPTR=+$ORDER(^MAG(2006.1,"B",INSTPTR,0))
 | 
|---|
| 50 |         IF IMGSPPTR'>0 GOTO GDFNDN
 | 
|---|
| 51 |         ;
 | 
|---|
| 52 |         ;"Now get NETWORK LOCATION stored in IMAGING SITE PARAMETERS record
 | 
|---|
| 53 |         NEW LOCPTR SET LOCPTR=+$PIECE($GET(^MAG(2006.1,IMGSPPTR,0)),"^",3)
 | 
|---|
| 54 |         IF LOCPTR>0 SET RESULT=LOCPTR
 | 
|---|
| 55 |         ;        
 | 
|---|
| 56 | GDFNDN  QUIT RESULT
 | 
|---|
| 57 |         ;
 | 
|---|
| 58 |         ;
 | 
|---|
| 59 | ENSUREDIV(FPATH,LOCIEN) ;
 | 
|---|
| 60 |         ;"Purpose: Ensure that the path ends with an appropriate node divider.
 | 
|---|
| 61 |         set FPATH=$GET(FPATH,"/")        
 | 
|---|
| 62 |         set LOCIEN=+$GET(LOCIEN) if LOCIEN'>0 set LOCIEN=$$GETDEFNL()
 | 
|---|
| 63 | 
 | 
|---|
| 64 |         ;"default is "/"    NOTE: CUSTOM FIELD
 | 
|---|
| 65 |         new NodeDiv set NodeDiv=$piece($get(^MAG(2005.2,LOCIEN,22701),"/"),"^",1)  
 | 
|---|
| 66 | 
 | 
|---|
| 67 |         new EndChar set EndChar=$extract(FPATH,$length(FPATH))
 | 
|---|
| 68 |         if EndChar'=NodeDiv set FPATH=FPATH_NodeDiv
 | 
|---|
| 69 |         quit FPATH
 | 
|---|
| 70 |         ;        
 | 
|---|
| 71 | GETLOCFPATH(FPATH,LOCIEN) ;
 | 
|---|
| 72 |         ;"Purpose: to get local (absolute) path for storing on host file system
 | 
|---|
| 73 |         ;"Input: FPATH --      the file path up to, but not including, the filename
 | 
|---|
| 74 |         ;"                     Use '/' to NOT specify any subdirectory
 | 
|---|
| 75 |         ;"                     [optional] default is '/'
 | 
|---|
| 76 |         ;"       LOCIEN--      [optional] -- the IEN from file 2005.2 (network location) to download from
 | 
|---|
| 77 |         ;"                      NOTE: DEPRECIATED.  Should pass "" to allow code to lookup default
 | 
|---|
| 78 |         ;"                      values stored in KERNEL SYSTEM PARAMETERS etc.
 | 
|---|
| 79 |         ;"                      Note: For security reasons, all path requests will be considered relative to a root path.
 | 
|---|
| 80 |         ;"                            e.g. if user asks for /download/SomeFile.jpg, this function will retrieve:
 | 
|---|
| 81 |         ;"                                        /var/local/Dir1/Dir2/download/SomeFile.jpg
 | 
|---|
| 82 |         ;"                            This root path is found in custom field 22701 in file 2005.2
 | 
|---|
| 83 |         ;"Returns: A path, that can be passed to KERNEL calls for HFS calls.
 | 
|---|
| 84 |         ;"         NOTE: Result WILL end with a node divider
 | 
|---|
| 85 |         ;
 | 
|---|
| 86 |         set FPATH=$GET(FPATH,"/")        
 | 
|---|
| 87 |         set LOCIEN=+$GET(LOCIEN) if LOCIEN'>0 set LOCIEN=$$GETDEFNL()
 | 
|---|
| 88 | 
 | 
|---|
| 89 |         ;"NOTE: CUSTOM FIELD
 | 
|---|
| 90 |         new PathRoot set PathRoot=$piece($get(^MAG(2005.2,LOCIEN,22700)),"^",1) 
 | 
|---|
| 91 | 
 | 
|---|
| 92 |         ;"default is "/"    NOTE: CUSTOM FIELD
 | 
|---|
| 93 |         new NodeDiv set NodeDiv=$piece($get(^MAG(2005.2,LOCIEN,22701),"/"),"^",1)
 | 
|---|
| 94 | 
 | 
|---|
| 95 |         new EndRoot set EndRoot=$extract(PathRoot,$length(PathRoot))
 | 
|---|
| 96 |         new StartPath set StartPath=$extract(FPATH,1)
 | 
|---|
| 97 | 
 | 
|---|
| 98 |         if (EndRoot=NodeDiv)&(StartPath=NodeDiv) do
 | 
|---|
| 99 |         . set FPATH=$extract(FPATH,2,1024)
 | 
|---|
| 100 |         else  if (EndRoot'=NodeDiv)&(StartPath'=NodeDiv) do
 | 
|---|
| 101 |         . set PathRoot=PathRoot_NodeDiv
 | 
|---|
| 102 | 
 | 
|---|
| 103 |         set FPATH=$$ENSUREDIV(PathRoot_FPATH,LOCIEN) 
 | 
|---|
| 104 |         quit FPATH
 | 
|---|
| 105 |         ;
 | 
|---|
| 106 |         ;
 | 
|---|
| 107 | GETDROPPATH(LOCIEN,DropBox) ;
 | 
|---|
| 108 |         ;"Purpose: return path to local dropbox.
 | 
|---|
| 109 |         ;"Input: LOCIEN  -- the IEN from file 2005.2 (network location)
 | 
|---|
| 110 |         ;"       DropBox -- PASS BY REFERENCE.  AN OUT PARAMETER.
 | 
|---|
| 111 |         ;"Results: 1 if OK, -1 if error
 | 
|---|
| 112 |         set LOCIEN=+$GET(LOCIEN)
 | 
|---|
| 113 |         if LOCIEN'>0 set LOCIEN=$$GETDEFNL()
 | 
|---|
| 114 |         new Result set Result=1        
 | 
|---|
| 115 |         set DropBox=$piece($get(^MAG(2005.2,LOCIEN,22702)),"^",1)
 | 
|---|
| 116 |         if DropBox="" do  goto GDPDN
 | 
|---|
| 117 |         . set Result=-1        
 | 
|---|
| 118 |         set DropBox=$$ENSUREDIV(DropBox,LOCIEN) 
 | 
|---|
| 119 | GDPDN   quit Result
 | 
|---|
| 120 | 
 | 
|---|
| 121 |         
 | 
|---|
| 122 | DOWNLOAD(GREF,FPATH,FNAME,LOCIEN)
 | 
|---|
| 123 |         ;"SCOPE: Public
 | 
|---|
| 124 |         ;"Purpose: To provide an entry point for a RPC call from a client.  The client
 | 
|---|
| 125 |         ;"              will ask for a given file, and it will be passed back in the form
 | 
|---|
| 126 |         ;"              of an array (in BASE64 ascii encoding)
 | 
|---|
| 127 |         ;"Input: GREF --        OUT PARAM -- the array to pass the result back in (PASSED BY REFERENCE)
 | 
|---|
| 128 |         ;"       FPATH --      the file path up to, but not including, the filename
 | 
|---|
| 129 |         ;"                     Use '/' to NOT specify any subdirectory
 | 
|---|
| 130 |         ;"                     [optional] default is '/'
 | 
|---|
| 131 |         ;"       FNAME --     the name of the file to pass back
 | 
|---|
| 132 |         ;"       LOCIEN--      [optional] -- the IEN from file 2005.2 (network location) to download from
 | 
|---|
| 133 |         ;"                            NOTE: DEPRECIATED.  Should pass "" to allow code to lookup default
 | 
|---|
| 134 |         ;"                            values stored in KERNEL SYSTEM PARAMETERS etc.
 | 
|---|
| 135 |         ;"                            Note: For security reasons, all path requests will be considered relative to a root path.
 | 
|---|
| 136 |         ;"                                    e.g. if user asks for /download/SomeFile.jpg, this function will retrieve:
 | 
|---|
| 137 |         ;"                                        /var/local/Dir1/Dir2/download/SomeFile.jpg
 | 
|---|
| 138 |         ;"                                    This root path is found in custom field 22701 in file 2005.2
 | 
|---|
| 139 |         ;"Output: results are passed out in @GREF
 | 
|---|
| 140 |         ;"              @GREF@(0)=success;    1=success, 0=failure
 | 
|---|
| 141 |         ;"              @GREF@(1..xxx) = actual data
 | 
|---|
| 142 | 
 | 
|---|
| 143 |         set FNAME=$get(FNAME)
 | 
|---|
| 144 |         set LOCIEN=+$GET(LOCIEN) 
 | 
|---|
| 145 |         if LOCIEN'>0 set LOCIEN=$$GETDEFNL()
 | 
|---|
| 146 |         set FPATH=$$GETLOCFPATH($GET(FPATH),LOCIEN) ;
 | 
|---|
| 147 | 
 | 
|---|
| 148 |         set GREF="^TMP(""DOWNLOAD^TMGRPC1"","_$J_")"
 | 
|---|
| 149 |         kill @GREF
 | 
|---|
| 150 |         set @GREF@(0)=$$BFTG^TMGBINF(.FPATH,.FNAME,$name(@GREF@(1)),3)
 | 
|---|
| 151 | 
 | 
|---|
| 152 |         do ENCODE($name(@GREF@(1)),3)
 | 
|---|
| 153 | 
 | 
|---|
| 154 |         quit
 | 
|---|
| 155 | 
 | 
|---|
| 156 | 
 | 
|---|
| 157 | UPLOAD(RESULT,FPATH,FNAME,LOCIEN,ARRAY)
 | 
|---|
| 158 |         ;"SCOPE: Public
 | 
|---|
| 159 |         ;"RPC That calls this: TMG UPLOAD FILE
 | 
|---|
| 160 |         ;"Purpose: To provide an entry point for a RPC call from a client.  The client
 | 
|---|
| 161 |         ;"              will provide a file for upload (in BASE64 ascii encoding)
 | 
|---|
| 162 |         ;"Input: GREF --    OUT PARAM -- the array to pass the result back in (PASSED BY REFERENCE)
 | 
|---|
| 163 |         ;"       FPATH --   the file path up to, but not including, the filename
 | 
|---|
| 164 |         ;"                  Use '/' to NOT specify any subdirectory
 | 
|---|
| 165 |         ;"                     [optional] default is '/'
 | 
|---|
| 166 |         ;"       FNAME --   the name of the file to pass back
 | 
|---|
| 167 |         ;"       LOCIEN--   [optional] -- the IEN from file 2005.2 (network location) to upload to
 | 
|---|
| 168 |         ;"                     NOTE: DEPRECIATED.  Should pass "" to allow code to lookup default
 | 
|---|
| 169 |         ;"                     Note: For security reasons, all path requests will be considered relative to a root path.
 | 
|---|
| 170 |         ;"                           e.g. if user asks for /download/SomeFile.jpg, this function will retrieve:
 | 
|---|
| 171 |         ;"                               /var/local/Dir1/Dir2/download/SomeFile.jpg
 | 
|---|
| 172 |         ;"                           This root path is found in custom field 22701 in file 2005.2
 | 
|---|
| 173 |         ;"       ARRAY --   the array that will hold the file, in BASE64 ascii encoding
 | 
|---|
| 174 |         ;"Output: results are passed out in RESULT:  1^SuccessMessage   or 0^FailureMessage
 | 
|---|
| 175 | 
 | 
|---|
| 176 |         new result
 | 
|---|
| 177 |         new resultMsg set resultMsg="1^Successful Upload"
 | 
|---|
| 178 | 
 | 
|---|
| 179 |         set ^TMP("UPLOAD^TMGRPC1",$J,"FPATH")=$GET(FPATH)
 | 
|---|
| 180 |         set ^TMP("UPLOAD^TMGRPC1",$J,"FNAME")=$GET(FNAME)
 | 
|---|
| 181 |         set ^TMP("UPLOAD^TMGRPC1",$J,"LOCIEN")=$GET(LOCIEN)
 | 
|---|
| 182 | 
 | 
|---|
| 183 |         if $data(ARRAY)=0 set resultMsg="0^No data received to upload" goto UpDone
 | 
|---|
| 184 |         set FNAME=$get(FNAME)
 | 
|---|
| 185 |         if FNAME="" do  goto UpDone
 | 
|---|
| 186 |         . set resultMsg="0^No file name received"
 | 
|---|
| 187 |         
 | 
|---|
| 188 |         set LOCIEN=+$GET(LOCIEN) if LOCIEN'>0 set LOCIEN=$$GETDEFNL()
 | 
|---|
| 189 |         
 | 
|---|
| 190 |         set FPATH=$$GETLOCFPATH($GET(FPATH),LOCIEN) ;
 | 
|---|
| 191 | 
 | 
|---|
| 192 |         do DECODE("ARRAY(0)",1)
 | 
|---|
| 193 | 
 | 
|---|
| 194 |         if $$GTBF^TMGBINF("ARRAY(0)",1,FPATH,FNAME)=0 do
 | 
|---|
| 195 |         . set resultMsg="0^Error while saving file"
 | 
|---|
| 196 | 
 | 
|---|
| 197 | UpDone  set RESULT=resultMsg
 | 
|---|
| 198 |         quit
 | 
|---|
| 199 | 
 | 
|---|
| 200 | 
 | 
|---|
| 201 | DOWNDROP(RESULT,FPATH,FNAME,LOCIEN)  ;"i.e. Download drop box file
 | 
|---|
| 202 |         ;"SCOPE: Public
 | 
|---|
| 203 |         ;"RPC That calls this: TMG DOWNLOAD FILE DROPBOX
 | 
|---|
| 204 |         ;"Purpose: To provide an entry point for a RPC call from a client.  The client
 | 
|---|
| 205 |         ;"         will request for the file to be placed into in a 'dropbox' file
 | 
|---|
| 206 |         ;"         location that both the client and server can access.  File may be
 | 
|---|
| 207 |         ;"         moved from there to its final destination by the client.
 | 
|---|
| 208 |         ;"         This method alloows file-hiding ability on the server side.
 | 
|---|
| 209 |         ;"Input: RESULT --    OUT PARAM -- the array to pass the result back in (PASSED BY REFERENCE)
 | 
|---|
| 210 |         ;"       FPATH --   the file path up to, but not including, the filename.  This
 | 
|---|
| 211 |         ;"                  is the path that the file is stored at (relative to a root path,
 | 
|---|
| 212 |         ;"                  see comments below).  It is NOT the path of the dropbox.
 | 
|---|
| 213 |         ;"                  Use '/' to NOT specify any subdirectory
 | 
|---|
| 214 |         ;"                  [optional] default is '/'
 | 
|---|
| 215 |         ;"       FNAME --   the name of the file to be uploaded.  Note: This is also the
 | 
|---|
| 216 |         ;"                  name of the file to be put into the dropbox.  It is the
 | 
|---|
| 217 |         ;"                  responsibility of the client to ensure that there is not already
 | 
|---|
| 218 |         ;"                  a similarly named file in the dropbox before requesting a file
 | 
|---|
| 219 |         ;"                  be put there.  It is the responsibility of the client to delete
 | 
|---|
| 220 |         ;"                  the file from the drop box.
 | 
|---|
| 221 |         ;"       LOCIEN--     [optional] -- the IEN from file 2005.2 (network location) to download from
 | 
|---|
| 222 |         ;"                            NOTE: DEPRECIATED.  Should pass "" to allow code to lookup default
 | 
|---|
| 223 |         ;"                            Note: For security reasons, all path requests will be considered relative to a root path.
 | 
|---|
| 224 |         ;"                                    e.g. if user asks for /download/SomeFile.jpg, this function will retrieve:
 | 
|---|
| 225 |         ;"                                        /var/local/Dir1/Dir2/download/SomeFile.jpg
 | 
|---|
| 226 |         ;"                                    This root path is found in custom field 22701 in file 2005.2
 | 
|---|
| 227 |         ;"                       Also: dropbox location is obtained from custom field 22702 in file 2005.2
 | 
|---|
| 228 |         ;"NOTE RE DROPBOX:
 | 
|---|
| 229 |         ;"   This system is designed for a system where by the server and the client have a
 | 
|---|
| 230 |         ;"   shared filesystem, but the directory paths will be different.  For example:
 | 
|---|
| 231 |         ;"      Linux server has dropbox at: /mnt/WinServer/dropbox/
 | 
|---|
| 232 |         ;"      Windows Client has access to dropbox at: V:\Dropbox\
 | 
|---|
| 233 | 
 | 
|---|
| 234 |         ;"Output: results are 1^Success^FileSize (in bytes), or 0^Error Message
 | 
|---|
| 235 | 
 | 
|---|
| 236 |         new DropBox,moveResult,SrcNamePath
 | 
|---|
| 237 |         
 | 
|---|
| 238 |         new resultMsg set resultMsg="1^Successful Download"
 | 
|---|
| 239 | 
 | 
|---|
| 240 |         set FNAME=$get(FNAME) if FNAME="" do  goto DnDBxDone   
 | 
|---|
| 241 |         . set resultMsg="0^No file name received" 
 | 
|---|
| 242 | 
 | 
|---|
| 243 |         set FPATH=$$GETLOCFPATH(.FPATH,.LOCIEN) ;
 | 
|---|
| 244 |         
 | 
|---|
| 245 |         if $$GETDROPPATH(.LOCIEN,.DropBox)=-1 do  goto DnDBxDone  
 | 
|---|
| 246 |         . set resultMsg="0^Dropbox location not configured in file 2005.2, IEN "_LOCIEN_", field 22702"        
 | 
|---|
| 247 | 
 | 
|---|
| 248 |         set SrcNamePath=FPATH_FNAME
 | 
|---|
| 249 | 
 | 
|---|
| 250 |         set moveResult=$$Copy^TMGKERNL(SrcNamePath,DropBox)
 | 
|---|
| 251 |         if moveResult>0 do
 | 
|---|
| 252 |         . set resultMsg="0^Move failed, returning OS error code: "_moveResult
 | 
|---|
| 253 |         else  do
 | 
|---|
| 254 |         . set resultMsg=resultMsg_"^"_$$FileSize^TMGKERNL(SrcNamePath)
 | 
|---|
| 255 | 
 | 
|---|
| 256 | DnDBxDone
 | 
|---|
| 257 |         set RESULT=resultMsg
 | 
|---|
| 258 |         quit
 | 
|---|
| 259 | 
 | 
|---|
| 260 | 
 | 
|---|
| 261 | UPLDDROP(RESULT,FPATH,FNAME,LOCIEN)  ;"i.e. Upload Dropbox File
 | 
|---|
| 262 |         ;"SCOPE: Public
 | 
|---|
| 263 |         ;"RPC That calls this: TMG UPLOAD FILE DROPBOX
 | 
|---|
| 264 |         ;"Purpose: To provide an entry point for a RPC call from a client.  The client
 | 
|---|
| 265 |         ;"         will put the file in a 'dropbox' file location that both the client
 | 
|---|
| 266 |         ;"         and server can access.  File will be moved from there to its final
 | 
|---|
| 267 |         ;"         destination.  This will provide file-hiding ability on the server side.
 | 
|---|
| 268 |         ;"Input: RESULT --  OUT PARAM -- the array to pass the result back in (PASSED BY REFERENCE)
 | 
|---|
| 269 |         ;"       FPATH --   the file path up to, but not including, the filename.  This
 | 
|---|
| 270 |         ;"                  is the path to store the file at.  (relative to a root path,
 | 
|---|
| 271 |         ;"                  see comments below).  It is NOT the path of the dropbox.
 | 
|---|
| 272 |         ;"                  Use '/' to NOT specify any subdirectory
 | 
|---|
| 273 |         ;"                  [optional] default is '/'
 | 
|---|
| 274 |         ;"       FNAME --   the name of the file to be uploaded.  Note: This is also the
 | 
|---|
| 275 |         ;"                  name of the file to be pulled from the dropbox.  It is the
 | 
|---|
| 276 |         ;"                  responsibility of the client to ensure that there is not already
 | 
|---|
| 277 |         ;"                  a similarly named file in the dropbox before depositing a file there.
 | 
|---|
| 278 |         ;"                  The server will remove the file from the dropbox, unless there is
 | 
|---|
| 279 |         ;"                  an error with the host OS (which will be returned as an error message)
 | 
|---|
| 280 |         ;"       LOCIEN--   [optional] -- the IEN from file 2005.2 (network location) to upload to
 | 
|---|
| 281 |         ;"                     NOTE: DEPRECIATED.  Should pass "" to allow code to lookup default
 | 
|---|
| 282 |         ;"                     Note: For security reasons, all path requests will be considered relative to a root path.
 | 
|---|
| 283 |         ;"                           e.g. if user asks for /download/SomeFile.jpg, this function will retrieve:
 | 
|---|
| 284 |         ;"                               /var/local/Dir1/Dir2/download/SomeFile.jpg
 | 
|---|
| 285 |         ;"                           This root path is found in custom field 22700 in file 2005.2
 | 
|---|
| 286 |         ;"                     Also: dropbox location is obtained from custom field 22702 in file 2005.2
 | 
|---|
| 287 |         ;"NOTE RE DROPBOX:
 | 
|---|
| 288 |         ;"   This system is designed for a system where by the server and the client have a
 | 
|---|
| 289 |         ;"   shared filesystem, but the directory paths will be different.  For example:
 | 
|---|
| 290 |         ;"      Linux server has dropbox at: /mnt/WinServer/dropbox/
 | 
|---|
| 291 |         ;"      Windows Client has access to dropbox at: V:\Dropbox\
 | 
|---|
| 292 | 
 | 
|---|
| 293 |         ;"Output: results are passed out in RESULT:
 | 
|---|
| 294 |         ;"      1^SuccessMessage   or 0^FailureMessage
 | 
|---|
| 295 | 
 | 
|---|
| 296 |         new SrcNamePath,DestNamePath,moveResult
 | 
|---|
| 297 |         new resultMsg set resultMsg="1^Successful Upload"
 | 
|---|
| 298 | 
 | 
|---|
| 299 |         set FNAME=$get(FNAME)
 | 
|---|
| 300 |         if FNAME="" set resultMsg="0^No file name received" goto UpDBxDone
 | 
|---|
| 301 | 
 | 
|---|
| 302 |         new DropBox 
 | 
|---|
| 303 |         if $$GETDROPPATH(.LOCIEN,.DropBox)=-1 do  goto UpDBxDone  
 | 
|---|
| 304 |         . set resultMsg="0^Dropbox location not configured in file 2005.2, IEN "_LOCIEN_", field 22702"        
 | 
|---|
| 305 |         
 | 
|---|
| 306 |         set FPATH=$$GETLOCFPATH($GET(FPATH),LOCIEN) ;        
 | 
|---|
| 307 | 
 | 
|---|
| 308 |         set SrcNamePath=DropBox_FNAME
 | 
|---|
| 309 |         set DestNamePath=FPATH_FNAME
 | 
|---|
| 310 | 
 | 
|---|
| 311 |         set moveResult=$$Move^TMGKERNL(SrcNamePath,DestNamePath)
 | 
|---|
| 312 |         if moveResult>0 do
 | 
|---|
| 313 |         . set resultMsg="0^Move failed, returning OS error code: "_moveResult
 | 
|---|
| 314 | 
 | 
|---|
| 315 | UpDBxDone
 | 
|---|
| 316 |         set RESULT=resultMsg
 | 
|---|
| 317 |         quit
 | 
|---|
| 318 | 
 | 
|---|
| 319 | 
 | 
|---|
| 320 | ENCODE(GRef,incSubscr,encodeFn)
 | 
|---|
| 321 |         ;"Purpose: ENCODE a  BINARY GLOBAL.
 | 
|---|
| 322 |         ;"Input:
 | 
|---|
| 323 |         ;"          GRef--      Global reference of the SOURCE binary global array, in fully resolved
 | 
|---|
| 324 |         ;"                              (closed root) format.
 | 
|---|
| 325 |         ;"                           Note:
 | 
|---|
| 326 |         ;"                           At least one subscript must be numeric.  This will be the incrementing
 | 
|---|
| 327 |         ;"                           subscript (i.e. the subscript that $$BIN2WP^TMGBINWP will increment
 | 
|---|
| 328 |         ;"                           to store each new global node).  This subscript need not be the final
 | 
|---|
| 329 |         ;"                           subscript.  For example, to load into a WORD PROCESSING field, the
 | 
|---|
| 330 |         ;"                           incrementing node is the second-to-last subscript; the final subscript
 | 
|---|
| 331 |         ;"                           is always zero.
 | 
|---|
| 332 |         ;"                           REQUIRED
 | 
|---|
| 333 |         ;"         incSubscr-- (required) Identifies the incrementing subscript level, for the source global
 | 
|---|
| 334 |         ;"                           For example, if you pass ^TMP(115,1,1,0) as the global_ref parameter and
 | 
|---|
| 335 |         ;"                           pass 3 as the inc_subscr parameter, $$BIN2GBL will increment the third
 | 
|---|
| 336 |         ;"                           subscript, such as ^TMP(115,1,x), but will WRITE notes at the full global
 | 
|---|
| 337 |         ;"                           reference, such as ^TMP(115,1,x,0).
 | 
|---|
| 338 |         ;"                           REQUIRED
 | 
|---|
| 339 |         ;"         encodeFn-   (OPTIONAL) the name of a function that will encode a line of data.
 | 
|---|
| 340 |         ;"                            e.g. "CODER^ZZZCODER"  or "LOCALCODER".  The function should
 | 
|---|
| 341 |         ;"                            take one input variable (the line of raw binary data), and return a converted
 | 
|---|
| 342 |         ;"                            line.  e.g.
 | 
|---|
| 343 |         ;"                                CODER(INPUT)
 | 
|---|
| 344 |         ;"                                 ... ;"convert INPUT to RESULT
 | 
|---|
| 345 |         ;"                                QUIT RESULT
 | 
|---|
| 346 |         ;"                            default value is B64CODER^TMGRPC1
 | 
|---|
| 347 |         ;"
 | 
|---|
| 348 |         ;"Output: @GRef is converted to encoded data
 | 
|---|
| 349 |         ;"Result: None
 | 
|---|
| 350 | 
 | 
|---|
| 351 |         if $get(GRef)="" goto EncodeDone
 | 
|---|
| 352 |         if $get(incSubscr)="" goto EncodeDone
 | 
|---|
| 353 | 
 | 
|---|
| 354 |         set encodeFn=$get(encodeFn,"B64CODER")
 | 
|---|
| 355 | 
 | 
|---|
| 356 |         new encoder
 | 
|---|
| 357 |         set encoder="set temp=$$"_encodeFn_"(.temp)"
 | 
|---|
| 358 | 
 | 
|---|
| 359 |         for  do  quit:(GRef="")
 | 
|---|
| 360 |         . new temp
 | 
|---|
| 361 |         . set temp=$get(@GRef)
 | 
|---|
| 362 |         . if temp="" set GRef="" quit
 | 
|---|
| 363 |         . xecute encoder  ;"i.e.  set temp=$$encoderFn(.temp)
 | 
|---|
| 364 |         . set @GRef=temp
 | 
|---|
| 365 |         . set GRef=$$NEXTNODE^TMGBINF(GRef,incSubscr,1,1)
 | 
|---|
| 366 | 
 | 
|---|
| 367 | EncodeDone
 | 
|---|
| 368 |         quit
 | 
|---|
| 369 | 
 | 
|---|
| 370 | 
 | 
|---|
| 371 | HEXCODER(INPUT)
 | 
|---|
| 372 |         ;"Purpose: to encode the input string.  Currently using simple hex encoding/
 | 
|---|
| 373 |         quit $$STRB2H^TMGSTUTL(.INPUT,0,1)
 | 
|---|
| 374 | 
 | 
|---|
| 375 | 
 | 
|---|
| 376 | B64CODER(INPUT)
 | 
|---|
| 377 |         ;"Purpose: to encode the input string via UUENCODE (actually Base64)
 | 
|---|
| 378 |         quit $$ENCODE^RGUTUU(.INPUT)
 | 
|---|
| 379 | 
 | 
|---|
| 380 | B64DECODER(INPUT)
 | 
|---|
| 381 |         ;"Purpose: to encode the input string via UUENCODE (actually Base64)
 | 
|---|
| 382 |         quit $$DECODE^RGUTUU(.INPUT)
 | 
|---|
| 383 | 
 | 
|---|
| 384 | 
 | 
|---|
| 385 | DECODE(GRef,incSubscr,decodeFn)
 | 
|---|
| 386 |         ;"Purpose: ENCODE a  BINARY GLOBAL.
 | 
|---|
| 387 |         ;"Input:
 | 
|---|
| 388 |         ;"          GRef--      Global reference of the SOURCE binary global array, in fully resolved
 | 
|---|
| 389 |         ;"                              (closed root) format.
 | 
|---|
| 390 |         ;"                           Note:
 | 
|---|
| 391 |         ;"                           At least one subscript must be numeric.  This will be the incrementing
 | 
|---|
| 392 |         ;"                           subscript (i.e. the subscript that $$BIN2WP^TMGBINWP will increment
 | 
|---|
| 393 |         ;"                           to store each new global node).  This subscript need not be the final
 | 
|---|
| 394 |         ;"                           subscript.  For example, to load into a WORD PROCESSING field, the
 | 
|---|
| 395 |         ;"                           incrementing node is the second-to-last subscript; the final subscript
 | 
|---|
| 396 |         ;"                           is always zero.
 | 
|---|
| 397 |         ;"                           REQUIRED
 | 
|---|
| 398 |         ;"         incSubscr-- (required) Identifies the incrementing subscript level, for the source global
 | 
|---|
| 399 |         ;"                           For example, if you pass ^TMP(115,1,1,0) as the global_ref parameter and
 | 
|---|
| 400 |         ;"                           pass 3 as the inc_subscr parameter, $$BIN2GBL will increment the third
 | 
|---|
| 401 |         ;"                           subscript, such as ^TMP(115,1,x), but will WRITE notes at the full global
 | 
|---|
| 402 |         ;"                           reference, such as ^TMP(115,1,x,0).
 | 
|---|
| 403 |         ;"                           REQUIRED
 | 
|---|
| 404 |         ;"         decodeFn-   (OPTIONAL)  the name of a function that will decode a line of data.
 | 
|---|
| 405 |         ;"                              e.g. "DECODER^ZZZCODER"  or "DECODER".  The function should take
 | 
|---|
| 406 |         ;"                            one input variable (the line of encoded data), and return a decoded line.  e.g.
 | 
|---|
| 407 |         ;"                                DECODER(INPUT)
 | 
|---|
| 408 |         ;"                                 ... ;"convert INPUT to RESULT
 | 
|---|
| 409 |         ;"                                QUIT RESULT
 | 
|---|
| 410 |         ;"                            default value is B64DECODER^TMGRPC1
 | 
|---|
| 411 |         ;"
 | 
|---|
| 412 |         ;"Output: @GRef is converted to decoded data
 | 
|---|
| 413 |         ;"Result: None
 | 
|---|
| 414 | 
 | 
|---|
| 415 |         if $get(GRef)="" goto DecodeDone
 | 
|---|
| 416 |         if $get(incSubscr)="" goto DecodeDone
 | 
|---|
| 417 |         set decodeFn=$get(decodeFn,"B64DECODER")
 | 
|---|
| 418 | 
 | 
|---|
| 419 |         new decoder
 | 
|---|
| 420 |         set decoder="set temp=$$"_decodeFn_"(.temp)"
 | 
|---|
| 421 | 
 | 
|---|
| 422 |         for  do  quit:(GRef="")
 | 
|---|
| 423 |         . new temp
 | 
|---|
| 424 |         . set temp=$get(@GRef)
 | 
|---|
| 425 |         . if temp="" set GRef="" quit
 | 
|---|
| 426 |         . xecute decoder  ;"i.e.  set temp=$$decoderFn(.temp)
 | 
|---|
| 427 |         . set @GRef=temp
 | 
|---|
| 428 |         . set GRef=$$NEXTNODE^TMGBINF(GRef,incSubscr,1,1)
 | 
|---|
| 429 | 
 | 
|---|
| 430 | DecodeDone
 | 
|---|
| 431 |         quit
 | 
|---|
| 432 |  ;
 | 
|---|
| 433 |  ;
 | 
|---|
| 434 | DELIMAGE(RESULT,TMGIEN,TMGMODE,TMGREASON) ;
 | 
|---|
| 435 |         ;"Purpose: Provide functionality for deleting or retacting an image from CPRS
 | 
|---|
| 436 |         ;"NOTE: MAGG IMAGE DELETE is not used because it does things like archive
 | 
|---|
| 437 |         ;"      the images before deletion.  I don't have this system fully integrated
 | 
|---|
| 438 |         ;"      In the future, that could possibly be used.
 | 
|---|
| 439 |         ;"NOTE: This function DOES NOT CHECK PERMISSIONS for deleting the images.
 | 
|---|
| 440 |         ;"      It is assumed that that has been doine PRIOR to calling this function.
 | 
|---|
| 441 |         ;"NOTE: It mode is to retract (see below), then the image will not be
 | 
|---|
| 442 |         ;"      actually be deleted.  It will just be marked as retracted and 
 | 
|---|
| 443 |         ;"      set so that it doesn't appear in CPRS.
 | 
|---|
| 444 |         ;"      --But if mode is to delete, then the record in the IMAGE file
 | 
|---|
| 445 |         ;"      will be deleted AND ALSO the actual image (with no backup.) This
 | 
|---|
| 446 |         ;"      mode is for deletion before signing, and the image has not been
 | 
|---|
| 447 |         ;"      formally entered into the record.
 | 
|---|
| 448 |         ;"Input: RESULT -- an OUT Parameter. (See results below)
 | 
|---|
| 449 |         ;"       TMGIEN -- the IEN in the IMAGE file (2005) to remove
 | 
|---|
| 450 |         ;"       TMGMODE -- 0 for NONE <-- just exit and do nothing
 | 
|---|
| 451 |         ;"               1 for DELETE <-- delete record and image file
 | 
|---|
| 452 |         ;"               2 for RETRACT <-- mark record as retracted, don't delete iamge file.
 | 
|---|
| 453 |         ;"       TMGREASON -- String (10-60 chars) giving reason for deletion.
 | 
|---|
| 454 |         ;"                 This is only used for mode RETRACT.
 | 
|---|
| 455 |         ;"Output: RESULT="1^Success"   or "-1^Some Failure Message"  <-- set up as SINGLE VALUE type in RPC BROKER
 | 
|---|
| 456 |         ;
 | 
|---|
| 457 |         SET RESULT="1^Success"  ;"Default to success
 | 
|---|
| 458 |         SET TMGIEN=$GET(TMGIEN,0)
 | 
|---|
| 459 |         IF +TMGIEN'>0 DO  GOTO DIDN
 | 
|---|
| 460 |         . SET RESULT="-1^Invalid IEN: "_TMGIEN
 | 
|---|
| 461 |         SET TMGIEN=+TMGIEN
 | 
|---|
| 462 |         SET TMGMODE=+$GET(TMGMODE)
 | 
|---|
| 463 |         IF TMGMODE=0 DO  GOTO DIDN
 | 
|---|
| 464 |         . SET RESULT="1^Delete not done because mode=0"
 | 
|---|
| 465 |         SET TMGREASON=$GET(TMGREASON,"(Not Specified)")
 | 
|---|
| 466 |         NEW TMGPTR SET TMGPTR=+$PIECE($GET(^MAG(2005,TMGIEN,2)),"^",8) ;"2;8 ==> Field 18 = PARENT DATA FILE IMAGE POINTER
 | 
|---|
| 467 |         IF TMGPTR'>0 DO  GOTO DIDN
 | 
|---|
| 468 |         . SET RESULT="-1^FILE 2005, IEN "_TMGIEN_", Field 18 does not point to valid record in file 8925.91"
 | 
|---|
| 469 |         NEW TMGTIUPTR SET TMGTIUPTR=+$PIECE($GET(^TIU(8925.91,TMGPTR,0)),"^",1) ;"0;1 ==> Field .01 = DOCUMENT (ptr to 8925)
 | 
|---|
| 470 |         IF TMGMODE=1 DO  GOTO:(+RESULT'>0) DIDN   ;"Delete mode
 | 
|---|
| 471 |         . NEW FNAME SET FNAME=$PIECE($GET(^MAG(2005,TMGIEN,0)),"^",2)
 | 
|---|
| 472 |         . NEW TMGPATH SET TMGPATH=$$GETLOCFPATH()
 | 
|---|
| 473 |         . NEW TMGARRAY,DELRSLT
 | 
|---|
| 474 |         . SET TMGARRAY(FNAME)=""
 | 
|---|
| 475 |         . SET DELRSLT=$$DEL^%ZISH(TMGPATH,"TMGARRAY")
 | 
|---|
| 476 |         . IF DELRSLT=0 DO  QUIT
 | 
|---|
| 477 |         . . SET RESULT="-1^Unable to delete file: "_TMGPATH_FNAME
 | 
|---|
| 478 |         . KILL TMGARRAY
 | 
|---|
| 479 |         . NEW FNAME2 SET FNAME2=FNAME
 | 
|---|
| 480 |         . SET $PIECE(FNAME2,",",$LENGTH(FNAME2,"."))="ABS"
 | 
|---|
| 481 |         . SET TMGARRAY(FNAME2)=""
 | 
|---|
| 482 |         . SET DELRSLT=$$DEL^%ZISH(TMGPATH,"TMGARRAY") ;"Ingnore results.  Thumbnail not always present        
 | 
|---|
| 483 |         . NEW DIK SET DIK="^MAG(2005,"
 | 
|---|
| 484 |         . NEW DA SET DA=TMGIEN
 | 
|---|
| 485 |         . DO ^DIK  ;"Kill Record in 2005
 | 
|---|
| 486 |         ELSE  IF TMGMODE=2 DO  GOTO:(+RESULT'>0) DIDN  ;"Retract mode
 | 
|---|
| 487 |         . NEW TMGFDA,TMGMSG,TMGIENS
 | 
|---|
| 488 |         . SET TMGIENS=TMGIEN_","
 | 
|---|
| 489 |         . SET TMGFDA(2005,TMGIENS,30)="`"_+DUZ
 | 
|---|
| 490 |         . SET TMGFDA(2005,TMGIENS,30.1)="NOW"
 | 
|---|
| 491 |         . SET TMGFDA(2005,TMGIENS,30.2)=TMGREASON
 | 
|---|
| 492 |         . SET TMGFDA(2005,TMGIENS,18)="@"
 | 
|---|
| 493 |         . ;"NOTE: Fld 17 already holds IEN of linked 8925 document
 | 
|---|
| 494 |         . DO FILE^DIE("EKT","TMGFDA","TMGMSG")
 | 
|---|
| 495 |         . IF $DATA(TMGMSG("DIERR")) DO
 | 
|---|
| 496 |         . . SET RESULT="-1^"_$$GetErrStr^TMGDEBUG(.TMGMSG)
 | 
|---|
| 497 |         DO  ;"Do this for both DELETE and RETRACT modes.
 | 
|---|
| 498 |         . NEW DIK SET DIK="^TIU(8925.91,"
 | 
|---|
| 499 |         . NEW DA SET DA=TMGPTR
 | 
|---|
| 500 |         . DO ^DIK  ;"Kill record in 8925.91
 | 
|---|
| 501 |         ;
 | 
|---|
| 502 | DIDN    QUIT        
 | 
|---|
| 503 |         ;
 | 
|---|
| 504 | UNRETRACT(RESULT,TMGIEN) ;
 | 
|---|
| 505 |         ;"Purpose: to reverse retraction process from DELIMAGE above.
 | 
|---|
| 506 |         ;"Input: RESULT -- an OUT Parameter. (See results below)
 | 
|---|
| 507 |         ;"       TMGIEN -- the IEN in the IMAGE file (2005) to remove
 | 
|---|
| 508 |         ;"Output: RESULT="1^Success"   or "-1^Some Failure Message"  <-- set up as SINGLE VALUE type in RPC BROKER
 | 
|---|
| 509 |         SET TMGIEN=$GET(TMGIEN)
 | 
|---|
| 510 |         IF +TMGIEN'>0 DO  GOTO URDN
 | 
|---|
| 511 |         . SET RESULT="-1^Invalid IEN supplied: "_TMGIEN
 | 
|---|
| 512 |         SET TMGIEN=+TMGIEN
 | 
|---|
| 513 |         NEW TIUPTR SET TIUPTR=+$PIECE($GET(^MAG(2005,TMGIEN,2)),"^",7)
 | 
|---|
| 514 |         IF TIUPTR'>0 DO  GOTO URDN
 | 
|---|
| 515 |         . SET RESULT="-1^Record 2005 doesn't hold link to TIU DOCUMENT in field 17"
 | 
|---|
| 516 |         NEW TMGFDA,TMGFDA,TMGIENS
 | 
|---|
| 517 |         ;"-- Recreate TIU EXTERNAL DATA LINK record
 | 
|---|
| 518 |         KILL TMGFDA
 | 
|---|
| 519 |         SET TMGIENS="+1,"
 | 
|---|
| 520 |         SET TMGFDA(8925.91,TMGIENS,.01)=TIUPTR       
 | 
|---|
| 521 |         SET TMGFDA(8925.91,TMGIENS,.02)=TMGIEN
 | 
|---|
| 522 |         DO UPDATE^DIE("","TMGFDA","TMGIEN","TMGMSG")
 | 
|---|
| 523 |         IF $DATA(TMGMSG("DIERR")) DO  GOTO URDN
 | 
|---|
| 524 |         . SET RESULT="-1^"_$$GetErrStr^TMGDEBUG(.TMGMSG)
 | 
|---|
| 525 |         NEW TIUIMGPTR SET TIUIMGPTR=+$GET(TMGIEN(1))
 | 
|---|
| 526 |         IF TIUIMGPTR'>0 DO  GOTO URDN
 | 
|---|
| 527 |         . SET RESULT="-1^Unable to locate recreated TIU EXTERNAL DATA LINK record"
 | 
|---|
| 528 |         ;"-- remove DELETED info from IMAGE record -- 
 | 
|---|
| 529 |         NEW TMGFDA,TMGFDA,TMGIENS
 | 
|---|
| 530 |         SET TMGIENS=TMGIEN_","
 | 
|---|
| 531 |         SET TMGFDA(2005,TMGIENS,30)="@"
 | 
|---|
| 532 |         SET TMGFDA(2005,TMGIENS,30.1)="@"
 | 
|---|
| 533 |         SET TMGFDA(2005,TMGIENS,30.2)="@"
 | 
|---|
| 534 |         SET TMGFDA(2005,TMGIENS,18)=TIUIMGPTR
 | 
|---|
| 535 |         DO FILE^DIE("EKT","TMGFDA","TMGMSG")
 | 
|---|
| 536 |         IF $DATA(TMGMSG("DIERR")) DO  GOTO URDN
 | 
|---|
| 537 |         . SET RESULT="-1^"_$$GetErrStr^TMGDEBUG(.TMGMSG)
 | 
|---|
| 538 |         
 | 
|---|
| 539 | URDN    QUIT                
 | 
|---|