public static string GetURNPrefix(string urn) { int len; DText p = new DText(); p.ATTRMARK = ":"; p[0] = urn; len = p[p.DCOUNT()].Length; return(urn.Substring(0, urn.Length - len)); }
public static string GetURNPrefix(string urn) { int len; DText p = new DText(); p.ATTRMARK = ":"; p[0] = urn; len = p[p.DCOUNT()].Length; return(urn.Substring(0, urn.Length - len)); }
private void OnReceiveSink2(byte[] buffer, IPEndPoint remote, IPEndPoint local) { HTTPMessage msg; try { msg = HTTPMessage.ParseByteArray(buffer, 0, buffer.Length); } catch (Exception ex) { OpenSource.Utilities.EventLogger.Log(ex); msg = new HTTPMessage(); msg.Directive = "---"; msg.DirectiveObj = "---"; msg.BodyBuffer = buffer; } msg.LocalEndPoint = local; msg.RemoteEndPoint = remote; HandleSniffer(remote, local, msg); DText parser = new DText(); String Location = msg.GetTag("Location"); int MaxAge = 0; String ma = msg.GetTag("Cache-Control").Trim(); if (ma != "") { parser.ATTRMARK = ","; parser.MULTMARK = "="; parser[0] = ma; for (int i = 1; i <= parser.DCOUNT(); ++i) { if (parser[i, 1].Trim().ToUpper() == "MAX-AGE") { MaxAge = int.Parse(parser[i, 2].Trim()); break; } } } ma = msg.GetTag("USN"); String USN = ma.Substring(ma.IndexOf(":") + 1); String ST = msg.GetTag("ST"); if (USN.IndexOf("::") != -1) { USN = USN.Substring(0, USN.IndexOf("::")); } OpenSource.Utilities.EventLogger.Log(this, System.Diagnostics.EventLogEntryType.SuccessAudit, msg.RemoteEndPoint.ToString()); if (OnSearch != null) { OnSearch(msg.RemoteEndPoint, msg.LocalEndPoint, new Uri(Location), USN, ST, MaxAge); } }
public static MediaItem PopulateMetaData(MediaResource R, FileInfo F) { MediaItem RetVal; MediaBuilder.item Item = null; DText parser = new DText(); parser.ATTRMARK = "-"; parser.MULTMARK = "."; switch(F.Extension.ToUpper()) { case ".MP3": Item = ParseMP3_V1(F); if(Item==null) { parser[0] = F.Name; if(parser.DCOUNT()==2) { Item = new MediaBuilder.musicTrack(parser[2,1].Trim()); Item.creator = parser[1].Trim(); ((MediaBuilder.musicTrack)Item).artist = new PersonWithRole[1]{new PersonWithRole()}; ((MediaBuilder.musicTrack)Item).artist[0].Name = Item.creator; ((MediaBuilder.musicTrack)Item).artist[0].Role = null; } } break; } if(Item!=null) { RetVal = MediaBuilder.CreateItem(Item); RetVal.AddResource(R); return(RetVal); } else { // Create a Generic Item string fname = F.Name; int fnameidx = fname.IndexOf("."); if(fnameidx!=-1) fname=fname.Substring(0,fnameidx); MediaBuilder.item genericItem = new MediaBuilder.item(fname); RetVal = MediaBuilder.CreateItem(genericItem); RetVal.AddResource(R); return(RetVal); } }
void SSniffer_OnPacket(object sender, string Packet, IPEndPoint Local, IPEndPoint From) { //System.Console.WriteLine(Local.ToString() + " / " + From.ToString()); //if (From.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) return; //if (From.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) return; //Console.WriteLine(Packet); DText p = new DText(); UTF8Encoding U = new UTF8Encoding(); string PType = "Unknown"; int i = Packet.IndexOf(" "); if (i > 0) PType = Packet.Substring(0, i); string NT = "Unknown"; string USN=""; string UUID=""; string Location = ""; if (PType == "NOTIFY") { int pos1 = Packet.IndexOf("\r\nNT:"); if (pos1 == -1) pos1 = Packet.IndexOf("\r\nnt:"); if (pos1 > 0) { int pos2 = Packet.IndexOf("\r\n", pos1 + 5); NT = Packet.Substring(pos1 + 5, pos2 - (pos1 + 5)); } NT = NT.Trim(); USN = ""; pos1 = Packet.IndexOf("\r\nUSN:"); if (pos1 == -1) pos1 = Packet.IndexOf("\r\nusn:"); if (pos1 > 0) { int pos2 = Packet.IndexOf("\r\n", pos1 + 6); USN = Packet.Substring(pos1 + 6, pos2 - (pos1 + 6)); } USN = USN.Trim(); int UsnEndPos = USN.IndexOf("::"); if (USN.StartsWith("uuid:") == true && UsnEndPos != -1) { UUID = USN.Substring(5, UsnEndPos - 5); } } if (PType == "HTTP/1.1") { int pos1 = Packet.IndexOf("\r\nST:"); if (pos1 == -1) pos1 = Packet.IndexOf("\r\nst:"); if (pos1 > 0) { int pos2 = Packet.IndexOf("\r\n", pos1 + 5); NT = Packet.Substring(pos1 + 5, pos2 - (pos1 + 5)); } NT = NT.Trim(); USN = ""; pos1 = Packet.IndexOf("\r\nUSN:"); if (pos1 == -1) pos1 = Packet.IndexOf("\r\nusn:"); if (pos1 > 0) { int pos2 = Packet.IndexOf("\r\n", pos1 + 6); USN = Packet.Substring(pos1 + 6, pos2 - (pos1 + 6)); } USN = USN.Trim(); string packetLower = Packet.ToLowerInvariant(); Location = ""; pos1 = packetLower.IndexOf("\r\nlocation:"); if (pos1 > 0) { int pos2 = Packet.IndexOf("\r\n", pos1 + 11); Location = Packet.Substring(pos1 + 11, pos2 - (pos1 + 11)); } Location = Location.Trim(); int UsnEndPos = USN.IndexOf("::"); if (USN.StartsWith("uuid:") == true && UsnEndPos != -1) { UUID = USN.Substring(5, UsnEndPos - 5); } } string FromHostName = From.Address.ToString(); try { FromHostName = System.Net.Dns.Resolve(From.Address.ToString()).HostName; } catch (Exception) { } if (OnUPnPDeviceFound != null) OnUPnPDeviceFound(sender, Packet, Local, From, PType, NT, USN, UUID, Location, FromHostName); }
private void ProcessPacket(HTTPMessage msg, IPEndPoint src, IPEndPoint local) { if (OnSniffPacket != null) { OnSniffPacket(src, null, msg); } DText parser = new DText(); parser.ATTRMARK = "::"; bool Alive = false; String UDN = msg.GetTag("USN"); parser[0] = UDN; String USN = parser[1]; USN = USN.Substring(USN.IndexOf(":") + 1); String ST = parser[2]; int MaxAge = 0; String NTS = msg.GetTag("NTS").ToUpper(); if (NTS == "SSDP:ALIVE") { Alive = true; String ma = msg.GetTag("Cache-Control").Trim(); if (ma != "") { parser.ATTRMARK = ","; parser.MULTMARK = "="; parser[0] = ma; for (int i = 1; i <= parser.DCOUNT(); ++i) { if (parser[i, 1].Trim().ToUpper() == "MAX-AGE") { MaxAge = int.Parse(parser[i, 2].Trim()); break; } } } } if (msg.Directive == "NOTIFY" && OnNotify != null) { Uri locuri = null; string location = msg.GetTag("Location"); if (location != null && location.Length > 0) { try { locuri = new Uri(location); } catch (Exception ex) { OpenSource.Utilities.EventLogger.Log(ex); } } OnNotify(src, msg.LocalEndPoint, locuri, Alive, USN, ST, MaxAge, msg); } else if (msg.Directive == "M-SEARCH" && OnSearch != null) { if (ValidateSearchPacket(msg) == false) { return; } int MaxTimer = int.Parse(msg.GetTag("MX")); SearchStruct SearchData = new SearchStruct(); SearchData.ST = msg.GetTag("ST"); SearchData.Source = src; SearchData.Local = local; SearchTimer.Add(SearchData, RandomGenerator.Next(0, MaxTimer)); } }
private void OnReceiveSink2(byte[] buffer, IPEndPoint remote, IPEndPoint local) { HTTPMessage msg; try { msg = HTTPMessage.ParseByteArray(buffer, 0, buffer.Length); } catch (Exception ex) { OpenSource.Utilities.EventLogger.Log(ex); msg = new HTTPMessage(); msg.Directive = "---"; msg.DirectiveObj = "---"; msg.BodyBuffer = buffer; } msg.LocalEndPoint = local; msg.RemoteEndPoint = remote; DText parser = new DText(); String Location = msg.GetTag("Location"); int MaxAge = 0; String ma = msg.GetTag("Cache-Control").Trim(); if (ma != "") { parser.ATTRMARK = ","; parser.MULTMARK = "="; parser[0] = ma; for (int i = 1; i <= parser.DCOUNT(); ++i) { if (parser[i, 1].Trim().ToUpper() == "MAX-AGE") { MaxAge = int.Parse(parser[i, 2].Trim()); break; } } } ma = msg.GetTag("USN"); String USN = ma.Substring(ma.IndexOf(":") + 1); String ST = msg.GetTag("ST"); if (USN.IndexOf("::") != -1) USN = USN.Substring(0, USN.IndexOf("::")); OpenSource.Utilities.EventLogger.Log(this, System.Diagnostics.EventLogEntryType.SuccessAudit, msg.RemoteEndPoint.ToString()); if (OnSearch != null) OnSearch(msg.RemoteEndPoint, msg.LocalEndPoint, new Uri(Location), USN, ST, MaxAge); }
private void ParseStateVarXml(String evented, String multicasted, XmlTextReader XMLDoc) { // if (XML=="") // { // return; // } string ComplexType = ""; string ComplexTypeNS = ""; UPnPComplexType CT = null; DText P = new DText(); P.ATTRMARK = ":"; string minval = null; string maxval = null; string stepval = null; bool HasDef = false; string name = ""; string DataType = ""; string DefaultValue = null; ArrayList allowedValueList = new ArrayList(); string LocalName = ""; string lname2 = ""; // StringReader MyString = new StringReader(XML); // XmlTextReader XMLDoc = new XmlTextReader(MyString); // XMLDoc.Read(); // XMLDoc.MoveToContent(); bool done = false; while (!done && XMLDoc.Read()) { switch (XMLDoc.NodeType) { case XmlNodeType.Element: LocalName = XMLDoc.LocalName; switch (XMLDoc.LocalName) { case "dataType": if (XMLDoc.HasAttributes) { for (int i = 0; i < XMLDoc.AttributeCount; i++) { XMLDoc.MoveToAttribute(i); if (XMLDoc.LocalName == "type") { P[0] = XMLDoc.Value; if (P.DCOUNT() == 1) { ComplexType = P[1]; } else { ComplexType = P[2]; ComplexTypeNS = P[1]; } CT = (UPnPComplexType)ComplexTypeTable[ComplexType + ":" + XMLDoc.LookupNamespace(ComplexTypeNS)]; } } } break; case "allowedValueList": bool done2 = false; while (!done2 && XMLDoc.Read()) { switch (XMLDoc.NodeType) { case XmlNodeType.Element: lname2 = XMLDoc.LocalName; break; case XmlNodeType.EndElement: if (XMLDoc.LocalName == "allowedValueList") { done2 = true; } break; case XmlNodeType.Text: if (lname2 == "allowedValue") { allowedValueList.Add(XMLDoc.Value); } break; } } break; case "allowedValueRange": bool done3 = false; while (!done3 && XMLDoc.Read()) { switch (XMLDoc.NodeType) { case XmlNodeType.Element: lname2 = XMLDoc.LocalName; break; case XmlNodeType.EndElement: if (XMLDoc.LocalName == "allowedValueRange") { done3 = true; } break; case XmlNodeType.Text: switch (lname2) { case "minimum": minval = XMLDoc.Value; break; case "maximum": maxval = XMLDoc.Value; break; case "step": stepval = XMLDoc.Value; break; } break; } } break; } break; case XmlNodeType.EndElement: if (XMLDoc.LocalName == "stateVariable") { done = true; } break; case XmlNodeType.Text: switch (LocalName) { case "name": name = XMLDoc.Value.Trim(); break; case "dataType": DataType = XMLDoc.Value.Trim(); break; case "defaultValue": DefaultValue = XMLDoc.Value; HasDef = true; break; } break; } } UPnPStateVariable var; if (CT == null) { var = new UPnPStateVariable(name); } else { var = new UPnPStateVariable(name, CT); } var.ParentService = this; if (evented == "yes") { var.SendEvent = true; } if (multicasted == "yes") { var.MulticastEvent = true; } var.VarType = DataType; if (allowedValueList.Count > 0) { var.AllowedStringValues = (string[])allowedValueList.ToArray(typeof(string)); } if (HasDef) { var.DefaultValue = UPnPService.CreateObjectInstance(var.GetNetType(), DefaultValue); } if ((minval != null) && (maxval != null)) { Object stepobj = null; if (stepval != null) { try { stepobj = UPnPService.CreateObjectInstance(var.GetNetType(), stepval); } catch (Exception) { stepobj = null; } } object MIN; object MAX; try { MIN = UPnPService.CreateObjectInstance(var.GetNetType(), minval); } catch (Exception) { FieldInfo mi = var.GetNetType().GetField("MinValue"); MIN = mi.GetValue(null); } try { MAX = UPnPService.CreateObjectInstance(var.GetNetType(), maxval); } catch (Exception) { FieldInfo mi = var.GetNetType().GetField("MaxValue"); MAX = mi.GetValue(null); } var.SetRange(MIN, MAX, stepobj); } //StateVariables.Add(name,var); StateVariables[name] = var; // TempPatch Only /* IDictionaryEnumerator en = RemoteMethods.GetEnumerator(); UPnPAction a; while(en.MoveNext()) { a = (UPnPAction)en.Value; for(int x =0;x<a.ArgumentList.Length;++x) { if (a.ArgumentList[x].RelatedStateVar.Name == name) { a.ArgumentList[x].RelatedStateVar.VarType = DataType; a.ArgumentList[x].RelatedStateVar.AllowedStringValues = var.AllowedStringValues; a.ArgumentList[x].RelatedStateVar.DefaultValue = DefaultValue; } } }*/ }
internal void SetVersion(string v) { DText p = new DText(); if (v.IndexOf("-") == -1) { p.ATTRMARK = "."; } else { p.ATTRMARK = "-"; } p[0] = v; string mj = p[1]; string mn = p[2]; if (mj == "") { this.Major = 0; } else { this.Major = int.Parse(mj); } if (mn == "") { this.Minor = 0; } else { this.Minor = int.Parse(mn); } }
/// <summary> /// Parses a Byte Array at a specific location, and builds a Packet. /// </summary> /// <param name="buffer">The Array of Bytes</param> /// <param name="indx">The Start Index</param> /// <param name="count">The number of Bytes to process</param> /// <returns></returns> static public HTTPMessage ParseByteArray(byte[] buffer, int indx, int count) { HTTPMessage TheMessage = new HTTPMessage(); UTF8Encoding UTF8 = new UTF8Encoding(); String TempData = UTF8.GetString(buffer, indx, count); DText parser = new DText(); String TempString; int idx = TempData.IndexOf("\r\n\r\n"); if (idx < 0) { return(null); } TempData = TempData.Substring(0, idx); parser.ATTRMARK = "\r\n"; parser.MULTMARK = ":"; parser[0] = TempData; string CurrentLine = parser[1]; DText HdrParser = new DText(); HdrParser.ATTRMARK = " "; HdrParser.MULTMARK = "/"; HdrParser[0] = CurrentLine; if (CurrentLine.ToUpper().StartsWith("HTTP/") == true) { TheMessage.ResponseCode = int.Parse(HdrParser[2]); int s1 = CurrentLine.IndexOf(" "); s1 = CurrentLine.IndexOf(" ", s1 + 1); TheMessage.ResponseData = HTTPMessage.UnEscapeString(CurrentLine.Substring(s1)); try { TheMessage.Version = HdrParser[1, 2]; } catch (Exception ex) { OpenSource.Utilities.EventLogger.Log(ex); TheMessage.Version = "0.9"; } } else { TheMessage.Directive = HdrParser[1]; TempString = CurrentLine.Substring(CurrentLine.LastIndexOf(" ") + 1); if (TempString.ToUpper().StartsWith("HTTP/") == false) { TheMessage.Version = "0.9"; TheMessage.DirectiveObj = HTTPMessage.UnEscapeString(TempString); } else { TheMessage.Version = TempString.Substring(TempString.IndexOf("/") + 1); int fs = CurrentLine.IndexOf(" ") + 1; TheMessage.DirectiveObj = HTTPMessage.UnEscapeString(CurrentLine.Substring( fs, CurrentLine.Length - fs - TempString.Length - 1)); } } String Tag = ""; String TagData = ""; for (int line = 2; line <= parser.DCOUNT(); ++line) { if (Tag != "" && parser[line, 1].StartsWith(" ")) { TagData = parser[line, 1].Substring(1); } else { Tag = parser[line, 1]; TagData = ""; for (int i = 2; i <= parser.DCOUNT(line); ++i) { if (TagData == "") { TagData = parser[line, i]; } else { TagData = TagData + parser.MULTMARK + parser[line, i]; } } } TheMessage.AppendTag(Tag, TagData); } int cl = 0; if (TheMessage.HasTag("Content-Length")) { try { cl = int.Parse(TheMessage.GetTag("Content-Length")); } catch (Exception ex) { OpenSource.Utilities.EventLogger.Log(ex); cl = -1; } } else { cl = -1; } byte[] tbuffer; if (cl > 0) { tbuffer = new byte[cl]; if ((idx + 4 + cl) > count) { // NOP } else { Array.Copy(buffer, idx + 4, tbuffer, 0, cl); TheMessage.DataBuffer = tbuffer; } } if (cl == -1) { tbuffer = new Byte[count - (idx + 4)]; Array.Copy(buffer, idx + 4, tbuffer, 0, tbuffer.Length); TheMessage.DataBuffer = tbuffer; } if (cl == 0) { TheMessage.DataBuffer = new byte[0]; } return(TheMessage); }
/// <summary> /// Constructs a ProtocolInfoString using string. /// </summary> /// <param name="protocolInfo">proposed value of the protocolInfo string</param> public ProtocolInfoString(string protocolInfo) { DText parser = new DText(); parser.ATTRMARK = ":"; parser[0] = protocolInfo; _Protocol = parser[1]; _Network = parser[2]; _MimeType = parser[3]; _Info = parser[4]; StringBuilder sb = new StringBuilder(100); sb.AppendFormat("{0}:{1}:{2}:{3}", _Protocol, _Network, _MimeType, _Info); _value = sb.ToString(); }
private void ProcessPacket(HTTPMessage msg, IPEndPoint src, IPEndPoint local) { if (OnSniffPacket != null) OnSniffPacket(src, null, msg); DText parser = new DText(); parser.ATTRMARK = "::"; bool Alive = false; String UDN = msg.GetTag("USN"); parser[0] = UDN; String USN = parser[1]; USN = USN.Substring(USN.IndexOf(":") + 1); String ST = parser[2]; int MaxAge = 0; String NTS = msg.GetTag("NTS").ToUpper(); if (NTS == "SSDP:ALIVE") { Alive = true; String ma = msg.GetTag("Cache-Control").Trim(); if (ma != "") { parser.ATTRMARK = ","; parser.MULTMARK = "="; parser[0] = ma; for (int i = 1; i <= parser.DCOUNT(); ++i) { if (parser[i, 1].Trim().ToUpper() == "MAX-AGE") { MaxAge = int.Parse(parser[i, 2].Trim()); break; } } } } if (msg.Directive == "NOTIFY" && OnNotify != null) { Uri locuri = null; string location = msg.GetTag("Location"); if (location != null && location.Length > 0) { try { locuri = new Uri(location); } catch (Exception) { } } OnNotify(src, msg.LocalEndPoint, locuri, Alive, USN, ST, MaxAge, msg); } else if (msg.Directive == "M-SEARCH" && OnSearch != null) { if (ValidateSearchPacket(msg) == false) return; int MaxTimer = int.Parse(msg.GetTag("MX")); SearchStruct SearchData = new SearchStruct(); SearchData.ST = msg.GetTag("ST"); SearchData.Source = src; SearchData.Local = local; SearchTimer.Add(SearchData, RandomGenerator.Next(0, MaxTimer)); } }
internal UPnPDevice(double version, String UDN) { // Full Device IsRoot = false; VirtualDir_Table = new Hashtable(); VirtualDir_Header_Table = new Hashtable(); parent = null; HasPresentation = true; ControlPointOnly = false; RootPath = ""; if (version == 0) { Major = 1; Minor = 0; } else { DText TempNum = new DText(); TempNum.ATTRMARK = "."; TempNum[0] = version.ToString(); Major = int.Parse(TempNum[1]); if (TempNum.DCOUNT() == 2) { Minor = int.Parse(TempNum[2]); } else { Minor = 0; } } Services = new UPnPService[0]; if (UDN == "") { UniqueDeviceName = Guid.NewGuid().ToString(); } else { UniqueDeviceName = UDN; } SSDPServer = new SSDP(ExpirationTimeout); SSDPServer.OnRefresh += new SSDP.RefreshHandler(SendNotify); SSDPServer.OnSearch += new SSDP.SearchHandler(HandleSearch); }
private static UPnPComplexType ParseComplexType(XmlTextReader X, UPnPComplexType RetVal) { string elementName = X.LocalName; int count = 0; bool done = false; DText P = new DText(); P.ATTRMARK = ":"; RetVal.AddContainer(new GenericContainer()); do { switch (X.NodeType) { case XmlNodeType.Element: switch (X.LocalName) { case "complexType": case "group": ++count; if (X.HasAttributes) { for (int i = 0; i < X.AttributeCount; i++) { X.MoveToAttribute(i); if (X.Name == "name") { P[0] = X.Value; if (P.DCOUNT() == 1) { RetVal.LocalName = X.Value; RetVal.NameSpace = X.LookupNamespace(""); } else { RetVal.LocalName = P[2]; RetVal.NameSpace = X.LookupNamespace(P[1]); } } else if (X.Name == "ref") { // NOP } } X.MoveToElement(); } break; case "sequence": case "choice": RetVal.CurrentContainer.AddCollection(ParseComplexType_SequenceChoice(X)); //ParseComplexType_Sequence(X,RetVal); break; case "complexContent": RetVal.AddContainer(new ComplexContent()); break; case "simpleContent": RetVal.AddContainer(new SimpleContent()); break; case "restriction": Restriction r = new Restriction(); if (RetVal.CurrentContainer.GetType() == typeof(ComplexContent)) { ((ComplexContent)RetVal.CurrentContainer).RestExt = r; } else if (RetVal.CurrentContainer.GetType() == typeof(SimpleContent)) { ((SimpleContent)RetVal.CurrentContainer).RestExt = r; } if (X.HasAttributes) { for (int i = 0; i < X.AttributeCount; i++) { X.MoveToAttribute(i); if (X.Name == "base") { P[0] = X.Value; if (P.DCOUNT() == 1) { r.baseType = X.Value; r.baseTypeNS = X.LookupNamespace(""); } else { r.baseType = P[2]; r.baseTypeNS = X.LookupNamespace(P[1]); } } } X.MoveToElement(); } break; } break; case XmlNodeType.EndElement: if (X.LocalName == elementName) { --count; if (count == 0) { done = true; } } break; case XmlNodeType.Text: break; } }while(!done && X.Read()); return(RetVal); }
private static ItemCollection ParseComplexType_SequenceChoice(XmlTextReader X) { bool done = false; ItemCollection RetVal = null; string elementName = X.LocalName; DText p = new DText(); p.ATTRMARK = ":"; if (X.LocalName == "choice") { RetVal = new Choice(); } else { RetVal = new Sequence(); } if (X.HasAttributes) { for (int i = 0; i < X.AttributeCount; i++) { X.MoveToAttribute(i); switch (X.LocalName) { case "minOccurs": RetVal.MinOccurs = X.Value; break; case "maxOccurs": RetVal.MaxOccurs = X.Value; break; } } X.MoveToElement(); } X.Read(); do { switch (X.NodeType) { case XmlNodeType.Element: switch (X.LocalName) { case "group": if (X.HasAttributes) { for (int i = 0; i < X.AttributeCount; i++) { X.MoveToAttribute(i); switch (X.LocalName) { case "ref": string sample = X.Value; break; } } X.MoveToElement(); } break; case "sequence": case "choice": RetVal.AddCollection(ParseComplexType_SequenceChoice(X)); break; case "element": RetVal.AddContentItem(new Element()); if (X.HasAttributes) { for (int i = 0; i < X.AttributeCount; i++) { X.MoveToAttribute(i); switch (X.LocalName) { case "name": RetVal.CurrentItem.Name = X.Value; break; case "type": p[0] = X.Value; if (p.DCOUNT() == 1) { RetVal.CurrentItem.Type = X.Value; RetVal.CurrentItem.TypeNS = X.LookupNamespace(""); } else { RetVal.CurrentItem.Type = p[2]; RetVal.CurrentItem.TypeNS = X.LookupNamespace(p[1]); } break; case "minOccurs": RetVal.CurrentItem.MinOccurs = X.Value; break; case "maxOccurs": RetVal.CurrentItem.MaxOccurs = X.Value; break; } } X.MoveToElement(); } break; case "attribute": break; } break; case XmlNodeType.EndElement: if (X.LocalName == elementName) { done = true; } break; case XmlNodeType.Text: break; } }while(!done && X.Read()); return(RetVal); }
private void BuildCertToolFiles(UPnPDevice device, DirectoryInfo outputDir) { StringBuilder sb = new StringBuilder(); ServiceGenerator.Configuration DeviceConf = (ServiceGenerator.Configuration)device.User; sb.Append("<device>"); if (device.Services.Length>0) { sb.Append("<serviceList>"); foreach(UPnPService s in device.Services) { sb.Append("<service>"); sb.Append("<serviceType>"+s.ServiceURN+"</serviceType>"); sb.Append("<serviceId>"+s.ServiceID+"</serviceId>"); sb.Append("</service>"); BuildCertToolFiles_Service(s,outputDir); } sb.Append("</serviceList>"); } sb.Append("</device>"); StreamWriter W; DText d = new DText(); d.ATTRMARK = ":"; d[0] = device.DeviceURN; W = File.CreateText(outputDir.FullName + "\\"+d[4]+device.Version.ToString()+".xml"); W.Write(sb.ToString()); W.Close(); }
private void GenerateControlSchemas(UPnPDevice d, System.IO.DirectoryInfo dirInfo, bool cleanSchema) { System.IO.MemoryStream ms = new MemoryStream(); System.Xml.XmlTextWriter X = new System.Xml.XmlTextWriter(ms,System.Text.Encoding.UTF8); X.Formatting = System.Xml.Formatting.Indented; foreach(UPnPDevice ed in d.EmbeddedDevices) { GenerateControlSchemas(ed,dirInfo,cleanSchema); } foreach(UPnPService s in d.Services) { Hashtable h = new Hashtable(); int j=1; foreach(string sn in s.GetSchemaNamespaces()) { h[sn] = "CT"+j.ToString(); ++j; } X.WriteStartDocument(); X.WriteStartElement("xsd","schema","http://www.w3.org/2001/XMLSchema"); X.WriteAttributeString("targetNamespace",s.ServiceURN); X.WriteAttributeString("xmlns",s.ServiceURN); X.WriteAttributeString("xmlns","upnp",null,"http://www.upnp.org/Schema/DataTypes"); IDictionaryEnumerator NE = h.GetEnumerator(); while(NE.MoveNext()) { X.WriteAttributeString("xmlns",NE.Value.ToString(),null,NE.Key.ToString()); } foreach(UPnPAction a in s.Actions) { X.WriteStartElement("xsd","element",null); X.WriteAttributeString("name",a.Name); X.WriteAttributeString("type",a.Name+"Type"); X.WriteEndElement(); X.WriteStartElement("xsd","element",null); X.WriteAttributeString("name",a.Name+"Response"); X.WriteAttributeString("type",a.Name+"ResponseType"); X.WriteEndElement(); if (!cleanSchema) { X.WriteComment("Note: Some schema validation tools may consider the following xsd:any element ambiguous in this placement"); X.WriteStartElement("xsd","any",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("minOccurs","0"); X.WriteAttributeString("maxOccurs","unbounded"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // ANY } X.WriteStartElement("xsd","complexType",null); X.WriteAttributeString("name",a.Name+"Type"); X.WriteStartElement("xsd","sequence",null); foreach(UPnPArgument arg in a.Arguments) { if (arg.Direction=="in") { X.WriteStartElement("xsd","element",null); X.WriteAttributeString("name",arg.Name); if (arg.RelatedStateVar.ComplexType==null) { // Simple Types X.WriteStartElement("xsd","complexType",null); X.WriteStartElement("xsd","simpleContent",null); X.WriteStartElement("xsd","extension",null); X.WriteAttributeString("base","upnp:"+arg.RelatedStateVar.ValueType); if (!cleanSchema) { X.WriteStartElement("xsd","anyAttribute",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // anyAttribute } X.WriteEndElement(); // Extension X.WriteEndElement(); // simpleConent X.WriteEndElement(); // complexType } else { // Complex Types X.WriteAttributeString("type",h[arg.RelatedStateVar.ComplexType.Name_NAMESPACE].ToString()+":"+arg.RelatedStateVar.ComplexType.Name_LOCAL); } X.WriteEndElement(); // element } } if (!cleanSchema) { X.WriteStartElement("xsd","any",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("minOccurs","0"); X.WriteAttributeString("maxOccurs","unbounded"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // any } X.WriteEndElement(); // sequence if (!cleanSchema) { X.WriteStartElement("xsd","anyAttribute",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // anyAttribute } X.WriteEndElement(); // complexType // ActionResponse X.WriteStartElement("xsd","complexType",null); X.WriteAttributeString("name",a.Name+"ResponseType"); X.WriteStartElement("xsd","sequence",null); foreach(UPnPArgument arg in a.Arguments) { if (arg.Direction=="out" || arg.IsReturnValue) { X.WriteStartElement("xsd","element",null); X.WriteAttributeString("name",arg.Name); if (arg.RelatedStateVar.ComplexType==null) { // Simple X.WriteStartElement("xsd","complexType",null); X.WriteStartElement("xsd","simpleContent",null); X.WriteStartElement("xsd","extension",null); X.WriteAttributeString("base","upnp:"+arg.RelatedStateVar.ValueType); if (!cleanSchema) { X.WriteStartElement("xsd","anyAttribute",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // anyAttribute } X.WriteEndElement(); // extension X.WriteEndElement(); // simpleContent X.WriteEndElement(); // complexType } else { // Complex X.WriteAttributeString("type",h[arg.RelatedStateVar.ComplexType.Name_NAMESPACE].ToString()+":"+arg.RelatedStateVar.ComplexType.Name_LOCAL); } X.WriteEndElement(); // Element } } // After all arguments if (!cleanSchema) { X.WriteStartElement("xsd","any",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("minOccurs","0"); X.WriteAttributeString("maxOccurs","unbounded"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // any } X.WriteEndElement(); // sequence if (!cleanSchema) { X.WriteStartElement("xsd","anyAttribute",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // anyAttribute } X.WriteEndElement(); // complexType } X.WriteEndElement(); //schema X.WriteEndDocument(); StreamWriter writer3; DText PP = new DText(); PP.ATTRMARK = ":"; PP[0] = s.ServiceURN; writer3 = File.CreateText(dirInfo.FullName + "\\"+PP[PP.DCOUNT()-1]+".xsd"); System.Text.UTF8Encoding U = new System.Text.UTF8Encoding(); X.Flush(); ms.Flush(); writer3.Write(U.GetString(ms.ToArray(),2,ms.ToArray().Length-2)); writer3.Close(); ms = new MemoryStream(); X = new System.Xml.XmlTextWriter(ms,System.Text.Encoding.UTF8); X.Formatting = System.Xml.Formatting.Indented; } }
private static void ParseDevice(String XML, int startLine, ref UPnPDevice RetVal) { string TempString; UPnPService service; int embeddedLine; DText p = new DText(); TextReader MyString = new StringReader(XML); XmlTextReader XMLDoc = new XmlTextReader(MyString); try { XMLDoc.Read(); XMLDoc.MoveToContent(); if (XMLDoc.LocalName == "device") { if (XMLDoc.AttributeCount > 0) { for (int ax = 0; ax < XMLDoc.AttributeCount; ++ax) { XMLDoc.MoveToAttribute(ax); if (XMLDoc.LocalName == "MaxVersion") { RetVal.SetVersion(XMLDoc.Value); } } XMLDoc.MoveToContent(); XMLDoc.Read(); } else { XMLDoc.Read(); XMLDoc.MoveToContent(); } while (XMLDoc.LocalName != "device" && !XMLDoc.EOF) { switch (XMLDoc.LocalName) { case "deviceList": embeddedLine = XMLDoc.LineNumber; ParseDeviceList(XMLDoc.ReadOuterXml(), startLine + embeddedLine - 1, ref RetVal); break; case "URLBase": // Here, tport is a hack to make Windows Home Server visible. WHS does no set the port in the BaseURL and so, you need to keep it from the SSDP message. int tport = 80; if (RetVal.BaseURL != null) tport = RetVal.BaseURL.Port; RetVal.BaseURL = new Uri(XMLDoc.ReadString()); if (RetVal.BaseURL.Port == 80 && RetVal.BaseURL.Port != tport) RetVal.BaseURL = new Uri(RetVal.BaseURL.Scheme + "://" + RetVal.BaseURL.Host + ":" + tport + RetVal.BaseURL.AbsolutePath); break; case "deviceType": RetVal.DeviceURN = XMLDoc.ReadString(); break; case "friendlyName": RetVal.FriendlyName = XMLDoc.ReadString(); break; case "manufacturer": RetVal.Manufacturer = XMLDoc.ReadString(); break; case "manufacturerURL": RetVal.ManufacturerURL = XMLDoc.ReadString(); break; case "modelDescription": RetVal.ModelDescription = XMLDoc.ReadString(); break; case "modelName": RetVal.ModelName = XMLDoc.ReadString(); break; case "modelNumber": RetVal.ModelNumber = XMLDoc.ReadString(); break; case "modelURL": try { string u = XMLDoc.ReadString(); if (Uri.TryCreate(u, UriKind.Absolute, out RetVal.ModelURL) == false) { Uri.TryCreate("http://" + u, UriKind.Absolute, out RetVal.ModelURL); } } catch (Exception ex) { OpenSource.Utilities.EventLogger.Log(ex); } break; case "serialNumber": RetVal.SerialNumber = XMLDoc.ReadString(); break; case "UDN": TempString = XMLDoc.ReadString(); RetVal.UniqueDeviceName = TempString.Substring(5); break; case "UPC": RetVal.ProductCode = XMLDoc.ReadString(); break; case "presentationURL": RetVal.HasPresentation = true; RetVal.PresentationURL = XMLDoc.ReadString(); break; case "serviceList": if (XMLDoc.IsEmptyElement) break; XMLDoc.Read(); XMLDoc.MoveToContent(); while (XMLDoc.LocalName != "serviceList") { if (XMLDoc.LocalName == "service") { embeddedLine = XMLDoc.LineNumber; service = UPnPService.Parse(XMLDoc.ReadOuterXml(), embeddedLine - 1 + startLine); RetVal.AddService(service); } if (!XMLDoc.IsStartElement()) { if (XMLDoc.LocalName != "serviceList") { XMLDoc.Read(); XMLDoc.MoveToContent(); } } } break; /* case "iconList": bool finishedIconList = false; while (!finishedIconList && XMLDoc.Read()) { switch (XMLDoc.NodeType) { case XmlNodeType.Element: if (XMLDoc.LocalName == "icon") { embeddedLine = XMLDoc.LineNumber; ParseIconXML(RetVal, startLine + embeddedLine-1, XMLDoc.ReadOuterXml()); if (XMLDoc.NodeType == XmlNodeType.EndElement && XMLDoc.LocalName == "iconList") { finishedIconList = true; } } break; case XmlNodeType.EndElement: if (XMLDoc.LocalName == "iconList") { finishedIconList = true; } break; } } break; */ default: if (XMLDoc.LocalName != "") { string customPrefix = XMLDoc.Prefix; string customFieldName = XMLDoc.LocalName; string customFieldNamespace = XMLDoc.LookupNamespace(customPrefix); string customFieldVal = XMLDoc.ReadInnerXml(); RetVal.AddCustomFieldInDescription(customFieldName, customFieldVal, customFieldNamespace); } else { XMLDoc.Skip(); } continue; } XMLDoc.Read(); //XMLDoc.MoveToContent(); } } } catch (XMLParsingException ex) { throw ex; } catch (Exception ex) { throw new XMLParsingException("Invalid Device XML", startLine + XMLDoc.LineNumber, XMLDoc.LinePosition, ex); } }
/// <summary> /// This method is called automatically by the UPNP stack when eventing the /// ContainerUpdateIDs. Programmers need only set the value of the ContainerUpdateIDs /// state variable with a single elem /// </summary> /// <param name="current">Comma-separated-value list in the string form of "[containerID] UpdateID= [container.UpdateID], [containerIDn] UpdateID= [container.UpdatedID]"</param> /// <param name="newObject">String that should overwrite an existing comma-separated-value item or append to the existing list, in form "[containerID] UpdateID= [container.UpdateID]"</param> /// <returns></returns> public object Merge(object current, object newObject) { DText Parser = new DText(); Parser.ATTRMARK = Accumulator_ContainerUpdateIDs.CSV_Delimitor; DText Parser2 = new DText(); Parser2.ATTRMARK = Accumulator_ContainerUpdateIDs.Delimitor; if (current == null) current = ""; if (newObject == null) newObject = ""; string curStr = current.ToString(); string newStr = newObject.ToString(); if (newStr == "") return ""; int i; Hashtable hash = new Hashtable(); if (curStr != "") { Parser[0] = curStr; int cnt = Parser.DCOUNT(); for (i=1; i <= cnt; i++) { string id, update; if (Accumulator_ContainerUpdateIDs.Delimitor == Accumulator_ContainerUpdateIDs.CSV_Delimitor) { id = Parser[i]; i++; update = Parser[i]; hash[id] = update; } else { string pair = Parser[i]; Parser2[0] = pair; id = Parser2[1];; update = Parser2[2]; hash[id] = update; } if (id == "") { throw new ApplicationException("Bad evil. Container ID is empty string."); } if (update == "") { throw new ApplicationException("Bad evil. Update ID is empty string."); } } } /* * add or overwrite a container update value */ Parser2[0] = newStr; string id2 = Parser2[1]; string update2 = Parser2[2]; hash[id2] = update2; StringBuilder sb = new StringBuilder(hash.Count * 20); i=0; foreach (string key in hash.Keys) { if (i > 0) { sb.Append(","); } i++; string val = hash[key].ToString(); if (key == "") { throw new ApplicationException("Bad evil. Accumulator has empty string for key."); } if (val == "") { throw new ApplicationException("Bad evil. Accumulator has empty string for value."); } sb.AppendFormat("{0}{1}{2}", key, Delimitor, val); } return sb.ToString(); }
private void GetNonRootDeviceXML(IPEndPoint local, XmlTextWriter XDoc) { IDictionaryEnumerator de = CustomField.GetEnumerator(); DText pp = new DText(); ; pp.ATTRMARK = ":"; XDoc.WriteStartElement("device"); // // Always advertise version :1 // XDoc.WriteElementString("deviceType", DeviceURN); if (HasPresentation == true) { XDoc.WriteElementString("presentationURL", PresentationURL); } while (de.MoveNext()) { IDictionaryEnumerator ede = ((Hashtable)de.Value).GetEnumerator(); while (ede.MoveNext()) { string localName = (string)ede.Key; string elementValue = (string)ede.Value; string ns = (string)de.Key; pp[0] = localName; if (pp.DCOUNT() == 2) { XDoc.WriteStartElement(pp[1], pp[2], ns); XDoc.WriteString(elementValue); XDoc.WriteEndElement(); } else { if (ns != "") { XDoc.WriteElementString(localName, ns, elementValue); } else { XDoc.WriteElementString(localName, elementValue); } } } } XDoc.WriteElementString("friendlyName", FriendlyName); if (Manufacturer != null) XDoc.WriteElementString("manufacturer", Manufacturer); if (ManufacturerURL != null) XDoc.WriteElementString("manufacturerURL", ManufacturerURL); if (ModelDescription != null) XDoc.WriteElementString("modelDescription", ModelDescription); if (ModelName != null) XDoc.WriteElementString("modelName", ModelName); if (ModelNumber != null) XDoc.WriteElementString("modelNumber", ModelNumber); if (ModelURL != null) XDoc.WriteElementString("modelURL", HTTPMessage.UnEscapeString(ModelURL.AbsoluteUri)); if (SerialNumber != null) XDoc.WriteElementString("serialNumber", SerialNumber); XDoc.WriteElementString("UDN", "uuid:" + UniqueDeviceName); /* if (_icon != null) { lock (_icon) { XDoc.WriteStartElement("iconList"); XDoc.WriteStartElement("icon"); XDoc.WriteElementString("mimetype", "image/png"); XDoc.WriteElementString("width", _icon.Width.ToString()); XDoc.WriteElementString("height", _icon.Height.ToString()); XDoc.WriteElementString("depth", System.Drawing.Image.GetPixelFormatSize(_icon.PixelFormat).ToString()); XDoc.WriteElementString("url", "/icon.png"); XDoc.WriteEndElement(); XDoc.WriteStartElement("icon"); XDoc.WriteElementString("mimetype", "image/jpg"); XDoc.WriteElementString("width", _icon.Width.ToString()); XDoc.WriteElementString("height", _icon.Height.ToString()); XDoc.WriteElementString("depth", System.Drawing.Image.GetPixelFormatSize(_icon.PixelFormat).ToString()); XDoc.WriteElementString("url", "/icon.jpg"); XDoc.WriteEndElement(); if (_icon2 != null) { XDoc.WriteStartElement("icon"); XDoc.WriteElementString("mimetype", "image/png"); XDoc.WriteElementString("width", _icon2.Width.ToString()); XDoc.WriteElementString("height", _icon2.Height.ToString()); XDoc.WriteElementString("depth", System.Drawing.Image.GetPixelFormatSize(_icon.PixelFormat).ToString()); XDoc.WriteElementString("url", "/icon2.png"); XDoc.WriteEndElement(); XDoc.WriteStartElement("icon"); XDoc.WriteElementString("mimetype", "image/jpg"); XDoc.WriteElementString("width", _icon2.Width.ToString()); XDoc.WriteElementString("height", _icon2.Height.ToString()); XDoc.WriteElementString("depth", System.Drawing.Image.GetPixelFormatSize(_icon2.PixelFormat).ToString()); XDoc.WriteElementString("url", "/icon2.jpg"); XDoc.WriteEndElement(); } XDoc.WriteEndElement(); } } */ if (Services.Length > 0) { XDoc.WriteStartElement("serviceList"); for (int sid = 0; sid < Services.Length; ++sid) { Services[sid].GetServiceXML(XDoc); } XDoc.WriteEndElement(); } if (EmbeddedDevices.Length > 0) { XDoc.WriteStartElement("deviceList"); for (int ei = 0; ei < EmbeddedDevices.Length; ++ei) { EmbeddedDevices[ei].GetNonRootDeviceXML(local, XDoc); } XDoc.WriteEndElement(); } XDoc.WriteEndElement(); }
public byte[] GetSCPDXml() { IDictionaryEnumerator varEnumerator = StateVariables.GetEnumerator(); MemoryStream mstr = new MemoryStream(); XmlTextWriter XDoc = new XmlTextWriter(mstr, System.Text.Encoding.UTF8); XDoc.Formatting = System.Xml.Formatting.Indented; XDoc.Indentation = 3; XDoc.WriteStartDocument(); XDoc.WriteStartElement("scpd", "urn:schemas-upnp-org:service-1-0"); IDictionaryEnumerator en = this.ComplexType_NamespacePrefix.GetEnumerator(); while (en.MoveNext()) { XDoc.WriteAttributeString("xmlns", en.Value.ToString(), null, en.Key.ToString()); XDoc.WriteAttributeString(en.Value.ToString(), "schemaLocation", null, SchemaURLS[en.Key.ToString()].ToString()); } XDoc.WriteStartElement("specVersion"); DText PP = new DText(); PP.ATTRMARK = "."; if (ParentDevice == null) { if (this.ComplexTypeTable.Count == 0) { PP[0] = "1.0"; } else { PP[0] = "1.1"; } } else { PP[0] = ParentDevice.ArchitectureVersion; } XDoc.WriteElementString("major", PP[1]); XDoc.WriteElementString("minor", PP[2]); XDoc.WriteEndElement(); XDoc.WriteStartElement("actionList"); foreach (UPnPAction A in this.Actions) { A.GetXML(XDoc); } XDoc.WriteEndElement(); XDoc.WriteStartElement("serviceStateTable"); while (varEnumerator.MoveNext()) { ((UPnPStateVariable)varEnumerator.Value).GetStateVariableXML(XDoc); } XDoc.WriteEndElement(); XDoc.WriteEndElement(); XDoc.WriteEndDocument(); XDoc.Flush(); byte[] RetVal = new byte[mstr.Length - 3]; mstr.Seek(3, SeekOrigin.Begin); mstr.Read(RetVal, 0, RetVal.Length); XDoc.Close(); return (RetVal); }
private void HandleHeaderRequest(HTTPMessage msg, HTTPSession WebSession) { DText parser = new DText(); HTTPMessage Response = new HTTPMessage(); String Method = msg.Directive; String MethodData = msg.DirectiveObj; VirtualDirectoryHandler H_cb = null; VirtualDirectoryHandler P_cb = null; String vd = ""; String vdobj = ""; // Check VirtualDirTable int vdi; try { vdi = MethodData.IndexOf("/", 1); if (vdi != -1) { vdobj = MethodData.Substring(vdi); vd = MethodData.Substring(0, vdi); if (VirtualDir_Header_Table.ContainsKey(vd)) { if (VirtualDir_Header_Table[vd] != null) H_cb = (VirtualDirectoryHandler)VirtualDir_Header_Table[vd]; } if (VirtualDir_Table.ContainsKey(vd)) { if (VirtualDir_Table[vd] != null) P_cb = (VirtualDirectoryHandler)VirtualDir_Table[vd]; } } } catch (Exception ex) { OpenSource.Utilities.EventLogger.Log(ex); } if ((H_cb != null) || (P_cb != null)) { HTTPMessage _msg = (HTTPMessage)msg.Clone(); _msg.DirectiveObj = vdobj; WebSession.InternalStateObject = new Object[3] { vd, vdobj, P_cb }; if (H_cb != null) H_cb(this, _msg, WebSession, vd); return; } }
private Uri[] ParseEventURL(String URLList) { DText parser = new DText(); String temp; ArrayList TList = new ArrayList(); parser.ATTRMARK = ">"; parser[0] = URLList; int cnt = parser.DCOUNT(); for (int x = 1; x <= cnt; ++x) { temp = parser[x]; try { temp = temp.Substring(temp.IndexOf("<") + 1); TList.Add(new Uri(temp)); } catch (Exception) { } } Uri[] RetVal = new Uri[TList.Count]; for (int x = 0; x < RetVal.Length; ++x) RetVal[x] = (Uri)TList[x]; return RetVal; }
internal UPnPDevice(int DeviceExpiration, double version, String RootDir) { //OpenSource.Utilities.InstanceTracker.Add(this); // Full Device IsRoot = true; parent = null; HasPresentation = true; ControlPointOnly = false; RootPath = RootDir; ExpirationTimeout = DeviceExpiration; WebServerTable = Hashtable.Synchronized(new Hashtable()); VirtualDir_Table = new Hashtable(); VirtualDir_Header_Table = new Hashtable(); if (version == 0) { Major = 1; Minor = 0; } else { DText TempNum = new DText(); TempNum.ATTRMARK = "."; TempNum[0] = version.ToString(); Major = int.Parse(TempNum[1]); if (TempNum.DCOUNT() == 2) { Minor = int.Parse(TempNum[2]); } else { Minor = 0; } } Services = new UPnPService[0]; UniqueDeviceName = Guid.NewGuid().ToString(); SSDPServer = new SSDP(ExpirationTimeout); SSDPServer.OnRefresh += SendNotify; SSDPServer.OnSearch += HandleSearch; }
internal UPnPService(double version) { OpenSource.Utilities.InstanceTracker.Add(this); InvocationPipeline.OnResponse += new HTTPRequest.RequestHandler(HandleInvokeRequest); this.SubscribeCycleCallback = new LifeTimeMonitor.LifeTimeHandler(SubscribeCycleSink); SubscribeCycle.OnExpired += this.SubscribeCycleCallback; VarAssociation = new Hashtable(); LocalMethodList = new Hashtable(); RemoteMethods = new SortedList(); SIDLock = new object(); EventSID = 0; StateVariables = Hashtable.Synchronized(new Hashtable()); SubscriberTable = Hashtable.Synchronized(new Hashtable()); CurrentSID = ""; if (version == 0) { Major = 1; Minor = 0; } else { DText TempNum = new DText(); TempNum.ATTRMARK = "."; TempNum[0] = version.ToString(); Major = int.Parse(TempNum[1]); Minor = 0; if (TempNum.DCOUNT() == 2) int.TryParse(TempNum[2], out Minor); } }
private void HandleWebRequest(HTTPMessage msg, HTTPSession WebSession) { DText parser = new DText(); HTTPMessage Response = new HTTPMessage(); HTTPMessage Response2 = null; String Method = msg.Directive; String MethodData = msg.DirectiveObj; if (WebSession.InternalStateObject != null) { HTTPMessage _msg = (HTTPMessage)msg.Clone(); object[] state = (object[])WebSession.InternalStateObject; _msg.DirectiveObj = (string)state[1]; VirtualDirectoryHandler t = (VirtualDirectoryHandler)state[2]; WebSession.InternalStateObject = null; t(this, _msg, WebSession, (string)state[0]); return; } if ((Method != "GET") && (Method != "HEAD") && (Method != "POST") && (Method != "SUBSCRIBE") && (Method != "UNSUBSCRIBE") && (Method != "NOTIFY")) { Response.StatusCode = 405; Response.StatusData = Method + " not supported"; WebSession.Send(Response); return; // Other methods are unknown to us } // Process Headers if (Method == "GET" || Method == "HEAD") { try { Response = Get(MethodData, WebSession.Source); } catch (UPnPCustomException ce) { OpenSource.Utilities.EventLogger.Log(ce); Response.StatusCode = ce.ErrorCode; Response.StatusData = ce.ErrorDescription; WebSession.Send(Response); return; } catch (Exception e) { OpenSource.Utilities.EventLogger.Log(e); Response.StatusCode = 500; Response.StatusData = "Internal"; Response.StringBuffer = e.ToString(); } if (Method == "HEAD") { Response.BodyBuffer = null; } WebSession.Send(Response); } if (Method == "POST") { //InvokerInfo[Thread.CurrentThread.GetHashCode()] = WebSession; try { Response = Post(MethodData, msg.StringBuffer, msg.GetTag("SOAPACTION"), WebSession); } catch (DelayedResponseException ex) { OpenSource.Utilities.EventLogger.Log(ex); InvokerInfo.Remove(Thread.CurrentThread.GetHashCode()); WebSession.StopReading(); return; } catch (UPnPCustomException ce) { OpenSource.Utilities.EventLogger.Log(this, System.Diagnostics.EventLogEntryType.Error, "UPnP Error [" + ce.ErrorCode.ToString() + "] " + ce.ErrorDescription); Response.StatusCode = 500; Response.StatusData = "Internal"; Response.StringBuffer = BuildErrorBody(ce); WebSession.Send(Response); InvokerInfo.Remove(Thread.CurrentThread.GetHashCode()); return; } catch (UPnPInvokeException ie) { Response.StatusCode = 500; Response.StatusData = "Internal"; if (ie.UPNP != null) { OpenSource.Utilities.EventLogger.Log(this, System.Diagnostics.EventLogEntryType.Error, "UPnP Error [" + ie.UPNP.ErrorCode.ToString() + "] " + ie.UPNP.ErrorDescription); Response.StringBuffer = BuildErrorBody(ie.UPNP); } else { OpenSource.Utilities.EventLogger.Log(this, System.Diagnostics.EventLogEntryType.Error, "UPnP Invocation Error [" + ie.MethodName + "] " + ie.Message); Response.StringBuffer = BuildErrorBody(new UPnPCustomException(500, ie.Message)); } WebSession.Send(Response); InvokerInfo.Remove(Thread.CurrentThread.GetHashCode()); return; } catch (UPnPTypeMismatchException tme) { OpenSource.Utilities.EventLogger.Log(tme); Response.StatusCode = 500; Response.StatusData = "Internal"; Response.StringBuffer = BuildErrorBody(new UPnPCustomException(402, tme.Message)); WebSession.Send(Response); InvokerInfo.Remove(Thread.CurrentThread.GetHashCode()); return; } catch (UPnPStateVariable.OutOfRangeException oor) { OpenSource.Utilities.EventLogger.Log(oor); Response.StatusCode = 500; Response.StatusData = "Internal"; Response.StringBuffer = BuildErrorBody(new UPnPCustomException(402, oor.Message)); WebSession.Send(Response); InvokerInfo.Remove(Thread.CurrentThread.GetHashCode()); return; } catch (System.Reflection.TargetInvocationException tie) { Exception inner = tie.InnerException; OpenSource.Utilities.EventLogger.Log(tie); while (inner.InnerException != null && (typeof(UPnPCustomException).IsInstanceOfType(inner) == false)) { inner = inner.InnerException; } if (typeof(UPnPCustomException).IsInstanceOfType(inner)) { UPnPCustomException ce = (UPnPCustomException)inner; OpenSource.Utilities.EventLogger.Log(this, System.Diagnostics.EventLogEntryType.Error, "UPnP Error [" + ce.ErrorCode.ToString() + "] " + ce.ErrorDescription); Response.StatusCode = 500; Response.StatusData = "Internal"; Response.StringBuffer = BuildErrorBody(ce); WebSession.Send(Response); InvokerInfo.Remove(Thread.CurrentThread.GetHashCode()); return; } else { Response.StatusCode = 500; Response.StatusData = "Internal"; Response.StringBuffer = BuildErrorBody(new UPnPCustomException(500, inner.ToString())); WebSession.Send(Response); OpenSource.Utilities.EventLogger.Log(inner); return; } } catch (Exception e) { Response.StatusCode = 500; Response.StatusData = "Internal"; Response.StringBuffer = BuildErrorBody(new UPnPCustomException(500, e.ToString())); WebSession.Send(Response); OpenSource.Utilities.EventLogger.Log(e); return; } WebSession.Send(Response); InvokerInfo.Remove(Thread.CurrentThread.GetHashCode()); return; } if (Method == "SUBSCRIBE") { String SID = msg.GetTag("SID"); String NT = msg.GetTag("NT"); String Timeout = msg.GetTag("Timeout"); String CallbackURL = msg.GetTag("Callback"); if (Timeout == "") { Timeout = "7200"; // Default = 2 Hours } else { Timeout = Timeout.Substring(Timeout.IndexOf("-") + 1).Trim().ToUpper(); if (Timeout == "INFINITE") { Timeout = "0"; } } if (SID != "") { // Renew RenewEvents(MethodData.Substring(1), SID, Timeout); } else { // Subscribe try { Response2 = SubscribeEvents(ref SID, MethodData.Substring(1), CallbackURL, Timeout); } catch (Exception s_exception) { OpenSource.Utilities.EventLogger.Log(s_exception); HTTPMessage err = new HTTPMessage(); err.StatusCode = 500; err.StatusData = s_exception.Message; WebSession.Send(err); return; } } if (Timeout == "0") { Timeout = "Second-infinite"; } else { Timeout = "Second-" + Timeout; } Response.StatusCode = 200; Response.StatusData = "OK"; Response.AddTag("Server", "Windows NT/5.0, UPnP/1.0"); Response.AddTag("SID", SID); Response.AddTag("Timeout", Timeout); WebSession.Send(Response); if (Response2 != null) { Uri[] cbURL = ParseEventURL(CallbackURL); for (int x = 0; x < cbURL.Length; ++x) { Response2.DirectiveObj = HTTPMessage.UnEscapeString(cbURL[x].PathAndQuery); Response2.AddTag("Host", cbURL[x].Host + ":" + cbURL[x].Port.ToString()); IPEndPoint d = new IPEndPoint(IPAddress.Parse(cbURL[x].Host), cbURL[x].Port); HTTPRequest R = new HTTPRequest(); R.OnResponse += new HTTPRequest.RequestHandler(HandleInitialEvent); this.InitialEventTable[R] = R; R.PipelineRequest(d, Response2, null); } } } if (Method == "UNSUBSCRIBE") { CancelEvent(MethodData.Substring(1), msg.GetTag("SID")); Response.StatusCode = 200; Response.StatusData = "OK"; WebSession.Send(Response); } }
protected bool GenerateEx(UPnPDevice device, DirectoryInfo outputDirectory, Hashtable serviceNames) { string sampleService = "Sample"; StreamWriter writer; ServiceNames = serviceNames; DText dt = new DText(); dt.ATTRMARK = ":"; dt[0] = device.DeviceURN; // *** Generate Main Code Log("Writing main stack module..."); IDictionaryEnumerator en = serviceNames.GetEnumerator(); while (en.MoveNext()) { string servicename = (string)en.Value; sampleService = servicename; UPnPService service = (UPnPService)en.Key; string servicexml = new UTF8Encoding().GetString(service.GetSCPDXml()); Log("Generating service class for " + servicename); OpenSource.UPnP.ServiceGenerator.GenerateCP("Cp" + servicename, nspace, outputDirectory.FullName + "\\Cp" + servicename + ".cs", service.ServiceURN, servicexml); } CodeProcessor cs = new CodeProcessor(new StringBuilder(), true); StringBuilder cs2; cs.Comment("UPnP .NET Framework Control Point Stack, Discovery Module"); cs.Comment(VersionString); cs.Append(cl); cs.Append("using System;" + cl); cs.Append("using System.Net;" + cl); cs.Append("using OpenSource.UPnP;" + cl); cs.Append("using OpenSource.Utilities;" + cl); cs.Append("using " + nspace + ";" + cl); cs.Append(cl); cs.Append("namespace " + nspace + cl); cs.Append("{" + cl); cs.Append(" /// <summary>" + cl); cs.Append(" /// Summary description for " + dt[4] + "Discovery." + cl); cs.Append(" /// </summary>" + cl); cs.Append(" class " + dt[4] + "Discovery" + cl); cs.Append(" {" + cl); cs.Append(" private UPnPSmartControlPoint scp;" + cl); cs.Append(" private WeakEvent AddEvent = new WeakEvent();" + cl); cs.Append(" private WeakEvent RemoveEvent = new WeakEvent();" + cl); cs.Append(cl); cs.Append(" public delegate void DiscoveryHandler(" + dt[4] + "Discovery sender, UPnPDevice dev);" + cl); cs.Append(" public event DiscoveryHandler OnAddedDevice" + cl); cs.Append(" {" + cl); cs.Append(" add" + cl); cs.Append(" {" + cl); cs.Append(" AddEvent.Register(value);" + cl); cs.Append(" }" + cl); cs.Append(" remove" + cl); cs.Append(" {" + cl); cs.Append(" AddEvent.UnRegister(value);" + cl); cs.Append(" }" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" public event DiscoveryHandler OnRemovedDevice" + cl); cs.Append(" {" + cl); cs.Append(" add" + cl); cs.Append(" {" + cl); cs.Append(" RemoveEvent.Register(value);" + cl); cs.Append(" }" + cl); cs.Append(" remove" + cl); cs.Append(" {" + cl); cs.Append(" RemoveEvent.UnRegister(value);" + cl); cs.Append(" }" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" public " + dt[4] + "Discovery()" + cl); cs.Append(" {" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" public void Start()" + cl); cs.Append(" {" + cl); cs.Append(" scp = new UPnPSmartControlPoint(new UPnPSmartControlPoint.DeviceHandler(OnAddSink), null ,\"" + device.DeviceURN + "\");" + cl); cs.Append(" scp.OnRemovedDevice += new UPnPSmartControlPoint.DeviceHandler(OnRemoveSink);" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" public void ReScan()" + cl); cs.Append(" {" + cl); cs.Append(" scp.Rescan();" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" public void UnicastSearch(IPAddress address)" + cl); cs.Append(" {" + cl); cs.Append(" scp.UnicastSearch(address);" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" public void ForceDisposeDevice(UPnPDevice dev)" + cl); cs.Append(" {" + cl); cs.Append(" if (dev.ParentDevice != null)" + cl); cs.Append(" {" + cl); cs.Append(" ForceDisposeDevice(dev.ParentDevice);" + cl); cs.Append(" }" + cl); cs.Append(" else" + cl); cs.Append(" {" + cl); cs.Append(" scp.ForceDisposeDevice(dev);" + cl); cs.Append(" }" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" private void OnAddSink(UPnPSmartControlPoint sender, UPnPDevice d)" + cl); cs.Append(" {" + cl); cs.Append(" AddEvent.Fire(this, d);" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" private void OnRemoveSink(UPnPSmartControlPoint sender, UPnPDevice d)" + cl); cs.Append(" {" + cl); cs.Append(" RemoveEvent.Fire(this, d);" + cl); cs.Append(" }" + cl); cs.Append(" }" + cl); cs.Append("}" + cl); cs.Append(cl); writer = File.CreateText(outputDirectory.FullName + "\\" + dt[4] + "Discovery.cs"); writer.Write(cs.ToString()); writer.Close(); cs = new CodeProcessor(new StringBuilder(), true); cs.Comment("UPnP .NET Framework Control Point Stack, Core Module"); cs.Comment(VersionString); cs.Append(cl); cs.Append("using System;" + cl); cs.Append("using OpenSource.UPnP;" + cl); cs.Append("using " + nspace + ";" + cl); cs.Append(cl); cs.Append("namespace " + nspace + cl); cs.Append("{" + cl); cs.Append(" /// <summary>" + cl); cs.Append(" /// Summary description for Main." + cl); cs.Append(" /// </summary>" + cl); cs.Append(" class SampleDeviceMain" + cl); cs.Append(" {" + cl); cs.Append(" /// <summary>" + cl); cs.Append(" /// The main entry point for the application." + cl); cs.Append(" /// </summary>" + cl); cs.Append(" [STAThread]" + cl); cs.Append(" static void Main(string[] args)" + cl); cs.Append(" {" + cl); cs.Append(" System.Console.WriteLine(\"UPnP .NET Framework Stack\");" + cl); cs.Append(" System.Console.WriteLine(\"StackBuilder Build#" + this.VersionString + "\");" + cl); cs.Append(" " + cl); cs.Append(" " + dt[4] + "Discovery disco = new " + dt[4] + "Discovery();" + cl); cs.Append(" disco.OnAddedDevice += new " + dt[4] + "Discovery.DiscoveryHandler(AddSink);" + cl); cs.Append(" disco.OnRemovedDevice += new " + dt[4] + "Discovery.DiscoveryHandler(RemoveSink);" + cl); cs.Append(" " + cl); cs.Append(" System.Console.WriteLine(\"Press return to stop CP.\");" + cl); cs.Append(" disco.Start();" + cl); cs.Append(" " + cl); cs.Append(" System.Console.ReadLine();" + cl); cs.Append(" }" + cl); cs.Append(" " + cl); cs.Append(" private static void AddSink(" + dt[4] + "Discovery sender, UPnPDevice d)" + cl); cs.Append(" {" + cl); cs.Append(" Console.WriteLine(\"Added Device: \" + d.FriendlyName);" + cl); cs.Append(cl); cs.Comment("To interace with a service, instantiate the appropriate wrapper class on the appropriate service"); cs.Comment("Traverse the device heirarchy to the correct device, and invoke 'GetServices', passing in the static field 'SERVICE_NAME'"); cs.Comment("of the appropriate wrapper class. This method returns an array of all services with this service type. For most purposes,"); cs.Comment("there will only be one service, in which case you can use array index 0."); cs.Comment("Save a reference to this instance of the wrapper class for later use."); cs.Append(" //Cp" + sampleService + " " + sampleService + " = new Cp" + sampleService + "(d.GetServices(Cp" + sampleService + ".SERVICE_NAME)[0]);" + cl); cs.Append(cl); cs.Comment("To subscribe to Events, call the '_subscribe' method of the wrapper class. The only parameter is"); cs.Comment("the duration of the event. A good value is 300 seconds."); cs.Append(" //" + sampleService + "._subscribe(300);" + cl); cs.Append(cl); cs.Comment("The wrapper class exposes all the evented state variables through events in the form 'OnStateVariable_xx', where xx is the variable name."); cs.Append(cl); cs.Comment("The wrapper class exposes methods in two formats. Asyncronous and Syncronous. The Async method calls are exposed simply"); cs.Comment("by the name of the method. The Syncronous version is the same, except with the word, 'Sync_' prepended to the name."); cs.Comment("Asyncronous responses to th async method calls are dispatched through the event in the format, 'OnResult_x' where x is the method name."); cs.Append(cl); cs.Comment("Note: All arguments are automatically type checked. Allowed Values are abstracted through enumerations, that are defined in the wrapper class."); cs.Comment("To access the list of allowed values or ranges for a given device, refer to the property 'Values_XXX' for a list of the allowed values for a"); cs.Comment("given state variable. Similarly, refer to the properties 'HasMaximum_XXX', 'HasMinimum_XXX', 'Maximum_XXX', and 'Minimum_XXX' where XXX is the variable name, for the Max/Min values."); cs.Append(cl); cs.Comment("To determine if a given service implements a particular StateVariable or Method, use the properties, 'HasStateVariableXXX' and 'HasActionXXX' where XXX is the method/variable name."); cs.Append(" }" + cl); cs.Append(" private static void RemoveSink(" + dt[4] + "Discovery sender, UPnPDevice d)" + cl); cs.Append(" {" + cl); cs.Append(" Console.WriteLine(\"Removed Device: \" + d.FriendlyName);" + cl); cs.Append(" }" + cl); cs.Append(cl); cs.Append(" }" + cl); cs.Append("}" + cl); cs.Append(cl); writer = File.CreateText(outputDirectory.FullName + "\\Main.cs"); writer.Write(cs.ToString()); writer.Close(); Log("Generating Visual Studio 7 Solution"); cs2 = new StringBuilder(); cs2.Append("Microsoft Visual Studio Solution File, Format Version 7.00" + cl); cs2.Append("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SampleDevice\", \"SampleDevice.csproj\", \"{FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}\"" + cl); cs2.Append("EndProject" + cl); cs2.Append("Global" + cl); cs2.Append(" GlobalSection(SolutionConfiguration) = preSolution" + cl); cs2.Append(" ConfigName.0 = Debug" + cl); cs2.Append(" ConfigName.1 = Release" + cl); cs2.Append(" EndGlobalSection" + cl); cs2.Append(" GlobalSection(ProjectDependencies) = postSolution" + cl); cs2.Append(" EndGlobalSection" + cl); cs2.Append(" GlobalSection(ProjectConfiguration) = postSolution" + cl); cs2.Append(" {FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}.Debug.ActiveCfg = Debug|.NET" + cl); cs2.Append(" {FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}.Debug.Build.0 = Debug|.NET" + cl); cs2.Append(" {FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}.Release.ActiveCfg = Release|.NET" + cl); cs2.Append(" {FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}.Release.Build.0 = Release|.NET" + cl); cs2.Append(" EndGlobalSection" + cl); cs2.Append(" GlobalSection(ExtensibilityGlobals) = postSolution" + cl); cs2.Append(" EndGlobalSection" + cl); cs2.Append(" GlobalSection(ExtensibilityAddIns) = postSolution" + cl); cs2.Append(" EndGlobalSection" + cl); cs2.Append("EndGlobal" + cl); writer = File.CreateText(outputDirectory.FullName + "\\SampleDevice.sln"); writer.Write(cs2.ToString()); writer.Close(); Log("Generating Assembly Info"); cs2 = new StringBuilder(); cs2.Append("using System.Reflection;" + cl); cs2.Append("using System.Runtime.CompilerServices;" + cl); cs2.Append(cl); cs2.Append("[assembly: AssemblyTitle(\"\")]" + cl); cs2.Append("[assembly: AssemblyDescription(\"\")]" + cl); cs2.Append("[assembly: AssemblyConfiguration(\"\")]" + cl); cs2.Append("[assembly: AssemblyCompany(\"\")]" + cl); cs2.Append("[assembly: AssemblyProduct(\"\")]" + cl); cs2.Append("[assembly: AssemblyCopyright(\"\")]" + cl); cs2.Append("[assembly: AssemblyTrademark(\"\")]" + cl); cs2.Append("[assembly: AssemblyCulture(\"\")]" + cl); cs2.Append("[assembly: AssemblyVersion(\"1.0.*\")]" + cl); cs2.Append("[assembly: AssemblyDelaySign(false)]" + cl); cs2.Append("[assembly: AssemblyKeyFile(\"\")]" + cl); cs2.Append("[assembly: AssemblyKeyName(\"\")]" + cl); writer = File.CreateText(outputDirectory.FullName + "\\AssemblyInfo.cs"); writer.Write(cs2.ToString()); writer.Close(); Log("Generating Visual Studio 7 Project"); cs2 = new StringBuilder(); cs2.Append("<VisualStudioProject>" + cl); cs2.Append(" <CSHARP" + cl); cs2.Append(" ProjectType = \"Local\"" + cl); cs2.Append(" ProductVersion = \"7.0.9466\"" + cl); cs2.Append(" SchemaVersion = \"1.0\"" + cl); cs2.Append(" ProjectGuid = \"{FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}\"" + cl); cs2.Append(" >" + cl); cs2.Append(" <Build>" + cl); cs2.Append(" <Settings" + cl); cs2.Append(" ApplicationIcon = \"\"" + cl); cs2.Append(" AssemblyKeyContainerName = \"\"" + cl); cs2.Append(" AssemblyName = \"SampleDevice\"" + cl); cs2.Append(" AssemblyOriginatorKeyFile = \"\"" + cl); cs2.Append(" DefaultClientScript = \"JScript\"" + cl); cs2.Append(" DefaultHTMLPageLayout = \"Grid\"" + cl); cs2.Append(" DefaultTargetSchema = \"IE50\"" + cl); cs2.Append(" DelaySign = \"false\"" + cl); cs2.Append(" OutputType = \"Exe\"" + cl); cs2.Append(" RootNamespace = \"SampleDevice\"" + cl); cs2.Append(" StartupObject = \"\"" + cl); cs2.Append(" >" + cl); cs2.Append(" <Config" + cl); cs2.Append(" Name = \"Debug\"" + cl); cs2.Append(" AllowUnsafeBlocks = \"false\"" + cl); cs2.Append(" BaseAddress = \"285212672\"" + cl); cs2.Append(" CheckForOverflowUnderflow = \"false\"" + cl); cs2.Append(" ConfigurationOverrideFile = \"\"" + cl); cs2.Append(" DefineConstants = \"DEBUG;TRACE\"" + cl); cs2.Append(" DocumentationFile = \"\"" + cl); cs2.Append(" DebugSymbols = \"true\"" + cl); cs2.Append(" FileAlignment = \"4096\"" + cl); cs2.Append(" IncrementalBuild = \"true\"" + cl); cs2.Append(" Optimize = \"false\"" + cl); cs2.Append(" OutputPath = \"bin\\Debug\\\"" + cl); cs2.Append(" RegisterForComInterop = \"false\"" + cl); cs2.Append(" RemoveIntegerChecks = \"false\"" + cl); cs2.Append(" TreatWarningsAsErrors = \"false\"" + cl); cs2.Append(" WarningLevel = \"4\"" + cl); cs2.Append(" />" + cl); cs2.Append(" <Config" + cl); cs2.Append(" Name = \"Release\"" + cl); cs2.Append(" AllowUnsafeBlocks = \"false\"" + cl); cs2.Append(" BaseAddress = \"285212672\"" + cl); cs2.Append(" CheckForOverflowUnderflow = \"false\"" + cl); cs2.Append(" ConfigurationOverrideFile = \"\"" + cl); cs2.Append(" DefineConstants = \"TRACE\"" + cl); cs2.Append(" DocumentationFile = \"\"" + cl); cs2.Append(" DebugSymbols = \"false\"" + cl); cs2.Append(" FileAlignment = \"4096\"" + cl); cs2.Append(" IncrementalBuild = \"false\"" + cl); cs2.Append(" Optimize = \"true\"" + cl); cs2.Append(" OutputPath = \"bin\\Release\\\"" + cl); cs2.Append(" RegisterForComInterop = \"false\"" + cl); cs2.Append(" RemoveIntegerChecks = \"false\"" + cl); cs2.Append(" TreatWarningsAsErrors = \"false\"" + cl); cs2.Append(" WarningLevel = \"4\"" + cl); cs2.Append(" />" + cl); cs2.Append(" </Settings>" + cl); cs2.Append(" <References>" + cl); cs2.Append(" <Reference" + cl); cs2.Append(" Name = \"System\"" + cl); cs2.Append(" AssemblyName = \"System\"" + cl); cs2.Append(" HintPath = \"..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.dll\"" + cl); cs2.Append(" />" + cl); cs2.Append(" <Reference" + cl); cs2.Append(" Name = \"System.Data\"" + cl); cs2.Append(" AssemblyName = \"System.Data\"" + cl); cs2.Append(" HintPath = \"..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Data.dll\"" + cl); cs2.Append(" />" + cl); cs2.Append(" <Reference" + cl); cs2.Append(" Name = \"System.XML\"" + cl); cs2.Append(" AssemblyName = \"System.Xml\"" + cl); cs2.Append(" HintPath = \"..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.XML.dll\"" + cl); cs2.Append(" />" + cl); cs2.Append(" <Reference" + cl); cs2.Append(" Name = \"UPnP\"" + cl); cs2.Append(" AssemblyName = \"UPnP\"" + cl); cs2.Append(" HintPath = \"UPnP.dll\"" + cl); cs2.Append(" />" + cl); cs2.Append(" </References>" + cl); cs2.Append(" </Build>" + cl); cs2.Append(" <Files>" + cl); cs2.Append(" <Include>" + cl); cs2.Append(" <File" + cl); cs2.Append(" RelPath = \"AssemblyInfo.cs\"" + cl); cs2.Append(" SubType = \"Code\"" + cl); cs2.Append(" BuildAction = \"Compile\"" + cl); cs2.Append(" />" + cl); en.Reset(); while (en.MoveNext()) { UPnPService service = (UPnPService)en.Key; cs2.Append(" <File" + cl); cs2.Append(" RelPath = \"Cp" + (string)en.Value + ".cs\"" + cl); cs2.Append(" SubType = \"Code\"" + cl); cs2.Append(" BuildAction = \"Compile\"" + cl); cs2.Append(" />" + cl); } cs2.Append(" <File" + cl); cs2.Append(" RelPath = \"" + dt[4] + "Discovery.cs\"" + cl); cs2.Append(" SubType = \"Code\"" + cl); cs2.Append(" BuildAction = \"Compile\"" + cl); cs2.Append(" />" + cl); cs2.Append(" <File" + cl); cs2.Append(" RelPath = \"Main.cs\"" + cl); cs2.Append(" SubType = \"Code\"" + cl); cs2.Append(" BuildAction = \"Compile\"" + cl); cs2.Append(" />" + cl); cs2.Append(" </Include>" + cl); cs2.Append(" </Files>" + cl); cs2.Append(" </CSHARP>" + cl); cs2.Append("</VisualStudioProject>" + cl); writer = File.CreateText(outputDirectory.FullName + "\\SampleDevice.csproj"); writer.Write(cs2.ToString()); writer.Close(); Log("Copying UPnP.dll."); System.IO.File.Copy(AppStartPath + "\\UPnP.dll", outputDirectory.FullName + "\\UPnP.dll", true); Log("UPnP Stack Generation Complete."); return true; }
private void SetVersion(string v) { DText p = new DText(); if (v.IndexOf("-") == -1) { p.ATTRMARK = "."; } else { p.ATTRMARK = "-"; } p[0] = v; string mj = p[1]; string mn = p[2]; this.Major = 0; int.TryParse(mj, out this.Major); this.Minor = 0; int.TryParse(mn, out this.Minor); /* if (mj == "") { this.Major = 0; } else { this.Major = int.Parse(mj); } if (mn == "") { this.Minor = 0; } else { this.Minor = int.Parse(mn); } */ }
private void startMenuItem_Click(object sender, System.EventArgs e) { startMenuItem.Enabled = false; foreach (MenuItem i in pfcMenuItem.MenuItems) {i.Enabled = false;} foreach (MenuItem i in menuItem3.MenuItems) {i.Enabled = false;} InfoStringBox.Enabled = false; device = UPnPDevice.CreateRootDevice(900,1,""); device.UniqueDeviceName = Guid.NewGuid().ToString(); device.StandardDeviceType = "MediaRenderer"; device.FriendlyName = "Media Renderer (" + System.Net.Dns.GetHostName() + ")"; device.HasPresentation = false; device.Manufacturer = "OpenSource"; device.ManufacturerURL = "http://opentools.homeip.net/"; device.PresentationURL = "/"; device.HasPresentation = true; device.ModelName = "AV Renderer"; device.ModelDescription = "Media Renderer Device"; device.ModelURL = new Uri("http://opentools.homeip.net/"); UPnPService ts = new UPnPService(1, "EmptyService", "EmptyService", true, this); ts.AddMethod("NullMethod"); //device.AddService(ts); DText p = new DText(); p.ATTRMARK = "\r\n"; p[0] = this.InfoStringBox.Text; int len = p.DCOUNT(); ProtocolInfoString[] istring = new ProtocolInfoString[len]; for(int i=1;i<=len;++i) { istring[i-1] = new ProtocolInfoString(p[i]); } r = new AVRenderer(MaxConnections, istring, new AVRenderer.ConnectionHandler(NewConnectionSink)); r.OnClosedConnection += new AVRenderer.ConnectionHandler(ClosedConnectionSink); if (supportRecordMenuItem.Checked == false) { r.AVT.RemoveAction_Record(); } if (supportRecordQualityMenuItem.Checked == false) { r.AVT.RemoveAction_SetRecordQualityMode(); } if (supportNextContentUriMenuItem.Checked == false) { r.AVT.RemoveAction_SetNextAVTransportURI(); } if (MaxConnections == 0) { r.Manager.RemoveAction_PrepareForConnection(); r.Manager.RemoveAction_ConnectionComplete(); } r.AVT.GetUPnPService().GetStateVariableObject("CurrentPlayMode").AllowedStringValues = new String[3]{"NORMAL","REPEAT_ALL","INTRO"}; r.Control.GetUPnPService().GetStateVariableObject("A_ARG_TYPE_Channel").AllowedStringValues = new String[3]{"Master","LF","RF"}; r.Control.GetUPnPService().GetStateVariableObject("RedVideoBlackLevel").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("GreenVideoBlackLevel").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("BlueVideoBlackLevel").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("RedVideoGain").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("GreenVideoGain").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("BlueVideoGain").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("Brightness").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("Contrast").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("Sharpness").SetRange((ushort)0,(ushort)100,(ushort)1); r.Control.GetUPnPService().GetStateVariableObject("Volume").SetRange((UInt16)0,(UInt16)100,(ushort)1); device.AddService(r.Control); device.AddService(r.AVT); device.AddService(r.Manager); //device.AddDevice(r); device.StartDevice(); //r.Start(); }
private void MSEARCHSink(AsyncSocket sender, Byte[] buffer, int HeadPointer, int BufferSize, int BytesRead, IPEndPoint source, IPEndPoint remote) { HTTPMessage msg = HTTPMessage.ParseByteArray(buffer, HeadPointer, BufferSize); DText P = new DText(); string USN = msg.GetTag("USN"); string UDN; if (USN.IndexOf("::") != -1) { UDN = USN.Substring(0, USN.IndexOf("::")); } else { UDN = USN; } UDN = UDN.Substring(5); sender.BufferBeginPointer = BufferSize; if (TestDevice.GetDevice(UDN) == null) { return; } lock (MSEARCHTable) { this.sample += "\r\n" + msg.GetTag("ST"); MSEARCHTable[msg.GetTag("ST").Trim()] = ""; } }
/// <summary> /// Parses a Byte Array at a specific location, and builds a Packet. /// </summary> /// <param name="buffer">The Array of Bytes</param> /// <param name="indx">The Start Index</param> /// <param name="count">The number of Bytes to process</param> /// <returns></returns> public static HTTPMessage ParseByteArray(byte[] buffer, int indx, int count) { HTTPMessage TheMessage = new HTTPMessage(); UTF8Encoding UTF8 = new UTF8Encoding(); String TempData = UTF8.GetString(buffer,indx,count); DText parser = new DText(); String TempString; int idx = TempData.IndexOf("\r\n\r\n"); if (idx < 0) return null; TempData = TempData.Substring(0,idx); parser.ATTRMARK = "\r\n"; parser.MULTMARK = ":"; parser[0] = TempData; string CurrentLine = parser[1]; DText HdrParser = new DText(); HdrParser.ATTRMARK = " "; HdrParser.MULTMARK = "/"; HdrParser[0] = CurrentLine; if (CurrentLine.ToUpper().StartsWith("HTTP/")==true) { TheMessage.ResponseCode = int.Parse(HdrParser[2]); int s1 = CurrentLine.IndexOf(" "); s1 = CurrentLine.IndexOf(" ",s1+1); TheMessage.ResponseData = HTTPMessage.UnEscapeString(CurrentLine.Substring(s1)); try { TheMessage.Version = HdrParser[1,2]; } catch(Exception) { TheMessage.Version = "0.9"; } } else { TheMessage.Directive = HdrParser[1]; TempString = CurrentLine.Substring(CurrentLine.LastIndexOf(" ") + 1); if (TempString.ToUpper().StartsWith("HTTP/")==false) { TheMessage.Version = "0.9"; TheMessage.DirectiveObj = HTTPMessage.UnEscapeString(TempString); } else { TheMessage.Version = TempString.Substring(TempString.IndexOf("/")+1); int fs = CurrentLine.IndexOf(" ") + 1; TheMessage.DirectiveObj = HTTPMessage.UnEscapeString(CurrentLine.Substring( fs, CurrentLine.Length-fs-TempString.Length-1)); } } String Tag=""; String TagData=""; for(int line=2;line<=parser.DCOUNT();++line) { if (Tag!="" && parser[line,1].StartsWith(" ")) { TagData = parser[line,1].Substring(1); } else { Tag = parser[line,1]; TagData = ""; for(int i=2;i<=parser.DCOUNT(line);++i) { if (TagData=="") { TagData = parser[line,i]; } else { TagData = TagData + parser.MULTMARK + parser[line,i]; } } } TheMessage.AppendTag(Tag,TagData); } int cl=0; if (TheMessage.HasTag("Content-Length")) { try { cl = int.Parse(TheMessage.GetTag("Content-Length")); } catch(Exception) { cl = -1; } } else { cl = -1; } byte[] tbuffer; if (cl>0) { tbuffer = new byte[cl]; if ((idx+4+cl)>count) { // NOP } else { Array.Copy(buffer,idx+4,tbuffer,0,cl); TheMessage.DataBuffer = tbuffer; } } if (cl==-1) { tbuffer = new Byte[count-(idx+4)]; Array.Copy(buffer,idx+4,tbuffer,0,tbuffer.Length); TheMessage.DataBuffer = tbuffer; } if (cl==0) { TheMessage.DataBuffer = new byte[0]; } return(TheMessage); }
private void ReceiveSink(AsyncSocket sender, Byte[] buffer, int HeadPointer, int BufferSize, int BytesRead, IPEndPoint source, IPEndPoint remote) { DateTime EndTime = DateTime.Now; DText P = new DText(); HTTPMessage msg = HTTPMessage.ParseByteArray(buffer, 0, BufferSize); string USN = msg.GetTag("USN"); string UDN = USN; if (USN.IndexOf("::") != -1) { UDN = USN.Substring(0, USN.IndexOf("::")); } UDN = UDN.Substring(5); sender.BufferBeginPointer = BufferSize; if (UDN != TestDevice.UniqueDeviceName) return; string cc = msg.GetTag("Cache-Control"); P.ATTRMARK = "="; P[0] = cc; cc = P[2].Trim(); this.Cache = int.Parse(cc); DPA.AddDataPoint(EndTime.Subtract(StartTime)); MRE.Set(); }
private void BuildCertToolFiles_Service(UPnPService s, DirectoryInfo outputDir) { StringBuilder sb = new StringBuilder(); sb.Append("<scpd>"); sb.Append("<serviceStateTable>"); foreach(UPnPStateVariable v in s.GetStateVariables()) { sb.Append("<stateVariable>"); sb.Append("<name>"+v.Name+"</name>"); sb.Append("<sendEventsAttribute>"); if (v.SendEvent) { sb.Append("yes"); } else { sb.Append("no"); } sb.Append("</sendEventsAttribute>"); sb.Append("<dataType>"+v.ValueType+"</dataType>"); if (v.AllowedStringValues!=null && v.AllowedStringValues.Length>0) { sb.Append("<allowedValueList>"); foreach(string av in v.AllowedStringValues) { sb.Append("<allowedValue>"+av+"</allowedValue>"); } sb.Append("</allowedValueList>"); } sb.Append("</stateVariable>"); } sb.Append("</serviceStateTable>"); if (s.Actions.Count>0) { sb.Append("<actionList>"); foreach(UPnPAction a in s.Actions) { sb.Append("<action>"); sb.Append("<name>"+a.Name+"</name>"); if (a.ArgumentList.Length>0) { sb.Append("<argumentList>"); foreach(UPnPArgument ag in a.ArgumentList) { sb.Append("<argument>"); sb.Append("<name>"+ag.Name+"</name>"); sb.Append("<direction>"+ag.Direction+"</direction>"); sb.Append("<relatedStateVariable>"+ag.RelatedStateVar.Name+"</relatedStateVariable>"); sb.Append("</argument>"); } sb.Append("</argumentList>"); } sb.Append("</action>"); } sb.Append("</actionList>"); } sb.Append("</scpd>"); StreamWriter W; DText d = new DText(); d.ATTRMARK = ":"; d[0] = s.ServiceURN; W = File.CreateText(outputDir.FullName + "\\" + d[4] + s.Version.ToString() + ".xml"); W.Write(sb.ToString()); W.Close(); }
private void Handle_OnRequestUnmappedFile(MediaServerDevice sender, MediaServerDevice.FileNotMapped getPacket) { string path_query = getPacket.RequestedResource.ContentUri.Substring(DvMediaResource.AUTOMAPFILE.Length); DText path_queryParser = new DText(); if (getPacket.RequestedResource.Owner.Class.IsA(MediaBuilder.StandardMediaClasses.ImageItem)) { path_queryParser.ATTRMARK = "?"; path_queryParser.MULTMARK = "="; path_queryParser.SUBVMARK = ","; path_queryParser[0] = path_query; string path = path_queryParser[1]; string query = path_queryParser[2]; string format = path_queryParser[2,1]; string resolution = path_queryParser[2,2]; string resX = path_queryParser[2,2,1]; string resY = path_queryParser[2,2,2]; int width = int.Parse(resX); int height = int.Parse(resY); int max = Math.Max(width, height); Image image = Image.FromFile(path); Image thumbnail = image.GetThumbnailImage(width, height, null, IntPtr.Zero); getPacket.RedirectedStream = new MemoryStream(); thumbnail.Save(getPacket.RedirectedStream, ImageFormat.Jpeg); } else if ( (getPacket.RequestedResource.Owner.Class.IsA(MediaBuilder.StandardMediaClasses.PlaylistContainer)) || (getPacket.RequestedResource.Owner.Class.IsA(MediaBuilder.StandardMediaClasses.PlaylistItem)) ) { path_queryParser.ATTRMARK = "?"; path_queryParser.MULTMARK = "="; path_queryParser[0] = path_query; string path = path_queryParser[1]; string query = path_queryParser[2]; string format = path_queryParser[2,1]; string baseUrl = getPacket.LocalInterface; FileInfo fi = (FileInfo) ((DvMediaResource) getPacket.RequestedResource).Tag; //TODO: build m3u MemoryStream m3u = new MemoryStream((int)fi.Length * 5); StreamWriter sw = new StreamWriter(m3u, System.Text.Encoding.UTF8); getPacket.RedirectedStream = m3u; sw.Write("\n"); sw.Flush(); m3u.Position = 0; DvMediaContainer dvc = (DvMediaContainer) getPacket.RequestedResource.Owner; sw.WriteLine("#EXTM3U"); foreach (DvMediaItem dvi in dvc.CompleteList) { StringBuilder extInfo = new StringBuilder(dvi.Title.Length + dvi.Creator.Length + 15); StringBuilder uri = new StringBuilder(1024); //digital home looks for a single '-' to delimit creator/title extInfo.AppendFormat("#EXTINF:-1,{0} - {1}", dvi.Creator.Replace("-", "_"), dvi.Title.Replace("-", "_")); sw.WriteLine(extInfo.ToString()); IList resources = dvi.MergedResources; DvMediaResource res = resources[0] as DvMediaResource; if (res != null) { if (res.ContentUri.StartsWith(MediaResource.AUTOMAPFILE)) { uri.AppendFormat("http://{0}/{1}{2}", baseUrl, mediaServer.VirtualDirName, res.RelativeContentUri); } else { uri.Append(res.ContentUri); } sw.WriteLine(uri); } else { StringBuilder msg = new StringBuilder(); if (resources.Count == 0) { msg.AppendFormat("MediaServerCore.Handle_OnRequestUnmappedFile() encountered a media object ID=\"{0}\" Title=\"{1}\" with zero resources.", dvi.ID, dvi.Title); } else { msg.AppendFormat("MediaServerCore.Handle_OnRequestUnmappedFile() encountered a media object ID=\"{0}\" Title=\"{1}\" with resource that is not a DvMediaResource.", dvi.ID, dvi.Title); } OpenSource.Utilities.EventLogger.Log(msg.ToString()); } } sw.Flush(); } }
private void GenerateEventSchemas(UPnPDevice d, System.IO.DirectoryInfo dirInfo, bool cleanSchema) { System.IO.MemoryStream ms = new MemoryStream(); System.Xml.XmlTextWriter X = new System.Xml.XmlTextWriter(ms,System.Text.Encoding.UTF8); X.Formatting = System.Xml.Formatting.Indented; foreach(UPnPDevice ed in d.EmbeddedDevices) { GenerateEventSchemas(ed,dirInfo,cleanSchema); } foreach(UPnPService s in d.Services) { Hashtable h = new Hashtable(); int j=1; foreach(string sn in s.GetSchemaNamespaces()) { h[sn] = "CT"+j.ToString(); ++j; } X.WriteStartDocument(); X.WriteStartElement("xsd","schema","http://www.w3.org/2001/XMLSchema"); X.WriteAttributeString("targetNamespace","urn:schemas-upnp-org:event-1-0"); X.WriteAttributeString("xmlns","upnp",null,"http://www.upnp.org/Schema/DataTypes"); X.WriteAttributeString("xmlns","urn:schemas-upnp-org:event-1-0"); foreach(UPnPStateVariable v in s.GetStateVariables()) { if (v.SendEvent) { X.WriteStartElement("xsd","element",null); // Element1 X.WriteAttributeString("name","propertyset"); X.WriteAttributeString("type","propertysetType"); if (!cleanSchema) { X.WriteComment("Note: Some schema validation tools may consider the following xsd:any element to be ambiguous in its placement"); X.WriteStartElement("xsd","any",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("minOccurs","0"); X.WriteAttributeString("maxOccurs","unbounded"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); //ANY } X.WriteStartElement("xsd","complexType",null); X.WriteAttributeString("name","propertysetType"); X.WriteStartElement("xsd","sequence",null); X.WriteStartElement("xsd","element",null); // Element2 X.WriteAttributeString("name","property"); X.WriteAttributeString("maxOccurs","unbounded"); X.WriteStartElement("xsd","complexType",null); X.WriteStartElement("xsd","sequence",null); X.WriteStartElement("xsd","element",null); // Element3 X.WriteAttributeString("name",v.Name); if (v.ComplexType==null) { // Simple Type X.WriteStartElement("xsd","complexType",null); X.WriteStartElement("xsd","simpleContent",null); X.WriteStartElement("xsd","extension",null); X.WriteAttributeString("base","upnp:"+v.ValueType); if (!cleanSchema) { X.WriteStartElement("xsd","anyAttribute",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // anyAttribute } X.WriteEndElement(); // extension X.WriteEndElement(); // simpleContent X.WriteEndElement(); // complexType } else { // Complex Type X.WriteAttributeString("type",h[v.ComplexType.Name_NAMESPACE].ToString()+":"+v.ComplexType.Name_LOCAL); } X.WriteEndElement(); // Element3 if (!cleanSchema) { X.WriteStartElement("xsd","any",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("minOccurs","0"); X.WriteAttributeString("maxOccurs","unbounded"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // any } X.WriteEndElement(); // sequence if (!cleanSchema) { X.WriteStartElement("xsd","anyAttribute",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // anyAttribute } X.WriteEndElement(); // complexType X.WriteEndElement(); // Element2 if (!cleanSchema) { X.WriteStartElement("xsd","any",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("minOccurs","0"); X.WriteAttributeString("maxOccurs","unbounded"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // any } X.WriteEndElement(); // sequence if (!cleanSchema) { X.WriteStartElement("xsd","anyAttribute",null); X.WriteAttributeString("namespace","##other"); X.WriteAttributeString("processContents","lax"); X.WriteEndElement(); // anyAttribute } X.WriteEndElement(); // complexType; X.WriteEndElement(); // Element1 } } X.WriteEndElement(); // schema X.WriteEndDocument(); StreamWriter writer3; DText PP = new DText(); PP.ATTRMARK = ":"; PP[0] = s.ServiceURN; writer3 = File.CreateText(dirInfo.FullName + "\\"+PP[PP.DCOUNT()-1]+"_Events.xsd"); System.Text.UTF8Encoding U = new System.Text.UTF8Encoding(); X.Flush(); ms.Flush(); writer3.Write(U.GetString(ms.ToArray(),2,ms.ToArray().Length-2)); writer3.Close(); ms = new MemoryStream(); X = new System.Xml.XmlTextWriter(ms,System.Text.Encoding.UTF8); X.Formatting = System.Xml.Formatting.Indented; } }
// For files with filenames that have the format: "creator - title" private DvMediaItem CreateItemFromFormatedNameFile(FileInfo file) { string mime, mediaClass; MimeTypes.ExtensionToMimeType(file.Extension, out mime, out mediaClass); string protInfo = new System.Text.StringBuilder().AppendFormat("http-get:*:{0}:*", mime).ToString(); string ct = Path.GetFileNameWithoutExtension(file.Name); DText DT = new DText(); DT.ATTRMARK = "-"; string title; string creator; DT[0] = ct; if (DT.DCOUNT() == 1) { creator = ""; title = DT[1].Trim(); } else { creator = DT[1].Trim(); title = DT[2].Trim(); } MediaBuilder.item info = new MediaBuilder.item(title); info.creator = creator; DvMediaItem newMedia = DvMediaBuilder.CreateItem(info); //DvMediaResource res = DvResourceBuilder.CreateResource_HttpGet(file,false); ResourceBuilder.VideoItem resInfo = new ResourceBuilder.VideoItem(); resInfo.contentUri = DvMediaResource.AUTOMAPFILE + file.FullName; resInfo.protocolInfo = new ProtocolInfoString(protInfo); resInfo.size = new _ULong((ulong)file.Length); DvMediaResource res = DvResourceBuilder.CreateResource(resInfo, true); res.Tag = file; newMedia.AddResource(res); return newMedia; }