Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 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;
             }
         }
     }
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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));
        }
Esempio n. 6
0
        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;
                    }
                }
            }
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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;
        }