Exemplo n.º 1
0
        /// <summary>
        /// Create the request from HL7
        /// </summary>
        /// <param name="received"></param>
        /// <returns></returns>
        public static ExecuteServiceServerRequest FromMessage(string received)
        {
            var lines = received.Split(Request.NewRow.ToCharArray());
            var rows  = (from l in lines
                         select l.Split(Request.Delimiter.ToCharArray())).ToArray();

            var teamName    = rows[0][2];
            var teamId      = int.Parse(rows[0][3]);
            var serviceName = rows[1][2];
            var numSegments = int.Parse(rows[1][4]);

            var call    = new RemoteServiceCall(serviceName, teamName, teamId);
            var request = new ExecuteServiceServerRequest(call);

            // Read the arguments
            for (int i = 0; i < numSegments; i++)
            {
                var row      = rows[2 + i];
                var pos      = int.Parse(row[1]);
                var respName = row[2];
                var dataType = ServiceArgument.TypeFromString(row[3]);
                var value    = row[5];

                var arg = new ServiceArgument(pos, respName, dataType);
                arg.Value = value;
                call.Args.Add(arg);
            }

            return(request);
        }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="teamName">Team name</param>
        /// <param name="teamId">Team id</param>
        /// <param name="service">Service</param>
        public PublishServiceRequest(string teamName, int teamId, RemoteService service) :
            base("PUB-SERVICE", teamName, teamId.ToString())
        {
            Contents.Add("SRV");
            Contents.Add(service.Tag);
            Contents.Add(service.Name);
            Contents.Add(service.SecurityLevel.ToString());
            Contents.Add(service.Args.Count.ToString());
            Contents.Add(service.Returns.Count.ToString());
            Contents.Add(service.Description);
            Contents.Add(NewRow);

            foreach (var arg in service.Args)
            {
                Contents.Add("ARG");
                Contents.Add(arg.Position.ToString());
                Contents.Add(arg.Name);
                Contents.Add(ServiceArgument.TypeToString(arg.DataType));
                Contents.Add(arg.Mandatory ? "mandatory" : "optional");
                Contents.Add(NewRow);
            }

            foreach (var ret in service.Returns)
            {
                Contents.Add("RSP");
                Contents.Add(ret.Position.ToString());
                Contents.Add(ret.Name);
                Contents.Add(ServiceArgument.TypeToString(ret.DataType));
                Contents.Add(NewRow);
            }

            Contents.Add("MCH");
            Contents.Add(service.Ip.ToString());
            Contents.Add(service.Port.ToString());
            Contents.Add(NewRow);
        }
Exemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="teamName">Team name</param>
        /// <param name="teamId">Team id</param>
        /// <param name="call">Remote service call</param>
        public ExecuteServiceRequest(string teamName, int teamId, RemoteServiceCall call) :
            base("EXEC-SERVICE", teamName, teamId.ToString())
        {
            Contents.Add("SRV");
            Contents.Add("");
            Contents.Add(call.ServiceName);
            Contents.Add("");
            Contents.Add(call.Args.Count.ToString());
            Contents.Add("");
            Contents.Add("");
            Contents.Add(NewRow);

            for (int i = 0; i < call.Args.Count; i++)
            {
                var arg = call.Args[i];
                Contents.Add("ARG");
                Contents.Add(arg.Position.ToString());
                Contents.Add(arg.Name);
                Contents.Add(ServiceArgument.TypeToString(arg.DataType));
                Contents.Add("");
                Contents.Add(arg.Value);
                Contents.Add(NewRow);
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Create HL7 from response
        /// </summary>
        /// <returns>HL7</returns>
        public string ToHl7()
        {
            var taxRate = (from t in taxRates
                           where t.Code == provinceCode
                           select t).FirstOrDefault();

            if (taxRate == null)
            {
                throw new Exception("Unknown provinceCode == " + provinceCode);
            }

            // Perform the calculations
            var subtotal = purchaseAmount;
            var hst      = (taxRate.Hst / 100) * subtotal;
            var gst      = (taxRate.Gst / 100) * subtotal;
            var pst      = 0.0;

            if (provinceCode == "QC" || provinceCode == "PE")
            {
                pst = (taxRate.Pst / 100) * (subtotal + gst);
            }
            else
            {
                pst = (taxRate.Pst / 100) * subtotal;
            }

            var total = subtotal + pst + hst + gst;

            // Create the return values
            var sr = SubTotalReturn;

            sr.Value = subtotal;

            var pr = PstReturn;

            pr.Value = pst;

            var hr = HstReturn;

            hr.Value = hst;

            var gr = GstReturn;

            gr.Value = gst;

            var tr = TotalReturn;

            tr.Value = total;

            // Create HL7
            var sb = new StringBuilder();

            sb.Append(String.Format("PUB|OK|||{0}|{1}", 5, Request.NewRow));
            foreach (var ret in new ServiceReturn[] { sr, pr, hr, gr, tr })
            {
                sb.Append(String.Format("RSP|{0}|{1}|{2}|{3}|{4}",
                                        ret.Position, ret.Name, ServiceArgument.TypeToString(ret.DataType), ret.Value, Request.NewRow));
            }

            return(Request.BeginMarker + sb.ToString() + Request.EndOfMessage);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Create the response from a message and HL7 response content
        /// </summary>
        /// <param name="request">Request made</param>
        /// <param name="message">HL7 response content</param>
        /// <returns></returns>
        public Response FromMessage(Request request, string message)
        {
            if (!IsOkMessage(message))
            {
                return(CreateFailureException(message));
            }

            var rows = ExtractRows(message);

            if (request is RegisterTeamRequest)
            {
                var fullRequest = (RegisterTeamRequest)request;
                var response    = new RegisterTeamResponse();

                var teamId     = rows[0][2];
                var expiration = rows[0][3];

                try
                {
                    response.TeamId     = int.Parse(teamId);
                    response.Expiration = expiration;

                    return(response);
                }
                catch (Exception)
                {
                    throw new FormatException("Failure to parse teamId, must be integer");
                }
            }
            else if (request is UnRegisterTeamRequest)
            {
                var fullRequest = (UnRegisterTeamRequest)request;
                var response    = new UnRegisterTeamResponse();
                return(response);
            }
            else if (request is QueryTeamRequest)
            {
                var fullRequest = (QueryTeamRequest)request;
                var response    = new QueryTeamResponse();

                return(response);
            }
            else if (request is PublishServiceRequest)
            {
                var fullRequest = (PublishServiceRequest)request;
                var response    = new PublishServiceResponse();
                return(response);
            }
            else if (request is QueryServiceRequest)
            {
                var fullRequest = (QueryServiceRequest)request;

                var numSegments  = int.Parse(rows[0][4]);
                var serviceName  = rows[1][2];
                var numArgs      = int.Parse(rows[1][4]);
                var numResponses = int.Parse(rows[1][5]);
                var description  = rows[1][6];

                var mchIndex = 2 + numArgs + numResponses;
                var ip       = rows[mchIndex][1];
                var port     = int.Parse(rows[mchIndex][2]);
                var service  = new RemoteService(IPAddress.Parse(ip), port, serviceName, fullRequest.TagName, 1, description);

                var response = new QueryServiceResponse(service);
                // Read the args
                for (int i = 0; i < numArgs; i++)
                {
                    var arg = 2 + i;
                    var row = rows[arg];

                    var pos       = int.Parse(row[1]);
                    var argName   = row[2];
                    var dataType  = ServiceArgument.TypeFromString(row[3]);
                    var mandatory = false;

                    try
                    {
                        // Optional
                        mandatory = row[4].Equals("mandatory", StringComparison.CurrentCultureIgnoreCase);
                    }
                    catch (Exception)
                    {
                        // Ignore...
                    }

                    service.Args.Add(new ServiceArgument(pos, argName, dataType, mandatory));
                }

                // Read the responses
                for (int i = 0; i < numResponses; i++)
                {
                    var resp = 2 + i + numArgs;
                    var row  = rows[resp];

                    var pos      = int.Parse(row[1]);
                    var respName = row[2];
                    var dataType = ServiceArgument.TypeFromString(row[3]);

                    service.Returns.Add(new ServiceReturn(pos, respName, dataType));
                }

                return(response);
            }
            else if (request is ExecuteServiceRequest)
            {
                var fullRequest = (ExecuteServiceRequest)request;

                var numSegments  = int.Parse(rows[0][4]);
                var name         = rows[0][2];
                var numResponses = int.Parse(rows[0][4]);

                var returnedCall = new RemoteServiceReturn(name);

                for (int resp = 0; resp < numResponses; resp++)
                {
                    var row = rows[1 + resp];
                    Debug.Assert(row[0] == "RSP");

                    var pos      = int.Parse(row[1]);
                    var argName  = row[2];
                    var dataType = row[3];
                    var value    = row[4];

                    var serviceReturn = new ServiceReturn(pos, argName, ServiceArgument.TypeFromString(dataType), value);
                    returnedCall.Returns.Add(serviceReturn);
                }

                var response = new ExecuteServiceResponse(returnedCall);
                return(response);
            }
            else
            {
                throw new KeyNotFoundException("Failure to create response for request of type: " + request.GetType().Name);
            }
        }