//--------------------------------------------------------------------- private void ProcessAsyncInvokeList() { for (ms_AsyncInvokeList.Begin(); ms_AsyncInvokeList.Next();) { string name = ms_AsyncInvokeList.Key; UIWindow win = GetWindow(name); if (win == null) { continue; } List <AsyncInvokeInfo> infoList = ms_AsyncInvokeList.Value; for (int index = 0; index < infoList.Count; ++index) { AsyncInvokeInfo info = infoList[index]; MemberInfo memberInfo = info.memberInfo; object[] paramList = info.paramList; try { if (memberInfo.MemberType == MemberTypes.Property) { PropertyInfo propertyInfo = memberInfo as PropertyInfo; propertyInfo.SetValue(win, paramList[0], null); } else { MethodInfo methodInfo = memberInfo as MethodInfo; methodInfo.Invoke(win, paramList); } } catch (System.Exception ex) { LOG.Erro("Async invoke failed: " + ex.Message); } } infoList.Clear(); } }
/// <summary> /// Invokes a method on this service with specific callbacks /// </summary> /// <param name="MethodName">Name of Method</param> /// <param name="InVarArr">Array of UPnPArguments</param> /// <param name="InvokeCallback">Callback for Success</param> /// <param name="ErrorCallback">Callback for Failed</param> /// <returns>Unique Handle identifier</returns> public void InvokeAsync(String MethodName, UPnPArgument[] InVarArr, object Tag, UPnPService.UPnPServiceInvokeHandler InvokeCallback, UPnPService.UPnPServiceInvokeErrorHandler ErrorCallback) { HTTPMessage request = new HTTPMessage(); if (InVarArr == null) { InVarArr = new UPnPArgument[0]; } UPnPAction action = (UPnPAction)RemoteMethods[MethodName]; if (action == null) { throw (new UPnPInvokeException(MethodName, InVarArr, MethodName + " is not currently defined in this object")); } else { action.ValidateArgs(InVarArr); } String WebIP; String sName; int WebPort; SSDP.ParseURL(__controlurl, out WebIP, out WebPort, out sName); IPEndPoint dest = new IPEndPoint(IPAddress.Parse(WebIP), WebPort); request.Directive = "POST"; request.DirectiveObj = sName; request.AddTag("Host", WebIP + ":" + WebPort); request.AddTag("Content-Type", "text/xml; charset=\"utf-8\""); request.AddTag("SoapAction", "\"" + ServiceURN + "#" + MethodName + "\""); MemoryStream mstream = new MemoryStream(4096); XmlTextWriter W = new XmlTextWriter(mstream, System.Text.Encoding.UTF8); W.Formatting = Formatting.Indented; W.Indentation = 3; W.WriteStartDocument(); String S = "http://schemas.xmlsoap.org/soap/envelope/"; W.WriteStartElement("s", "Envelope", S); W.WriteAttributeString("s", "encodingStyle", S, "http://schemas.xmlsoap.org/soap/encoding/"); W.WriteStartElement("s", "Body", S); W.WriteStartElement("u", MethodName, ServiceURN); for (int ID = 0; ID < InVarArr.Length; ++ID) { if (action.GetArg(InVarArr[ID].Name).Direction == "in") { W.WriteElementString(InVarArr[ID].Name, UPnPService.SerializeObjectInstance(InVarArr[ID].DataValue)); } } W.WriteEndElement(); W.WriteEndElement(); W.WriteEndElement(); W.WriteEndDocument(); W.Flush(); byte[] wbuf = new Byte[mstream.Length - 3]; mstream.Seek(3, SeekOrigin.Begin); mstream.Read(wbuf, 0, wbuf.Length); W.Close(); request.BodyBuffer = wbuf; AsyncInvokeInfo state = new AsyncInvokeInfo(); state.Args = InVarArr; state.MethodName = MethodName; state.Packet = request; state.Tag = Tag; state.InvokeCB = InvokeCallback; state.ErrorCB = ErrorCallback; InvocationPipeline.PipelineRequest(dest, request, state); }