public UPnPInvokeException(string Method_Name, UPnPArgument[] Args, String msg, UPnPCustomException e)
     : base(msg)
 {
     MethodName = Method_Name;
     Arguments = Args;
     _Inner = e;
 }
 /// <summary>
 /// This is used to complete an AsyncRequest in an AsyncFashion.
 /// <para>
 /// You must either assign all the Argument values, or return an exception with "e"
 /// </para>
 /// </summary>
 /// <param name="id">ID</param>
 /// <param name="RetArg">Return Argument</param>
 /// <param name="OutArgs">Out Arguments</param>
 /// <param name="e">Exception</param>
 public void DelayedInvokeResponse(long id, object RetArg, UPnPArgument[] OutArgs, UPnPCustomException e)
 {
     UPnPDevice.InvokerInfoStruct iis = (UPnPDevice.InvokerInfoStruct)DelayedResponseTable[id];
     HTTPMessage resp = new HTTPMessage();
     if (e != null)
     {
         resp.StatusCode = 500;
         resp.StatusData = "Internal";
         resp.StringBuffer = ParentDevice.BuildErrorBody(e);
     }
     else
     {
         resp = ParentDevice.ParseInvokeResponse(iis.MethodName, iis.SOAPAction, this.ServiceURN, RetArg, OutArgs);
     }
     iis.WebSession.Send(resp);
     iis.WebSession.StartReading();
     lock (DelayedResponseTable)
     {
         DelayedResponseTable.Remove(id);
     }
 }
        private UPnPCustomException ParseErrorBody(String XML)
        {
            StringReader sr = new StringReader(XML);
            XmlTextReader XMLDoc = new XmlTextReader(sr);
            UPnPCustomException RetVal = null;

            int ec = 0;
            String ed = "";

            XMLDoc.Read();
            XMLDoc.MoveToContent();

            if (XMLDoc.LocalName == "Envelope")
            {
                XMLDoc.Read();
                XMLDoc.MoveToContent();
                while ((XMLDoc.LocalName != "Envelope") && (XMLDoc.EOF == false))
                {
                    switch (XMLDoc.LocalName)
                    {
                        case "Body":
                            XMLDoc.Read();
                            XMLDoc.MoveToContent();
                            while ((XMLDoc.LocalName != "Body") && (XMLDoc.EOF == false))
                            {
                                if (XMLDoc.LocalName == "Fault")
                                {
                                    XMLDoc.Read();
                                    XMLDoc.MoveToContent();
                                    while ((XMLDoc.LocalName != "Fault") && (XMLDoc.EOF == false))
                                    {
                                        switch (XMLDoc.LocalName)
                                        {
                                            case "detail":
                                                XMLDoc.Read();
                                                XMLDoc.MoveToContent();
                                                while ((XMLDoc.LocalName != "detail") && (XMLDoc.EOF == false))
                                                {
                                                    if (XMLDoc.LocalName == "UPnPError")
                                                    {
                                                        XMLDoc.Read();
                                                        XMLDoc.MoveToContent();
                                                        while ((XMLDoc.LocalName != "UPnPError") && (XMLDoc.EOF == false))
                                                        {
                                                            switch (XMLDoc.LocalName)
                                                            {
                                                                case "errorCode":
                                                                    ec = int.Parse(XMLDoc.ReadString());
                                                                    break;
                                                                case "errorDescription":
                                                                    ed = XMLDoc.ReadString();
                                                                    break;
                                                            }
                                                            XMLDoc.Read();
                                                            XMLDoc.MoveToContent();
                                                        }

                                                        RetVal = new UPnPCustomException(ec, ed);
                                                    }
                                                    else
                                                    {
                                                        XMLDoc.Skip();
                                                    }
                                                    XMLDoc.Read();
                                                    XMLDoc.MoveToContent();
                                                }
                                                break;
                                            default:
                                                XMLDoc.Skip();
                                                break;
                                        }
                                        XMLDoc.Read();
                                        XMLDoc.MoveToContent();
                                    }

                                }
                                else
                                {
                                    XMLDoc.Skip();
                                }
                                XMLDoc.Read();
                                XMLDoc.MoveToContent();
                            }
                            break;
                        default:
                            XMLDoc.Skip();
                            break;
                    }
                    XMLDoc.Read();
                    XMLDoc.MoveToContent();
                }
            }
            return (RetVal);
        }
        internal string BuildErrorBody(UPnPCustomException e)
        {
            System.Text.StringBuilder s = new System.Text.StringBuilder();

            s.Append("<s:Envelope\r\n");
            s.Append("   xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"\r\n");
            s.Append("   s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n");
            s.Append("   <s:Body>\r\n");
            s.Append("      <s:Fault>\r\n");
            s.Append("         <faultcode>s:Client</faultcode>\r\n");
            s.Append("         <faultstring>UPnPError</faultstring>\r\n");
            s.Append("            <detail>\r\n");
            s.Append("               <UPnPError xmlns=\"urn:schemas-upnp-org:control-1-0\">\r\n");
            s.Append("                  <errorCode>" + e.ErrorCode.ToString() + "</errorCode>\r\n");
            s.Append("                  <errorDescription>" + UPnPStringFormatter.EscapeString(e.ErrorDescription) + "</errorDescription>\r\n");
            s.Append("               </UPnPError>\r\n");
            s.Append("            </detail>\r\n");
            s.Append("      </s:Fault>\r\n");
            s.Append("   </s:Body>\r\n");
            s.Append("</s:Envelope>");
            return (s.ToString());
        }