private void ReadCallback(IAsyncResult ar)
{
try
{
RequestState requestState = (RequestState)ar.AsyncState;
Stream responseStream = requestState.ResponseStream;
int bytes = responseStream.EndRead(ar);
if (bytes > 0)
{
for (int i = 0; i < bytes; i++)
{
if (requestState.MetaLength != 0)
{
requestState.MetaHeader += Convert.ToChar(requestState.Buffer[i]);
requestState.MetaLength--;
if (requestState.MetaLength <= 0)
{
string title = Regex.Match(requestState.MetaHeader, "(StreamTitle=')(.*)(';StreamUrl)").Groups[2].Value.Trim();
responseStream.Close(); //?
AllDone.Set(); //?
OnTitleReceived(title);
return;
}
}
else
{
if (Math.Max(System.Threading.Interlocked.Increment(ref requestState.MetaCount), requestState.MetaCount - 1) >= requestState.MetaInt)
{
requestState.MetaLength = Convert.ToInt32(requestState.Buffer[i]) * 16;
requestState.MetaCount = 0;
}
}
}
responseStream.BeginRead(requestState.Buffer, 0, RequestState.BufferSize, new AsyncCallback(ReadCallback), requestState);
return;
}
else
{
responseStream.Close();
}
}
catch { }
AllDone.Set();
}