Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: HLOAPP

HLOAPP.m

Go to the documentation of this file.
HLOAPP ;ALB/CJM-HL7 -Application Registry ;02/23/2012
 ;;1.6;HEALTH LEVEL SEVEN;**126,132,137,139,158**;Oct 13, 1995;Build 14
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
GETIEN(NAME) ;given the application name, it finds the ien.  Returns 0 on failure
 Q:'$L($G(NAME)) 0
 Q +$O(^HLD(779.2,"C",$E(NAME,1,60),0))
 ;
ACTION(HEADER,ACTION,QUEUE) ;Given the parsed header of a message it returns both the action that should be performed in response to the message and the incoming queue that it should be placed on.
 ;
 ;** do not implement the Pass Immediate parameter **
 ;ACTION(HEADER,ACTION,QUEUE,IMMEDIATE);Given the parsed header of a message it returns both the action that should be performed in response to the message and the incoming queue that it should be placed on.
 ;
 ;Input:
 ;  HEADER() subscripts are used: "RECEIVING APPLICATION","SEGMENT TYPE", "MESSAGE TYPE", "EVENT", "VERSION"
 ;Output:
 ;  Function returns 1 on success, 0 on failure
 ;  ACTION (pass by reference) <tag>^<rtn>
 ;  QUEUE (pass by reference) returns the named queue if there is one, else "DEFAULT"
 ;
 ;** do not implement the Pass Immediate parameter **
 ;  IMMEDIATE (pass by reference, optional) returns 1 if the application wants its messages passed to the incoming queue immediately, 0 otherwise
 ;
 N IEN
 S (ACTION,QUEUE)=""
 S IEN=$$GETIEN(HEADER("RECEIVING APPLICATION"))
 Q:'$G(IEN) 0
 I $G(HEADER("SEGMENT TYPE"))="BHS" D
 .S NODE=$G(^HLD(779.2,IEN,0))
 .I $P(NODE,"^",5)]"" D
 ..S ACTION=$P(NODE,"^",4,5)
 .E  I $P(NODE,"^",7)]"" S ACTION=$P(NODE,"^",6,7)
 .I $P(NODE,"^",8)]"" D
 ..S QUEUE=$P(NODE,"^",8)
 .E  I $P(NODE,"^",3)]"" S QUEUE=$P(NODE,"^",3)
 E  I HEADER("SEGMENT TYPE")="MSH" D
 .I HEADER("MESSAGE TYPE")'="",HEADER("EVENT")'="" D
 ..N SUBIEN,NODE
 ..;did the application specify an action for the particular version of this message?
 ..I HEADER("VERSION")'="" S SUBIEN=$O(^HLD(779.2,IEN,1,"D",HEADER("MESSAGE TYPE"),HEADER("EVENT"),HEADER("VERSION"),0))
 ..;if not, look on the "C" index
 ..S:'$G(SUBIEN) SUBIEN=$O(^HLD(779.2,IEN,1,"C",HEADER("MESSAGE TYPE"),HEADER("EVENT"),0))
 ..;
 ..I SUBIEN D
 ...S NODE=$G(^HLD(779.2,IEN,1,SUBIEN,0))
 ...I $P(NODE,"^",5)]"" S ACTION=$P(NODE,"^",4,5)
 ...I $P(NODE,"^",3)]"" S QUEUE=$P(NODE,"^",3)
 ...;
 ...;** do not implement the Pass ImMediate parameter **
 ...;S IMMEDIATE=$P(NODE,"^",8)
 ...;
 ..I ACTION="" S NODE=$G(^HLD(779.2,IEN,0)) I $P(NODE,"^",7)]"" S ACTION=$P(NODE,"^",6,7)
 ..I QUEUE="" S NODE=$G(^HLD(779.2,IEN,0)) I $P(NODE,"^",3)]"" S QUEUE=$P(NODE,"^",3)
 I QUEUE="" S QUEUE="DEFAULT"
 ;
 ;** do not implement the Pass Immediate parameter **
 ;I $G(IMMEDIATE)'=1 S IMMEDIATE=0
 ;
 I ACTION="" Q 0
 Q 1
 ;
RTRNLNK(APPNAME) ;
 ;given the name of a receiving application, this returns the return
 ;link for application acks if one is provided.  Otherwise, return
 ;acks are routed based on the information provide in the message hdr
 ;
 Q:(APPNAME="") ""
 N IEN
 S IEN=$$GETIEN(APPNAME)
 Q:IEN $P($G(^HLD(779.2,IEN,0)),"^",2)
 Q ""
 ;
RTRNPORT(APPNAME) ;
 ;Given the name of the sending application, IF the application has its
 ;own listener, its port # is returned.  Application acks should be
 ;returned using that port
 Q:(APPNAME="") ""
 N IEN,LINK
 S IEN=$$GETIEN(APPNAME)
 Q:'IEN ""
 S LINK=$P($G(^HLD(779.2,IEN,0)),"^",9)
 Q:'LINK ""
 Q $$PORT^HLOTLNK(LINK)
 ;
ACTIVE(APP,MSGTYPE,EVENT,VERSION) ;
 ;Returns 1 if the message's INACTIVE flag has NOT been set.
 ;
 ;Input:
 ;  APP (required) the name of the sending application
 ;  MSGTYPE (required) 3 character HL7 message type
 ;  EVENT (required) 3 character HL7 event
 ;  VERSION (optional) HL7 version ID as it appears in the message header
 ;Output:
 ;  Function returns 1 if the message type specified by the input parameters has not been set to INACTIVE.  It returns 0 otherwise.
 ;
 N IEN,ACTIVE,SUBIEN
 S ACTIVE=1
 S IEN=$$GETIEN($G(APP))
 Q:'$G(IEN) ACTIVE
 Q:$G(MSGTYPE)="" ACTIVE
 Q:$G(EVENT)="" ACTIVE
 ;did the application specify an action for the particular version of this message?
 I $G(VERSION)'="" S SUBIEN=$O(^HLD(779.2,IEN,1,"D",MSGTYPE,EVENT,VERSION,0))
 ;if not, look on the "C" index
 S:'$G(SUBIEN) SUBIEN=$O(^HLD(779.2,IEN,1,"C",MSGTYPE,EVENT,0))
 ;
 S:SUBIEN ACTIVE='(+$P($G(^HLD(779.2,IEN,1,SUBIEN,0)),"^",7))
 Q ACTIVE
 ;
EXCEPT(APPNAME) ;
 ;returns the exception handler (tag^routine) that should be invoked
 ;when an applicaiton's messages are being sequenced and an app ack
 ;is not timely received
 ;
 N IEN,RTN
 S IEN=$$GETIEN($G(APPNAME))
 I IEN S RTN=$P($G(^HLD(779.2,IEN,0)),"^",10,11)
 I $L($G(RTN))>1 Q RTN
 Q "DEFAULT^HLOAPP"
 ;
DEFAULT ;default exception handler if the app doesn't specify one
 S ^TMP("HLO SEQUENCING EXCEPTION",$J,$$NOW^XLFDT,+$G(HLMSGIEN))=""
 Q
 ;
TIMEOUT(APPNAME) ;
 N IEN,TIME
 S IEN=$$GETIEN($G(APPNAME))
 I IEN S TIME=$P($G(^HLD(779.2,IEN,0)),"^",12)
 Q:'$G(TIME) 10
 Q TIME
 ;
RTNTN(APP,MSGTYPE,EVENT,VERSION) ;
 ;Returns the retention time for this message, if specified.
 ;
 ;Input:
 ;  APP (required) the name of the sending application
 ;  MSGTYPE (required) 3 character HL7 message type
 ;  EVENT (required) 3 character HL7 event
 ;  VERSION (optional) HL7 version ID as it appears in the message header
 ;Output:
 ;  Function returns retention time if spcified, 0 otherwise
 ;
 N IEN,RET,SUBIEN
 S RET=0
 S IEN=$$GETIEN($G(APP))
 Q:'$G(IEN) RET
 I $L($G(MSGTYPE)),$L($G(EVENT)) D
 .;did the application specify an action for the particular version of this message?
 .I $G(VERSION)'="" S SUBIEN=$O(^HLD(779.2,IEN,1,"D",MSGTYPE,EVENT,VERSION,0)) I SUBIEN S RET=$P($G(^HLD(779.2,IEN,1,SUBIEN,0)),"^",8)
 .;if not, look on the "C" index
 .S:'RET SUBIEN=$O(^HLD(779.2,IEN,1,"C",MSGTYPE,EVENT,0)) I SUBIEN S RET=$P($G(^HLD(779.2,IEN,1,SUBIEN,0)),"^",8)
 ;
 S:'RET RET=+$P($G(^HLD(779.2,IEN,0)),"^",13)
 Q RET
 ;
 ;
 ;
 ;
 ;
 ;