196 lines
6.8 KiB
C++
196 lines
6.8 KiB
C++
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
|
|
#include "OculusXRColocationRequests.h"
|
|
#include "OculusXRColocationModule.h"
|
|
#include "OculusXRColocationUtil.h"
|
|
#include "OculusXRColocationSession.h"
|
|
#include "OculusXRColocationEventDelegates.h"
|
|
#include "OculusXRColocationSubsystem.h"
|
|
#include "OculusXRColocationFunctions.h"
|
|
#include "OculusXRHMDModule.h"
|
|
|
|
namespace OculusXRColocation
|
|
{
|
|
OculusXR::FAsyncRequestBase::RequestId DetermineRequestId(EColocationResult Result, uint64 Id)
|
|
{
|
|
return IsResultSuccess(Result) ? OculusXR::FAsyncRequestBase::RequestId(Id) : OculusXR::FAsyncRequestBase::RequestId(OculusXR::INVALID_TASK_REQUEST_ID);
|
|
}
|
|
|
|
FDiscoverSessionsRequest::FDiscoverSessionsRequest()
|
|
{
|
|
OnStartCompleteHandle = FOculusXRColocationEventDelegates::StartColocationDiscoveryComplete.AddStatic(
|
|
&FDiscoverSessionsRequest::OnStartComplete);
|
|
|
|
OnSessionFoundHandle = FOculusXRColocationEventDelegates::ColocationDiscoveryResultAvailable.AddStatic(
|
|
&FDiscoverSessionsRequest::OnResultAvailable);
|
|
|
|
OnStopCompleteHandle = FOculusXRColocationEventDelegates::StopColocationDiscoveryComplete.AddStatic(
|
|
&FDiscoverSessionsRequest::OnDiscoveryComplete);
|
|
|
|
OnDiscoveryCompleteHandle = FOculusXRColocationEventDelegates::StopColocationDiscoveryComplete.AddStatic(
|
|
&FDiscoverSessionsRequest::OnDiscoveryComplete);
|
|
}
|
|
|
|
FDiscoverSessionsRequest::~FDiscoverSessionsRequest()
|
|
{
|
|
}
|
|
|
|
void FDiscoverSessionsRequest::BindOnSessionFound(const FOculusXRColocationSessionFoundDelegate& OnSessionFound)
|
|
{
|
|
OnFoundSessionCallback = OnSessionFound;
|
|
}
|
|
|
|
void FDiscoverSessionsRequest::OnSessionFound(FOculusXRColocationSession&& Session)
|
|
{
|
|
auto index = FoundSessions.Emplace(Session);
|
|
OnFoundSessionCallback.ExecuteIfBound(FoundSessions[index]);
|
|
}
|
|
|
|
void FDiscoverSessionsRequest::OnInitRequest()
|
|
{
|
|
uint64 requestId;
|
|
auto result = IOculusXRColocationFunctions::GetOculusXRColocationFunctionsImpl()->StartColocationDiscovery(requestId);
|
|
UE_LOG(LogOculusXRColocation, Log, TEXT("Starting colocation session discovery. RequestID: %llu, Launch async result: %d"), requestId, result);
|
|
|
|
SetRequestId(DetermineRequestId(result, requestId));
|
|
SetInitialResult(result);
|
|
}
|
|
|
|
void FDiscoverSessionsRequest::OnStartComplete(FOculusXRUInt64 RequestId, EColocationResult Result)
|
|
{
|
|
auto taskPtr = OculusXR::FAsyncRequestSystem::GetRequest<FDiscoverSessionsRequest>(
|
|
OculusXR::FAsyncRequestBase::RequestId{ RequestId.GetValue() });
|
|
|
|
if (!taskPtr.IsValid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
// If result succeeded we don't have complete the task but we do update the subsystem
|
|
if (IsResultSuccess(Result))
|
|
{
|
|
UOculusXRColocationSubsystem::Get()->SetDiscoveryRequest(taskPtr);
|
|
return;
|
|
}
|
|
|
|
OculusXR::FAsyncRequestSystem::CompleteRequest<FDiscoverSessionsRequest>(
|
|
taskPtr->GetEventId(),
|
|
FDiscoverSessionsRequest::FResultType::FromError(Result));
|
|
}
|
|
|
|
void FDiscoverSessionsRequest::OnResultAvailable(FOculusXRUInt64 RequestId, FOculusXRUUID Uuid, const TArray<uint8>& Metadata)
|
|
{
|
|
auto taskPtr = OculusXR::FAsyncRequestSystem::GetRequest<FDiscoverSessionsRequest>(
|
|
OculusXR::FAsyncRequestBase::RequestId{ RequestId.GetValue() });
|
|
|
|
if (!taskPtr.IsValid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
FOculusXRColocationSession session;
|
|
session.Uuid = Uuid;
|
|
session.Metadata = Metadata;
|
|
|
|
taskPtr->OnSessionFound(std::move(session));
|
|
}
|
|
|
|
void FDiscoverSessionsRequest::OnDiscoveryComplete(FOculusXRUInt64 RequestId, EColocationResult Result)
|
|
{
|
|
auto taskPtr = OculusXR::FAsyncRequestSystem::GetRequest<FDiscoverSessionsRequest>(
|
|
OculusXR::FAsyncRequestBase::RequestId{ RequestId.GetValue() });
|
|
|
|
if (!taskPtr.IsValid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
UOculusXRColocationSubsystem::Get()->ClearDiscoveryRequest();
|
|
|
|
OculusXR::FAsyncRequestSystem::CompleteRequest<FDiscoverSessionsRequest>(
|
|
taskPtr->GetEventId(),
|
|
FDiscoverSessionsRequest::FResultType::FromResult(Result, taskPtr->GetFoundSessions()));
|
|
}
|
|
|
|
FStartSessionAdvertisementRequest::FStartSessionAdvertisementRequest(const TArray<uint8>& SessionData)
|
|
: Data(SessionData)
|
|
{
|
|
OnStartCompleteHandle = FOculusXRColocationEventDelegates::StartColocationAdvertisementComplete.AddStatic(
|
|
&FStartSessionAdvertisementRequest::OnStartComplete);
|
|
}
|
|
|
|
FStartSessionAdvertisementRequest::~FStartSessionAdvertisementRequest()
|
|
{
|
|
FOculusXRColocationEventDelegates::StartColocationAdvertisementComplete.Remove(OnStartCompleteHandle);
|
|
}
|
|
|
|
void FStartSessionAdvertisementRequest::OnInitRequest()
|
|
{
|
|
uint64 requestId;
|
|
auto result = IOculusXRColocationFunctions::GetOculusXRColocationFunctionsImpl()->StartColocationAdvertisement(Data, requestId);
|
|
|
|
SetRequestId(DetermineRequestId(result, requestId));
|
|
SetInitialResult(result);
|
|
}
|
|
|
|
void FStartSessionAdvertisementRequest::OnStartComplete(FOculusXRUInt64 RequestId, FOculusXRUUID Uuid, EColocationResult Result)
|
|
{
|
|
auto taskPtr = OculusXR::FAsyncRequestSystem::GetRequest<FStartSessionAdvertisementRequest>(
|
|
OculusXR::FAsyncRequestBase::RequestId{ RequestId.GetValue() });
|
|
|
|
if (!taskPtr.IsValid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
FOculusXRColocationSession session;
|
|
session.Uuid = Uuid;
|
|
session.Metadata = taskPtr->Data;
|
|
|
|
OculusXR::FAsyncRequestSystem::CompleteRequest<FStartSessionAdvertisementRequest>(
|
|
taskPtr->GetEventId(),
|
|
FStartSessionAdvertisementRequest::FResultType::FromResult(
|
|
Result,
|
|
session));
|
|
}
|
|
|
|
FStopSessionAdvertisementRequest::FStopSessionAdvertisementRequest()
|
|
{
|
|
OnStopCompleteHandle = FOculusXRColocationEventDelegates::StopColocationAdvertisementComplete.AddStatic(
|
|
&FStopSessionAdvertisementRequest::OnStopComplete);
|
|
|
|
OnCompleteHandle = FOculusXRColocationEventDelegates::ColocationAdvertisementComplete.AddStatic(
|
|
&FStopSessionAdvertisementRequest::OnStopComplete);
|
|
}
|
|
|
|
FStopSessionAdvertisementRequest::~FStopSessionAdvertisementRequest()
|
|
{
|
|
FOculusXRColocationEventDelegates::StopColocationAdvertisementComplete.Remove(OnStopCompleteHandle);
|
|
FOculusXRColocationEventDelegates::StopColocationAdvertisementComplete.Remove(OnCompleteHandle);
|
|
}
|
|
|
|
void FStopSessionAdvertisementRequest::OnInitRequest()
|
|
{
|
|
uint64 requestId;
|
|
auto result = IOculusXRColocationFunctions::GetOculusXRColocationFunctionsImpl()->StopColocationAdvertisement(requestId);
|
|
|
|
SetRequestId(DetermineRequestId(result, requestId));
|
|
SetInitialResult(result);
|
|
}
|
|
|
|
void FStopSessionAdvertisementRequest::OnStopComplete(FOculusXRUInt64 RequestId, EColocationResult Result)
|
|
{
|
|
auto taskPtr = OculusXR::FAsyncRequestSystem::GetRequest<FStopSessionAdvertisementRequest>(
|
|
OculusXR::FAsyncRequestBase::RequestId{ RequestId.GetValue() });
|
|
|
|
if (!taskPtr.IsValid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
OculusXR::FAsyncRequestSystem::CompleteRequest<FStopSessionAdvertisementRequest>(
|
|
taskPtr->GetEventId(),
|
|
FStartSessionAdvertisementRequest::FResultType::FromResult(Result, UOculusXRColocationSubsystem::Get()->GetLocalSession()));
|
|
}
|
|
} // namespace OculusXRColocation
|