private bool Test_AVTransport_LastChange() { bool RetVal = true; AVT.OnStateVariable_LastChange += new CpAVTransport.StateVariableModifiedHandler_LastChange(AVT_LastChangeSink); Ev.Reset(); AVT._subscribe(150); Ev.WaitOne(30000, false); string LC = AVT.LastChange; if (LC.Substring(0, 1) != "<") { LC = UPnPStringFormatter.UnEscapeString(LC); } StringReader SR = new StringReader(LC); XmlTextReader XMLDoc = new XmlTextReader(SR); try { XMLDoc.Read(); XMLDoc.MoveToContent(); if (XMLDoc.NamespaceURI != "urn:schemas-upnp-org:metadata-1-0/AVT/") { //Invalid Namespace RetVal = false; AddEvent(LogImportance.Critical, "Event Formatting", "LastChange event was not in the proper namespace"); } else { // OK AddEvent(LogImportance.Remark, "Event Formatting", "LastChange event appears OK"); } } catch (System.Xml.XmlException) { // Not a well-formed XML RetVal = false; AddEvent(LogImportance.Critical, "Event Formatting", "LastChange event was not a well formed XML"); } AVT.GetUPnPService().UnSubscribe(null); return(RetVal); }
protected void LastChangeSink(CpRenderingControl sender, string LC) { if (LC == "") { return; } if (LC.Substring(0, 1) != "<") { LC = UPnPStringFormatter.UnEscapeString(LC); } if (LC.Substring(0, 1) != "<") { LC = UPnPStringFormatter.UnEscapeString(LC); } /* * if(LC.StartsWith("<?")==true) * { * int dx = LC.IndexOf(">"); * LC = LC.Substring(0,dx+1) + "<MYROOT>" + LC.Substring(dx+1) + "</MYROOT>"; * } * else * { * LC = "<MYROOT>" + LC + "</MYROOT>"; * }*/ StringReader MyString = new StringReader(LC); XmlTextReader XMLDoc = new XmlTextReader(MyString); Hashtable T = new Hashtable(); int ID = -1; string VarName = ""; string VarValue = ""; string AttrName = ""; string AttrValue = ""; XMLDoc.Read(); XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while ((XMLDoc.LocalName != "Event") && (XMLDoc.EOF == false)) { // At Start, should be InstanceID if (XMLDoc.LocalName == "InstanceID") { XMLDoc.MoveToAttribute("val"); ID = int.Parse(XMLDoc.GetAttribute("val")); if (T.ContainsKey(ID) == false) { T[ID] = new Hashtable(); } XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while (XMLDoc.LocalName != "InstanceID") { VarName = XMLDoc.LocalName; VarValue = ""; AttrName = ""; AttrValue = ""; for (int a_idx = 0; a_idx < XMLDoc.AttributeCount; ++a_idx) { XMLDoc.MoveToAttribute(a_idx); if (XMLDoc.LocalName == "val") { VarValue = XMLDoc.GetAttribute(a_idx); } else { AttrName = XMLDoc.LocalName; AttrValue = XMLDoc.GetAttribute(a_idx); } } XMLDoc.MoveToContent(); if (AttrName == "") { ((Hashtable)T[ID])[VarName] = VarValue; } else { if (((Hashtable)T[ID]).ContainsKey(VarName) == false) { ((Hashtable)T[ID])[VarName] = new Hashtable(); } if (((Hashtable)((Hashtable)T[ID])[VarName]).ContainsKey(AttrName) == false) { ((Hashtable)((Hashtable)T[ID])[VarName])[AttrName] = new Hashtable(); } ((Hashtable)((Hashtable)((Hashtable)T[ID])[VarName])[AttrName])[AttrValue] = VarValue; } XMLDoc.Read(); XMLDoc.MoveToContent(); } } else { XMLDoc.Skip(); } XMLDoc.Read(); XMLDoc.MoveToContent(); } XMLDoc.Close(); IDictionaryEnumerator inEn = T.GetEnumerator(); IDictionaryEnumerator EvEn; Hashtable TT; while (inEn.MoveNext()) { if ((int)inEn.Key == InstanceID) { TT = (Hashtable)inEn.Value; EvEn = TT.GetEnumerator(); while (EvEn.MoveNext()) { switch ((string)EvEn.Key) { case "Mute": if (EvEn.Value.GetType().FullName == "System.String") { MuteByChannel["MASTER"] = (bool)UPnPService.CreateObjectInstance(typeof(bool), (string)EvEn.Value); } else { IDictionaryEnumerator E2 = ((Hashtable)EvEn.Value).GetEnumerator(); while (E2.MoveNext()) { IDictionaryEnumerator E3 = ((Hashtable)((Hashtable)E2.Value)).GetEnumerator(); while (E3.MoveNext()) { MuteByChannel[E3.Key.ToString()] = (bool)UPnPService.CreateObjectInstance(typeof(bool), E3.Value.ToString()); } } } if (OnMuteChanged != null) { OnMuteChanged(this); } break; case "Volume": if (EvEn.Value.GetType().FullName == "System.String") { VolumeByChannel["MASTER"] = UInt16.Parse((string)EvEn.Value); } else { IDictionaryEnumerator E2 = ((Hashtable)EvEn.Value).GetEnumerator(); while (E2.MoveNext()) { IDictionaryEnumerator E3 = ((Hashtable)((Hashtable)E2.Value)).GetEnumerator(); while (E3.MoveNext()) { VolumeByChannel[E3.Key.ToString()] = UInt16.Parse(E3.Value.ToString()); } } } //_Volume = UInt16.Parse((string)EvEn.Value); if (OnVolumeChanged != null) { OnVolumeChanged(this); } break; } } } } }
public object Merge(object current, object newobject) { if (current == null) { return(newobject); } string CurrentEvent = UPnPStringFormatter.UnEscapeString((string)current); if (CurrentEvent == "") { return(newobject); } string NewEvent = UPnPStringFormatter.UnEscapeString((string)newobject); Hashtable T = new Hashtable(); StringReader MyString = new StringReader(CurrentEvent); XmlTextReader XMLDoc = new XmlTextReader(MyString); int InstanceID = -1; string VarName = ""; string VarValue = ""; string AttrName = ""; string AttrValue = ""; XMLDoc.Read(); XMLDoc.MoveToContent(); if (XMLDoc.LocalName != "Event") { return(newobject); } XMLDoc.Read(); XMLDoc.MoveToContent(); while ((XMLDoc.LocalName != "Event") && (XMLDoc.EOF == false)) { // At Start, should be InstanceID if (XMLDoc.LocalName == "InstanceID") { XMLDoc.MoveToAttribute("val"); InstanceID = int.Parse(XMLDoc.GetAttribute("val")); if (T.ContainsKey(InstanceID) == false) { T[InstanceID] = new Hashtable(); } XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while (XMLDoc.LocalName != "InstanceID") { VarName = XMLDoc.LocalName; for (int a_idx = 0; a_idx < XMLDoc.AttributeCount; ++a_idx) { XMLDoc.MoveToAttribute(a_idx); if (XMLDoc.LocalName == "val") { //VarValue = XMLDoc.GetAttribute(a_idx); VarValue = UPnPStringFormatter.PartialEscapeString(XMLDoc.ReadInnerXml()); } else { AttrName = XMLDoc.LocalName; //AttrValue = XMLDoc.GetAttribute(a_idx); AttrValue = UPnPStringFormatter.PartialEscapeString(XMLDoc.ReadInnerXml()); } } XMLDoc.MoveToContent(); if (AttrName == "") { ((Hashtable)T[InstanceID])[VarName] = VarValue; } else { if (((Hashtable)T[InstanceID]).ContainsKey(VarName) == false) { ((Hashtable)T[InstanceID])[VarName] = new Hashtable(); } if (((Hashtable)((Hashtable)T[InstanceID])[VarName]).ContainsKey(AttrName) == false) { ((Hashtable)((Hashtable)T[InstanceID])[VarName])[AttrName] = new Hashtable(); } ((Hashtable)((Hashtable)((Hashtable)T[InstanceID])[VarName])[AttrName])[AttrValue] = VarValue; } XMLDoc.Read(); XMLDoc.MoveToContent(); } } else { XMLDoc.Skip(); } XMLDoc.Read(); XMLDoc.MoveToContent(); } XMLDoc.Close(); MyString = new StringReader(NewEvent); XMLDoc = new XmlTextReader(MyString); // Read New Events XMLDoc.Read(); XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while ((XMLDoc.LocalName != "Event") && (XMLDoc.EOF == false)) { // At Start, should be InstanceID if (XMLDoc.LocalName == "InstanceID") { XMLDoc.MoveToAttribute("val"); InstanceID = int.Parse(XMLDoc.GetAttribute("val")); if (T.ContainsKey(InstanceID) == false) { T[InstanceID] = new Hashtable(); } XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while (XMLDoc.LocalName != "InstanceID") { VarName = XMLDoc.LocalName; VarValue = ""; AttrName = ""; AttrValue = ""; for (int a_idx = 0; a_idx < XMLDoc.AttributeCount; ++a_idx) { XMLDoc.MoveToAttribute(a_idx); if (XMLDoc.LocalName == "val") { //VarValue = XMLDoc.GetAttribute(a_idx); VarValue = UPnPStringFormatter.PartialEscapeString(XMLDoc.ReadInnerXml()); } else { AttrName = XMLDoc.LocalName; //AttrValue = XMLDoc.GetAttribute(a_idx); AttrValue = UPnPStringFormatter.PartialEscapeString(XMLDoc.ReadInnerXml()); } } XMLDoc.MoveToContent(); if (AttrName == "") { ((Hashtable)T[InstanceID])[VarName] = VarValue; } else { if (((Hashtable)T[InstanceID]).ContainsKey(VarName) == false) { ((Hashtable)T[InstanceID])[VarName] = new Hashtable(); } if (((Hashtable)((Hashtable)T[InstanceID])[VarName]).ContainsKey(AttrName) == false) { ((Hashtable)((Hashtable)T[InstanceID])[VarName])[AttrName] = new Hashtable(); } ((Hashtable)((Hashtable)((Hashtable)T[InstanceID])[VarName])[AttrName])[AttrValue] = VarValue; } XMLDoc.Read(); XMLDoc.MoveToContent(); } } else { XMLDoc.Skip(); } XMLDoc.Read(); XMLDoc.MoveToContent(); } XMLDoc.Close(); // Rebuild Events IDictionaryEnumerator en = T.GetEnumerator(); StringBuilder Ev = new StringBuilder(); IDictionaryEnumerator en2; Ev.Append("<Event xmlns = \"urn:schemas-upnp-org:metadata-1-0/" + NS + "/\">\r\n"); while (en.MoveNext()) { VarValue = ""; VarName = ""; AttrName = ""; AttrValue = ""; Ev.Append(" <InstanceID val=\"" + en.Key.ToString() + "\">\r\n"); en2 = ((Hashtable)en.Value).GetEnumerator(); while (en2.MoveNext()) { if (en2.Value.GetType().FullName == "System.String") { Ev.Append(" <" + en2.Key.ToString() + " val=\"" + en2.Value.ToString() + "\"/>\r\n"); } else { IDictionaryEnumerator en3 = ((Hashtable)en2.Value).GetEnumerator(); while (en3.MoveNext()) { AttrName = en3.Key.ToString(); AttrValue = ""; IDictionaryEnumerator en4 = ((Hashtable)en3.Value).GetEnumerator(); while (en4.MoveNext()) { AttrValue = en4.Key.ToString(); VarValue = en4.Value.ToString(); Ev.Append(" <" + en2.Key.ToString() + " val=\"" + VarValue + "\" " + AttrName + "=\"" + AttrValue + "\"/>\r\n"); } } } } Ev.Append(" </InstanceID>\r\n"); } Ev.Append("</Event>"); return(UPnPStringFormatter.EscapeString(Ev.ToString())); }
protected void LastChangeSink(CpAVTransport sender, string LC) { if (LC == "") { return; } //LC = UPnPStringFormatter.UnEscapeString(LC); if (LC.Substring(0, 1) != "<") { LC = UPnPStringFormatter.UnEscapeString(LC); } if (LC.Substring(0, 1) != "<") { LC = UPnPStringFormatter.UnEscapeString(LC); } StringReader MyString = new StringReader(LC); XmlTextReader XMLDoc = new XmlTextReader(MyString); Hashtable T = new Hashtable(); int ID = -1; string VarName = ""; string VarValue = ""; string AttrName = ""; string AttrValue = ""; XMLDoc.Read(); XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while ((XMLDoc.LocalName != "Event") && (XMLDoc.EOF == false)) { // At Start, should be InstanceID if (XMLDoc.LocalName == "InstanceID") { XMLDoc.MoveToAttribute("val"); ID = int.Parse(XMLDoc.GetAttribute("val")); if (T.ContainsKey(ID) == false) { T[ID] = new Hashtable(); } XMLDoc.MoveToContent(); XMLDoc.Read(); XMLDoc.MoveToContent(); while (XMLDoc.LocalName != "InstanceID") { if (XMLDoc.IsStartElement() == true) { VarName = XMLDoc.LocalName; VarValue = ""; AttrName = ""; AttrValue = ""; for (int a_idx = 0; a_idx < XMLDoc.AttributeCount; ++a_idx) { XMLDoc.MoveToAttribute(a_idx); if (XMLDoc.LocalName == "val") { VarValue = UPnPStringFormatter.UnEscapeString(XMLDoc.GetAttribute(a_idx)); } else { AttrName = XMLDoc.LocalName; AttrValue = XMLDoc.GetAttribute(a_idx); } } XMLDoc.MoveToContent(); if (AttrName == "") { ((Hashtable)T[ID])[VarName] = VarValue; } else { if (((Hashtable)T[ID]).ContainsKey(VarName) == false) { ((Hashtable)T[ID])[VarName] = new Hashtable(); } if (((Hashtable)((Hashtable)T[ID])[VarName]).ContainsKey(AttrName) == false) { ((Hashtable)((Hashtable)T[ID])[VarName])[AttrName] = new Hashtable(); } ((Hashtable)((Hashtable)((Hashtable)T[ID])[VarName])[AttrName])[AttrValue] = VarValue; } } XMLDoc.Read(); XMLDoc.MoveToContent(); } } else { XMLDoc.Skip(); } XMLDoc.Read(); XMLDoc.MoveToContent(); } XMLDoc.Close(); IDictionaryEnumerator inEn = T.GetEnumerator(); IDictionaryEnumerator EvEn; Hashtable TT; string TempString; DText TempParser = new DText(); while (inEn.MoveNext()) { if (inEn.Key.ToString() == InstanceID) { TT = (Hashtable)inEn.Value; EvEn = TT.GetEnumerator(); while (EvEn.MoveNext()) { switch ((string)EvEn.Key) { case "AVTransportURI": _AVTransportURI = (string)EvEn.Value; if (OnAVTransportURIChanged != null) { OnAVTransportURIChanged(this); } break; case "TransportState": _PlayState = (string)EvEn.Value; if (OnPlayStateChanged != null) { OnPlayStateChanged(this); } break; case "CurrentTrackDuration": TempString = (string)EvEn.Value; TempParser.ATTRMARK = ":"; TempParser[0] = TempString; try { this._CurrentDuration = new TimeSpan(int.Parse(TempParser[1]), int.Parse(TempParser[2]), int.Parse(TempParser[3])); } catch (Exception) {} if (this.OnCurrentPositionChanged != null) { this.OnCurrentPositionChanged(this); } break; case "RelativeTimePosition": TempString = (string)EvEn.Value; TempParser.ATTRMARK = ":"; TempParser[0] = TempString; this._CurrentPosition = new TimeSpan(int.Parse(TempParser[1]), int.Parse(TempParser[2]), int.Parse(TempParser[3])); if (this.OnCurrentPositionChanged != null) { this.OnCurrentPositionChanged(this); } break; case "NumberOfTracks": try { _NumberOfTracks = UInt32.Parse((string)EvEn.Value); if (OnNumberOfTracksChanged != null) { OnNumberOfTracksChanged(this); } } catch (Exception) {} break; case "CurrentTrack": try { _CurrentTrack = UInt32.Parse((string)EvEn.Value); if (OnCurrentTrackChanged != null) { OnCurrentTrackChanged(this); } } catch (Exception) {} break; case "CurrentTrackURI": _TrackURI = (string)EvEn.Value; if (OnTrackURIChanged != null) { OnTrackURIChanged(this); } break; case "TransportStatus": _TransportStatus = (string)EvEn.Value; if (OnTransportStatusChanged != null) { OnTransportStatusChanged(this); } break; case "AVTransportURIMetaData": _AVTransportMetaData = (string)EvEn.Value; if (this.OnCurrentURIMetaDataChanged != null) { OnCurrentURIMetaDataChanged(this); } break; case "CurrentPlayMode": _CurrentPlayMode = (string)EvEn.Value; if (this.OnCurrentPlayModeChanged != null) { OnCurrentPlayModeChanged(this); } break; } } } } }