Files
UnrealEngine/Engine/Source/Runtime/Sockets/Private/Android/SocketsAndroid.cpp
2025-05-18 13:04:45 +08:00

82 lines
2.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SocketsAndroid.h"
FSocketAndroid::~FSocketAndroid()
{
ReleaseMulticastLock();
}
bool FSocketAndroid::SetBroadcast(bool bAllowBroadcast)
{
bool bSucceeded = FSocketBSD::SetBroadcast(bAllowBroadcast);
if (bSucceeded && bAllowBroadcast && !bIsMulticastLockAcquired)
{
AcquireMulticastLock();
}
return bSucceeded;
}
bool FSocketAndroid::JoinMulticastGroup(const FInternetAddr& GroupAddress)
{
bool bShouldReleaseLockOnFailure = !bIsMulticastLockAcquired;
if (bShouldReleaseLockOnFailure)
{
AcquireMulticastLock();
}
bool bSucceeded = FSocketBSD::JoinMulticastGroup(GroupAddress);
if (!bSucceeded && bShouldReleaseLockOnFailure)
{
ReleaseMulticastLock();
}
return bSucceeded;
}
bool FSocketAndroid::JoinMulticastGroup(const FInternetAddr& GroupAddress, const FInternetAddr& InterfaceAddress)
{
bool bShouldReleaseLockOnFailure = !bIsMulticastLockAcquired;
if (bShouldReleaseLockOnFailure)
{
AcquireMulticastLock();
}
bool bSucceeded = FSocketBSD::JoinMulticastGroup(GroupAddress, InterfaceAddress);
if (!bSucceeded && bShouldReleaseLockOnFailure)
{
ReleaseMulticastLock();
}
return bSucceeded;
}
void FSocketAndroid::AcquireMulticastLock()
{
#if USE_ANDROID_JNI
extern bool AndroidThunkCpp_AcquireWifiManagerMulticastLock();
if (AndroidThunkCpp_AcquireWifiManagerMulticastLock())
{
bIsMulticastLockAcquired = true;
UE_LOG(LogSockets, VeryVerbose, TEXT("WifiManager.MulticastLock succesfully aquired"));
}
else
#endif
{
static bool bAlreadyLoggedFailure = false;
if (!bAlreadyLoggedFailure)
{
bAlreadyLoggedFailure = true;
UE_LOG(LogSockets, Warning, TEXT("Failed to acquire WifiManager.MulticastLock. Is multicast/broadcast support for Android enabled in AndroidRuntimeSettings?"));
}
}
}
void FSocketAndroid::ReleaseMulticastLock()
{
#if USE_ANDROID_JNI
if (bIsMulticastLockAcquired)
{
UE_LOG(LogSockets, VeryVerbose, TEXT("Releasing WifiManager.MulticastLock"));
extern void AndroidThunkCpp_ReleaseWifiManagerMulticastLock();
AndroidThunkCpp_ReleaseWifiManagerMulticastLock();
bIsMulticastLockAcquired = false;
}
#endif
}