/// <summary> /// Reads Xml from given stream and retrieves incoming messages or delivery reports /// within the XML document. The Messages or DeliveryReport are stored in the IncomingMessages /// or DeliveryReports collection. /// </summary> /// <param name="inStream"></param> /// <param name="outStream"></param> public void HandleIncomingMessages(Stream inStream, Stream outStream) { ReceivedMessages.Clear(); DeliveryReports.Clear(); XmlDocument docRequest = new XmlDocument(); XmlLocalResolver res = new XmlLocalResolver(); XmlEmbeddedResourceResolver res2 = new XmlEmbeddedResourceResolver(); docRequest.XmlResolver = res2; docRequest.Load(inStream); XmlDocument docResponse = CheckRequest(docRequest); string sResponse = "<?xml version=\"1.0\"?>\n" + docResponse.OuterXml; StreamWriter sw = new StreamWriter(outStream, System.Text.Encoding.GetEncoding("ISO-8859-1")); sw.Write(sResponse); sw.Flush(); outStream.Flush(); }
/// <summary> /// Check request for IncomingMessages/DeliveryReports from Gateway, /// update Message collection or DeliveryReport collection /// </summary> /// <param name="doc">XmlDocument containing request from gateway</param> private XmlDocument CheckRequest(XmlDocument doc) { XmlDocument docResponse = new XmlDocument(); XmlNode nodMsgList = doc.SelectSingleNode("MSGLST"); if (nodMsgList != null) { // Loop through msg list foreach (XmlNode n in nodMsgList.ChildNodes) { if (n.NodeType == XmlNodeType.Element && n.Name.Equals("MSG")) { string id = GetNodeValue(n, "ID"); int i = int.Parse(id); // is this delivery report or incoming msg? string state = GetNodeValue(n, "STATE"); if (state == null) { // Incoming Message ReceivedMessages.Add(i, new Message()); ReceivedMessages[i].Text = GetNodeValue(n, "TEXT"); ReceivedMessages[i].SenderNumber = GetNodeValue(n, "SND"); ReceivedMessages[i].ReceiverNumber = GetNodeValue(n, "RCV"); ReceivedMessages[i].Network = GetNodeValue(n, "NET"); ReceivedMessages[i]._Address = GetNodeValue(n, "ADDRESS"); // Check if position data is included XmlNode nodPosition = n.SelectSingleNode("POSITION"); if (nodPosition != null) { // Get position request results ReceivedMessages[i]._Position = new PositionResult(); switch (GetNodeValue(nodPosition, "STATUS")) { case "OK": ReceivedMessages[i]._Position._Status = PositionRequestStatus.Ok; XmlNode nodPosData = nodPosition.SelectSingleNode("POS"); if (nodPosData != null) { ReceivedMessages[i]._Position._PositionData = new GSMPosition(); ReceivedMessages[i]._Position._PositionData._Latitude = GetNodeValue(nodPosData, "LATITUDE"); ReceivedMessages[i]._Position._PositionData._Longitude = GetNodeValue(nodPosData, "LONGITUDE"); ReceivedMessages[i]._Position._PositionData._City = GetNodeValue(nodPosData, "CITY"); ReceivedMessages[i]._Position._PositionData._Council = GetNodeValue(nodPosData, "COUNCIL"); ReceivedMessages[i]._Position._PositionData._CouncilNumber = GetNodeValue(nodPosData, "COUNCILNUMBER", "").Equals("") ? -1 : int.Parse(GetNodeValue(nodPosData, "COUNCILNUMBER")); ReceivedMessages[i]._Position._PositionData._County = GetNodeValue(nodPosData, "COUNTY"); ReceivedMessages[i]._Position._PositionData._Place = GetNodeValue(nodPosData, "PLACE"); ReceivedMessages[i]._Position._PositionData._Radius = GetNodeValue(nodPosData, "RADIUS", "").Equals("") ? -1 : int.Parse(GetNodeValue(nodPosData, "RADIUS")); ReceivedMessages[i]._Position._PositionData._SubPlace = GetNodeValue(nodPosData, "SUBPLACE"); ReceivedMessages[i]._Position._PositionData._ZipCode = GetNodeValue(nodPosData, "ZIPCODE", "").Equals("") ? -1 : int.Parse(GetNodeValue(nodPosData, "ZIPCODE")); } break; default: ReceivedMessages[i]._Position._Status = PositionRequestStatus.Failed; ReceivedMessages[i]._Position._FailedReason = GetNodeValue(nodPosition, "INFO"); break; } } } else { DeliveryReports.Add(i, new DeliveryReport()); DeliveryReports[i].State = GetNodeValue(n, "STATE"); DeliveryReports[i].Reference = GetNodeValue(n, "REF"); DeliveryReports[i].ReceiverNumber = GetNodeValue(n, "RCV"); string sDeliveryTime = GetNodeValue(n, "DELIVERYTIME"); if (sDeliveryTime != null && sDeliveryTime.Length > 0) { DeliveryReports[i].DeliveredDate = Convert.ToDateTime(sDeliveryTime); } } } } // Build Response XmlElement elmMsgList = docResponse.CreateElement("MSGLST"); foreach (int i in ReceivedMessages.Keys) { XmlElement elmMsg = docResponse.CreateElement("MSG"); elmMsg.AppendChild(CreateElement(docResponse, "ID", i.ToString())); elmMsg.AppendChild(CreateElement(docResponse, "STATUS", "OK")); elmMsgList.AppendChild(elmMsg); } foreach (int i in DeliveryReports.Keys) { XmlElement elmMsg = docResponse.CreateElement("MSG"); elmMsg.AppendChild(CreateElement(docResponse, "ID", i.ToString())); elmMsg.AppendChild(CreateElement(docResponse, "STATUS", "OK")); elmMsgList.AppendChild(elmMsg); } docResponse.AppendChild(elmMsgList); } return(docResponse); }