internal static unsafe BufferHeader Read(CachedBinaryReader reader)
 {
     if (!reader.LoadData (BufferSize))
         return null;
     fixed (byte* buffer = reader.buffer) {
         reader.SetBufferPointer (buffer);
         return new BufferHeader (reader);
     }
 }
        internal static unsafe BufferDescriptor Read(LogHeader logHeader, CachedBinaryReader reader, EventListener listener)
        {
            var pos = reader.Position;
            var header = BufferHeader.Read (reader);
            if (header == null)
                return null;

            if (!reader.LoadData (header.Length)) {
                reader.Position = pos;
                return null;
            }

            fixed (byte* buffer = reader.buffer) {
                // FIXME: unset the buffer pointer after this block!
                reader.SetBufferPointer (buffer);
                var result = new BufferDescriptor (pos, header);
                try {
                    listener.ReadBufferEvents (logHeader, result, reader);
                } catch (Exception e) {
                    Console.WriteLine ("error while reading event !");
                    Console.WriteLine (e);
                }
                return result;
            }
        }