protected void PositionInfoSink(CpAVTransport sender, UInt32 InstanceID,
                                        UInt32 Track,
                                        string TrackDuration,
                                        string TrackMetaData,
                                        string TrackURI,
                                        string RelTime,
                                        string AbsTime,
                                        int RelCount,
                                        int AbsCount,
                                        UPnPInvokeException e,
                                        object Handle)
        {
            DText p = new DText();

            p.ATTRMARK = ":";
            try
            {
                p[0]             = TrackDuration;
                _CurrentDuration = new TimeSpan(int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3]));
            }
            catch (Exception)
            {
            }

            try
            {
                p[0]             = RelTime;
                _CurrentPosition = new TimeSpan(int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3]));
            }
            catch (Exception)
            {
            }

            if (OnCurrentPositionChanged != null)
            {
                OnCurrentPositionChanged(this);
            }

            _CurrentTrack  = Track;
            this._TrackURI = HTTPMessage.UnEscapeString(TrackURI);
            if (this.OnTrackURIChanged != null)
            {
                OnTrackURIChanged(this);
            }
            if (OnCurrentTrackChanged != null)
            {
                OnCurrentTrackChanged(this);
            }
            lock (this)
            {
                --StateCounter;
                if (StateCounter == 0)
                {
                    if (OnReady != null)
                    {
                        OnReady(this);
                    }
                }
            }
        }
コード例 #2
0
        protected override void RunAlice()
        {
            MemoryStream  msStream = new MemoryStream();
            NetworkStream sIn      = StreamAlice;
            NetworkStream sOut     = StreamBob;

            try
            {
                while (bSouldRun)
                {
                    int         iLen         = 0;
                    HTTPRequest htreq        = new eExNetworkLibrary.HTTP.HTTPRequest(sIn, out iLen);
                    HTTPMessage htreqForward = ModifyRequest(htreq);
                    if (htreqForward != null)
                    {
                        byte[] bData = htreqForward.RawBytes;
                        sOut.Write(bData, 0, bData.Length);
                        sOut.Flush();
                    }
                }
            }
            catch (HTTPParserStreamEndedException ex)
            { }
            catch (ObjectDisposedException ex)
            { throw new NetworkStreamModifierException("A network stream was forcibly closed, but " + this.ToString() + " still had data to write.", ex); }
        }
        private HTTPMessage Request(Uri GetUri, bool isGetRequest, bool isHttp1_1)
        {
            directiveObjTextBox.Text = GetUri.PathAndQuery;

            IPAddress Addr = null;

            try
            {
                if (GetUri.HostNameType == UriHostNameType.Dns)
                {
                    Addr = Dns.GetHostEntry(GetUri.Host).AddressList[0];
                }
                else
                {
                    Addr = IPAddress.Parse(GetUri.Host);
                }
            }
            catch (Exception)
            {
                return(null);
            }
            if (Addr == null)
            {
                return(null);
            }

            IPEndPoint ep = new IPEndPoint(Addr, GetUri.Port);

            // NKIDD - ADDED support for requesting GET/HEAD 1.0/1.1

            HTTPMessage req = null;

            if (isHttp1_1)
            {
                req = new HTTPMessage();
            }
            else
            {
                req = new HTTPMessage("1.0");
            }

            if (isGetRequest)
            {
                req.Directive = "GET";
            }
            else
            {
                req.Directive = "HEAD";
            }

            req.DirectiveObj = HTTPMessage.UnEscapeString(GetUri.PathAndQuery);
            req.AddTag("Host", ep.ToString());

            this.Text = "Device Sniffer - " + GetUri.AbsoluteUri;

            SniffText.Text = "";
            GetText.Text   = "";

            return(req);
        }
コード例 #4
0
 protected void SniffPacketSink(UPnPService sender, HTTPMessage MSG)
 {
     if (OnSniffPacket != null)
     {
         OnSniffPacket(this, MSG);
     }
 }
コード例 #5
0
        protected override void RunBob()
        {
            MemoryStream  msStream = new MemoryStream();
            NetworkStream sIn      = StreamBob;
            NetworkStream sOut     = StreamAlice;

            try
            {
                while (bSouldRun)
                {
                    HTTPResponse htrsp        = new HTTPResponse(sIn);
                    HTTPMessage  htrspForward = ModifyResponse(htrsp);
                    if (htrspForward != null)
                    {
                        byte[] bData = htrspForward.RawBytes;
                        sOut.Write(bData, 0, bData.Length);
                        sOut.Flush();
                    }
                }
            }
            catch (HTTPParserStreamEndedException ex)
            { }
            catch (ObjectDisposedException ex)
            { throw new NetworkStreamModifierException("A network stream was forcibly closed, but " + this.ToString() + " still had data to write.", ex); }
        }
コード例 #6
0
        protected void GetMediaInfoSink(System.UInt32 InstanceID, out System.UInt32 NrTracks, out System.String MediaDuration, out System.String CurrentURI, out System.String CurrentURIMetaData, out System.String NextURI, out System.String NextURIMetaData, out DvAVTransport.Enum_PlaybackStorageMedium PlayMedium, out DvAVTransport.Enum_RecordStorageMedium RecordMedium, out DvAVTransport.Enum_RecordMediumWriteStatus WriteStatus)
        {
            if (ID_Table.ContainsKey(InstanceID) == false)
            {
                throw(new UPnPCustomException(802, InstanceID.ToString() + " is not a valid InstanceID"));
            }
            else
            {
                AVConnection c = (AVConnection)ID_Table[InstanceID];
                NrTracks      = c._NumberOfTracks;
                MediaDuration = string.Format("{0:00}", c._Duration.Hours) + ":" + string.Format("{0:00}", c._Duration.Minutes) + ":" + string.Format("{0:00}", c._Duration.Seconds);
                if (c._CurrentURI == null)
                {
                    CurrentURI = "";
                }
                else
                {
                    CurrentURI = HTTPMessage.UnEscapeString(c._CurrentURI.AbsoluteUri);
                }
                if (c._NextURI == null)
                {
                    NextURI = "";
                }
                else
                {
                    NextURI = HTTPMessage.UnEscapeString(c._NextURI.AbsoluteUri);
                }

                CurrentURIMetaData = c._CurrentURIMetaData;
                NextURIMetaData    = c._NextURIMetaData;
                PlayMedium         = c._PlaybackMedium;
                RecordMedium       = c._RecordMedium;
                WriteStatus        = c._WriteStatus;
            }
        }
コード例 #7
0
        private string ConvertLocalFileToHTTPResource(IMediaResource resource)
        {
            if (resource.ContentUri.StartsWith(MediaResource.AUTOMAPFILE))
            {
                // Map File
                string tempName = resource.ContentUri.Substring(MediaResource.AUTOMAPFILE.Length);
                string fileName = tempName.GetHashCode().ToString() + "/" + tempName.Substring(tempName.LastIndexOf("\\") + 1);

                if (resource.Owner != null)
                {
                    fileName = tempName.GetHashCode().ToString() + "/" + resource.Owner.Creator + "  -  " + resource.Owner.Title + tempName.Substring(tempName.LastIndexOf("."));
                    //					fileName = tempName.GetHashCode().ToString() + "/" + tempName.Substring(tempName.LastIndexOf("."));
                }
                FileInfoTable[tempName.GetHashCode().ToString()] = tempName;
                CheckMiniWebServer();

                string path = "http://" + _AVR.device.InterfaceToHost.ToString() + ":" + MWS.LocalIPEndPoint.Port.ToString() + "/" + fileName;
                return(HTTPMessage.EscapeString(path));
            }
            else
            {
                // Don't Map File
                return(resource.ContentUri);
            }
        }
コード例 #8
0
        private void SendErrorMessage(HTTPSession webSession, Stream stream)
        {
            try
            {
                if (stream != null)
                {
                    webSession.CloseStreamObject(stream);
                    stream.Dispose();
                    stream = null;
                }

                HTTPMessage error = new HTTPMessage();
                error.StatusCode   = 404;
                error.StatusData   = "Error";
                error.StringBuffer = "Error";
                webSession.Send(error);
            }
            catch (Exception ex)
            {
                Utils.WriteException(ex);
            }
            finally
            {
                AllowSystemStandBy();
            }
        }
        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()] = "";
            }
        }
コード例 #10
0
        public override bool IsMatch(HTTPMessage httpMessage)
        {
            bool bResult = false;

            if (httpMessage.MessageType == HTTPMessageType.Response && EvaluateRequestForResponse && bLastRequestWasMatch)
            {
                bResult = true;
            }
            else
            {
                foreach (HTTPHeader hHeader in httpMessage.Headers[Header])
                {
                    if (System.Text.RegularExpressions.Regex.IsMatch(hHeader.Value, Pattern))
                    {
                        bResult = true;
                        break;
                    }
                }

                if (httpMessage.MessageType == HTTPMessageType.Request)
                {
                    bLastRequestWasMatch = bResult;
                }
            }

            bool bBaseResult = base.IsMatch(httpMessage);

            return(bResult && bBaseResult);
        }
        private void ReceiveSink2(AsyncSocket sender, Byte[] buffer, int HeadPointer, int BufferSize, int BytesRead, IPEndPoint source, IPEndPoint remote)
        {
            HTTPMessage msg = HTTPMessage.ParseByteArray(buffer, 0, BufferSize);

            if (msg.Directive != "NOTIFY")
            {
                sender.BufferBeginPointer = BufferSize;
                return;
            }

            string USN = msg.GetTag("USN");
            string UDN;

            if (USN.IndexOf("::") != -1)
            {
                UDN = USN.Substring(0, USN.IndexOf("::"));
            }
            else
            {
                UDN = USN;
            }
            UDN = UDN.Substring(5);

            if (msg.GetTag("NTS").Trim() == "ssdp:alive")
            {
                if (TestDevice.GetDevice(UDN) != null)
                {
                    NotifyTable[msg.GetTag("NT")] = DateTime.Now;
                }
            }

            sender.BufferBeginPointer = BufferSize;
        }
        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();
        }
 public void AddPacket(HTTPMessage packet)
 {
     packets.Add(packet);
     if (this.OnPacketTraceChanged != null)
     {
         OnPacketTraceChanged(this, packet);
     }
 }
        /// <summary>
        /// This method returns a resource URI in string form, such that the
        /// URI is not a URI using the
        /// <see cref="MediaResource.AUTOMAPFILE"/>
        /// protocol.
        /// </summary>
        /// <param name="baseUri">the base http URL. If null, then the original local path is printed. If empty string, then only the relative portion of URI is printed.</param>
        /// <returns>A URI not using the
        /// <see cref="MediaResource.AUTOMAPFILE"/>
        /// protocol.
        /// </returns>
        internal string EnsureNonAutoMapProtocol(string baseUri)
        {
            IUPnPMedia item = this.m_Owner;

            if (this.ContentUri.StartsWith(AUTOMAPFILE))
            {
                if (baseUri == null)
                {
                    return(this.ContentUri);
                }

                if (this.m_LocalFileExists)
                {
                    StringBuilder uri    = new StringBuilder(this.ContentUri.Length);
                    int           dotpos = this.ContentUri.LastIndexOf('.');

                    string ext = "";
                    if (this.OverrideFileExtenstion == null)
                    {
                        if ((dotpos > 0) && (dotpos < this.ContentUri.Length - 1))
                        {
                            ext = this.ContentUri.Substring(dotpos);
                        }

                        int querypos = ext.IndexOf('?');
                        if ((querypos > 0) && (querypos < ext.Length - 1))
                        {
                            ext = ext.Substring(0, querypos);
                        }
                    }
                    else
                    {
                        if (this.OverrideFileExtenstion.StartsWith("."))
                        {
                            ext = this.OverrideFileExtenstion;
                        }
                        else
                        {
                            ext = "." + this.OverrideFileExtenstion;
                        }
                    }

                    uri.Append(baseUri);
                    uri.AppendFormat("/{0}/{1}/{2} - {3}{4}", this.m_ResourceID, item.ID, item.Creator, item.Title, ext);
                    string uriString = HTTPMessage.EscapeString(uri.ToString());

                    return(uriString);
                }
                else
                {
                    return("");
                }
            }
            else
            {
                return(this.ContentUri);
            }
        }
        private void BadMSEARCHSink(AsyncSocket sender, Byte[] buffer, int HeadPointer, int BufferSize, int BytesRead, IPEndPoint source, IPEndPoint remote)
        {
            HTTPMessage msg = HTTPMessage.ParseByteArray(buffer, HeadPointer, BufferSize);

            if (remote.Address.ToString() == TestDevice.RemoteEndPoint.Address.ToString())
            {
                lock (MSEARCHTable)
                {
                    MSEARCHTable[remote.Address.ToString()] = msg;
                }
            }
        }
        private void SubscribeSink(HTTPRequest sender, HTTPMessage MSG, object Tag)
        {
            if (MSG != null)
            {
                AddPacket(MSG);

                if (MSG.StatusCode == 200)
                {
                    SID = MSG.GetTag("SID");
                }
            }
            MRE.Set();
        }
コード例 #17
0
        public override bool IsMatch(HTTPMessage httpMessage)
        {
            bool bResult = false;

            if (httpMessage.Headers.Contains("Content-Type"))
            {
                bResult = httpMessage.Headers["Content-Type"][0].Value.ToLower().Contains("image");
            }

            bool bBaseResult = base.IsMatch(httpMessage);

            return(bResult && bBaseResult);
        }
        private void CancelSink(HTTPRequest sender, HTTPMessage MSG, object Tag)
        {
            if (MSG != null)
            {
                AddPacket(MSG);

                if (MSG.StatusCode == 200)
                {
                    SID = "CANCELED";
                }
            }
            MRE.Set();
        }
コード例 #19
0
ファイル: ContentHandler.cs プロジェクト: L2N6H5B3/SoftSled2
        public HTTPMessage HandleContent(string GetWhat, System.Net.IPEndPoint local, HTTPMessage msg, HTTPSession WebSession)
        {
            System.Diagnostics.Debug.WriteLine("HandleContent GetWhat = '" + GetWhat + "'");
            HTTPMessage message = new HTTPMessage();

            message.StatusCode = 200;
            message.StatusData = "OK";
            string tagData = "text/xml";

            message.BodyBuffer = new System.Text.ASCIIEncoding().GetBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?><blah>" + GetWhat + "</blah>");
            message.AddTag("Content-Type", tagData);
            WebSession.Send(message);

            return(null);
        }
        private void grabHttpPacket(XmlElement packetElement)
        {
            string packetString = packetElement.InnerText;

            System.Text.UTF8Encoding utf8    = new System.Text.UTF8Encoding();
            System.Text.Encoder      utf8Enc = utf8.GetEncoder();
            char [] packetChars = packetString.ToCharArray();
            int     len         = packetChars.Length;

            byte [] packetBytes = new byte[len];
            utf8Enc.GetBytes(packetChars, 0, len, packetBytes, 0, true);

            HTTPMessage m = HTTPMessage.ParseByteArray(packetBytes);

            packets.Add(m);
        }
        private HTTPMessage[] MSEARCH(UPnPDevice device)
        {
            ArrayList PacketList = new ArrayList();

            foreach (UPnPDevice d in device.EmbeddedDevices)
            {
                foreach (HTTPMessage m in MSEARCH(d))
                {
                    PacketList.Add(m);
                }
            }

            HTTPMessage rq;

            rq              = new HTTPMessage();
            rq.Directive    = "M-SEARCH";
            rq.DirectiveObj = "*";
            rq.AddTag("MX", "5");
            rq.AddTag("ST", "uuid:" + device.UniqueDeviceName);
            rq.AddTag("Host", "239.255.255.250:1900");
            rq.AddTag("MAN", "\"ssdp:discover\"");
            PacketList.Add(rq);

            rq              = new HTTPMessage();
            rq.Directive    = "M-SEARCH";
            rq.DirectiveObj = "*";
            rq.AddTag("MX", "5");
            rq.AddTag("ST", device.DeviceURN);
            rq.AddTag("Host", "239.255.255.250:1900");
            rq.AddTag("MAN", "\"ssdp:discover\"");
            PacketList.Add(rq);

            foreach (UPnPService s in device.Services)
            {
                rq              = new HTTPMessage();
                rq.Directive    = "M-SEARCH";
                rq.DirectiveObj = "*";
                rq.AddTag("MX", "5");
                rq.AddTag("ST", s.ServiceURN);
                rq.AddTag("Host", "239.255.255.250:1900");
                rq.AddTag("MAN", "\"ssdp:discover\"");
                PacketList.Add(rq);
            }

            return((HTTPMessage[])PacketList.ToArray(typeof(HTTPMessage)));
        }
コード例 #22
0
        public void Search(string SearchString, IPEndPoint ep)
        {
            HTTPMessage request = new HTTPMessage();

            request.Directive    = "M-SEARCH";
            request.DirectiveObj = "*";
            if (ep.AddressFamily == AddressFamily.InterNetwork)
            {
                request.AddTag("HOST", ep.ToString());                                                 // "239.255.255.250:1900"
            }
            if (ep.AddressFamily == AddressFamily.InterNetworkV6)
            {
                request.AddTag("HOST", string.Format("[{0}]:{1}", ep.Address.ToString(), ep.Port));                                                   // "[FF05::C]:1900" or "[FF02::C]:1900"
            }
            request.AddTag("MAN", "\"ssdp:discover\"");
            request.AddTag("MX", "10");
            request.AddTag("ST", SearchString);
            SearchEx(System.Text.UTF8Encoding.UTF8.GetBytes(request.StringPacket), ep);
        }
コード例 #23
0
        /// <summary>
        /// Checkes whether this rule matches a given message.
        /// </summary>
        /// <param name="httpMessage">The HTTP message to match</param>
        public virtual bool IsMatch(HTTPMessage httpMessage)
        {
            bool bResult = false;

            lock (lChildRules)
            {
                if (lChildRules.Count == 0)
                {
                    return(true); //Nothing to validate
                }
                foreach (HTTPStreamModifierCondition htCondition in lChildRules)
                {
                    if (htCondition.IsMatch(httpMessage))
                    {
                        bResult = true;
                    }
                }
            }

            return(bResult);
        }
コード例 #24
0
        private UserAgent GetUserAgent()
        {
            HTTPMessage headers = GetUPnPService().GetWebSession().Headers;

            if (headers != null)
            {
                string userAgent = headers.GetTag("User-Agent");
                if (!String.IsNullOrWhiteSpace(userAgent))
                {
                    if (userAgent.Contains("fbxupnpav/6.0"))
                    {
                        return(UserAgent.FreeboxV6);
                    }

                    if (userAgent.Contains("fbxupnpav/1.0") || userAgent.Contains("libfbxhttp"))
                    {
                        return(UserAgent.FreeboxV5);
                    }
                }
            }
            return(UserAgent.Other);
        }
コード例 #25
0
        public override HTTPMessage ApplyAction(HTTPMessage httpMessage)
        {
            ImageFormat imgFormat = GetImageFormat(httpMessage.Headers["Content-Type"][0].Value.ToLower());

            if (imgFormat == null)
            {
                throw new InvalidOperationException("Unknown image format " + httpMessage.Headers["Content-Type"][0].Value);
            }


            Bitmap img = new Bitmap(new MemoryStream(httpMessage.Payload));

            img = ModifyImage(img);

            MemoryStream msSave = new MemoryStream();

            img.Save(msSave, imgFormat);
            httpMessage.Payload = msSave.ToArray();

            img.Dispose();
            msSave.Dispose();

            return(httpMessage);
        }
 private void AddHTTPMessage(HTTPMessage msg)
 {
     AddPacket(msg);
 }
 private void SniffPacketSink(UPnPServiceWatcher sender, HTTPMessage MSG)
 {
     AddPacket(MSG);
 }
コード例 #28
0
 /// <summary>
 /// Applys an actions to this HTTP Message
 /// </summary>
 /// <param name="httpMessage">The HTTP message to edit</param>
 /// <returns>The edited HTTP message</returns>
 public abstract HTTPMessage ApplyAction(HTTPMessage httpMessage);
        private HTTPMessage Request()
        {
            HTTPMessage RetVal = null;

            if (this.Visible == false)
            {
                Show();
            }
            else
            {
                Activate();
            }

            Uri uri;

            try
            {
                uri = new Uri(addressTextBox.Text);
            }
            catch
            {
                SniffText.Text = "Invalid Request URI";
                GetText.Text   = "Invalid Request URI";
                return(null);
            }

            SniffText.Text = "";
            GetText.Text   = "";

            if (MethodBox.SelectedIndex == 0)
            {
                // GET 1.0
                RetVal = Request(uri, true, false);
            }
            else if (MethodBox.SelectedIndex == 1)
            {
                // GET 1.1
                RetVal = Request(uri, true, true);
            }
            else if (MethodBox.SelectedIndex == 2)
            {
                // HEAD 1.0
                RetVal = Request(uri, false, false);
            }
            else if (MethodBox.SelectedIndex == 3)
            {
                // HEAD 1.1
                RetVal = Request(uri, false, true);
            }
            else if (MethodBox.SelectedIndex == 4)
            {
                HTTPMessage msg = new HTTPMessage();
                msg.Directive    = directiveTextBox.Text;
                msg.DirectiveObj = directiveObjTextBox.Text;

                if (versionComboBox.SelectedIndex == 0)
                {
                    msg.Version = "0.9";
                }
                if (versionComboBox.SelectedIndex == 1)
                {
                    msg.Version = "1.0";
                }
                if (versionComboBox.SelectedIndex == 2)
                {
                    msg.Version = "1.1";
                }

                try
                {
                    bool addreturn = false;
                    if (fieldsTextBox.Text.EndsWith("\r\n") == false)
                    {
                        fieldsTextBox.Text += "\r\n";
                        addreturn           = true;
                    }
                    int pos = 0;
                    while (pos != -1)
                    {
                        int s1 = fieldsTextBox.Text.IndexOf(":", pos);
                        int s2 = fieldsTextBox.Text.IndexOf("\r\n", pos);
                        if (s1 == -1 || s2 == -1)
                        {
                            break;
                        }
                        msg.AppendTag(fieldsTextBox.Text.Substring(pos, s1 - pos), fieldsTextBox.Text.Substring(s1 + 1, s2 - s1 - 1));
                        pos = s2 + 2;
                    }
                    if (addreturn == true)
                    {
                        fieldsTextBox.Text = fieldsTextBox.Text.Substring(0, fieldsTextBox.Text.Length - 2);
                    }
                }
                catch { }
                msg.StringBuffer = bodyTextBox.Text;

                RetVal = msg;
            }

            if (RetVal == null)
            {
                SniffText.Text = "Invalid Request URI";
                GetText.Text   = "Invalid Request URI";
            }

            return(RetVal);
        }
 private void ReceiveSink(HTTPSession sender, HTTPMessage msg)
 {
     GetText.Text = msg.StringPacket;
 }
コード例 #31
0
ファイル: AVPlayList.cs プロジェクト: Scannow/SWYH
        /// <summary>
        /// This method gets called when a new Request is received
        /// </summary>
        /// <param name="request"></param>
        /// <param name="WebSession"></param>
        protected void ReceiveSink(HTTPMessage request, HTTPSession WebSession)
        {
            HTTPMessage rsp = new HTTPMessage();
            UTF8Encoding U = new UTF8Encoding();

            if ((request.Directive == "HEAD") ||
                (request.Directive == "GET"))
            {
                if (request.DirectiveObj == "/item.m3u")
                {/*
					rsp.StatusCode = 200;
					rsp.StatusData = "OK";
					rsp.ContentType = "audio/mpegurl";
					rsp.StringBuffer = M3UString;
					*/

                    string r = request.GetTag("Range");
                    if (r == "")
                    {
                        rsp.StatusCode = 200;
                        rsp.StatusData = "OK";
                        rsp.ContentType = "audio/mpegurl";
                        rsp.StringBuffer = M3UString;
                    }
                    else
                    {
                        rsp.StatusCode = 206;
                        rsp.StatusData = "Partial Content";
                        rsp.ContentType = "audio/mpegurl";

                        DText rp0 = new DText();
                        rp0.ATTRMARK = "=";
                        rp0[0] = r;
                        DText rp = new DText();
                        rp.ATTRMARK = "-";
                        rp[0] = rp0[2].Trim();
                        if (rp[1] == "")
                        {
                            // LastBytes
                            try
                            {
                                if (int.Parse(rp[2]) > M3UString.Length)
                                {
                                    rsp.AddTag("Content-Range", "bytes 0-" + M3UString.Length.ToString() + "/" + M3UString.Length.ToString());
                                    rsp.StringBuffer = M3UString;
                                }
                                else
                                {
                                    rsp.AddTag("Content-Range", "bytes " + (M3UString.Length - int.Parse(rp[2])).ToString() + "-" + M3UString.Length.ToString() + "/" + M3UString.Length.ToString());
                                    rsp.StringBuffer = M3UString.Substring(M3UString.Length - int.Parse(rp[2]));
                                }
                            }
                            catch (Exception)
                            {
                                rsp = new HTTPMessage();
                                rsp.StatusCode = 400;
                                rsp.StatusData = "Bad Request";
                            }
                        }
                        else if (rp[2] == "")
                        {
                            // Offset till end
                            try
                            {
                                rsp.AddTag("Content-Range", "bytes " + rp[1] + "-" + M3UString.Length.ToString() + "/" + M3UString.Length.ToString());
                                rsp.StringBuffer = M3UString.Substring(int.Parse(rp[1]));
                            }
                            catch (Exception)
                            {
                                rsp = new HTTPMessage();
                                rsp.StatusCode = 400;
                                rsp.StatusData = "Bad Request";
                            }

                        }
                        else
                        {
                            // Range
                            try
                            {
                                if (int.Parse(rp[2]) > M3UString.Length + 1)
                                {
                                    rsp.AddTag("Content-Range", "bytes " + rp[1] + "-" + (M3UString.Length - 1).ToString() + "/" + M3UString.Length.ToString());
                                    rsp.StringBuffer = M3UString.Substring(int.Parse(rp[1]));
                                }
                                else
                                {
                                    rsp.AddTag("Content-Range", "bytes " + rp[1] + "-" + rp[2] + "/" + M3UString.Length.ToString());
                                    rsp.StringBuffer = M3UString.Substring(int.Parse(rp[1]), 1 + int.Parse(rp[2]) - int.Parse(rp[1]));
                                }
                            }
                            catch (Exception)
                            {
                                rsp = new HTTPMessage();
                                rsp.StatusCode = 400;
                                rsp.StatusData = "Bad Request";
                            }
                        }
                    }
                }
                else
                {
                    try
                    {
                        int i = request.DirectiveObj.LastIndexOf("/");
                        string tmp = request.DirectiveObj.Substring(1, i - 1);
                        bool hasRange = true;
                        if (tmp.IndexOf("/") != -1)
                        {
                            tmp = tmp.Substring(0, tmp.IndexOf("/"));
                        }

                        if (FileInfoTable.ContainsKey(tmp))
                        {
                            FileInfo f;
                            if (FileInfoTable[tmp].GetType() == typeof(string))
                            {
                                f = new FileInfo((string)FileInfoTable[tmp]);
                                FileInfoTable[tmp] = f;
                            }
                            else
                            {
                                f = (FileInfo)FileInfoTable[tmp];
                            }
                            ProtocolInfoString pis = ProtocolInfoString.CreateHttpGetProtocolInfoString(f);
                            rsp.StatusCode = 200;
                            rsp.StatusData = "OK";
                            rsp.ContentType = pis.MimeType;
                            if (request.Directive == "HEAD")
                            {
                                rsp.AddTag("Content-Length", f.Length.ToString());
                                rsp.OverrideContentLength = true;
                            }
                            else
                            {
                                HTTPSession.Range[] RNG = null;
                                if (request.GetTag("Range") != "")
                                {
                                    long x, y;
                                    ArrayList RList = new ArrayList();
                                    DText rp = new DText();
                                    rp.ATTRMARK = "=";
                                    rp.MULTMARK = ",";
                                    rp.SUBVMARK = "-";
                                    rp[0] = request.GetTag("Range");

                                    for (int I = 1; I <= rp.DCOUNT(2); ++I)
                                    {
                                        if (rp[2, I, 1] == "")
                                        {
                                            // Final Bytes
                                            y = long.Parse(rp[2, I, 2].Trim());
                                            x = f.Length - y;
                                            y = x + y;
                                        }
                                        else if (rp[2, I, 2] == "")
                                        {
                                            // Offset till end
                                            x = long.Parse(rp[2, I, 1].Trim());
                                            y = f.Length - x;
                                        }
                                        else
                                        {
                                            // Full Range
                                            x = long.Parse(rp[2, I, 1].Trim());
                                            y = long.Parse(rp[2, I, 2].Trim());
                                        }
                                        RList.Add(new HTTPSession.Range(x, 1 + y - x));
                                    }
                                    RNG = (HTTPSession.Range[])RList.ToArray(typeof(HTTPSession.Range));
                                }
                                else
                                {
                                    hasRange = false;
                                }

                                if (request.Version == "1.0")
                                {
                                    WebSession.OnStreamDone += new HTTPSession.StreamDoneHandler(DoneSink);
                                }
                                //								((HTTPMessage)(new UPnPDebugObject(WebSession)).GetField("Headers")).Version = "1.0";
                                if (hasRange)
                                {
                                    WebSession.SendStreamObject(f.OpenRead(), RNG, pis.MimeType);
                                }
                                else
                                {
                                    FileStream fs = f.OpenRead();
                                    long length = fs.Length;
                                    WebSession.SendStreamObject(fs, length, pis.MimeType);
                                }
                                return;
                            }
                        }
                        else
                        {
                            rsp.StatusCode = 404;
                            rsp.StatusData = "Not Found";
                        }
                    }
                    catch (Exception)
                    {
                        rsp.StatusCode = 404;
                        rsp.StatusData = "Not Found";
                    }
                }
                WebSession.Send(rsp);
                return;
            }

            rsp.StatusCode = 500;
            rsp.StatusData = "Not implemented";
            WebSession.Send(rsp);
        }