示例#1
0
 internal void ReadNextDownloadResult()
 {
     m_streamReadState           = StreamReadState.Response;
     m_streamBytesNeeded         = ResponseLen;
     m_streamBytesRead           = 0;
     m_nextFileCompleteEventArgs = new DownloadFinishedEventArgs {
         Result = DownloadResult.Failure
     };
     BeginReadHeader();
 }
示例#2
0
        private void EndReadHeader(IAsyncResult r)
        {
            var bytesRead = m_stream.EndRead(r);

            if (bytesRead <= 0)
            {
                return;
            }

            m_streamBytesRead += bytesRead;

            if (OnReadHeader != null)
            {
                OnReadHeader(m_streamBytesRead, m_streamReadBuffer);
            }

            if (m_streamBytesRead < m_streamBytesNeeded)
            {
                BeginReadHeader();
                return;
            }

            switch (m_streamReadState)
            {
            case StreamReadState.Response:
                if (Convert.ToChar(m_streamReadBuffer[0]) == '+')
                {
                    m_streamReadState   = StreamReadState.Size;
                    m_streamBytesNeeded = SizeLen;
                }
                else
                {
                    m_nextFileCompleteEventArgs.Result = DownloadResult.FileNotFound;
                    m_streamReadState   = StreamReadState.Id;
                    m_streamBytesNeeded = IdLen;
                }

                break;

            case StreamReadState.Size:
                m_nextFileCompleteEventArgs.Size = Util.ReadUInt64(m_streamReadBuffer, 0);
                m_streamReadState   = StreamReadState.Id;
                m_streamBytesNeeded = IdLen;
                break;

            case StreamReadState.Id:
                m_mutex.WaitOne();
                var next = m_downloadQueue.Peek();
                m_mutex.ReleaseMutex();
                m_nextFileCompleteEventArgs.DownloadItem = next;

                var match =
                    Util.ByteArraysAreEqual(next.Id.guid, 0, m_streamReadBuffer, 0, GuidLen) &&
                    Util.ByteArraysAreEqual(next.Id.hash, 0, m_streamReadBuffer, GuidLen, HashLen);

                if (!match)
                {
                    Close();
                    throw new InvalidDataException();
                }

                if (m_nextFileCompleteEventArgs.Result == DownloadResult.FileNotFound)
                {
                    OnDownloadFinished(m_nextFileCompleteEventArgs);
                }
                else
                {
                    var size = m_nextFileCompleteEventArgs.Size;
                    m_nextWriteStream   = next.GetWriteStream(size);
                    m_streamBytesNeeded = (int)size;
                    m_streamBytesRead   = 0;
                    BeginReadData();
                }

                return;

            default:
                throw new ArgumentOutOfRangeException();
            }

            m_streamBytesRead = 0;
            BeginReadHeader();
        }