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);
            }
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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));
            }
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 10
0
        /// <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);
        }
Exemplo n.º 11
0
		/// <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));
            }
        }
Exemplo n.º 13
0
        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;
            }
        }
Exemplo n.º 18
0
        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);
            }
        }
Exemplo n.º 19
0
		/// <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();
		}
Exemplo n.º 20
0
        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();
        }
Exemplo n.º 21
0
        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);
        }
Exemplo n.º 22
0
        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;
            }
        }
Exemplo n.º 23
0
        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;
        }
Exemplo n.º 24
0
        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;
        }
Exemplo n.º 25
0
        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);
            }
        }
Exemplo n.º 26
0
        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;
        }
Exemplo n.º 28
0
        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);
            }
            */
        }
Exemplo n.º 29
0
        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()] = "";
            }
        }
Exemplo n.º 31
0
        /// <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;
        }