Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
EventPipeMetadataGenerator.cs
Go to the documentation of this file.
2
4
5internal sealed class EventPipeMetadataGenerator
6{
8
10 {
11 }
12
13 public byte[] GenerateEventMetadata(EventSource.EventMetadata eventMetadata)
14 {
15 ParameterInfo[] parameters = eventMetadata.Parameters;
16 EventParameterInfo[] array = new EventParameterInfo[parameters.Length];
17 for (int i = 0; i < parameters.Length; i++)
18 {
19 EventParameterInfo.GetTypeInfoFromType(parameters[i].ParameterType, out var typeInfo);
20 array[i].SetInfo(parameters[i].Name, parameters[i].ParameterType, typeInfo);
21 }
22 return GenerateMetadata(eventMetadata.Descriptor.EventId, eventMetadata.Name, eventMetadata.Descriptor.Keywords, eventMetadata.Descriptor.Level, eventMetadata.Descriptor.Version, (EventOpcode)eventMetadata.Descriptor.Opcode, array);
23 }
24
25 public byte[] GenerateEventMetadata(int eventId, string eventName, EventKeywords keywords, EventLevel level, uint version, EventOpcode opcode, TraceLoggingEventTypes eventTypes)
26 {
27 TraceLoggingTypeInfo[] typeInfos = eventTypes.typeInfos;
28 string[] paramNames = eventTypes.paramNames;
29 EventParameterInfo[] array = new EventParameterInfo[typeInfos.Length];
30 for (int i = 0; i < typeInfos.Length; i++)
31 {
32 string name = string.Empty;
33 if (paramNames != null)
34 {
35 name = paramNames[i];
36 }
37 array[i].SetInfo(name, typeInfos[i].DataType, typeInfos[i]);
38 }
39 return GenerateMetadata(eventId, eventName, (long)keywords, (uint)level, version, opcode, array);
40 }
41
42 internal unsafe byte[] GenerateMetadata(int eventId, string eventName, long keywords, uint level, uint version, EventOpcode opcode, EventParameterInfo[] parameters)
43 {
44 byte[] array = null;
45 bool flag = false;
46 try
47 {
48 uint num = (uint)(24 + (eventName.Length + 1) * 2);
49 uint num2 = 0u;
50 uint num3 = num;
51 if (parameters.Length == 1 && parameters[0].ParameterType == typeof(EmptyStruct))
52 {
53 parameters = Array.Empty<EventParameterInfo>();
54 }
55 EventParameterInfo[] array2 = parameters;
56 foreach (EventParameterInfo eventParameterInfo in array2)
57 {
58 if (!eventParameterInfo.GetMetadataLength(out var size))
59 {
60 flag = true;
61 break;
62 }
63 num += size;
64 }
65 if (flag)
66 {
67 num = num3;
68 num2 = 4u;
69 EventParameterInfo[] array3 = parameters;
70 foreach (EventParameterInfo eventParameterInfo2 in array3)
71 {
72 if (!eventParameterInfo2.GetMetadataLengthV2(out var size2))
73 {
74 parameters = Array.Empty<EventParameterInfo>();
75 num = num3;
76 num2 = 0u;
77 flag = false;
78 break;
79 }
80 num2 += size2;
81 }
82 }
83 uint num4 = ((opcode != 0) ? 6u : 0u);
84 uint num5 = ((num2 != 0) ? (num2 + 5) : 0u);
85 uint num6 = num5 + num4;
86 uint num7 = num + num6;
87 array = new byte[num7];
88 fixed (byte* ptr = array)
89 {
90 uint offset = 0u;
91 WriteToBuffer(ptr, num7, ref offset, (uint)eventId);
92 fixed (char* src = eventName)
93 {
94 WriteToBuffer(ptr, num7, ref offset, (byte*)src, (uint)((eventName.Length + 1) * 2));
95 }
96 WriteToBuffer(ptr, num7, ref offset, keywords);
97 WriteToBuffer(ptr, num7, ref offset, version);
98 WriteToBuffer(ptr, num7, ref offset, level);
99 if (flag)
100 {
101 WriteToBuffer(ptr, num7, ref offset, 0);
102 }
103 else
104 {
105 WriteToBuffer(ptr, num7, ref offset, (uint)parameters.Length);
106 EventParameterInfo[] array4 = parameters;
107 foreach (EventParameterInfo eventParameterInfo3 in array4)
108 {
109 if (!eventParameterInfo3.GenerateMetadata(ptr, ref offset, num7))
110 {
111 return GenerateMetadata(eventId, eventName, keywords, level, version, opcode, Array.Empty<EventParameterInfo>());
112 }
113 }
114 }
115 if (opcode != 0)
116 {
117 WriteToBuffer(ptr, num7, ref offset, 1);
118 WriteToBuffer(ptr, num7, ref offset, (byte)1);
119 WriteToBuffer(ptr, num7, ref offset, (byte)opcode);
120 }
121 if (flag)
122 {
123 WriteToBuffer(ptr, num7, ref offset, num2);
124 WriteToBuffer(ptr, num7, ref offset, (byte)2);
125 WriteToBuffer(ptr, num7, ref offset, (uint)parameters.Length);
126 EventParameterInfo[] array5 = parameters;
127 foreach (EventParameterInfo eventParameterInfo4 in array5)
128 {
129 if (!eventParameterInfo4.GenerateMetadataV2(ptr, ref offset, num7))
130 {
131 return GenerateMetadata(eventId, eventName, keywords, level, version, opcode, Array.Empty<EventParameterInfo>());
132 }
133 }
134 }
135 }
136 }
137 catch
138 {
139 array = null;
140 }
141 return array;
142 }
143
144 internal unsafe static void WriteToBuffer(byte* buffer, uint bufferLength, ref uint offset, byte* src, uint srcLength)
145 {
146 for (int i = 0; i < srcLength; i++)
147 {
148 (buffer + offset)[i] = src[i];
149 }
150 offset += srcLength;
151 }
152
153 internal unsafe static void WriteToBuffer<T>(byte* buffer, uint bufferLength, ref uint offset, T value) where T : unmanaged
154 {
155 *(T*)(buffer + offset) = value;
156 offset += (uint)sizeof(T);
157 }
158}
unsafe byte[] GenerateMetadata(int eventId, string eventName, long keywords, uint level, uint version, EventOpcode opcode, EventParameterInfo[] parameters)
static unsafe void WriteToBuffer< T >(byte *buffer, uint bufferLength, ref uint offset, T value)
byte[] GenerateEventMetadata(EventSource.EventMetadata eventMetadata)
byte[] GenerateEventMetadata(int eventId, string eventName, EventKeywords keywords, EventLevel level, uint version, EventOpcode opcode, TraceLoggingEventTypes eventTypes)
static unsafe void WriteToBuffer(byte *buffer, uint bufferLength, ref uint offset, byte *src, uint srcLength)
static bool GetTypeInfoFromType(Type type, out TraceLoggingTypeInfo typeInfo)
unsafe bool GenerateMetadata(byte *pMetadataBlob, ref uint offset, uint blobSize)
unsafe bool GenerateMetadataV2(byte *pMetadataBlob, ref uint offset, uint blobSize)