private void HandleContextCore(HttpListenerContext context) { XmlReader reader = XmlReader.Create(context.Request.InputStream); reader.ReadToFollowing("Body", Protocol.SoapEnvelopeSchema); while (Helper.ReadToNextElement(reader)) { if (!service.Actions.ContainsKey(reader.LocalName)) { throw UpnpControlException.InvalidAction(); } ServiceAction action = service.Actions[reader.LocalName]; BriefAction(reader.ReadSubtree(), action); try { action.Execute(); } catch (UpnpControlException) { throw; } catch (ArgumentOutOfRangeException e) { throw UpnpControlException.ArgumentValueOutOfRange(e.Message); } catch (ArgumentException e) { throw UpnpControlException.ArgumentValueInvalid(e.Message); } catch (NotImplementedException e) { throw UpnpControlException.OptionalActionNotImplimented(e.Message); } catch (Exception e) { throw UpnpControlException.ActionFailed(e.Message); } DebriefAction(context, action); } }
private void BriefAction(XmlReader reader, ServiceAction action) { reader.Read(); foreach (Argument argument in action.Arguments.Values) { argument.Value = argument.RelatedStateVariable.DefaultValue; } while (Helper.ReadToNextElement(reader)) { if (!action.Arguments.ContainsKey(reader.Name)) { throw UpnpControlException.InvalidArgs(); } Argument argument = action.Arguments[reader.Name]; if (argument.RelatedStateVariable.DataType.IsEnum) { try { argument.Value = Enum.Parse(argument.RelatedStateVariable.DataType, reader.ReadString()); } catch { throw UpnpControlException.ArgumentValueOutOfRange(); } } else { try { argument.Value = Convert.ChangeType(reader.ReadString(), argument.RelatedStateVariable.DataType); } catch { throw UpnpControlException.InvalidArgs(); } // TODO handle min, max, and step } } reader.Close(); }
private void HandleFault(HttpListenerContext context, UpnpControlException e) { context.Response.StatusCode = 500; context.Response.StatusDescription = "Internal Server Error"; context.Response.ContentType = @"text/xml; charset=""utf-8"""; context.Response.Headers.Add("Date", DateTime.Now.ToString("r")); context.Response.Headers.Add("EXT:"); context.Response.AddHeader("SERVER", ServerString); Stream stream = context.Response.OutputStream; XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; XmlWriter writer = XmlWriter.Create(stream, settings); Helper.WriteStartSoapBody(writer); writer.WriteStartElement("Fault", Protocol.SoapEnvelopeSchema); writer.WriteStartElement("faultcode"); writer.WriteValue(String.Format("{0}:Client", writer.LookupPrefix(Protocol.SoapEnvelopeSchema))); writer.WriteEndElement(); writer.WriteStartElement("faultstring"); writer.WriteValue("UPnPError"); writer.WriteEndElement(); writer.WriteStartElement("detail"); writer.WriteStartElement("UPnPError", Protocol.ControlUrn); writer.WriteStartElement("errorCode"); writer.WriteValue(e.Code); writer.WriteEndElement(); writer.WriteStartElement("errorDescription"); writer.WriteValue(e.Message); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); Helper.WriteEndSoapBody(writer); writer.Flush(); context.Response.ContentLength64 = stream.Length; }
private void HandleFault(HttpListenerContext context, UpnpControlException e) { context.Response.StatusCode = 500; context.Response.StatusDescription = "Internal Server Error"; context.Response.ContentType = @"text/xml; charset=""utf-8"""; context.Response.Headers.Add ("Date", DateTime.Now.ToString ("r")); context.Response.Headers.Add ("EXT:"); context.Response.AddHeader ("SERVER", ServerString); Stream stream = context.Response.OutputStream; XmlWriterSettings settings = new XmlWriterSettings (); settings.Encoding = Encoding.UTF8; XmlWriter writer = XmlWriter.Create (stream, settings); Helper.WriteStartSoapBody (writer); writer.WriteStartElement ("Fault", Protocol.SoapEnvelopeSchema); writer.WriteStartElement ("faultcode"); writer.WriteValue (String.Format ("{0}:Client", writer.LookupPrefix (Protocol.SoapEnvelopeSchema))); writer.WriteEndElement (); writer.WriteStartElement ("faultstring"); writer.WriteValue ("UPnPError"); writer.WriteEndElement (); writer.WriteStartElement ("detail"); writer.WriteStartElement ("UPnPError", Protocol.ControlUrn); writer.WriteStartElement ("errorCode"); writer.WriteValue (e.Code); writer.WriteEndElement (); writer.WriteStartElement ("errorDescription"); writer.WriteValue (e.Message); writer.WriteEndElement (); writer.WriteEndElement (); writer.WriteEndElement (); writer.WriteEndElement (); writer.WriteEndElement (); Helper.WriteEndSoapBody (writer); writer.Flush (); context.Response.ContentLength64 = stream.Length; }