public static unsafe Item ConvertItem(CEventTrace.Item *itemContainer) { var newItem = new Item(); if (itemContainer->ItemType == 0) { // The item is newly initialized so return an empty Item return(newItem); } newItem.ItemType = (ItemType)itemContainer->ItemType; switch (newItem.ItemType) { case ItemType.Span: newItem.Span = new Span(); var newSpan = newItem.Span.Value; ApiInterop.Memcpy(newSpan.Id.Data, itemContainer->ItemUnion.Span.Id.Data, SpanId.SpanIdSize); newSpan.Causes = new SpanId[(int)itemContainer->ItemUnion.Span.CauseCount]; for (var i = 0; i < newSpan.Causes.Length; i++) { fixed(byte *spanIdDest = newSpan.Causes[i].Data) { ApiInterop.Memcpy(spanIdDest, itemContainer->ItemUnion.Span.Causes[i].Data, SpanId.SpanIdSize); } } newItem.Span = newSpan; break; case ItemType.Event: newItem.Event = new Event(); var newEvent = newItem.Event.GetValueOrDefault(); newEvent.Id = new SpanId(); ApiInterop.Memcpy(newEvent.Id.Data, itemContainer->ItemUnion.Event.Id.Data, SpanId.SpanIdSize); newEvent.UnixTimestampMillis = itemContainer->ItemUnion.Event.UnixTimestampMillis; newEvent.Type = ApiInterop.FromUtf8Cstr(itemContainer->ItemUnion.Event.Type); newEvent.Message = ApiInterop.FromUtf8Cstr(itemContainer->ItemUnion.Event.Message); newEvent.Data = new TraceEventData(itemContainer->ItemUnion.Event.Data); var fields = newEvent.Data.GetAll(); // Release memory allocated to the underlying event data in the itemContainer newEvent.Data.EventData.Dispose(); // Add the data to the newly initialized event data struct newEvent.Data = new TraceEventData(fields); newItem.Event = newEvent; break; default: throw new NotSupportedException("Invalid Item Type provided."); } return(newItem); }
private static void TraceCallbackThunk(void *callbackPtr, CEventTrace.Item *responseItem) { var callbackHandle = (EventTracerParameters)GCHandle.FromIntPtr((IntPtr)callbackPtr).Target; callbackHandle.TraceCallback(callbackHandle.UserData, ConvertItem(responseItem)); }