| File: System\Diagnostics\Reader\EventMetadata.cs | Web Access |
| Project: src\runtime\src\libraries\System.Diagnostics.EventLog\src\System.Diagnostics.EventLog.csproj (System.Diagnostics.EventLog) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace System.Diagnostics.Eventing.Reader { /// <summary> /// Event Metadata /// </summary> public sealed class EventMetadata { private readonly byte _channelId; private readonly byte _level; private readonly short _opcode; private readonly int _task; private readonly long _keywords; private readonly ProviderMetadata _pmReference; internal EventMetadata(uint id, byte version, byte channelId, byte level, byte opcode, short task, long keywords, string? template, string? description, ProviderMetadata pmReference) { Id = id; Version = version; _channelId = channelId; _level = level; _opcode = opcode; _task = task; _keywords = keywords; Template = template; Description = description; _pmReference = pmReference; } // // Max value will be UINT32.MaxValue - it is a long because this property // is really a UINT32. The legacy API allows event message ids to be declared // as UINT32 and these event/messages may be migrated into a Provider's // manifest as UINT32. Note that EventRecord ids are // still declared as int, because those ids max value is UINT16.MaxValue // and rest of the bits of the legacy event id would be stored in // Qualifiers property. // public long Id { get; } public byte Version { get; } public EventLogLink LogLink { get { return new EventLogLink((uint)_channelId, _pmReference); } } public EventLevel Level { get { return new EventLevel(_level, _pmReference); } } public EventOpcode Opcode { get { return new EventOpcode(_opcode, _pmReference); } } public EventTask Task { get { return new EventTask(_task, _pmReference); } } public IEnumerable<EventKeyword> Keywords { get { List<EventKeyword> list = new List<EventKeyword>(); ulong theKeywords = unchecked((ulong)_keywords); ulong mask = 0x8000000000000000; // For every bit // for (int i = 0; i < 64 && theKeywords != 0; i++) for (int i = 0; i < 64; i++) { // If this bit is set if ((theKeywords & mask) > 0) { // The mask is the keyword we will be searching for. list.Add(new EventKeyword(unchecked((long)mask), _pmReference)); // theKeywords = theKeywords - mask; } // Modify the mask to check next bit. mask >>= 1; } return list; } } public string? Template { get; } public string? Description { get; } } }