82 lines
2.3 KiB
C++
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
|
|
} |