File: System\Diagnostics\Eventing\Reader\EventMetadata.cs
Project: ndp\fx\src\Core\System.Core.csproj (System.Core)
// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
/*============================================================
**
** Class: EventMetadata
**
** Purpose: 
** This public class describes the metadata for a specific event 
** raised by Provider. An instance of this class is obtained from 
** ProviderMetadata class.
** 
============================================================*/
 
using System.Globalization;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics.CodeAnalysis;
 
namespace System.Diagnostics.Eventing.Reader {
    /// <summary>
    /// Event Metadata
    /// </summary>
    [System.Security.Permissions.HostProtection(MayLeakOnAbort = true)]
    public sealed class EventMetadata {
        private long id;
        private byte version;
        private byte channelId;
        private byte level;
        private short opcode;
        private int task;
        private long keywords;
        private string template;
        private string description;
 
        ProviderMetadata pmReference;
 
        internal EventMetadata(uint id, byte version, byte channelId,
                 byte level, byte opcode, short task, long keywords,
                 string template, string description, ProviderMetadata pmReference) {
            this.id = id;
            this.version = version;
            this.channelId = channelId;
            this.level = level;
            this.opcode = opcode;
            this.task = task;
            this.keywords = keywords;
            this.template = template;
            this.description = description;
            this.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 {
                return this.id;
            }
        }
 
        public byte Version {
            get {
                return this.version;
            }
        }
 
        public EventLogLink LogLink {
            get {
                return new EventLogLink((uint)this.channelId, this.pmReference);
            }
        }
 
        public EventLevel Level {
            get {
                return new EventLevel(this.level, this.pmReference);
            }
        }
 
        [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "Opcode", Justification = "Microsoft: Shipped public in 3.5, breaking change to fix now.")]
        public EventOpcode Opcode {
            get {
                return new EventOpcode(this.opcode, this.pmReference);
            }
        }
 
        public EventTask Task {
            get {
                return new EventTask(this.task, this.pmReference);
            }
        }
 
 
        public IEnumerable<EventKeyword> Keywords {
            get {
                List<EventKeyword> list = new List<EventKeyword>();
 
                ulong theKeywords = (ulong)this.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((long)mask, this.pmReference));
                        //theKeywords = theKeywords - mask;
                    }
                    //modify the mask to check next bit.
                    mask = mask >> 1;
                }
 
                return list;
            }
        }
 
        public string Template {
            get {
                return this.template;
            }
        }
 
        public string Description {
            get {
                return this.description;
            }
        }
    }
}