using PostSharp.Patterns.Diagnostics;
using PostSharp.Patterns.Diagnostics.Backends.EventSource;
using System;
using System.Diagnostics.Tracing;
using System.Runtime.InteropServices;
 
namespace PostSharp.Samples.Logging.Etw.CustomSource
{
  [Log(AttributeExclude = true)]
  [EventSource(Name = "MyEventSource")]
  [Guid("971d5f08-f366-421c-a25c-3aed379d5eb2")]
  class MyEventSource : PostSharpEventSource
  {
    private const string format = "{0} | {1} | {2} | {3}";
    private const string invalidOperationExceptionMessage = "Use the Log method. This method is metadata-only.";
    private const byte version = 2;
 
    [Event(EventIds.MethodEntry, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Start, Version = version, Task = Tasks.Method)]
    internal void MethodEntry(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.MethodSuccess, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Stop, Version = version, Task = Tasks.Method)]
    internal void MethodSuccess(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.MethodException, Level = EventLevel.Warning, Message = format, Opcode = EventOpcode.Stop, Version = version, Task = Tasks.Method)]
    internal void MethodException(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.MethodOvertime, Level = EventLevel.Warning, Message = format, Opcode = EventOpcode.Stop, Version = version, Task = Tasks.Method)]
    internal void MethodOvertime(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.AsyncMethodAwait, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Suspend, Version = version, Task = Tasks.Method)]
    internal void AsyncMethodAwait(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.AsyncMethodResume, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Resume, Version = version, Task = Tasks.Method)]
    internal void AsyncMethodResume(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.ValueChanged, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Info, Version = version, Task = Tasks.Message)]
    internal void ValueChanged(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomVerbose, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Info, Version = version, Task = Tasks.Message)]
    internal void CustomVerbose(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomInfo, Level = EventLevel.Informational, Message = format, Opcode = EventOpcode.Info, Version = version, Task = Tasks.Message)]
    internal void CustomInfo(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomWarning, Level = EventLevel.Warning, Message = format, Opcode = EventOpcode.Info, Version = version, Task = Tasks.Message)]
    internal void CustomWarning(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomError, Level = EventLevel.Error, Message = format, Opcode = EventOpcode.Info, Version = version, Task = Tasks.Message)]
    internal void CustomError(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomCritical, Level = EventLevel.Critical, Message = format, Opcode = EventOpcode.Info, Version = version, Task = Tasks.Message)]
    internal void CustomCritical(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomActivityEntry, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Start, Version = version, Task = Tasks.CustomActivity)]
    internal void CustomActivityEntry(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomActivityException, Level = EventLevel.Warning, Message = format, Opcode = EventOpcode.Stop, Version = version, Task = Tasks.CustomActivity)]
    internal void CustomActivityException(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomActivitySuccess, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Stop, Version = version, Task = Tasks.CustomActivity)]
    internal void CustomActivitySuccess(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.CustomActivityFailure, Level = EventLevel.Warning, Message = format, Opcode = EventOpcode.Stop, Version = version, Task = Tasks.CustomActivity)]
    internal void CustomActivityFailure(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.IteratorYield, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Stop, Version = version, Task = Tasks.Method)]
    internal void IteratorYield(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.IteratorMoveNext, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Start, Version = version, Task = Tasks.Method)]
    internal void IteratorMoveNext(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
 
 
    [Event(EventIds.ExecutionPoint, Level = EventLevel.Verbose, Message = format, Opcode = EventOpcode.Info, Version = version, Task = Tasks.Method)]
    internal void ExecutionPoint(string role, string type, string context, string message, int indentLevel)
    {
      throw new InvalidOperationException(invalidOperationExceptionMessage);
    }
 
    // We need to repeat this, otherwise the ETW framework for .NET will ignore the class.
    public new static class Tasks
    {
      public const EventTask Method = PostSharpEventSource.Tasks.Method;
      public const EventTask CustomActivity = PostSharpEventSource.Tasks.CustomActivity;
      public const EventTask Message = PostSharpEventSource.Tasks.Message;
    }
 
  }
}