{
asyncResult.SetComplete(preReadSize);
}
+ else if (recordStream.Position < recordStream.Length) {
+ InternalReadCallback_inner (asyncResult, recbuf, new object[] { recbuf, asyncResult }, false, 0);
+ }
else if (!this.context.ReceivedConnectionEnd)
{
// this will read data from the network until we have (at least) one
return;
}
+ InternalReadCallback_inner(internalResult, recbuf, state, true, n);
+ }
+ catch (Exception ex)
+ {
+ internalResult.SetComplete(ex);
+ }
+
+ }
+
+ // read encrypted data until we have enough to decrypt (at least) one
+ // record and return are the records (may be more than one) we have
+ private void InternalReadCallback_inner(InternalAsyncResult internalResult, byte[] recbuf, object[] state, bool didRead, int n)
+ {
+ if (this.disposed)
+ return;
+
+ try
+ {
bool dataToReturn = false;
long pos = recordStream.Position;
pos = 0;
}
- if (!dataToReturn && (n > 0))
+ if (!dataToReturn && (!didRead || (n > 0)))
{
if (context.ReceivedConnectionEnd) {
internalResult.SetComplete (0);
{
internalResult.SetComplete(ex);
}
-
}
private void InternalBeginWrite(InternalAsyncResult asyncResult)
if (remainder > 0) {
recordStream.Write (outofrecord, 0, outofrecord.Length);
+ recordStream.Position = 0;
}
if (dataToReturn) {