// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
// Standard Library
using System;
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;
// Third Party
using Newtonsoft.Json;
namespace AWS.GameKit.Runtime.Features.GameKitAchievements
{
///
/// Achievements wrapper for GameKit C++ SDK calls
///
public class AchievementsWrapper : 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-achievements";
#endif
// DLL loading
[DllImport(IMPORT)] private static extern IntPtr GameKitAchievementsInstanceCreateWithSessionManager(IntPtr sessionManager, FuncLoggingCallback logCb);
[DllImport(IMPORT)] private static extern void GameKitAchievementsInstanceRelease(IntPtr achievementsInstance);
[DllImport(IMPORT)] private static extern uint GameKitListAchievements(IntPtr achievementsInstance, uint pageSize, bool waitForAllPages, IntPtr dispatchReceiver, FuncStringCallback responseCallback);
[DllImport(IMPORT)] private static extern uint GameKitUpdateAchievement(IntPtr achievementsInstance, string achievementId, uint incrementBy, IntPtr dispatchReceiver, FuncStringCallback responseCallback);
[DllImport(IMPORT)] private static extern uint GameKitGetAchievement(IntPtr achievementsInstance, string achievementId, IntPtr dispatchReceiver, FuncStringCallback responseCallback);
[DllImport(IMPORT)] private static extern uint GameKitGetAchievementIconsBaseUrl(IntPtr achievementsInstance, IntPtr dispatchReceiver, FuncStringCallback responseCallback);
[AOT.MonoPInvokeCallback(typeof(FuncStringCallback))]
public static void AchievementListFromRecurringStringCallback(IntPtr dispatchReceiver, string responseValue)
{
// parse the string response
AchievementListResult result = JsonConvert.DeserializeObject>(responseValue).data;
// get a handle to the result callback from the dispatch receiver
Action resultCallback = Marshaller.GetDispatchObject>(dispatchReceiver);
// call the callback and pass it the result
resultCallback(result);
}
public uint ListAchievements(ListAchievementsDesc listAchievementsDesc, Action resultCallback)
{
return DllLoader.TryDll(resultCallback, (IntPtr dispatchReceiver) => GameKitListAchievements(
GetInstance(),
listAchievementsDesc.PageSize,
listAchievementsDesc.WaitForAllPages,
dispatchReceiver,
AchievementListFromRecurringStringCallback), nameof(GameKitListAchievements), GameKitErrors.GAMEKIT_ERROR_GENERAL);
}
public AchievementResult UpdateAchievement(UpdateAchievementDesc updateAchievementDesc)
{
StringCallbackResult result = new StringCallbackResult();
uint status = DllLoader.TryDll(result, (IntPtr dispatchReceiver) => GameKitUpdateAchievement(
GetInstance(),
updateAchievementDesc.AchievementId,
updateAchievementDesc.IncrementBy,
dispatchReceiver,
GameKitCallbacks.StringCallback), nameof(GameKitUpdateAchievement), GameKitErrors.GAMEKIT_ERROR_GENERAL);
return GetAchievementResult(result, status);
}
public AchievementResult GetAchievement(string achievementId)
{
StringCallbackResult result = new StringCallbackResult();
uint status = DllLoader.TryDll(result, (IntPtr dispatchReceiver) => GameKitGetAchievement(GetInstance(), achievementId, dispatchReceiver, GameKitCallbacks.StringCallback), nameof(GameKitGetAchievement), GameKitErrors.GAMEKIT_ERROR_GENERAL);
return GetAchievementResult(result, status);
}
public StringCallbackResult GetAchievementIconsBaseUrl()
{
StringCallbackResult result = new StringCallbackResult();
uint status = DllLoader.TryDll(result, (IntPtr dispatchReceiver) => GameKitGetAchievementIconsBaseUrl(GetInstance(), dispatchReceiver, GameKitCallbacks.StringCallback), nameof(GameKitGetAchievementIconsBaseUrl), GameKitErrors.GAMEKIT_ERROR_GENERAL);
result.ResultCode = status;
return result;
}
protected override IntPtr Create(IntPtr sessionManager, FuncLoggingCallback logCb)
{
return DllLoader.TryDll(() => GameKitAchievementsInstanceCreateWithSessionManager(sessionManager, logCb), nameof(GameKitAchievementsInstanceCreateWithSessionManager), IntPtr.Zero);
}
protected override void Release(IntPtr instance)
{
DllLoader.TryDll(() => GameKitAchievementsInstanceRelease(instance), nameof(GameKitAchievementsInstanceRelease));
}
private AchievementResult GetAchievementResult(StringCallbackResult stringCallbackResult, uint status)
{
Achievement achievement = status == GameKitErrors.GAMEKIT_SUCCESS
? JsonConvert.DeserializeObject>(stringCallbackResult.ResponseValue).data
: new Achievement();
return new AchievementResult
{
Achievement = achievement,
ResultCode = status
};
}
}
}