private bool ReadEntry(Stream stream, out LogEntry entry) { _currentArgs.Clear(); entry = default; var bytesRead = stream.Read(_buffer, 0, EntryHeader.Size); if (bytesRead == 0) { return(false); } if (bytesRead != EntryHeader.Size) { throw new BinLogDecodingException("Invalid decoding stream length"); } var header = new EntryHeader(_buffer.AsSpan(0, EntryHeader.Size)); if (_buffer.Length < header.EntryLength) { _buffer = new byte[header.EntryLength]; } entry.LogLevel = (LogLevel)header.LogLevel; entry.DateTimeUtc = header.DateTimeUtc; if (!_decoders.TryGetValue(header.ChannelId, out var decoder)) { throw new BinLogDecodingException($"Unknown channel id {header.ChannelId}"); } entry.Channel = decoder.ChannelName; if (bytesRead < header.EntryLength) { var payloadSize = header.EntryLength - EntryHeader.Size; bytesRead += stream.Read(_buffer, 0, payloadSize); if (bytesRead != header.EntryLength) { throw new BinLogDecodingException("Invalid decoding stream length"); } var argsSize = DecodeArguments(header.ArgCount, _buffer.AsSpan(0, payloadSize), decoder, _currentArgs); if (argsSize != payloadSize) { throw new BinLogDecodingException("Invalid entry length"); } } if (_currentArgs.Count != header.ArgCount) { throw new BinLogDecodingException("Failed to decode args"); } entry.Message = DecodeMessage(header.MessageId, decoder, _currentArgs); return(true); }
public void Log <T1, T2, T3, T4>(LogLevel level, TMessageEnum msgId, T1 arg1, T2 arg2, T3 arg3, T4 arg4) where T1 : ILoggableValue where T2 : ILoggableValue where T3 : ILoggableValue where T4 : ILoggableValue { _tracer?.Trace(level, _name, LogEnum.GetMsg(msgId), arg1.Unwrap(), arg2.Unwrap(), arg3.Unwrap(), arg4.Unwrap()); var length = EntryHeader.Size + arg1.SizeOf() + arg2.SizeOf() + arg3.SizeOf() + arg4.SizeOf(); var header = new EntryHeader((ushort)length, _channelId, LogEnum.ToUInt16(msgId), level, 4); var span = GetSpan(length); var bytesWritten = header.WriteTo(span); bytesWritten += arg1.WriteTo(span.Slice(bytesWritten)); bytesWritten += arg2.WriteTo(span.Slice(bytesWritten)); bytesWritten += arg3.WriteTo(span.Slice(bytesWritten)); bytesWritten += arg4.WriteTo(span.Slice(bytesWritten)); if (bytesWritten != length) { throw new SerializationException("Failed to serialize log entry"); } _stream.Write(_buffer, 0, bytesWritten); }
public AppleDouble(string path) { using (var fr = new FileStream(path, FileMode.Open, FileAccess.Read)) { var entriesList = new List<Entry>(); var br = new BinaryReader(fr); var magic = FromBE(br.ReadInt32()); if (magic != 0x00051607) throw new ArgumentException(); var version = FromBE(br.ReadInt32()); if (version != 0x00020000) throw new ArgumentException(); BaseFileFormat = Encoding.UTF8.GetString(br.ReadBytes(16)); int entriesCount = FromBE(br.ReadUInt16()); var entryHeaders = new List<EntryHeader>(); for (uint i = 0; i < entriesCount; ++i) { var header = new EntryHeader(); header.id = FromBE(br.ReadUInt32()); header.offset = FromBE(br.ReadUInt32()); header.length = FromBE(br.ReadUInt32()); entryHeaders.Add(header); } entries = new List<Entry>(); foreach (var header in entryHeaders) { switch (header.id) { case 9: fr.Seek(header.offset, SeekOrigin.Begin); entries.Add(new FinderInfo(fr)); break; default: entries.Add(new NotImplementedEntry(header.id)); break; } } } }
public void Log(LogLevel level, TMessageEnum msgId) { _tracer?.Trace(level, _name, LogEnum.GetMsg(msgId)); var span = GetSpan(EntryHeader.Size); var header = new EntryHeader(EntryHeader.Size, _channelId, LogEnum.ToUInt16(msgId), level, 0); var bytesWritten = header.WriteTo(span); if (bytesWritten != EntryHeader.Size) { throw new SerializationException("Failed to serialize log entry"); } _stream.Write(_buffer, 0, bytesWritten); }
public void InsertImage(BitmapSource imageSource) { //imageSource = ConvertIndexedColorImage ( imageSource ); Stream stream = EncodeImageToPNG(imageSource); EntryHeader header = new EntryHeader { width = ( byte )( uint )imageSource.Width, height = ( byte )( uint )imageSource.Height, colorCount = ( byte )(imageSource.Palette != null ? imageSource.Palette.Colors.Count : 0), planes = 1, bitCount = 0, sizeInBytes = ( uint )stream.Length }; entries.Add(new KeyValuePair <Stream, EntryHeader> (stream, header)); }
public AppleDouble(string path) { using (var fr = new FileStream(path, FileMode.Open, FileAccess.Read)) { var entriesList = new List <Entry>(); var br = new BinaryReader(fr); var magic = FromBE(br.ReadInt32()); if (magic != 0x00051607) { throw new ArgumentException(); } var version = FromBE(br.ReadInt32()); if (version != 0x00020000) { throw new ArgumentException(); } BaseFileFormat = Encoding.UTF8.GetString(br.ReadBytes(16)); int entriesCount = FromBE(br.ReadUInt16()); var entryHeaders = new List <EntryHeader>(); for (uint i = 0; i < entriesCount; ++i) { var header = new EntryHeader(); header.id = FromBE(br.ReadUInt32()); header.offset = FromBE(br.ReadUInt32()); header.length = FromBE(br.ReadUInt32()); entryHeaders.Add(header); } entries = new List <Entry>(); foreach (var header in entryHeaders) { switch (header.id) { case 9: fr.Seek(header.offset, SeekOrigin.Begin); entries.Add(new FinderInfo(fr)); break; default: entries.Add(new NotImplementedEntry(header.id)); break; } } } }
bool ReadEntryHeaders() { for (var i = 0; i < Header.FileCount; ++i) { var s = new ArraySegment <byte>(headerBytes, (6 + i * 12), 12); var Entry = new EntryHeader(); if (!Entry.ReadFile(s)) { return(false); } if (Entry.Offset + Entry.Length > BodyLength) { return(false); } Entries.Add(Entry.Hash, Entry); } return(true); }
bool ReadEntryHeaders() { for (var i = 0; i < Header.FileCount; ++i) { var s = new ArraySegment<byte>(headerBytes, (6 + i * 12), 12); var Entry = new EntryHeader(); if (!Entry.ReadFile(s)) { return false; } if (Entry.Offset + Entry.Length > BodyLength) { return false; } Entries.Add(Entry.Hash, Entry); } return true; }