internal void ReadNextDownloadResult() { m_streamReadState = StreamReadState.Response; m_streamBytesNeeded = ResponseLen; m_streamBytesRead = 0; m_nextFileCompleteEventArgs = new DownloadFinishedEventArgs { Result = DownloadResult.Failure }; BeginReadHeader(); }
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(); }