// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
// Standard Library
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
// GameKit
using AWS.GameKit.Runtime.Core;
using AWS.GameKit.Runtime.FeatureUtils;
using AWS.GameKit.Runtime.Models;
using AWS.GameKit.Runtime.Utils;
namespace AWS.GameKit.Runtime.Features.GameKitIdentity
{
///
/// Identity wrapper for GameKit C++ SDK calls
///
public class IdentityWrapper : GameKitFeatureWrapperBase
{
// Select the correct source path based on the platform
#if UNITY_IPHONE && !UNITY_EDITOR
private const string IMPORT = "__Internal";
#else
private const string IMPORT = "aws-gamekit-identity";
#endif
// DLL loading
[DllImport(IMPORT)] private static extern IntPtr GameKitIdentityInstanceCreateWithSessionManager(IntPtr sessionManager, FuncLoggingCallback logCb);
[DllImport(IMPORT)] private static extern void GameKitIdentityInstanceRelease(IntPtr identityInstance);
[DllImport(IMPORT)] private static extern uint GameKitIdentityRegister(IntPtr identityInstance, UserRegistration userRegistration);
[DllImport(IMPORT)] private static extern uint GameKitIdentityConfirmRegistration(IntPtr identityInstance, ConfirmRegistrationRequest request);
[DllImport(IMPORT)] private static extern uint GameKitIdentityResendConfirmationCode(IntPtr identityInstance, ResendConfirmationCodeRequest request);
[DllImport(IMPORT)] private static extern uint GameKitIdentityLogin(IntPtr identityInstance, UserLogin userLogin);
[DllImport(IMPORT)] private static extern uint GameKitIdentityLogout(IntPtr identityInstance);
[DllImport(IMPORT)] private static extern uint GameKitIdentityGetUser(IntPtr identityInstance, IntPtr dispatchReceiver, FuncIdentityGetUserResponseCallback responseCallback);
[DllImport(IMPORT)] private static extern uint GameKitIdentityForgotPassword(IntPtr identityInstance, ForgotPasswordRequest request);
[DllImport(IMPORT)] private static extern uint GameKitIdentityConfirmForgotPassword(IntPtr identityInstance, ConfirmForgotPasswordRequest request);
[DllImport(IMPORT)] private static extern uint GameKitGetFederatedLoginUrl(IntPtr identityInstance, FederatedIdentityProvider identityProvider, IntPtr dispatchReceiver, FuncKeyValueStringCallback responseCallback);
[DllImport(IMPORT)] private static extern uint GameKitPollAndRetrieveFederatedTokens(IntPtr identityInstance, FederatedIdentityProvider identityProvider, string requestId, int timeout);
[DllImport(IMPORT)] private static extern uint GameKitGetFederatedIdToken(IntPtr identityInstance, FederatedIdentityProvider identityProvider, IntPtr dispatchReceiver, FuncStringCallback responseCallback);
[AOT.MonoPInvokeCallback(typeof(FuncIdentityGetUserResponseCallback))]
protected static void IdentityGetUserResponseCallback(IntPtr dispatchReceiver, IntPtr getUserResponse)
{
// recover object reference from dispatchReceiver
GetUserResult result = Marshaller.GetDispatchObject(dispatchReceiver);
// handle assignments to the result object
result.Response = Marshal.PtrToStructure(getUserResponse);
}
public uint IdentityRegister(UserRegistration userRegistration)
{
return DllLoader.TryDll(() => GameKitIdentityRegister(GetInstance(), userRegistration), nameof(GameKitIdentityRegister), GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public uint IdentityConfirmRegistration(ConfirmRegistrationRequest request)
{
return DllLoader.TryDll(() => GameKitIdentityConfirmRegistration(GetInstance(), request), nameof(GameKitIdentityConfirmRegistration), GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public uint IdentityResendConfirmationCode(ResendConfirmationCodeRequest request)
{
return DllLoader.TryDll(() => GameKitIdentityResendConfirmationCode(GetInstance(), request), nameof(GameKitIdentityResendConfirmationCode), GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public uint IdentityLogin(UserLogin userLogin)
{
return DllLoader.TryDll(() => GameKitIdentityLogin(GetInstance(), userLogin), nameof(GameKitIdentityLogin), GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public uint IdentityLogout()
{
return DllLoader.TryDll(() => GameKitIdentityLogout(GetInstance()), nameof(GameKitIdentityLogout), GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public GetUserResult IdentityGetUser()
{
GetUserResult result = new GetUserResult();
uint status = DllLoader.TryDll(result, (IntPtr dispatchReceiver) => GameKitIdentityGetUser(GetInstance(), dispatchReceiver, IdentityGetUserResponseCallback), nameof(GameKitIdentityGetUser), GameKitErrors.GAMEKIT_ERROR_GENERAL);
result.ResultCode = status;
return result;
}
public uint IdentityForgotPassword(ForgotPasswordRequest request)
{
return DllLoader.TryDll(() => GameKitIdentityForgotPassword(GetInstance(), request), nameof(GameKitIdentityForgotPassword), GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public uint IdentityConfirmForgotPassword(ConfirmForgotPasswordRequest request)
{
return DllLoader.TryDll(() => GameKitIdentityConfirmForgotPassword(GetInstance(), request), nameof(GameKitIdentityConfirmForgotPassword), GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public MultiKeyValueStringCallbackResult GetFederatedLoginUrl(FederatedIdentityProvider identityProvider)
{
MultiKeyValueStringCallbackResult result = new MultiKeyValueStringCallbackResult();
uint status = DllLoader.TryDll(result, (IntPtr dispatchReceiver) => GameKitGetFederatedLoginUrl(GetInstance(), identityProvider, dispatchReceiver, GameKitCallbacks.MultiKeyValueStringCallback), nameof(GameKitGetFederatedLoginUrl), GameKitErrors.GAMEKIT_ERROR_GENERAL);
result.ResultCode = status;
return result;
}
public uint PollAndRetrieveFederatedTokens(PollAndRetrieveFederatedTokensDesc pollAndRetrieveFederatedTokensDesc)
{
return DllLoader.TryDll(() => GameKitPollAndRetrieveFederatedTokens(
GetInstance(),
pollAndRetrieveFederatedTokensDesc.IdentityProvider,
pollAndRetrieveFederatedTokensDesc.RequestId,
pollAndRetrieveFederatedTokensDesc.Timeout), nameof(GameKitPollAndRetrieveFederatedTokens),
GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public StringCallbackResult GetFederatedIdToken(FederatedIdentityProvider identityProvider)
{
StringCallbackResult result = new StringCallbackResult();
uint status = DllLoader.TryDll(result, (IntPtr dispatchReceiver) => GameKitGetFederatedIdToken(GetInstance(), identityProvider, dispatchReceiver, GameKitCallbacks.StringCallback), nameof(GameKitGetFederatedIdToken), GameKitErrors.GAMEKIT_ERROR_GENERAL);
result.ResultCode = status;
return result;
}
protected override IntPtr Create(IntPtr sessionManager, FuncLoggingCallback logCb)
{
return DllLoader.TryDll(() => GameKitIdentityInstanceCreateWithSessionManager(sessionManager, logCb), nameof(GameKitIdentityInstanceCreateWithSessionManager), IntPtr.Zero);
}
protected override void Release(IntPtr instance)
{
DllLoader.TryDll(() => GameKitIdentityInstanceRelease(instance), nameof(GameKitIdentityInstanceRelease));
}
}
}