コード例 #1
0
        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);
            }
        }
コード例 #2
0
 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();
 }
コード例 #3
0
        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;
        }
コード例 #4
0
        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;
        }