Skip to content

Instantly share code, notes, and snippets.

@arturaz
Created January 2, 2015 11:38
Show Gist options
  • Save arturaz/72c67e4b20f298b3ebea to your computer and use it in GitHub Desktop.
Save arturaz/72c67e4b20f298b3ebea to your computer and use it in GitHub Desktop.
private void readFrame(
byte[] buffer, int frameLength, int leftToRead, Ref<bool> continueReading,
Act<Try<Messages.Messages.FromServer>> callback
) {
Log.debug(string.Format(
"Entering #readFrame(frameLength={0}, leftToRead={1})", frameLength, leftToRead
));
var stream = tcp.GetStream();
stream.BeginRead(buffer, frameLength - leftToRead, leftToRead, ar => {
var bytesRead = stream.EndRead(ar);
if (bytesRead == leftToRead) {
Log.debug(string.Format("Read frame of size {0}", frameLength));
Log.trace(string.Format("Buf: {0}", BitConverter.ToString(buffer)));
try {
var parsed = Messages.Messages.FromServer.ParseFrom(buffer);
ASync.OnMainThread(() => callback(F.scs(parsed)));
}
catch (Exception e) {
Log.error(e);
Log.error(string.Format(
"While parsing frame of size {0}: {1}", frameLength, BitConverter.ToString(buffer)
));
}
getFrameSize(continueReading, callback);
}
else {
var newLeftToRead = leftToRead - bytesRead;
Log.debug(string.Format(
"Tried to read {0} bytes for frame of {1} bytes, read {2}, left {3}",
leftToRead, frameLength, bytesRead, newLeftToRead
));
readFrame(buffer, frameLength, newLeftToRead, continueReading, callback);
}
}, null);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment