예제 #1
0
        /// <summary>
        /// Create an Ack message based on a received message
        /// </summary>
        /// <param name="inboundMessage">received message</param>
        /// <param name="ackCode">Should be "AE" or "AR", can be "AA".</param>
        /// <param name="errorMessage">The reason the message was rejected or an error. If "AA" was supplied as ackCode the errorMessage should be null.</param>
        /// <returns>Created ACK message</returns>
        public static IMessage MakeACK(IMessage inboundMessage, string ackCode, string errorMessage)
        {
            IMessage ackMessage = null;
            // Get an object from the right ACK class
            string ackClassType = string.Format("NHapi.Model.V{0}.Message.ACK, NHapi.Model.V{0}", inboundMessage.Version.Remove(inboundMessage.Version.IndexOf('.'), 1));
            Type   x            = Type.GetType(ackClassType);

            ackMessage = (IMessage)Activator.CreateInstance(x);

            Terser   inboundTerser = new Terser(inboundMessage);
            ISegment inboundHeader = null;

            inboundHeader = inboundTerser.getSegment("MSH");

            // Find the HL7 version of the inbound message:
            //
            string version = null;

            try
            {
                version = Terser.Get(inboundHeader, 12, 0, 1, 1);
            }
            catch (NHapi.Base.HL7Exception)
            {
                // I'm not happy to proceed if we can't identify the inbound
                // message version.
                throw new NHapi.Base.HL7Exception("Failed to get valid HL7 version from inbound MSH-12-1");
            }

            // Create a Terser instance for the outbound message (the ACK).
            Terser terser = new Terser(ackMessage);

            // Populate outbound MSH fields using data from inbound message
            ISegment outHeader = (ISegment)terser.getSegment("MSH");

            DeepCopy.copy(inboundHeader, outHeader);

            // Now set the message type, HL7 version number, acknowledgement code
            // and message control ID fields:
            string sendingApp = terser.Get("/MSH-3");
            string sendingEnv = terser.Get("/MSH-4");

            terser.Set("/MSH-3", CommunicationName);
            terser.Set("/MSH-4", EnvironmentIdentifier);
            terser.Set("/MSH-5", sendingApp);
            terser.Set("/MSH-6", sendingEnv);
            terser.Set("/MSH-7", DateTime.Now.ToString("yyyyMMddmmhh"));
            terser.Set("/MSH-9", "ACK");
            terser.Set("/MSH-12", version);
            terser.Set("/MSA-1", ackCode == null ? "AA" : ackCode);
            terser.Set("/MSA-2", Terser.Get(inboundHeader, 10, 0, 1, 1));

            // Set error message
            if (errorMessage != null)
            {
                terser.Set("/ERR-7", errorMessage);
            }

            return(ackMessage);
        }
예제 #2
0
        private void SetACK(AckTypes ackType, String messageString)
        {
            Terser   terser          = new Terser(hl7Ack.Message);
            ISegment err             = terser.getSegment("/ERR(0)");
            ISegment criticalSegment = TryToRecoverCriticalDataFromMessage(messageString);


            try
            {
                FillMSHSegment((ISegment)hl7Ack.Message.GetStructure("MSH"), criticalSegment);

                if (criticalSegment == null)
                {
                    terser.Set("/MSA-1", Enum.GetName(typeof(AckTypes), ackType));
                    terser.Set("/MSA-2", "");
                }
                else
                {
                    terser.Set("/MSA-1", Enum.GetName(typeof(AckTypes), ackType));
                    terser.Set("/MSA-2", Terser.Get(criticalSegment, 10, 0, 1, 1));
                }
            }
            catch (HL7Exception he)
            {
                _errorMessage.Append(he.Message);
                return; //do not throw exceptions;
            }
            //terser.Set("ERR(0)-7", _errorMessage);
            terser.Set("/ERR(0)-7-1-1", _errorMessage.ToString());
        }
        /// <summary>
        /// Set request message parameters
        /// </summary>
        protected void SetRequestMessageParams(NHapi.Base.Model.IMessage request)
        {
            Terser setTerser = new Terser(request);

            setTerser.Set("/MSH-7", DateTime.Now.ToString("yyyyMMddHHmmss"));
            setTerser.Set("/EVN-2", DateTime.Today.ToString("yyyyMMdd"));
        }
예제 #4
0
        /// Create an Ack message based on a received message///
        /// received message///
        /// Acknowlegde code///
        /// Message to be created///
        /// Created message
        public string MakeACK(string AckHead, string version, string ackCode, IMessage ackMessage)
        {
            // Create a Terser instance for the outbound message (the ACK).
            Terser terser = new Terser(ackMessage);

            // Populate outbound MSH fields using data from inbound message


            // Now set the message type, HL7 version number, acknowledgement code
            // and message control ID fields:
            string sendingApp = terser.Get("/MSH-3");
            string sendingEnv = terser.Get("/MSH-4");
            string CommunicationNameOfThisApplication     = string.Empty;
            string EnvironmentIdentifierOfThisApplication = string.Empty;

            terser.Set("/MSH-3", CommunicationNameOfThisApplication);
            terser.Set("/MSH-4", EnvironmentIdentifierOfThisApplication);
            terser.Set("/MSH-5", sendingApp);
            terser.Set("/MSH-6", sendingEnv);
            terser.Set("/MSH-7", DateTime.Now.ToString("yyyyMMddmmhh"));
            terser.Set("/MSH-9", "ACK");
            terser.Set("/MSH-12", version);
            // The ackCode should be "AA" if the message was correctly handled and "AE" if there was an error
            terser.Set("/MSA-1", ackCode == null ? "AA" : ackCode);
            terser.Set("/MSA-2", AckHead);


            return(PipeParser.Encode(ackMessage, new EncodingCharacters('|', '^', '~', '\\', '&')));
        }
예제 #5
0
        private void FillMSHSegment(ISegment mshIn, ISegment mshOut)
        {
            if (mshOut == null)
            {
                throw new System.Exception("mshout");
            }

            Guid g = Guid.NewGuid();

            Terser.Set(mshIn, 7, 0, 1, 1, DateTime.Now.ToString("yyyyMMddHHmmss"));
            Terser.Set(mshIn, 7, 0, 1, 1, DateTime.Now.ToString("yyyyMMddHHmmss"));

            if (mshIn == null)
            {
                Terser.Set(mshIn, 3, 0, 1, 1, "");
                Terser.Set(mshIn, 4, 0, 1, 1, "");
                Terser.Set(mshIn, 5, 0, 1, 1, "");
                Terser.Set(mshIn, 6, 0, 1, 1, "");
                Terser.Set(mshIn, 9, 0, 1, 1, "ACK");
            }
            else
            {
                Terser.Set(mshIn, 3, 0, 1, 1, Terser.Get(mshIn, 5, 0, 1, 1));
                Terser.Set(mshIn, 4, 0, 1, 1, Terser.Get(mshIn, 6, 0, 1, 1));
                Terser.Set(mshIn, 5, 0, 1, 1, Terser.Get(mshIn, 3, 0, 1, 1));
                Terser.Set(mshIn, 6, 0, 1, 1, Terser.Get(mshIn, 4, 0, 1, 1));
                Terser.Set(mshIn, 9, 0, 1, 1, Terser.Get(mshIn, 9, 0, 1, 1));
                Terser.Set(mshIn, 9, 0, 2, 1, Terser.Get(mshIn, 9, 0, 2, 1));
            }
        }