zworld-em/Plugins/sentry-unreal/Source/Sentry/Private/Android/SentryTransactionAndroid.cpp
2025-05-11 22:07:21 +08:00

89 lines
3.0 KiB
C++

// Copyright (c) 2023 Sentry. All Rights Reserved.
#include "SentryTransactionAndroid.h"
#include "SentrySpanAndroid.h"
#include "SentryDefines.h"
#include "Infrastructure/SentryConvertorsAndroid.h"
#include "Infrastructure/SentryJavaClasses.h"
SentryTransactionAndroid::SentryTransactionAndroid(jobject transaction)
: FSentryJavaObjectWrapper(SentryJavaClasses::Transaction, transaction)
{
SetupClassMethods();
}
void SentryTransactionAndroid::SetupClassMethods()
{
StartChildMethod = GetMethod("startChild", "(Ljava/lang/String;Ljava/lang/String;)Lio/sentry/ISpan;");
FinishMethod = GetMethod("finish", "()V");
IsFinishedMethod = GetMethod("isFinished", "()Z");
SetNameMethod = GetMethod("setName", "(Ljava/lang/String;)V");
SetTagMethod = GetMethod("setTag", "(Ljava/lang/String;Ljava/lang/String;)V");
SetDataMethod = GetMethod("setData", "(Ljava/lang/String;Ljava/lang/Object;)V");
ToSentryTraceMethod = GetMethod("toSentryTrace", "()Lio/sentry/SentryTraceHeader;");
}
TSharedPtr<ISentrySpan> SentryTransactionAndroid::StartChild(const FString& operation, const FString& desctiption)
{
auto span = CallObjectMethod<jobject>(StartChildMethod, *GetJString(operation), *GetJString(desctiption));
return MakeShareable(new SentrySpanAndroid(*span));
}
TSharedPtr<ISentrySpan> SentryTransactionAndroid::StartChildWithTimestamp(const FString& operation, const FString& desctiption, int64 timestamp)
{
UE_LOG(LogSentrySdk, Log, TEXT("Starting child span with explicit timestamp not supported on Android."));
return StartChild(operation, desctiption);
}
void SentryTransactionAndroid::Finish()
{
CallMethod<void>(FinishMethod);
}
void SentryTransactionAndroid::FinishWithTimestamp(int64 timestamp)
{
UE_LOG(LogSentrySdk, Log, TEXT("Finishing transaction with explicit timestamp not supported on Android."));
Finish();
}
bool SentryTransactionAndroid::IsFinished() const
{
return CallMethod<bool>(IsFinishedMethod);;
}
void SentryTransactionAndroid::SetName(const FString& name)
{
CallMethod<void>(SetNameMethod, *GetJString(name));
}
void SentryTransactionAndroid::SetTag(const FString& key, const FString& value)
{
CallMethod<void>(SetTagMethod, *GetJString(key), *GetJString(value));
}
void SentryTransactionAndroid::RemoveTag(const FString& key)
{
SetTag(key, TEXT(""));
}
void SentryTransactionAndroid::SetData(const FString& key, const TMap<FString, FString>& values)
{
CallMethod<void>(SetDataMethod, *GetJString(key), SentryConvertorsAndroid::StringMapToNative(values)->GetJObject());
}
void SentryTransactionAndroid::RemoveData(const FString& key)
{
SetData(key, TMap<FString, FString>());
}
void SentryTransactionAndroid::GetTrace(FString& name, FString& value)
{
FSentryJavaObjectWrapper NativeTraceHeader(SentryJavaClasses::SentryTraceHeader, *CallObjectMethod<jobject>(ToSentryTraceMethod));
FSentryJavaMethod GetValueMethod = NativeTraceHeader.GetMethod("getValue", "()Ljava/lang/String;");
name = TEXT("sentry-trace");
value = NativeTraceHeader.CallMethod<FString>(GetValueMethod);
}