/// <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); }
/// <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); }
/// <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); } }
/// <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); }
/// <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); } }