private void EnqueueMessagesFromKeyframe(int keyframe)
{
Message message;
SetKeyframeMessage keyframeMessage;
Log.InfoFormat("enqueuing messages from keyframe {0}", keyframe);
using(StreamAndBufferBackup())
{
Decrypter.Reset();
MessageStream = MessageStreamEndpoint.OpenKeyframe(keyframe);
QueuedMessages.Enqueue(new SetStreamTimestampMessage());
try
{
do
{
if((message = ReadMessage()) != Message.Empty)
{
QueuedMessages.Enqueue(message);
PostProcessMessage(message, false);
}
} while((keyframeMessage = message as SetKeyframeMessage) == null);
if(keyframeMessage.Keyframe > keyframe)
{
Log.InfoFormat("keyframe contained a set keyframe message " +
"with a higher keyframe number ({0}) than the one currently " +
"being read ({1}), reloading.", keyframeMessage.Keyframe, keyframe);
// All queued messages will be superceeded in the new keyframe.
QueuedMessages.Clear();
MessageTranslator.Reset();
EnqueueMessagesFromKeyframe(keyframeMessage.Keyframe);
return;
}
}
finally
{
DisposeOfMessageStream();
}
}
Decrypter.Reset();
Log.InfoFormat("enqueued {0} messages from keyframe {1}", QueuedMessages.Count, keyframe);
}