This commit is contained in:
Nathan Iskandar 2022-03-16 14:50:35 -07:00 коммит произвёл GitHub
Родитель 312e05d78b
Коммит ac85ac1264
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
81 изменённых файлов: 2412 добавлений и 465 удалений

Просмотреть файл

@ -33,7 +33,8 @@
<TargetName>Microsoft.Xbox.Services.141.GDK.C.Thunks</TargetName>
<RootNamespace>Microsoft.Xbox.Services</RootNamespace>
<XsapiPlatform>GDK</XsapiPlatform>
<XsapiBuildFromSource>1</XsapiBuildFromSource>
<XsapiLibBuildFromSource>true</XsapiLibBuildFromSource>
<LibHttpClientBuildFromSource>true</LibHttpClientBuildFromSource>
</PropertyGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), xsapi.gdk.bwoi.props))\xsapi.gdk.bwoi.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

Просмотреть файл

@ -20,6 +20,7 @@ EXPORTS
HCHttpCallRequestGetHeaderAtIndex
HCHttpCallRequestGetNumHeaders
HCHttpCallRequestGetRequestBodyBytes
HCHttpCallRequestGetRequestBodyReadFunction
HCHttpCallRequestGetRequestBodyString
HCHttpCallRequestGetRetryAllowed
HCHttpCallRequestGetRetryCacheId
@ -29,6 +30,7 @@ EXPORTS
HCHttpCallRequestGetUrl
HCHttpCallRequestSetHeader
HCHttpCallRequestSetRequestBodyBytes
HCHttpCallRequestSetRequestBodyReadFunction
HCHttpCallRequestSetRequestBodyString
HCHttpCallRequestSetRetryAllowed
HCHttpCallRequestSetRetryCacheId
@ -45,6 +47,7 @@ EXPORTS
HCHttpCallResponseGetPlatformNetworkErrorMessage
HCHttpCallResponseGetResponseBodyBytes
HCHttpCallResponseGetResponseBodyBytesSize
HCHttpCallResponseGetResponseBodyWriteFunction
HCHttpCallResponseGetResponseString
HCHttpCallResponseGetStatusCode
HCHttpCallResponseSetHeader
@ -52,6 +55,7 @@ EXPORTS
HCHttpCallResponseSetNetworkErrorCode
HCHttpCallResponseSetPlatformNetworkErrorMessage
HCHttpCallResponseSetResponseBodyBytes
HCHttpCallResponseSetResponseBodyWriteFunction
HCHttpCallResponseSetStatusCode
HCHttpCallSetContext
HCHttpCallSetTracing
@ -497,6 +501,7 @@ EXPORTS
XblRealTimeActivityRemoveResyncHandler
XblRemoveServiceCallRoutedHandler
XblSetOverrideConfiguration
XblSetOverrideLocale
XblSocialAddSocialRelationshipChangedHandler
XblSocialGetSocialRelationshipsAsync
XblSocialGetSocialRelationshipsResult

Просмотреть файл

@ -69,6 +69,41 @@
<VCTargetsPath16>$(_AlternativeVCTargetsPath160)</VCTargetsPath16>
</PropertyGroup>
<!--
****************************************************************************************************
VCTargetsPath redirection (VS 2022)
For VS 2022, we have to copy the contents of
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v160
to a temp location, then xcopy in the files from
C:\Program Files (x86)\Microsoft GDK\211000\GXDK\VS2019\flatDeployment\MSBuild\Microsoft\VC\v160
and
C:\Program Files (x86)\Microsoft GDK\211000\GRDK\VS2019\flatDeployment\MSBuild\Microsoft\VC\v160
and do the same for the v150 for v141 downlevel
****************************************************************************************************
-->
<PropertyGroup Condition="'$(GDKUseBWOI)' == 'true'">
<_AlternativeVCTargetsPath160>$(GDKMSBuildForVS2019)v160\</_AlternativeVCTargetsPath160>
<_AlternativeVCTargetsPath150>$(GDKMSBuildForVS2019)v150\</_AlternativeVCTargetsPath150>
</PropertyGroup>
<PropertyGroup Condition="'$(GDKUseBWOI)' == 'true' and ('$(Platform)' == 'Gaming.Xbox.XboxOne.x64' and '$(VisualStudioVersion)' == '17.0')">
<VCTargetsPath>$(_AlternativeVCTargetsPath160)</VCTargetsPath>
<VCTargetsPath15 Condition="'$(_AlternativeVCTargetsPath150)'!=''">$(_AlternativeVCTargetsPath150)</VCTargetsPath15>
<VCTargetsPath16>$(_AlternativeVCTargetsPath160)</VCTargetsPath16>
</PropertyGroup>
<PropertyGroup Condition="'$(GDKUseBWOI)' == 'true' and ('$(Platform)' == 'Gaming.Xbox.Scarlett.x64' and '$(VisualStudioVersion)' == '17.0')">
<VCTargetsPath>$(_AlternativeVCTargetsPath160)</VCTargetsPath>
<VCTargetsPath15 Condition="'$(_AlternativeVCTargetsPath150)'!=''">$(_AlternativeVCTargetsPath150)</VCTargetsPath15>
<VCTargetsPath16>$(_AlternativeVCTargetsPath160)</VCTargetsPath16>
</PropertyGroup>
<PropertyGroup Condition="'$(GDKUseBWOI)' == 'true' and ('$(Platform)' == 'Gaming.Desktop.x64' and '$(VisualStudioVersion)' == '17.0')">
<VCTargetsPath>$(_AlternativeVCTargetsPath160)</VCTargetsPath>
<VCTargetsPath15 Condition="'$(_AlternativeVCTargetsPath150)'!=''">$(_AlternativeVCTargetsPath150)</VCTargetsPath15>
<VCTargetsPath16>$(_AlternativeVCTargetsPath160)</VCTargetsPath16>
</PropertyGroup>
<!--
****************************************************************************************************
Debugging

2
External/Xal/External/libHttpClient поставляемый

@ -1 +1 @@
Subproject commit ffbc58008ae4a8402f811893906ff782efda42ac
Subproject commit 312552b182c99b05a81630fb19c71671830ebab6

Просмотреть файл

@ -42,28 +42,39 @@ typedef enum XalPlatformOperationResult
/// </summary>
typedef enum XalShowUrlType
{
/// <summary>The client should show the URL in a shared system browser if
/// <summary>
/// The client should show the URL in a shared system browser if
/// one is present, otherwise the client should use an embedded browser.
/// </summary>
XalShowUrlType_Normal = 0,
/// <summary>The browser is being raised for the purposes of deleting
/// cookies. If the client is able clear the user's cookies without showing
/// UI the client should. Otherwise the URL should be loaded as normal.
/// <summary>
/// This case is deprecated and no longer used. Cookie removal is now
/// signaled exclusively using
/// XalShowUrlType_CookieRemovalSkipIfSharedCredentials.
/// </summary>
XalShowUrlType_CookieRemoval = 1,
/// <summary>The browser is being raised for the purposes of deleting
/// <remarks>
/// Formerly, this value indicated that the browser was being raised for the
/// purposes of deleting cookies from both shared and embedded browsers.
/// </remarks>
XalShowUrlType_CookieRemoval_DEPRECATED = 1,
/// <summary>
/// The browser is being raised for the purposes of deleting
/// cookies. If the client is using a shared system browser, this call
/// should be ignored and the client should immediately call
/// XalPlatformWebShowUrlComplete passing in success, and forwarding the
/// received final URL back into Xal. If an embedded browser is being used,
/// the URL should be loaded as normal.</summary>
/// the cookies should be cleared without showing UI if possible. If silent
/// cookie-clearing is impossible, the URL should be loaded as normal.
/// </summary>
XalShowUrlType_CookieRemovalSkipIfSharedCredentials = 2,
/// <summary>This is a web flow which does not rely on cookies. The client
/// <summary>
/// This is a web flow which does not rely on cookies. The client
/// may use a shared system browser or an embedded browser depending on
/// whichever browser would give the best user experience. If headers are
/// required for the web request, this will be the show type asked for. If
/// this is the case, an embedded browser might be required so those
/// request headers can be set.</summary>
/// request headers can be set.
/// </summary>
XalShowUrlType_NonAuthFlow = 3,
} XalShowUrlType;

Просмотреть файл

@ -400,25 +400,6 @@ typedef enum XalUserChangeType
// That header is included at the top of this file
#endif
/// <summary>
/// User detail change event handler.
/// </summary>
/// <param name="context">Optional pointer to data used by the event handler.
/// </param>
/// <param name="userId">The local id of the user that changed.</param>
/// <param name="change">The type of change.</param>
/// <returns></returns>
#if !XAL_OS_IMPL
typedef void (XalUserChangeEventHandler)(
_In_opt_ void* context,
_In_ XalUserLocalId userId,
_In_ XalUserChangeType change
);
#else
// XalUserChangeEventHandler is defined in the platform specific header.
// That header is included at the top of this file
#endif
/// <summary>
/// A token returned when registering a callback to identify the registration. This token
/// is later used to unregister the callback.

Просмотреть файл

@ -321,6 +321,25 @@ STDAPI XalUserResolveIssueWithUiResult(
//-----------------------------------------------------------------------------
// Events
/// <summary>
/// User detail change event handler.
/// </summary>
/// <param name="context">Optional pointer to data used by the event handler.
/// </param>
/// <param name="userId">The local id of the user that changed.</param>
/// <param name="change">The type of change.</param>
/// <returns></returns>
#if !XAL_OS_IMPL
typedef void (XalUserChangeEventHandler)(
_In_opt_ void* context,
_In_ XalUserLocalId userId,
_In_ XalUserChangeType change
);
#else
// XalUserChangeEventHandler is defined in the platform specific header.
// That header is included in xal_types.h
#endif
/// <summary>
/// Register the event handler for user detail changes.
/// </summary>

Просмотреть файл

@ -20,6 +20,6 @@ extern "C"
/// YYYYMMDD Date string describing the date the build was created
/// rrr QFE number (000 indicates base release)
/// </summary>
#define XAL_VERSION "2021.10.20220111.002"
#define XAL_VERSION "2021.11.20211021.000"
}

Просмотреть файл

@ -751,6 +751,7 @@ STDAPI XblAchievementsUpdateAchievementForTitleIdAsync(
/// <param name="async">Caller allocated AsyncBlock.</param>
/// <returns>HRESULT return code for this API operation.</returns>
/// <remarks>
/// If multiple achievements are required, use the batch API instead: <see cref="XblAchievementsGetAchievementsForTitleIdAsync"/>
/// To get the result, call <see cref="XblAchievementsGetAchievementResult"/> inside the AsyncBlock callback
/// or after the AsyncBlock is complete.
/// </remarks>

Просмотреть файл

@ -34,6 +34,7 @@ STDAPI XblNotificationSubscribeToNotificationsAsync(
) XBL_NOEXCEPT;
#endif
#if HC_PLATFORM == HC_PLATFORM_IOS || HC_PLATFORM == HC_PLATFORM_ANDROID || HC_PLATFORM == HC_PLATFORM_UWP
/// <summary>
/// Unsubscribes the title from push notifications.
/// </summary>
@ -44,4 +45,5 @@ STDAPI XblNotificationUnsubscribeFromNotificationsAsync(
_In_ XblContextHandle xboxLiveContext,
_In_ XAsyncBlock* asyncBlock
) XBL_NOEXCEPT;
#endif
}

Просмотреть файл

@ -525,6 +525,9 @@ STDAPI XblPresenceSetPresenceAsync(
/// <param name="xuid">The Xbox User ID of the user to get presence for.</param>
/// <param name="async">The AsyncBlock for this operation.</param>
/// <returns>HRESULT return code for this API operation.</returns>
/// <remarks>
/// If presence info is needed for multiple users, use the batch API instead: <see cref="XblPresenceGetPresenceForMultipleUsersAsync"/>
/// </remarks>
STDAPI XblPresenceGetPresenceAsync(
_In_ XblContextHandle xblContextHandle,
_In_ uint64_t xuid,

Просмотреть файл

@ -515,6 +515,7 @@ STDAPI XblPrivacyGetAvoidListResult(
/// <param name="async">The AsyncBlock for this operation.</param>
/// <returns>HRESULT return code for this API operation.</returns>
/// <remarks>
/// If multiple permissions and/or target users are needed, use the batch API instead: <see cref="XblPrivacyBatchCheckPermissionAsync"/>
/// Call <see cref="XblPrivacyCheckPermissionResultSize"/> and <see cref="XblPrivacyCheckPermissionResult"/>
/// upon completion to get the result.
/// </remarks>

Просмотреть файл

@ -94,6 +94,7 @@ typedef struct XblUserProfile
/// <param name="async">Caller allocated AsyncBlock.</param>
/// <returns>HRESULT return code for this API operation.</returns>
/// <remarks>
/// If profiles are needed for multiple users, use the batch API instead: <see cref="XblProfileGetUserProfilesAsync"/>
/// To get the result, call <see cref="XblProfileGetUserProfileResult"/>
/// inside the AsyncBlock callback or after the AsyncBlock is complete.
/// </remarks>

Просмотреть файл

@ -212,7 +212,21 @@ typedef struct XblTitleHistory
/// <summary>
/// The last time the user had played.
/// </summary>
/// <remarks>
/// Do not use both this and lastTimeUserPlayedText.
/// For playtime within the past 14 days, this will be accurate for the date and fuzzily accurate for the time.
/// For playtime older than 14 days, this will only be accurate to the year and month, up to a year ago. The date will be returned as the 1st of the month,
/// but the play time could have occurred anywhere within that month.
/// </remarks>
time_t lastTimeUserPlayed;
/// <summary>
/// The last time the user had played in a standardized plaintext format (e.g. "a few minutes ago" or "x hours/days/months ago" or "this/last month").
/// </summary>
/// <remarks>
/// Do not use both this and lastTimeUserPlayed.
/// </remarks>
char lastTimeUserPlayedText[XBL_LAST_TIME_PLAYED_CHAR_SIZE];
} XblTitleHistory;
/// <summary>

Просмотреть файл

@ -39,6 +39,7 @@ extern "C"
#define XBL_REAL_NAME_CHAR_SIZE (255 * 3)
#define XBL_RICH_PRESENCE_CHAR_SIZE (100 * 3)
#define XBL_XBOX_USER_ID_CHAR_SIZE (21 * 3)
#define XBL_LAST_TIME_PLAYED_CHAR_SIZE 25
#define XBL_GUID_LENGTH 40
#define XBL_SCID_LENGTH XBL_GUID_LENGTH
@ -55,6 +56,7 @@ typedef XalUserHandle XblUserHandle;
/// <summary>
/// A context token returned when registering a callback/handler to identify the registration.
/// This context token is later used to unregister the callback/handler.
/// A value of 0 indicates and invalid handler token.
/// </summary>
typedef int32_t XblFunctionContext;

Просмотреть файл

@ -135,6 +135,8 @@ typedef struct XblStatisticChangeEventArgs
/// <param name="async">The AsyncBlock for this operation.</param>
/// <returns>HRESULT return code for this API operation.</returns>
/// <remarks>
/// If multiple statistics are required for a single user, use this batch API instead: <see cref="XblUserStatisticsGetSingleUserStatisticsAsync"/>
/// If statistics are needed for multiple users, use this batch API: <see cref="XblUserStatisticsGetMultipleUserStatisticsAsync"/>
/// Call <see cref="XblUserStatisticsGetSingleUserStatisticResultSize"/> and <see cref="XblUserStatisticsGetSingleUserStatisticResult"/>
/// upon completion to get the result.
/// </remarks>

Просмотреть файл

@ -28,7 +28,7 @@ STDAPI XblContextCreateHandle(
/// <returns>HRESULT return code for this API operation.</returns>
/// <remarks>
/// Use this method rather than creating a new context with the same user
/// if the XblContextHandle is needed by multiple threads.
/// if the XblContextHandle is needed by multiple components with independent lifespans.
/// </remarks>
STDAPI XblContextDuplicateHandle(
_In_ XblContextHandle xboxLiveContextHandle,

Просмотреть файл

@ -11,7 +11,11 @@
#pragma warning(disable: 4062)
#endif
#if (!defined(HC_LINK_STATIC) || HC_LINK_STATIC == 0) && HC_PLATFORM_IS_APPLE
#include <HttpClient/XAsync.h>
#else
#include <XAsync.h>
#endif
extern "C"
{
@ -296,6 +300,15 @@ STDAPI XblSetOverrideConfiguration(
_In_ uint32_t overrideTitleId
) XBL_NOEXCEPT;
/// <summary>
/// To override the locale used across XSAPI. If not set, the default is to use the OS locale
/// </summary>
/// <param name="overrideLocale">Override locale to be used</param>
/// <returns>HRESULT return code for this API operation.</returns>
STDAPI XblSetOverrideLocale(
_In_ char const* overrideLocale
) XBL_NOEXCEPT;
/// <summary>
/// Contains information about a service call.
/// </summary>

Просмотреть файл

@ -268,6 +268,7 @@ Global
{DA74F6C1-9B77-4135-9C23-AA348AB0DC9C}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64
{DA74F6C1-9B77-4135-9C23-AA348AB0DC9C}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{DA74F6C1-9B77-4135-9C23-AA348AB0DC9C}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{DA74F6C1-9B77-4135-9C23-AA348AB0DC9C}.Debug|Gaming.Xbox.XboxOne.x64.Build.0 = Debug|Gaming.Desktop.x64
{DA74F6C1-9B77-4135-9C23-AA348AB0DC9C}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64
{DA74F6C1-9B77-4135-9C23-AA348AB0DC9C}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64
{DA74F6C1-9B77-4135-9C23-AA348AB0DC9C}.Profile|Any CPU.ActiveCfg = Release|Gaming.Desktop.x64

Просмотреть файл

@ -0,0 +1,467 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26430.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GDK", "GDK", "{C9C47451-FCA6-4B7F-9BD0-20AD3B119737}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APIExplorer.Shared", "Tests\APIExplorer\APIExplorer.Shared.vcxitems", "{CBC0BEC4-131D-4868-9345-71813557FB39}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{DC381015-B171-4DA5-B7FA-7CDE8196C6D3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.Xbox.Services.142.GDK.C", "Build\Microsoft.Xbox.Services.142.GDK.C\Microsoft.Xbox.Services.142.GDK.C.vcxproj", "{60139F62-BF37-4F11-BD93-5FBF4E92100C}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK12", "Tests\GDK\APIRunner.GDK\Kits\DirectXTK12\DirectXTK12_GDK_2017.vcxproj", "{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APIRunner.143.GDK.Src", "Tests\GDK\APIRunner.GDK\APIRunner.143.GDK.Src.vcxproj", "{46F31A54-4C74-41A8-B294-26B5689E51EF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libHttpClient.142.GDK.C", "External\xal\External\libHttpClient\Build\libHttpClient.142.GDK.C\libHttpClient.142.GDK.C.vcxproj", "{80D8061D-BBEF-414D-8F08-4D8B52C02E85}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnitTests", "UnitTests", "{026C8F03-2B39-4984-9F71-D933E4455B2B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.Xbox.Services.UnitTest.142.TE", "Build\Microsoft.Xbox.Services.UnitTest.142.TE\Microsoft.Xbox.Services.UnitTest.142.TE.vcxproj", "{3092CCC9-DB6E-4199-95CC-4959950B95FA}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcrypto.142.Win32", "External\xal\External\libHttpClient\Build\libcrypto.142.Win32\libcrypto.142.Win32.vcxproj", "{2C8E7AF1-A395-4695-A116-63000F910ABD}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libHttpClient.142.Win32.C", "External\xal\External\libHttpClient\Build\libHttpClient.142.Win32.C\libHttpClient.142.Win32.C.vcxproj", "{9164C6C9-3872-4922-A3E3-3822622D3E71}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libssl.142.Win32", "External\xal\External\libHttpClient\Build\libssl.142.Win32\libssl.142.Win32.vcxproj", "{13457617-8476-4708-A601-AF998F6EDF21}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
Tests\APIExplorer\APIExplorer.Shared.vcxitems*{46f31a54-4c74-41a8-b294-26b5689e51ef}*SharedItemsImports = 4
Tests\APIExplorer\APIExplorer.Shared.vcxitems*{cbc0bec4-131d-4868-9345-71813557fb39}*SharedItemsImports = 9
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|Gaming.Desktop.x64 = Debug|Gaming.Desktop.x64
Debug|Gaming.Xbox.Scarlett.x64 = Debug|Gaming.Xbox.Scarlett.x64
Debug|Gaming.Xbox.XboxOne.x64 = Debug|Gaming.Xbox.XboxOne.x64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Profile|Any CPU = Profile|Any CPU
Profile|ARM = Profile|ARM
Profile|ARM64 = Profile|ARM64
Profile|Gaming.Desktop.x64 = Profile|Gaming.Desktop.x64
Profile|Gaming.Xbox.Scarlett.x64 = Profile|Gaming.Xbox.Scarlett.x64
Profile|Gaming.Xbox.XboxOne.x64 = Profile|Gaming.Xbox.XboxOne.x64
Profile|x64 = Profile|x64
Profile|x86 = Profile|x86
Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|Gaming.Desktop.x64 = Release|Gaming.Desktop.x64
Release|Gaming.Xbox.Scarlett.x64 = Release|Gaming.Xbox.Scarlett.x64
Release|Gaming.Xbox.XboxOne.x64 = Release|Gaming.Xbox.XboxOne.x64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|Any CPU.ActiveCfg = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|ARM.ActiveCfg = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|ARM64.ActiveCfg = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|Gaming.Xbox.Scarlett.x64.Build.0 = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|Gaming.Xbox.XboxOne.x64.Build.0 = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|Any CPU.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|Any CPU.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|ARM.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|ARM.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|ARM64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|ARM64.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|x64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|x64.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|x86.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Profile|x86.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|Any CPU.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|ARM.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|ARM64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|x64.ActiveCfg = Release|Gaming.Desktop.x64
{60139F62-BF37-4F11-BD93-5FBF4E92100C}.Release|x86.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|Any CPU.ActiveCfg = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|ARM.ActiveCfg = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|ARM64.ActiveCfg = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|Gaming.Xbox.Scarlett.x64.Build.0 = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|Gaming.Xbox.XboxOne.x64.Build.0 = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|Any CPU.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|Any CPU.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|ARM.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|ARM.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|ARM64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|ARM64.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|x64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|x64.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|x86.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Profile|x86.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|Any CPU.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|ARM.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|ARM64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|x64.ActiveCfg = Release|Gaming.Desktop.x64
{E538394B-68CB-4597-87AD-7B6841CC1278}.Release|x86.ActiveCfg = Release|Gaming.Desktop.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|Any CPU.ActiveCfg = Debug|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|ARM.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|ARM64.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|Gaming.Xbox.Scarlett.x64.Build.0 = Debug|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|Gaming.Xbox.XboxOne.x64.Build.0 = Debug|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|x64.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Debug|x86.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|Any CPU.ActiveCfg = Profile|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|ARM.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|ARM64.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|Gaming.Desktop.x64.ActiveCfg = Profile|Gaming.Desktop.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|Gaming.Desktop.x64.Build.0 = Profile|Gaming.Desktop.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Profile|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Profile|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Profile|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|x64.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Profile|x86.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|Any CPU.ActiveCfg = Release|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|ARM.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|ARM64.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Gaming.Xbox.XboxOne.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|x64.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2}.Release|x86.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Any CPU.ActiveCfg = Debug|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|ARM.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|ARM64.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Desktop.x64.Deploy.0 = Debug|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Xbox.Scarlett.x64.Build.0 = Debug|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Xbox.Scarlett.x64.Deploy.0 = Debug|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Xbox.XboxOne.x64.Build.0 = Debug|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|Gaming.Xbox.XboxOne.x64.Deploy.0 = Debug|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|x64.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Debug|x86.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Any CPU.ActiveCfg = Profile|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|ARM.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|ARM64.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Desktop.x64.ActiveCfg = Profile|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Desktop.x64.Build.0 = Profile|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Desktop.x64.Deploy.0 = Profile|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Profile|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Xbox.Scarlett.x64.Deploy.0 = Profile|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Profile|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Profile|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|Gaming.Xbox.XboxOne.x64.Deploy.0 = Profile|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|x64.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Profile|x86.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Any CPU.ActiveCfg = Release|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|ARM.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|ARM64.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Desktop.x64.Deploy.0 = Release|Gaming.Desktop.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Xbox.Scarlett.x64.Deploy.0 = Release|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|Gaming.Xbox.XboxOne.x64.Deploy.0 = Release|Gaming.Xbox.XboxOne.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|x64.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{46F31A54-4C74-41A8-B294-26B5689E51EF}.Release|x86.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|ARM.ActiveCfg = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|ARM.Build.0 = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|ARM64.Build.0 = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|Gaming.Xbox.Scarlett.x64.Build.0 = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|Gaming.Xbox.XboxOne.x64.Build.0 = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|x64.ActiveCfg = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|x64.Build.0 = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|x86.ActiveCfg = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Debug|x86.Build.0 = Debug|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|Any CPU.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|Any CPU.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|ARM.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|ARM.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|ARM64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|ARM64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|Gaming.Desktop.x64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|Gaming.Desktop.x64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|x64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|x64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|x86.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Profile|x86.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|Any CPU.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|ARM.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|ARM.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|ARM64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|ARM64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|Gaming.Desktop.x64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|x64.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|x64.Build.0 = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|x86.ActiveCfg = Release|Any CPU
{21C651D1-61D7-46C5-BD23-128E40329AA5}.Release|x86.Build.0 = Release|Any CPU
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|Any CPU.ActiveCfg = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|ARM.ActiveCfg = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|ARM64.ActiveCfg = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|Any CPU.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|Any CPU.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|ARM.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|ARM.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|ARM64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|ARM64.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|x64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|x64.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|x86.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Profile|x86.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|Any CPU.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|ARM.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|ARM64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|x64.ActiveCfg = Release|Gaming.Desktop.x64
{80D8061D-BBEF-414D-8F08-4D8B52C02E85}.Release|x86.ActiveCfg = Release|Gaming.Desktop.x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|Any CPU.ActiveCfg = Debug|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|ARM.ActiveCfg = Debug|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|ARM64.ActiveCfg = Debug|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|x64.ActiveCfg = Debug|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|x64.Build.0 = Debug|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|x86.ActiveCfg = Debug|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Debug|x86.Build.0 = Debug|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|Any CPU.ActiveCfg = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|Any CPU.Build.0 = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|ARM.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|ARM.Build.0 = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|ARM64.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|ARM64.Build.0 = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|Gaming.Desktop.x64.ActiveCfg = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|Gaming.Desktop.x64.Build.0 = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|x64.ActiveCfg = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|x64.Build.0 = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|x86.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Profile|x86.Build.0 = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|Any CPU.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|ARM.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|ARM64.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|x64.ActiveCfg = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|x64.Build.0 = Release|x64
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|x86.ActiveCfg = Release|Win32
{3092CCC9-DB6E-4199-95CC-4959950B95FA}.Release|x86.Build.0 = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|Any CPU.ActiveCfg = Debug|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|ARM.ActiveCfg = Debug|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|ARM64.ActiveCfg = Debug|ARM64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|ARM64.Build.0 = Debug|ARM64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|x64.ActiveCfg = Debug|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|x64.Build.0 = Debug|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|x86.ActiveCfg = Debug|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Debug|x86.Build.0 = Debug|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|Any CPU.ActiveCfg = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|Any CPU.Build.0 = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|ARM.ActiveCfg = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|ARM.Build.0 = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|ARM64.ActiveCfg = Release|ARM64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|ARM64.Build.0 = Release|ARM64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|Gaming.Desktop.x64.ActiveCfg = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|Gaming.Desktop.x64.Build.0 = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|x64.ActiveCfg = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|x64.Build.0 = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|x86.ActiveCfg = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Profile|x86.Build.0 = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|Any CPU.ActiveCfg = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|ARM.ActiveCfg = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|ARM64.ActiveCfg = Release|ARM64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|ARM64.Build.0 = Release|ARM64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|x64.ActiveCfg = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|x64.Build.0 = Release|x64
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|x86.ActiveCfg = Release|Win32
{2C8E7AF1-A395-4695-A116-63000F910ABD}.Release|x86.Build.0 = Release|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|Any CPU.ActiveCfg = Debug|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|ARM.ActiveCfg = Debug|ARM
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|ARM.Build.0 = Debug|ARM
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|ARM64.ActiveCfg = Debug|ARM64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|ARM64.Build.0 = Debug|ARM64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|x64.ActiveCfg = Debug|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|x64.Build.0 = Debug|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|x86.ActiveCfg = Debug|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Debug|x86.Build.0 = Debug|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|Any CPU.ActiveCfg = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|Any CPU.Build.0 = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|ARM.ActiveCfg = Release|ARM
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|ARM.Build.0 = Release|ARM
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|ARM64.ActiveCfg = Release|ARM64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|ARM64.Build.0 = Release|ARM64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|Gaming.Desktop.x64.ActiveCfg = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|Gaming.Desktop.x64.Build.0 = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|x64.ActiveCfg = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|x64.Build.0 = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|x86.ActiveCfg = Release|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Profile|x86.Build.0 = Release|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|Any CPU.ActiveCfg = Release|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|ARM.ActiveCfg = Release|ARM
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|ARM.Build.0 = Release|ARM
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|ARM64.ActiveCfg = Release|ARM64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|ARM64.Build.0 = Release|ARM64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|x64.ActiveCfg = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|x64.Build.0 = Release|x64
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|x86.ActiveCfg = Release|Win32
{9164C6C9-3872-4922-A3E3-3822622D3E71}.Release|x86.Build.0 = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|Any CPU.ActiveCfg = Debug|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|ARM.ActiveCfg = Debug|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|ARM64.ActiveCfg = Debug|ARM64
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|ARM64.Build.0 = Debug|ARM64
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|x64.ActiveCfg = Debug|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|x64.Build.0 = Debug|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|x86.ActiveCfg = Debug|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Debug|x86.Build.0 = Debug|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|Any CPU.ActiveCfg = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|Any CPU.Build.0 = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|ARM.ActiveCfg = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|ARM.Build.0 = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|ARM64.ActiveCfg = Release|ARM64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|ARM64.Build.0 = Release|ARM64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|Gaming.Desktop.x64.ActiveCfg = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|Gaming.Desktop.x64.Build.0 = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|x64.ActiveCfg = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|x64.Build.0 = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|x86.ActiveCfg = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Profile|x86.Build.0 = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Release|Any CPU.ActiveCfg = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Release|ARM.ActiveCfg = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Release|ARM64.ActiveCfg = Release|ARM64
{13457617-8476-4708-A601-AF998F6EDF21}.Release|ARM64.Build.0 = Release|ARM64
{13457617-8476-4708-A601-AF998F6EDF21}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Release|x64.ActiveCfg = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Release|x64.Build.0 = Release|x64
{13457617-8476-4708-A601-AF998F6EDF21}.Release|x86.ActiveCfg = Release|Win32
{13457617-8476-4708-A601-AF998F6EDF21}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{CBC0BEC4-131D-4868-9345-71813557FB39} = {DC381015-B171-4DA5-B7FA-7CDE8196C6D3}
{DC381015-B171-4DA5-B7FA-7CDE8196C6D3} = {C9C47451-FCA6-4B7F-9BD0-20AD3B119737}
{60139F62-BF37-4F11-BD93-5FBF4E92100C} = {C9C47451-FCA6-4B7F-9BD0-20AD3B119737}
{E538394B-68CB-4597-87AD-7B6841CC1278} = {C9C47451-FCA6-4B7F-9BD0-20AD3B119737}
{052C4858-C76F-4CEA-8A1A-E8E5559E67C2} = {DC381015-B171-4DA5-B7FA-7CDE8196C6D3}
{46F31A54-4C74-41A8-B294-26B5689E51EF} = {DC381015-B171-4DA5-B7FA-7CDE8196C6D3}
{21C651D1-61D7-46C5-BD23-128E40329AA5} = {C9C47451-FCA6-4B7F-9BD0-20AD3B119737}
{80D8061D-BBEF-414D-8F08-4D8B52C02E85} = {C9C47451-FCA6-4B7F-9BD0-20AD3B119737}
{3092CCC9-DB6E-4199-95CC-4959950B95FA} = {026C8F03-2B39-4984-9F71-D933E4455B2B}
{2C8E7AF1-A395-4695-A116-63000F910ABD} = {026C8F03-2B39-4984-9F71-D933E4455B2B}
{9164C6C9-3872-4922-A3E3-3822622D3E71} = {026C8F03-2B39-4984-9F71-D933E4455B2B}
{13457617-8476-4708-A601-AF998F6EDF21} = {026C8F03-2B39-4984-9F71-D933E4455B2B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {622BB9B5-938F-41A2-BC8B-B7B3A64A73B5}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -26,7 +26,6 @@ public:
protected:
void OnEvent(const JsonValue& data) noexcept override;
void OnResync() noexcept override;
private:
Map<XblFunctionContext, AchievementProgressChangeHandler> m_handlers;

Просмотреть файл

@ -203,8 +203,4 @@ void AchievementProgressChangeSubscription::OnEvent(
}
}
void AchievementProgressChangeSubscription::OnResync() noexcept
{
LOGS_ERROR << __FUNCTION__ << ": Achievement Progress events may have been missed";
}
NAMESPACE_MICROSOFT_XBOX_SERVICES_ACHIEVEMENTS_CPP_END
NAMESPACE_MICROSOFT_XBOX_SERVICES_ACHIEVEMENTS_CPP_END

Просмотреть файл

@ -87,7 +87,7 @@ HRESULT XblContext::Initialize(
{
Result<xbox::services::User> userResult = m_user.Copy();
RETURN_HR_IF_FAILED(userResult.Hresult());
m_presenceService = MakeShared<xbox::services::presence::PresenceService>(userResult.ExtractPayload(), m_xboxLiveContextSettings, rtaManager);
m_presenceService = MakeShared<xbox::services::presence::PresenceService>(userResult.ExtractPayload(), globalQueue, m_xboxLiveContextSettings, rtaManager);
}
{
@ -123,7 +123,7 @@ HRESULT XblContext::Initialize(
{
Result<xbox::services::User> userResult = m_user.Copy();
RETURN_HR_IF_FAILED(userResult.Hresult());
m_userStatisticsService = MakeShared<xbox::services::user_statistics::UserStatisticsService>(userResult.ExtractPayload(), m_xboxLiveContextSettings, rtaManager);
m_userStatisticsService = MakeShared<xbox::services::user_statistics::UserStatisticsService>(userResult.ExtractPayload(), globalQueue, m_xboxLiveContextSettings, rtaManager);
}
{

Просмотреть файл

@ -191,6 +191,26 @@ try
}
CATCH_RETURN()
STDAPI XblSetOverrideLocale(
_In_ char const* overrideLocale
) XBL_NOEXCEPT
try
{
RETURN_HR_INVALIDARGUMENT_IF_NULL(overrideLocale);
VERIFY_XBL_INITIALIZED();
auto state{ GlobalState::Get() };
if (state)
{
state->OverrideLocale(overrideLocale);
return S_OK;
}
else
{
return E_FAIL;
}
}
CATCH_RETURN()
STDAPI_(XblFunctionContext) XblAddServiceCallRoutedHandler(
_In_ XblCallRoutedHandler handler,
_In_opt_ void* context

Просмотреть файл

@ -11,13 +11,6 @@ using namespace xbox::services::multiplayer;
NAMESPACE_MICROSOFT_XBOX_SERVICES_MULTIPLAYER_MANAGER_CPP_BEGIN
MultiplayerLocalUserManager::MultiplayerLocalUserManager() :
m_sessionChangeEventHandlerCounter(0),
m_multiplayerSubscriptionLostEventHandlerCounter(0),
m_rtaResyncEventHandlerCounter(0)
{
}
MultiplayerLocalUserManager::~MultiplayerLocalUserManager()
{
ChangeAllLocalUserLobbyState(MultiplayerLocalUserLobbyState::Remove);
@ -348,11 +341,11 @@ MultiplayerLocalUserManager::AddMultiplayerSessionChangedHandler(
{
std::lock_guard<std::mutex> lock(m_subscriptionLock);
XblFunctionContext context = -1;
XblFunctionContext context = 0;
if (handler != nullptr)
{
context = ++m_sessionChangeEventHandlerCounter;
m_sessionChangeEventHandler[m_sessionChangeEventHandlerCounter] = std::move(handler);
context = m_sessionChangeEventHandlerCounter;
m_sessionChangeEventHandler[m_sessionChangeEventHandlerCounter++] = std::move(handler);
}
return context;
@ -402,11 +395,11 @@ MultiplayerLocalUserManager::AddMultiplayerConnectionIdChangedHandler(
{
std::lock_guard<std::mutex> lock(m_subscriptionLock);
XblFunctionContext context = -1;
XblFunctionContext context = 0;
if (handler != nullptr)
{
context = ++m_multiplayerConnectionIdChangedEventHandlerCounter;
m_multiplayerConnectionIdChangedEventHandler[m_multiplayerConnectionIdChangedEventHandlerCounter] = std::move(handler);
context = m_multiplayerConnectionIdChangedEventHandlerCounter;
m_multiplayerConnectionIdChangedEventHandler[m_multiplayerConnectionIdChangedEventHandlerCounter++] = std::move(handler);
}
return context;
@ -455,11 +448,11 @@ MultiplayerLocalUserManager::AddMultiplayerSubscriptionLostHandler(
{
std::lock_guard<std::mutex> lock(m_subscriptionLock);
XblFunctionContext context = -1;
XblFunctionContext context = 0;
if (handler != nullptr)
{
context = ++m_multiplayerSubscriptionLostEventHandlerCounter;
m_multiplayerSubscriptionLostEventHandler[m_multiplayerSubscriptionLostEventHandlerCounter] = std::move(handler);
context = m_multiplayerSubscriptionLostEventHandlerCounter;
m_multiplayerSubscriptionLostEventHandler[m_multiplayerSubscriptionLostEventHandlerCounter++] = std::move(handler);
}
return context;
@ -520,11 +513,11 @@ MultiplayerLocalUserManager::AddRtaResyncHandler(
{
std::lock_guard<std::mutex> lock(m_subscriptionLock);
XblFunctionContext context = -1;
XblFunctionContext context = 0;
if (handler != nullptr)
{
context = ++m_rtaResyncEventHandlerCounter;
m_rtaResyncEventHandler[m_rtaResyncEventHandlerCounter] = std::move(handler);
context = m_rtaResyncEventHandlerCounter;
m_rtaResyncEventHandler[m_rtaResyncEventHandlerCounter++] = std::move(handler);
}
return context;

Просмотреть файл

@ -823,7 +823,7 @@ private:
std::mutex m_resyncLock;
std::mutex m_stateLock;
XblFunctionContext m_sessionUpdateEventHandlerCounter{ 0 };
XblFunctionContext m_sessionUpdateEventHandlerCounter{ 1 };
UnorderedMap<uint32_t, Callback<const std::shared_ptr<XblMultiplayerSession>>> m_sessionUpdateEventHandler;
uint64_t m_id{ 0 }; // used to ignore calls made before resetting the state via destory()
@ -1280,7 +1280,7 @@ private:
class MultiplayerLocalUserManager : public std::enable_shared_from_this<MultiplayerLocalUserManager>
{
public:
MultiplayerLocalUserManager();
MultiplayerLocalUserManager() = default;
~MultiplayerLocalUserManager();
std::shared_ptr<XblContext> GetPrimaryContext();
@ -1343,10 +1343,10 @@ private:
void OnResyncMessageReceived();
std::mutex m_subscriptionLock;
XblFunctionContext m_sessionChangeEventHandlerCounter{};
XblFunctionContext m_multiplayerConnectionIdChangedEventHandlerCounter{};
XblFunctionContext m_multiplayerSubscriptionLostEventHandlerCounter{};
XblFunctionContext m_rtaResyncEventHandlerCounter{};
XblFunctionContext m_sessionChangeEventHandlerCounter{ 1 };
XblFunctionContext m_multiplayerConnectionIdChangedEventHandlerCounter{ 1 };
XblFunctionContext m_multiplayerSubscriptionLostEventHandlerCounter{ 1 };
XblFunctionContext m_rtaResyncEventHandlerCounter{ 1 };
xsapi_internal_unordered_map<uint32_t, Callback<XblMultiplayerSessionChangeEventArgs>> m_sessionChangeEventHandler;
xsapi_internal_unordered_map<uint32_t, Function<void()>> m_multiplayerConnectionIdChangedEventHandler;
xsapi_internal_unordered_map<uint32_t, Function<void()>> m_multiplayerSubscriptionLostEventHandler;

Просмотреть файл

@ -81,10 +81,10 @@ MultiplayerSessionWriter::AddMultiplayerSessionUpdatedHandler(
{
std::lock_guard<std::mutex> lock(m_stateLock);
XblFunctionContext context = -1;
XblFunctionContext context = 0;
if (handler != nullptr)
{
context = ++m_sessionUpdateEventHandlerCounter;
context = m_sessionUpdateEventHandlerCounter++;
m_sessionUpdateEventHandler[m_sessionUpdateEventHandlerCounter] = std::move(handler);
}

Просмотреть файл

@ -296,7 +296,6 @@ public:
protected:
void OnSubscribe(_In_ const JsonValue& data) noexcept override;
void OnEvent(_In_ const JsonValue& data) noexcept override;
void OnResync() noexcept override;
private:
String m_connectionId;
@ -530,7 +529,7 @@ private:
// RTA state
std::shared_ptr<MultiplayerSubscription> m_subscription;
XblFunctionContext m_rtaConnectionStateChangedToken{};
XblFunctionContext m_rtaConnectionStateChangedToken{ 0 };
XblFunctionContext m_nextClientToken{ 1 };
Map<XblFunctionContext, SubscriptionLostHandler> m_subscriptionLostHandlers;
Map<XblFunctionContext, MultiplayerSubscription::ConnectionIdChangedHandler> m_connectionIdChangedHandlers;

Просмотреть файл

@ -131,10 +131,4 @@ void MultiplayerSubscription::OnEvent(
}
}
void MultiplayerSubscription::OnResync() noexcept
{
// Since clients are manually managing sessions, they will need to resync them
LOGS_DEBUG << __FUNCTION__ << ": MPSD Session taps may have been missed";
}
NAMESPACE_MICROSOFT_XBOX_SERVICES_MULTIPLAYER_CPP_END

Просмотреть файл

@ -167,12 +167,6 @@ void NotificationSubscription::OnEvent(
}
}
void NotificationSubscription::OnResync() noexcept
{
// Don't think there is much we can do here - just log an error
LOGS_ERROR << __FUNCTION__ << ": Notification service events may have been missed";
}
GameInviteNotificationEventArgs::GameInviteNotificationEventArgs(
const GameInviteNotificationEventArgs& other
) noexcept

Просмотреть файл

@ -91,13 +91,12 @@ public:
protected:
void OnEvent(_In_ const JsonValue& event) noexcept override;
void OnResync() noexcept override;
private:
User m_user;
TaskQueue m_queue;
std::mutex m_mutex;
XblFunctionContext m_nextToken{ 0 };
XblFunctionContext m_nextToken{ 1 };
Map<XblFunctionContext, MPSDInviteHandler> m_mpsdInviteHandlers;
Map<XblFunctionContext, MultiplayerActivityInviteHandler> m_mpaInviteHandlers;

Просмотреть файл

@ -61,29 +61,4 @@ void DevicePresenceChangeSubscription::OnEvent(
}
}
void DevicePresenceChangeSubscription::OnResync() noexcept
{
auto presenceService{ m_presenceService.lock() };
if (presenceService)
{
presenceService->GetPresence(m_xuid, {
[
sharedThis{ shared_from_this() },
presenceService
]
(Result<std::shared_ptr<XblPresenceRecord>> result)
{
if (Succeeded(result))
{
for (const auto& deviceRecord : result.Payload()->DeviceRecords())
{
presenceService->HandleDevicePresenceChanged(sharedThis->m_xuid, deviceRecord.deviceType, true);
}
}
}
}
);
}
}
NAMESPACE_MICROSOFT_XBOX_SERVICES_PRESENCE_CPP_END

Просмотреть файл

@ -73,7 +73,6 @@ public:
protected:
void OnSubscribe(const JsonValue& data) noexcept override;
void OnEvent(const JsonValue& event) noexcept override;
void OnResync() noexcept override;
private:
uint64_t m_xuid;
@ -92,7 +91,6 @@ public:
protected:
void OnSubscribe(const JsonValue& data) noexcept override;
void OnEvent(_In_ const JsonValue& event) noexcept override;
void OnResync() noexcept override;
private:
uint64_t m_xuid;
@ -139,6 +137,7 @@ class PresenceService : public std::enable_shared_from_this<PresenceService>
public:
PresenceService(
_In_ User&& user,
_In_ const TaskQueue& backgroundQueue,
_In_ std::shared_ptr<xbox::services::XboxLiveContextSettings> xboxLiveContextSettings,
_In_ std::shared_ptr<xbox::services::real_time_activity::RealTimeActivityManager> rtaManager
) noexcept;
@ -196,6 +195,7 @@ public:
_In_ AsyncContext<Result<Vector<std::shared_ptr<XblPresenceRecord>>>> async
) const noexcept;
private:
void HandleDevicePresenceChanged(
_In_ uint64_t xuid,
_In_ XblPresenceDeviceType deviceType,
@ -208,15 +208,18 @@ public:
_In_ XblPresenceTitleState state
) const noexcept;
private:
void HandleRTAResync();
static Result<Vector<std::shared_ptr<XblPresenceRecord>>> DeserializeBatchPresenceRecordsResponse(
const JsonValue& json
) noexcept;
User m_user;
TaskQueue m_queue;
std::shared_ptr<xbox::services::XboxLiveContextSettings> m_xboxLiveContextSettings;
std::shared_ptr<real_time_activity::RealTimeActivityManager> m_rtaManager;
XblFunctionContext m_resyncHandlerToken{ 0 };
Map<XblFunctionContext, DevicePresenceChangedHandler> m_devicePresenceChangedHandlers;
Map<XblFunctionContext, TitlePresenceChangedHandler> m_titlePresenceChangedHandlers;
XblFunctionContext m_nextHandlerToken{ 1 };
@ -233,6 +236,9 @@ private:
uint32_t const m_titleId;
mutable std::mutex m_mutex;
friend class DevicePresenceChangeSubscription;
friend class TitlePresenceChangeSubscription;
};
NAMESPACE_MICROSOFT_XBOX_SERVICES_PRESENCE_CPP_END

Просмотреть файл

@ -13,10 +13,12 @@ NAMESPACE_MICROSOFT_XBOX_SERVICES_PRESENCE_CPP_BEGIN
PresenceService::PresenceService(
_In_ User&& user,
_In_ const TaskQueue& queue,
_In_ std::shared_ptr<xbox::services::XboxLiveContextSettings> xboxLiveContextSettings,
_In_ std::shared_ptr<xbox::services::real_time_activity::RealTimeActivityManager> rtaManager
) noexcept
: m_user{ std::move(user) },
m_queue{ queue.DeriveWorkerQueue() },
m_xboxLiveContextSettings{ xboxLiveContextSettings },
m_rtaManager{ rtaManager },
m_titleId{ AppConfig::Instance()->TitleId() }
@ -27,6 +29,11 @@ PresenceService::PresenceService(
PresenceService::~PresenceService() noexcept
{
if (m_resyncHandlerToken)
{
m_rtaManager->RemoveResyncHandler(m_user, m_resyncHandlerToken);
}
for (auto& xuidPair : m_trackedXuids)
{
if (!m_devicePresenceChangedHandlers.empty())
@ -56,6 +63,7 @@ XblFunctionContext PresenceService::AddTitlePresenceChangedHandler(
{
for (auto& titlePair : xuidPair.second.titlePresenceChangedSubscriptions)
{
titlePair.second = MakeShared<TitlePresenceChangeSubscription>(xuidPair.first, titlePair.first, shared_from_this());
m_rtaManager->AddSubscription(m_user, titlePair.second);
}
}
@ -79,6 +87,7 @@ void PresenceService::RemoveTitlePresenceChangedHandler(
for (auto& titlePair : xuidPair.second.titlePresenceChangedSubscriptions)
{
m_rtaManager->RemoveSubscription(m_user, titlePair.second);
titlePair.second.reset();
}
}
}
@ -95,6 +104,7 @@ XblFunctionContext PresenceService::AddDevicePresenceChangedHandler(
{
for (auto& pair : m_trackedXuids)
{
pair.second.devicePresenceChangedSub = MakeShared<DevicePresenceChangeSubscription>(pair.first, shared_from_this());
m_rtaManager->AddSubscription(m_user, pair.second.devicePresenceChangedSub);
}
}
@ -115,6 +125,7 @@ void PresenceService::RemoveDevicePresenceChangedHandler(
for (auto& pair : m_trackedXuids)
{
m_rtaManager->RemoveSubscription(m_user, pair.second.devicePresenceChangedSub);
pair.second.devicePresenceChangedSub.reset();
}
}
}
@ -125,6 +136,18 @@ HRESULT PresenceService::TrackUsers(
{
std::lock_guard<std::mutex> lock{ m_mutex };
if (!m_resyncHandlerToken)
{
m_resyncHandlerToken = m_rtaManager->AddResyncHandler(m_user, [weakThis = std::weak_ptr<PresenceService>{ shared_from_this() } ]
{
auto sharedThis = weakThis.lock();
if (sharedThis)
{
sharedThis->HandleRTAResync();
}
});
}
for (auto& xuid : xuids)
{
// If we don't have them already, create RTA subscriptions for the new user
@ -133,23 +156,21 @@ HRESULT PresenceService::TrackUsers(
{
TrackedXuidSubscriptions newSubs{};
newSubs.refCount = 1;
newSubs.devicePresenceChangedSub = MakeShared<DevicePresenceChangeSubscription>(xuid, shared_from_this());
for (auto& pair : m_trackedTitles)
{
auto& title{ pair.first };
newSubs.titlePresenceChangedSubscriptions[title] = MakeShared<TitlePresenceChangeSubscription>(xuid, title, shared_from_this());
}
// If there are existing handlers, add the new subs to RTA managers
if (!m_devicePresenceChangedHandlers.empty())
{
newSubs.devicePresenceChangedSub = MakeShared<DevicePresenceChangeSubscription>(xuid, shared_from_this());
RETURN_HR_IF_FAILED(m_rtaManager->AddSubscription(m_user, newSubs.devicePresenceChangedSub));
}
if (!m_titlePresenceChangedHandlers.empty())
{
for (auto& pair : newSubs.titlePresenceChangedSubscriptions)
for (auto& pair : m_trackedTitles)
{
RETURN_HR_IF_FAILED(m_rtaManager->AddSubscription(m_user, pair.second));
auto sub{ MakeShared<TitlePresenceChangeSubscription>(xuid, pair.first, shared_from_this()) };
newSubs.titlePresenceChangedSubscriptions[pair.first] = sub;
RETURN_HR_IF_FAILED(m_rtaManager->AddSubscription(m_user, sub));
}
}
m_trackedXuids[xuid] = std::move(newSubs);
@ -207,12 +228,11 @@ HRESULT PresenceService::TrackAdditionalTitles(
// If its a new title, create the appropriate subscriptions
for (auto& pair : m_trackedXuids)
{
auto sub{ MakeShared<TitlePresenceChangeSubscription>(pair.first, titleId, shared_from_this()) };
pair.second.titlePresenceChangedSubscriptions[titleId] = sub;
// Add new subs to RTA manager if we have handlers
if (!m_titlePresenceChangedHandlers.empty())
{
auto sub{ MakeShared<TitlePresenceChangeSubscription>(pair.first, titleId, shared_from_this()) };
pair.second.titlePresenceChangedSubscriptions[titleId] = sub;
RETURN_HR_IF_FAILED(m_rtaManager->AddSubscription(m_user, sub));
}
}
@ -420,6 +440,97 @@ void PresenceService::HandleTitlePresenceChanged(
}
}
void PresenceService::HandleRTAResync()
{
std::unique_lock<std::mutex> lock{ m_mutex };
LOGS_DEBUG << "Resyncing " << m_trackedXuids.size() << " Presence Subscriptions";
auto weakThis = std::weak_ptr<PresenceService>{ shared_from_this() };
auto handleGetPresenceResult = [weakThis, this](Result<Vector<std::shared_ptr<XblPresenceRecord>>> result)
{
auto sharedThis = weakThis.lock();
if (!sharedThis)
{
return;
}
std::unique_lock<std::mutex> lock{ m_mutex };
if(Succeeded(result))
{
Vector<uint32_t> trackedTitles;
for (auto& pair : m_trackedTitles)
{
trackedTitles.push_back(pair.first);
}
auto titlePresenceChangedHandlers{ m_titlePresenceChangedHandlers };
auto devicePresenceChangedHandlers{ m_devicePresenceChangedHandlers };
lock.unlock();
for (auto& presenceRecord : result.Payload())
{
// Invoke title presence changed subs for tracked titles
for (auto titleId : trackedTitles)
{
bool isPlaying = presenceRecord->IsUserPlayingTitle(titleId);
for (auto& pair : titlePresenceChangedHandlers)
{
pair.second(presenceRecord->Xuid(), titleId, isPlaying ? XblPresenceTitleState::Started : XblPresenceTitleState::Ended);
}
}
// Invoke device presence changed handlers
for (const auto& deviceRecord : presenceRecord->DeviceRecords())
{
for (auto& pair : devicePresenceChangedHandlers)
{
pair.second(presenceRecord->Xuid(), deviceRecord.deviceType, true);
}
}
}
}
};
Vector<uint64_t> trackedXuids;
for (auto& pair : m_trackedXuids)
{
trackedXuids.push_back(pair.first);
}
if (trackedXuids.empty())
{
// nothing to resync
return;
}
else if (trackedXuids.size() > 1)
{
// Make batch query
GetBatchPresence(
UserBatchRequest{ trackedXuids.data(), trackedXuids.size(), nullptr },
AsyncContext<Result<Vector<std::shared_ptr<XblPresenceRecord>>>>{ m_queue, std::move(handleGetPresenceResult) }
);
}
else
{
GetPresence(
trackedXuids.front(),
AsyncContext<Result<std::shared_ptr<XblPresenceRecord>>>{m_queue, [batchResultHandler = std::move(handleGetPresenceResult)](Result<std::shared_ptr<XblPresenceRecord>> result)
{
if (Succeeded(result))
{
batchResultHandler(Vector<std::shared_ptr<XblPresenceRecord>>{ result.ExtractPayload() });
}
else
{
batchResultHandler(result.Hresult());
}
}
});
}
}
Result<Vector<std::shared_ptr<XblPresenceRecord>>> PresenceService::DeserializeBatchPresenceRecordsResponse(
const JsonValue& json
) noexcept

Просмотреть файл

@ -59,30 +59,4 @@ void TitlePresenceChangeSubscription::OnEvent(
}
}
void TitlePresenceChangeSubscription::OnResync() noexcept
{
auto presenceService{ m_presenceService.lock() };
if (presenceService)
{
presenceService->GetPresence(m_xuid, {
[
sharedThis{ shared_from_this() },
presenceService
]
(Result<std::shared_ptr<XblPresenceRecord>> result)
{
if (Succeeded(result))
{
bool isPlaying{ result.Payload()->IsUserPlayingTitle(sharedThis->m_titleId) };
presenceService->HandleTitlePresenceChanged(
sharedThis->m_xuid,
sharedThis->m_titleId,
isPlaying ? XblPresenceTitleState::Started : XblPresenceTitleState::Ended
);
}
}}
);
}
}
NAMESPACE_MICROSOFT_XBOX_SERVICES_PRESENCE_CPP_END

Просмотреть файл

@ -92,13 +92,6 @@ Connection::~Connection() noexcept
LOGS_DEBUG << __FUNCTION__ << "[" << this << "]";
m_queue.Terminate(false);
#if HC_PLATFORM == HC_PLATFORM_GDK
auto state{ GlobalState::Get() };
if (state)
{
state->RemoveAppChangeNotificationHandler(m_registrationID);
}
#endif
}
Result<std::shared_ptr<Connection>> Connection::Make(
@ -120,31 +113,8 @@ Result<std::shared_ptr<Connection>> Connection::Make(
Allocator<Connection>()
);
auto hr = rtaConnection->InitializeWebsocket();
if (FAILED(hr))
{
return hr;
}
rtaConnection->m_stateChangedHandler(rtaConnection->m_state);
rtaConnection->m_websocket->Connect(s_rtaUri, s_rtaSubprotocol);
#if HC_PLATFORM == HC_PLATFORM_GDK
auto state{ GlobalState::Get() };
if (state)
{
rtaConnection->m_registrationID = state->AddAppChangeNotificationHandler(
[weakThis = std::weak_ptr<Connection>{ rtaConnection }](bool isSuspended)
{
std::shared_ptr<Connection> connection = weakThis.lock();
if (connection)
{
connection->AppStateChangeNotificationReceived(isSuspended);
}
}
);
}
#endif
rtaConnection->ScheduleConnect();
return rtaConnection;
}
@ -152,11 +122,13 @@ Result<std::shared_ptr<Connection>> Connection::Make(
void Connection::Cleanup()
{
std::unique_lock<std::mutex> lock{ m_lock };
assert(m_websocket);
// Clear our disconnect handler to disable auto-reconnect logic
m_websocket->SetDisconnectHandler(nullptr);
m_websocket->Disconnect();
if (m_websocket)
{
// Clear our disconnect handler to disable auto-reconnect logic
m_websocket->SetDisconnectHandler(nullptr);
m_websocket->Disconnect();
}
List<AsyncContext<Result<void>>> pendingAsyncContexts;
for (auto& pair : m_subscribeAsyncContexts)
@ -183,21 +155,6 @@ void Connection::Cleanup()
);
}
#if HC_PLATFORM == HC_PLATFORM_GDK
void Connection::AppStateChangeNotificationReceived(
bool isSuspended
) noexcept
{
std::unique_lock<std::mutex> lock{ m_lock };
this->m_isSuspended = isSuspended;
if (!this->m_isSuspended && this->m_state == XblRealTimeActivityConnectionState::Disconnected)
{
Reconnect(std::move(lock));
}
}
#endif
HRESULT Connection::AddSubscription(
std::shared_ptr<Subscription> sub,
AsyncContext<Result<void>> async
@ -214,7 +171,7 @@ HRESULT Connection::AddSubscription(
m_subs[sub->m_state->clientId] = sub;
LOGS_DEBUG << __FUNCTION__ << ": [" << sub->m_state->clientId << "] ServiceStatus=" << EnumName(sub->m_state->serviceStatus);
LOGS_DEBUG << __FUNCTION__ << ": [" << sub->m_state->clientId << "] Uri=" << sub->m_resourceUri;
switch (sub->m_state->serviceStatus)
{
@ -225,7 +182,7 @@ HRESULT Connection::AddSubscription(
// If our connection is active, immediately register with RTA service
if (m_state == XblRealTimeActivityConnectionState::Connected)
{
return SendSubscribeMessage(sub);
return SendSubscribeMessage(sub, std::move(lock));
}
return S_OK;
}
@ -273,7 +230,7 @@ HRESULT Connection::RemoveSubscription(
assert(iter != m_subs.end());
(void)(iter); // suppress unused warning
LOGS_DEBUG << __FUNCTION__ << ": [" << sub->m_state->clientId << "] ServiceStatus=" << EnumName(sub->m_state->serviceStatus);
LOGS_DEBUG << __FUNCTION__ << ": [" << sub->m_state->clientId << "] Uri=" << sub->m_resourceUri << ", ServiceStatus=" << EnumName(sub->m_state->serviceStatus);
switch (sub->m_state->serviceStatus)
{
@ -292,7 +249,7 @@ HRESULT Connection::RemoveSubscription(
{
// Unregister subscription from RTA service
m_unsubscribeAsyncContexts[sub->m_state->clientId] = std::move(async);
return SendUnsubscribeMessage(sub);
return SendUnsubscribeMessage(sub, std::move(lock));
}
case Subscription::State::ServiceStatus::PendingSubscribe:
{
@ -333,9 +290,7 @@ size_t Connection::SubscriptionCount() const noexcept
return m_subs.size();
}
HRESULT Connection::SendSubscribeMessage(
std::shared_ptr<Subscription> sub
) const noexcept
JsonDocument Connection::AssembleSubscribeMessage(std::shared_ptr<Subscription> sub) const noexcept
{
// Payload format [<API_ID>, <SEQUENCE_N>, “<RESOURCE_URI>”]
@ -348,6 +303,23 @@ HRESULT Connection::SendSubscribeMessage(
request.PushBack(sub->m_state->clientId, a);
request.PushBack(JsonValue{ sub->m_resourceUri.data(), a }, a);
return request;
}
HRESULT Connection::SendSubscribeMessage(
std::shared_ptr<Subscription> sub,
std::unique_lock<std::mutex>&& lock
) const noexcept
{
JsonDocument request = AssembleSubscribeMessage(sub);
lock.unlock();
return SendAssembledMessage(request);
}
HRESULT Connection::SendAssembledMessage(_In_ const JsonValue& request) const noexcept
{
String requestString{ JsonUtils::SerializeJson(request) };
LOGS_DEBUG << __FUNCTION__ << "[" << this << "]: " << requestString;
@ -355,7 +327,8 @@ HRESULT Connection::SendSubscribeMessage(
}
HRESULT Connection::SendUnsubscribeMessage(
std::shared_ptr<Subscription> sub
std::shared_ptr<Subscription> sub,
std::unique_lock<std::mutex>&& lock
) const noexcept
{
// Payload format [<API_ID>, <SEQUENCE_N>, <SUB_ID>]
@ -369,6 +342,8 @@ HRESULT Connection::SendUnsubscribeMessage(
request.PushBack(sub->m_state->clientId, a);
request.PushBack(sub->m_state->serviceId, a);
lock.unlock();
String requestString{ JsonUtils::SerializeJson(request) };
LOGS_DEBUG << __FUNCTION__ << "[" << this << "]: " << requestString;
@ -409,6 +384,9 @@ void Connection::SubscribeResponseHandler(_In_ const JsonValue& message) noexcep
m_activeSubs[sub->m_state->serviceId][sub->m_state->clientId] = sub;
}
AsyncContext<Result<void>> asyncContext{ std::move(m_subscribeAsyncContexts[sub->m_state->clientId]) };
m_subscribeAsyncContexts.erase(sub->m_state->clientId);
switch (sub->m_state->serviceStatus)
{
case Subscription::State::ServiceStatus::Subscribing:
@ -420,7 +398,7 @@ void Connection::SubscribeResponseHandler(_In_ const JsonValue& message) noexcep
{
// Client has removed the subscription while subscribe handshake was happening,
// so immediately begin unsubscribing.
SendUnsubscribeMessage(sub);
SendUnsubscribeMessage(sub, std::move(lock));
break;
}
default:
@ -431,10 +409,10 @@ void Connection::SubscribeResponseHandler(_In_ const JsonValue& message) noexcep
}
}
AsyncContext<Result<void>> asyncContext{ std::move(m_subscribeAsyncContexts[sub->m_state->clientId]) };
m_subscribeAsyncContexts.erase(sub->m_state->clientId);
lock.unlock();
if (lock)
{
lock.unlock();
}
asyncContext.Complete(ConvertRTAErrorCode(errorCode));
sub->OnSubscribe(data);
@ -526,6 +504,9 @@ void Connection::UnsubscribeResponseHandler(_In_ const JsonValue& message) noexc
LOGS_DEBUG << __FUNCTION__ << ": [" << sub->m_state->clientId <<"] ServiceStatus=" << EnumName(sub->m_state->serviceStatus);
AsyncContext<Result<void>> asyncContext{ std::move(m_unsubscribeAsyncContexts[clientId]) };
m_unsubscribeAsyncContexts.erase(clientId);
switch (sub->m_state->serviceStatus)
{
case Subscription::State::ServiceStatus::Unsubscribing:
@ -539,7 +520,7 @@ void Connection::UnsubscribeResponseHandler(_In_ const JsonValue& message) noexc
{
// Client has re-added the subscription while unsubscibe handshake was happening,
// so immediately begin subscribing.
SendSubscribeMessage(sub);
SendSubscribeMessage(sub, std::move(lock));
break;
}
default:
@ -549,10 +530,10 @@ void Connection::UnsubscribeResponseHandler(_In_ const JsonValue& message) noexc
}
}
AsyncContext<Result<void>> asyncContext{ std::move(m_unsubscribeAsyncContexts[clientId]) };
m_unsubscribeAsyncContexts.erase(clientId);
lock.unlock();
if (lock)
{
lock.unlock();
}
asyncContext.Complete(ConvertRTAErrorCode(errorCode));
}
@ -578,27 +559,6 @@ void Connection::EventHandler(_In_ const JsonValue& message) const noexcept
}
}
void Connection::ResyncHandler() const noexcept
{
List<std::shared_ptr<Subscription>> subs;
std::unique_lock<std::mutex> lock{ m_lock };
for (auto& pair : m_subs)
{
subs.push_back(pair.second);
}
lock.unlock();
// In some cases, subscriptions have enough context to handle a resync internally. In other cases,
// there is some client context required, so we also will raise the resync to the client.
for (auto& sub : subs)
{
sub->OnResync();
}
m_resyncHandler();
}
void Connection::ConnectCompleteHandler(WebsocketResult result) noexcept
{
LOGS_DEBUG << __FUNCTION__ << ": WebsocketResult [" << result.hr << "," << result.platformErrorCode << "]";
@ -609,12 +569,15 @@ void Connection::ConnectCompleteHandler(WebsocketResult result) noexcept
{
m_state = XblRealTimeActivityConnectionState::Connected;
m_connectTime = std::chrono::system_clock::now();
m_connectAttempt = 0;
assert(m_activeSubs.empty());
List<JsonDocument> subMessages{};
for (auto& pair : m_subs)
{
assert(pair.second->m_state->serviceStatus == Subscription::State::ServiceStatus::Inactive);
SendSubscribeMessage(pair.second);
subMessages.push_back(AssembleSubscribeMessage(pair.second));
}
// RTA v2 has a lifetime of 2 hours. After 2 hours RTA service will disconnect the title. On some platforms
@ -638,62 +601,64 @@ void Connection::ConnectCompleteHandler(WebsocketResult result) noexcept
},
CONNECTION_TIMEOUT_MS
);
lock.unlock();
for (auto& request : subMessages)
{
SendAssembledMessage(request);
}
}
else
{
m_state = XblRealTimeActivityConnectionState::Disconnected;
//libHttpClient websocket does not support connecting
// the same websocket handle multiple times, so create a new one.
auto hr = InitializeWebsocket();
if (FAILED(hr))
{
return;
}
// Backoff and attempt to connect again.
m_connectAttempt++;
uint64_t backoff = __min(std::pow(m_connectAttempt, 2), 60) * 1000;
m_queue.RunWork([weakThis = std::weak_ptr<Connection>{ shared_from_this() }]
{
auto sharedThis{ weakThis.lock() };
if (sharedThis)
{
{
std::unique_lock<std::mutex> lock{ sharedThis->m_lock };
sharedThis->m_state = XblRealTimeActivityConnectionState::Connecting;
}
sharedThis->m_stateChangedHandler(sharedThis->m_state);
sharedThis->m_websocket->Connect(s_rtaUri, s_rtaSubprotocol);
}
},
backoff
);
ScheduleConnect();
}
lock.unlock();
m_stateChangedHandler(m_state);
}
void Connection::Reconnect(std::unique_lock<std::mutex>&& lock) noexcept
{
// Immediately attempt to reconnect. libHttpClient websocket does not support connecting
// the same websocket handle multiple times, so create a new one.
auto hr = InitializeWebsocket();
if (FAILED(hr))
if (lock)
{
return;
lock.unlock();
}
m_connectAttempt = 0;
m_state = XblRealTimeActivityConnectionState::Connecting;
lock.unlock();
m_stateChangedHandler(m_state);
m_websocket->Connect(s_rtaUri, s_rtaSubprotocol);
}
void Connection::ScheduleConnect() noexcept
{
LOGS_DEBUG << __FUNCTION__;
// Backoff and attempt to connect again.
uint64_t backoff = __min(std::pow(m_connectAttempt++, 2), 60) * 1000;
m_queue.RunWork([weakThis = std::weak_ptr<Connection>{ shared_from_this() }, this]
{
auto sharedThis{ weakThis.lock() };
if (sharedThis)
{
std::unique_lock<std::mutex> lock{ m_lock };
LOGS_DEBUG << "RTA::Connection Initializing WebSocket and attempting connect. Subcount=" << m_subs.size();
auto hr = InitializeWebsocket();
if (FAILED(hr))
{
ScheduleConnect();
}
else
{
m_state = XblRealTimeActivityConnectionState::Connecting;
lock.unlock();
sharedThis->m_stateChangedHandler(sharedThis->m_state);
sharedThis->m_websocket->Connect(s_rtaUri, s_rtaSubprotocol); // Do synchronous failures need to be handled here?
}
}
},
backoff
);
}
void Connection::DisconnectHandler(WebSocketCloseStatus status) noexcept
{
LOGS_DEBUG << __FUNCTION__ << ": WebocketCloseStatus [" << static_cast<uint32_t>(status) << "]";
@ -759,22 +724,8 @@ void Connection::DisconnectHandler(WebSocketCloseStatus status) noexcept
}
m_state = XblRealTimeActivityConnectionState::Disconnected;
// On GDK, if the cause of the disconnection is that the title went into suspended mode
// Don't reconnect right away and wait for the title to exit suspended mode first.
// Otherwise, attempt to reconnect.
#if HC_PLATFORM == HC_PLATFORM_GDK
if (!this->m_isSuspended) {
#endif
Reconnect(std::move(lock));
#if HC_PLATFORM == HC_PLATFORM_GDK
}
else
{
lock.unlock();
}
#endif
ScheduleConnect();
lock.unlock();
for (auto& async : unsubscribeAsyncContexts)
{
@ -818,7 +769,7 @@ void Connection::WebsocketMessageReceived(const String& message) noexcept
}
case MessageType::Resync:
{
ResyncHandler();
m_resyncHandler();
break;
}
default:
@ -831,6 +782,8 @@ void Connection::WebsocketMessageReceived(const String& message) noexcept
HRESULT Connection::InitializeWebsocket() noexcept
{
LOGS_DEBUG << __FUNCTION__;
if (m_websocket)
{
m_websocket->SetConnectCompleteHandler([](WebsocketResult) {});

Просмотреть файл

@ -49,26 +49,31 @@ private:
ResyncHandler resyncHandler
) noexcept;
JsonDocument AssembleSubscribeMessage(std::shared_ptr<Subscription> sub) const noexcept;
// RTA protocol implementation
HRESULT SendSubscribeMessage(
std::shared_ptr<Subscription> subscription
std::shared_ptr<Subscription> subscription,
std::unique_lock<std::mutex>&& lock
) const noexcept;
HRESULT SendUnsubscribeMessage(
std::shared_ptr<Subscription> subscription
std::shared_ptr<Subscription> subscription,
std::unique_lock<std::mutex>&& lock
) const noexcept;
HRESULT SendAssembledMessage(_In_ const JsonValue& message) const noexcept;
void SubscribeResponseHandler(_In_ const JsonValue& message) noexcept;
void UnsubscribeResponseHandler(_In_ const JsonValue& message) noexcept;
void EventHandler(_In_ const JsonValue& message) const noexcept;
void ResyncHandler() const noexcept;
// IWebsocket handlers
void ConnectCompleteHandler(WebsocketResult result) noexcept;
void DisconnectHandler(WebSocketCloseStatus result) noexcept;
void WebsocketMessageReceived(const String& message) noexcept;
HRESULT InitializeWebsocket() noexcept;
void Reconnect(std::unique_lock<std::mutex>&& lock) noexcept;
void ScheduleConnect() noexcept;
User m_user;
TaskQueue const m_queue;
@ -86,15 +91,6 @@ private:
uint32_t m_nextSubId{ 1 };
#if HC_PLATFORM == HC_PLATFORM_GDK
// This flag is used to indicate whether the title is in the middle of being suspended
// In that case, the connection won't attempt to reconnect until the title is out of the 'suspended' state
bool m_isSuspended = false;
// Holds the registration ID for receiving App State Notifications (aka Quick Resume)
XblFunctionContext m_registrationID;
#endif
mutable std::mutex m_lock;
};

Просмотреть файл

@ -189,6 +189,21 @@ void RealTimeActivityManager::Deactivate(
}
}
void RealTimeActivityManager::TriggerResync() const noexcept
{
std::unique_lock<std::recursive_mutex> lock{ m_lock };
auto handlers{ m_resyncHandlers };
lock.unlock();
for (auto& userPair : handlers)
{
for (auto& handlerPair : userPair.second)
{
handlerPair.second();
}
}
}
Result<std::shared_ptr<Connection>> RealTimeActivityManager::GetConnection(
const User& user
) noexcept
@ -261,4 +276,17 @@ Result<std::shared_ptr<Connection>> RealTimeActivityManager::GetConnection(
return connection;
}
NAMESPACE_MICROSOFT_XBOX_SERVICES_RTA_CPP_END
NAMESPACE_MICROSOFT_XBOX_SERVICES_RTA_CPP_END
// Test Hook
HRESULT XblTestHooksTriggerRTAResync()
{
auto state = GlobalState::Get();
if (!state)
{
return E_XBL_NOT_INITIALIZED;
}
state->RTAManager()->TriggerResync();
return S_OK;
}

Просмотреть файл

@ -61,6 +61,9 @@ public:
const User& user
) noexcept;
// Test Hook
void TriggerResync() const noexcept;
private:
Result<std::shared_ptr<class Connection>> GetConnection(
const User& user

Просмотреть файл

@ -33,7 +33,6 @@ protected:
assert(data.IsNull());
};
virtual void OnEvent(const JsonValue& event) noexcept = 0;
virtual void OnResync() noexcept = 0;
String m_resourceUri;

Просмотреть файл

@ -99,7 +99,7 @@ HRESULT PeoplehubService::MakeServiceCall(
xbox_live_api::get_social_graph
));
httpCall->SetXblServiceContractVersion(3);
httpCall->SetXblServiceContractVersion(5);
if (!bodyJson.IsNull())
{
@ -309,9 +309,9 @@ Result<XblTitleHistory> PeoplehubService::DeserializeTitleHistory(
return titleHistory;
}
// If PeopleHub service fails to query TitleHistory, the "LastTimePlayed" field may be null.
// If PeopleHub service fails to query TitleHistory, the "lastTimePlayed" field may be null.
// We don't want to fail deserialization in this case, so just return that the user has not played
constexpr const char* lastTimePlayedKey{ "LastTimePlayed" };
constexpr const char* lastTimePlayedKey{ "lastTimePlayed" };
if (json.HasMember(lastTimePlayedKey) && json[lastTimePlayedKey].IsString())
{
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonTimeT(
@ -322,6 +322,17 @@ Result<XblTitleHistory> PeoplehubService::DeserializeTitleHistory(
));
}
constexpr const char* lastTimePlayedTextKey{ "lastTimePlayedText" };
if (json.HasMember(lastTimePlayedTextKey) && json[lastTimePlayedTextKey].IsString())
{
RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonStringToCharArray(
json,
lastTimePlayedTextKey,
titleHistory.lastTimeUserPlayedText,
XBL_LAST_TIME_PLAYED_CHAR_SIZE
));
}
titleHistory.hasUserPlayed = titleHistory.lastTimeUserPlayed != 0;
return Result<XblTitleHistory>{ titleHistory };

Просмотреть файл

@ -63,7 +63,6 @@ public:
protected:
void OnEvent(const JsonValue& data) noexcept override;
void OnResync() noexcept override;
private:
uint64_t m_xuid;

Просмотреть файл

@ -81,11 +81,4 @@ void SocialRelationshipChangeSubscription::OnEvent(
}
}
void SocialRelationshipChangeSubscription::OnResync() noexcept
{
// Can't easily tell what might have been missed without keeping track of a full
// SocialGraph locally. Log the service error and continue.
LOGS_DEBUG << __FUNCTION__ << ": Resync received, relationship changes may have been missed";
}
NAMESPACE_MICROSOFT_XBOX_SERVICES_SOCIAL_CPP_END

Просмотреть файл

@ -10,7 +10,7 @@ StatisticChangeSubscription::StatisticChangeSubscription(
_In_ uint64_t xuid,
_In_ String scid,
_In_ String statisticName,
_In_ std::shared_ptr<UserStatisticsService const> statisticsService
_In_ std::shared_ptr<UserStatisticsService> statisticsService
) noexcept :
m_xuid{ xuid },
m_scid{ std::move(scid) },
@ -122,38 +122,6 @@ void StatisticChangeSubscription::OnEvent(
}
}
void StatisticChangeSubscription::OnResync() noexcept
{
if (auto statisticsService{ m_statisticsService.lock() })
{
statisticsService->GetSingleUserStatistic(m_xuid, m_scid, m_statisticName, {
[
sharedThis{ shared_from_this() },
statisticsService
]
(Result<UserStatisticsResult> result)
{
if (Succeeded(result))
{
auto& payload{ result.Payload() };
if (payload.ServiceConfigurationStatistics().size() >= 1 &&
payload.ServiceConfigurationStatistics()[0].Statistics().size() >= 1)
{
statisticsService->HandleStatisticChanged(StatisticChangeEventArgs
{
sharedThis->m_xuid,
sharedThis->m_scid,
sharedThis->m_statisticName,
sharedThis->m_statisticType,
payload.ServiceConfigurationStatistics()[0].Statistics()[0].Value()
});
}
}
}
});
}
}
StatisticChangeEventArgs::StatisticChangeEventArgs(
_In_ uint64_t _xboxUserId,
_In_ const String& _serviceConfigurationId,

Просмотреть файл

@ -143,20 +143,19 @@ public:
_In_ uint64_t xuid,
_In_ String scid,
_In_ String statisticName,
_In_ std::shared_ptr<class UserStatisticsService const> statisticsService
_In_ std::shared_ptr<class UserStatisticsService> statisticsService
) noexcept;
protected:
void OnSubscribe(_In_ const JsonValue& data) noexcept override;
void OnEvent(_In_ const JsonValue& data) noexcept override;
void OnResync() noexcept override;
private:
const uint64_t m_xuid;
const String m_scid;
const String m_statisticName;
String m_statisticType;
const std::weak_ptr<class UserStatisticsService const> m_statisticsService;
const std::weak_ptr<class UserStatisticsService> m_statisticsService;
};
class UserStatisticsService : public std::enable_shared_from_this<UserStatisticsService>
@ -164,6 +163,7 @@ class UserStatisticsService : public std::enable_shared_from_this<UserStatistics
public:
UserStatisticsService(
_In_ User&& user,
_In_ const TaskQueue& backgroundQueue,
_In_ std::shared_ptr<xbox::services::XboxLiveContextSettings> xboxLiveContextSettings,
_In_ std::shared_ptr<xbox::services::real_time_activity::RealTimeActivityManager> rtaManager
) noexcept;
@ -223,11 +223,13 @@ public:
_In_ const Vector<uint64_t>& xuids
) noexcept;
private:
void HandleStatisticChanged(
const StatisticChangeEventArgs& args
) const noexcept;
private:
void HandleRTAResync();
static String UserStatsSubpath(
_In_ uint64_t xuid,
_In_ const String& serviceConfigurationId,
@ -235,9 +237,11 @@ private:
) noexcept;
User m_user;
TaskQueue m_queue;
std::shared_ptr<xbox::services::XboxLiveContextSettings> m_xboxLiveContextSettings;
std::shared_ptr<xbox::services::real_time_activity::RealTimeActivityManager> m_rtaManager;
XblFunctionContext m_resyncHandlerToken{ 0 };
Map<XblFunctionContext, StatisticChangeHandler> m_statisticChangeHandlers;
XblFunctionContext m_nextToken{ 1 };
@ -248,9 +252,14 @@ private:
};
// Indexing on Xuid before StatName because the set of tracked Users is probably more
// likely to change than the set of tracked Stats.
Map<uint64_t, Map<std::pair<String, String>, SubscriptionHolder>> m_trackedStats;
Map<uint64_t, Map<std::pair<String, String>, SubscriptionHolder>> m_trackedStatsByUser;
// Tracked stats by scid. Needed to perform RTA resync
Map<String, Vector<String>> m_trackedStatsByScid;
mutable std::mutex m_mutex;
friend class StatisticChangeSubscription;
};
NAMESPACE_MICROSOFT_XBOX_SERVICES_USERSTATISTICS_CPP_END

Просмотреть файл

@ -10,10 +10,12 @@ NAMESPACE_MICROSOFT_XBOX_SERVICES_USERSTATISTICS_CPP_BEGIN
UserStatisticsService::UserStatisticsService(
_In_ User&& user,
_In_ const TaskQueue& backgroundQueue,
_In_ std::shared_ptr<xbox::services::XboxLiveContextSettings> xboxLiveContextSettings,
_In_ std::shared_ptr<xbox::services::real_time_activity::RealTimeActivityManager> rtaManager
) noexcept :
m_user{ std::move(user) },
m_queue{ backgroundQueue.DeriveWorkerQueue() },
m_xboxLiveContextSettings{ std::move(xboxLiveContextSettings) },
m_rtaManager{ std::move(rtaManager) }
{
@ -21,9 +23,14 @@ UserStatisticsService::UserStatisticsService(
UserStatisticsService::~UserStatisticsService() noexcept
{
if (m_resyncHandlerToken)
{
m_rtaManager->RemoveResyncHandler(m_user, m_resyncHandlerToken);
}
if (!m_statisticChangeHandlers.empty())
{
for (auto& userPair : m_trackedStats)
for (auto& userPair : m_trackedStatsByUser)
{
for (auto& statPair : userPair.second)
{
@ -211,13 +218,26 @@ XblFunctionContext UserStatisticsService::AddStatisticChangedHandler(
{
std::lock_guard<std::mutex> lock{ m_mutex };
if (!m_resyncHandlerToken)
{
m_resyncHandlerToken = m_rtaManager->AddResyncHandler(m_user, [weakThis = std::weak_ptr<UserStatisticsService>{ shared_from_this() }]
{
auto sharedThis = weakThis.lock();
if (sharedThis)
{
sharedThis->HandleRTAResync();
}
});
}
// Add subs to RTA manager if needed
if (m_statisticChangeHandlers.empty())
{
for (auto& userPair : m_trackedStats)
for (auto& userPair : m_trackedStatsByUser)
{
for (auto& statPair : userPair.second)
{
statPair.second.subscription = MakeShared<StatisticChangeSubscription>(userPair.first, statPair.first.first, statPair.first.second, shared_from_this());
m_rtaManager->AddSubscription(m_user, statPair.second.subscription);
}
}
@ -238,11 +258,12 @@ void UserStatisticsService::RemoveStatisticChangedHandler(
// Remove subs if there are no more handlers
if (removed && m_statisticChangeHandlers.empty())
{
for (auto& userPair : m_trackedStats)
for (auto& userPair : m_trackedStatsByUser)
{
for (auto& statPair : userPair.second)
{
m_rtaManager->RemoveSubscription(m_user, statPair.second.subscription);
statPair.second.subscription.reset();
}
}
}
@ -258,18 +279,19 @@ HRESULT UserStatisticsService::TrackStatistics(
for (auto& xuid : xuids)
{
auto& userStats{ m_trackedStats[xuid] };
auto& userStats{ m_trackedStatsByUser[xuid] };
for (auto& statName : statNames)
{
auto iter{ userStats.find({ scid, statName }) };
if (iter == userStats.end())
{
auto sub{ MakeShared<StatisticChangeSubscription>(xuid, scid, statName, shared_from_this()) };
userStats[{scid, statName}] = SubscriptionHolder{ 1, sub };
userStats[{scid, statName}] = SubscriptionHolder{ 1, nullptr };
// If there are existing handlers, add the new subs to RTA manager
if (!m_statisticChangeHandlers.empty())
{
auto sub{ MakeShared<StatisticChangeSubscription>(xuid, scid, statName, shared_from_this()) };
userStats[{scid, statName}].subscription = sub;
RETURN_HR_IF_FAILED(m_rtaManager->AddSubscription(m_user, sub));
}
}
@ -292,7 +314,7 @@ HRESULT UserStatisticsService::StopTrackingStatistics(
for (auto& xuid : xuids)
{
auto& userStats{ m_trackedStats[xuid] };
auto& userStats{ m_trackedStatsByUser[xuid] };
for (auto& statName : statNames)
{
auto iter{ userStats.find({ scid, statName }) };
@ -318,7 +340,7 @@ HRESULT UserStatisticsService::StopTrackingUsers(
for (auto& xuid : xuids)
{
auto& userStats{ m_trackedStats[xuid] };
auto& userStats{ m_trackedStatsByUser[xuid] };
for (auto& statPair : userStats)
{
if (--(statPair.second.refCount) == 0)
@ -327,6 +349,7 @@ HRESULT UserStatisticsService::StopTrackingUsers(
if (!m_statisticChangeHandlers.empty())
{
RETURN_HR_IF_FAILED(m_rtaManager->RemoveSubscription(m_user, statPair.second.subscription));
statPair.second.subscription.reset();
}
}
}
@ -348,6 +371,75 @@ void UserStatisticsService::HandleStatisticChanged(
}
}
void UserStatisticsService::HandleRTAResync()
{
std::unique_lock<std::mutex> lock{ m_mutex };
// Get all stats tracked stats for all tracked users so that we can resync in a single request.
// In the request callback, we will only invoke the stat changed handlers for the tracked users/stats
Vector<uint64_t> trackedUsers;
Vector<RequestedStatistics> trackedStats;
for (auto& pair : m_trackedStatsByUser)
{
trackedUsers.push_back(pair.first);
}
for (auto& pair : m_trackedStatsByScid)
{
trackedStats.push_back(RequestedStatistics{ pair.first, pair.second });
}
auto weakThis = std::weak_ptr<UserStatisticsService>{ shared_from_this() };
auto getStatsCallback = [weakThis, this](Result<Vector<UserStatisticsResult>> result)
{
auto sharedThis = weakThis.lock();
if (!sharedThis)
{
return;
}
std::unique_lock<std::mutex> lock{ m_mutex };
if (Succeeded(result))
{
Vector<StatisticChangeEventArgs> changeEvents;
for (auto& userStatsResult : result.Payload())
{
// Only invoke handler for tracked stats
auto trackedUserIter = m_trackedStatsByUser.find(utils::internal_string_to_uint64(userStatsResult.XboxUserId()));
if (trackedUserIter != m_trackedStatsByUser.end())
{
for (auto& scidStats : userStatsResult.ServiceConfigurationStatistics())
{
for (auto& stat : scidStats.Statistics())
{
auto trackedStatIter = trackedUserIter->second.find({ scidStats.ServiceConfigurationId(), stat.StatisticName() });
if (trackedStatIter != trackedUserIter->second.end())
{
changeEvents.emplace_back(trackedUserIter->first, scidStats.ServiceConfigurationId(), stat.StatisticName(), stat.StatisticType(), stat.Value());
}
}
}
}
}
auto statChangedHandlers{ m_statisticChangeHandlers };
lock.unlock();
for (auto& pair : statChangedHandlers)
{
for (auto& eventArgs : changeEvents)
{
pair.second(eventArgs);
}
}
}
};
GetMultipleUserStatisticsForMultipleServiceConfigurations(trackedUsers, trackedStats, AsyncContext<Result<Vector<UserStatisticsResult>>>{ m_queue, std::move(getStatsCallback) });
}
String UserStatisticsService::UserStatsSubpath(
_In_ uint64_t xuid,
_In_ const String& serviceConfigurationId,

Просмотреть файл

@ -631,16 +631,15 @@ xsapi_internal_string datetime::to_string_internal(date_format format) const
throw utility::details::create_system_error(GetLastError());
}
xsapi_internal_wostringstream outStream;
outStream.imbue(std::locale::classic());
constexpr size_t dateTimeMaxLength{ 256 };
wchar_t dateTimeBuffer[dateTimeMaxLength]{ 0 };
if (format == RFC_1123)
{
wchar_t dateStr[18] = { 0 };
#if _WIN32_WINNT < _WIN32_WINNT_VISTA
TCHAR dateStr[18] = {0};
status = GetDateFormat(LOCALE_INVARIANT, 0, &systemTime, __TEXT("ddd',' dd MMM yyyy"), dateStr, sizeof(dateStr) / sizeof(TCHAR));
status = GetDateFormatW(LOCALE_INVARIANT, 0, &systemTime, L"ddd',' dd MMM yyyy", dateStr, sizeof(dateStr) / sizeof(wchar_t));
#else
wchar_t dateStr[18] = {0};
status = GetDateFormatEx(LOCALE_NAME_INVARIANT, 0, &systemTime, L"ddd',' dd MMM yyyy", dateStr, sizeof(dateStr) / sizeof(wchar_t), NULL);
#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA
if (status == 0)
@ -648,11 +647,10 @@ xsapi_internal_string datetime::to_string_internal(date_format format) const
throw utility::details::create_system_error(GetLastError());
}
wchar_t timeStr[10] = { 0 };
#if _WIN32_WINNT < _WIN32_WINNT_VISTA
TCHAR timeStr[10] = {0};
status = GetTimeFormat(LOCALE_INVARIANT, TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, &systemTime, __TEXT("HH':'mm':'ss"), timeStr, sizeof(timeStr) / sizeof(TCHAR));
status = GetTimeFormatW(LOCALE_INVARIANT, TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, &systemTime, L"HH':'mm':'ss", timeStr, sizeof(timeStr) / sizeof(wchar_t));
#else
wchar_t timeStr[10] = {0};
status = GetTimeFormatEx(LOCALE_NAME_INVARIANT, TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, &systemTime, L"HH':'mm':'ss", timeStr, sizeof(timeStr) / sizeof(wchar_t));
#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA
if (status == 0)
@ -660,16 +658,15 @@ xsapi_internal_string datetime::to_string_internal(date_format format) const
throw utility::details::create_system_error(GetLastError());
}
outStream << dateStr << " " << timeStr << " " << "GMT";
_snwprintf_s(dateTimeBuffer, sizeof(dateTimeBuffer), L"%s %s GMT", dateStr, timeStr);
}
else if (format == ISO_8601)
{
const size_t buffSize = 64;
wchar_t dateStr[buffSize] = { 0 };
#if _WIN32_WINNT < _WIN32_WINNT_VISTA
TCHAR dateStr[buffSize] = {0};
status = GetDateFormat(LOCALE_INVARIANT, 0, &systemTime, __TEXT("yyyy-MM-dd"), dateStr, buffSize);
status = GetDateFormatW(LOCALE_INVARIANT, 0, &systemTime, L"yyyy-MM-dd", dateStr, buffSize);
#else
wchar_t dateStr[buffSize] = {0};
status = GetDateFormatEx(LOCALE_NAME_INVARIANT, 0, &systemTime, L"yyyy-MM-dd", dateStr, buffSize, NULL);
#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA
if (status == 0)
@ -677,11 +674,10 @@ xsapi_internal_string datetime::to_string_internal(date_format format) const
throw utility::details::create_system_error(GetLastError());
}
wchar_t timeStr[buffSize] = { 0 };
#if _WIN32_WINNT < _WIN32_WINNT_VISTA
TCHAR timeStr[buffSize] = {0};
status = GetTimeFormat(LOCALE_INVARIANT, TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, &systemTime, __TEXT("HH':'mm':'ss"), timeStr, buffSize);
status = GetTimeFormatW(LOCALE_INVARIANT, TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, &systemTime, L"HH':'mm':'ss", timeStr, buffSize);
#else
wchar_t timeStr[buffSize] = {0};
status = GetTimeFormatEx(LOCALE_NAME_INVARIANT, TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, &systemTime, L"HH':'mm':'ss", timeStr, buffSize);
#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA
if (status == 0)
@ -689,22 +685,21 @@ xsapi_internal_string datetime::to_string_internal(date_format format) const
throw utility::details::create_system_error(GetLastError());
}
outStream << dateStr << "T" << timeStr;
wchar_t fracSecBuf[9] = { 0 };
uint64_t frac_sec = largeInt.QuadPart % _secondTicks;
if (frac_sec > 0)
{
// Append fractional second, which is a 7-digit value with no trailing zeros
// This way, '1200' becomes '00012'
char buf[9] = { 0 };
sprintf_s(buf, sizeof(buf), ".%07ld", (long int)frac_sec);
_snwprintf_s(fracSecBuf, sizeof(fracSecBuf), L".%07ld", (long int)frac_sec);
// trim trailing zeros
for (int i = 7; buf[i] == '0'; i--) buf[i] = '\0';
outStream << buf;
for (int i = 7; fracSecBuf[i] == '0'; i--) fracSecBuf[i] = '\0';
}
outStream << "Z";
_snwprintf_s(dateTimeBuffer, sizeof(dateTimeBuffer), L"%sT%sZ%s", dateStr, timeStr, fracSecBuf);
}
return conversions::to_utf8string_internal(outStream.str());
return conversions::to_utf8string_internal(dateTimeBuffer);
#else //LINUX
uint64_t input = m_interval;
uint64_t frac_sec = input % _secondTicks;

Просмотреть файл

@ -9,4 +9,4 @@
//*********************************************************
#pragma once
#define XBOX_SERVICES_API_VERSION_STRING "2021.10.20220111.1"
#define XBOX_SERVICES_API_VERSION_STRING "2021.10.20210928.0"

Просмотреть файл

@ -137,10 +137,7 @@ HRESULT GlobalState::Create(
state->m_achivementsEventProviderName = achievementsProviderName.str();
#endif
#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_XDK || HC_PLATFORM == HC_PLATFORM_GDK
// Generate locales
state->m_locales = utils::generate_locales();
#endif
// GlobalState object has been created and initialized successfully at this point so store it.
(void)AccessHelper(AccessMode::SET, state);
@ -473,9 +470,10 @@ const String& GlobalState::Locales() const noexcept
return m_locales;
}
void GlobalState::OverrideLocales(String&& locales) noexcept
void GlobalState::OverrideLocale(const xsapi_internal_string& locale) noexcept
{
m_locales = std::move(locales);
m_locales = utils::generate_locales(locale);
}
NAMESPACE_MICROSOFT_XBOX_SERVICES_CPP_END

Просмотреть файл

@ -94,7 +94,7 @@ public:
#endif
const String& Locales() const noexcept;
void OverrideLocales(String&& locales) noexcept;
void OverrideLocale(const xsapi_internal_string& locales) noexcept;
// API Type to be used in HTTP requests so they are identifiable in traces.
// TODO consider configuring this with XblInitArgs
@ -120,7 +120,7 @@ private:
Set<uint64_t> m_userExpiredTokens;
UnorderedMap<uint64_t, std::shared_ptr<UserChangeEventHandler>> m_userChangeHandlers;
XblFunctionContext m_nextHandlerToken{ 0 };
XblFunctionContext m_nextHandlerToken{ 1 };
UnorderedMap<XblFunctionContext, std::shared_ptr<ServiceCallRoutedHandler>> m_callRoutedHandlers;
String m_locales{ "en-US" };
@ -137,7 +137,7 @@ private:
#endif
#if HC_PLATFORM == HC_PLATFORM_GDK
XblFunctionContext m_nextAppChangeHandlerToken{ 0 };
XblFunctionContext m_nextAppChangeHandlerToken{ 1 };
xsapi_internal_unordered_map<XblFunctionContext, AppChangeNotificationHandler> m_appChangeNotificationHandlers;
#endif

Просмотреть файл

@ -109,7 +109,6 @@ std::map<xsapi_internal_string, xsapi_internal_string> serviceLocales =
#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_XDK || HC_PLATFORM == HC_PLATFORM_GDK
// Locale api for desktop and xbox
xsapi_internal_vector<xsapi_internal_string> utils::get_locale_list()
{
xsapi_internal_vector<xsapi_internal_string> localeList;
@ -196,11 +195,25 @@ xsapi_internal_vector<xsapi_internal_string> utils::get_locale_list()
#endif
String utils::generate_locales()
String utils::generate_locales(_In_z_ const xsapi_internal_string& overrideLocale)
{
xsapi_internal_vector<xsapi_internal_string> localeList = get_locale_list();
xsapi_internal_vector<xsapi_internal_string> localeList;
// If an overrideLocale is provided, it should be added to the front of the localeList
auto osLocaleList = get_locale_list();
if (!overrideLocale.empty())
{
localeList.push_back(overrideLocale);
localeList.insert(localeList.end(), osLocaleList.begin(), osLocaleList.end());
}
else
{
localeList = osLocaleList;
}
xsapi_internal_vector<xsapi_internal_string> localeFallbackList;
for (auto& locale : localeList)
{
// Build up fallback list, for instance, if the lang is "sd-Arab-PK"

Просмотреть файл

@ -184,7 +184,7 @@ public:
static int utf8_from_char_t(_In_z_ const char_t* inArray, _Out_writes_z_(cchOutArray) char* outArray, _In_ int cchOutArray);
static int char_t_from_utf8(_In_z_ const char* inArray, _Out_writes_z_(cchOutArray) char_t* outArray, _In_ int cchOutArray);
static String generate_locales();
static String generate_locales(_In_z_ const xsapi_internal_string& locale = "");
// Helper function to get locales from GlobalState. Fallback to "en-us" if GlobalState is not initialized
static String get_locales();

Просмотреть файл

@ -255,7 +255,7 @@
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\achievements\achievements_progress_notification.lua">
<DeploymentContent>true</DeploymentContent>
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\achievements\PerformanceTestMockResponse.json">
<DeploymentContent>true</DeploymentContent>
@ -284,8 +284,11 @@
<None Include="$(MSBuildThisFileDirectory)Tests\gdk-gameinvite\game-invite-send.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\gdk-gameinvite\game-mpainvite-send.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\leaderboard\leaderboard-2017.lua">
<DeploymentContent>true</DeploymentContent>
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\leaderboard\leaderboard-bvt.lua">
<DeploymentContent>true</DeploymentContent>
@ -302,6 +305,15 @@
<None Include="$(MSBuildThisFileDirectory)Tests\libHttp\httpPerform.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\libHttp\manualDispatchTest.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\libHttp\websocket_cleanup_while_connected.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\libHttp\websocket_cleanup_while_connecting.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\libHttp\websocket_closehandle_while_connected.lua">
<DeploymentContent>true</DeploymentContent>
</None>
@ -314,6 +326,12 @@
<None Include="$(MSBuildThisFileDirectory)Tests\misc\global_state.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\misc\null_task_queue.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\misc\override_locale.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\misc\simpletest.lua">
<DeploymentContent>true</DeploymentContent>
</None>
@ -428,6 +446,12 @@
<None Include="$(MSBuildThisFileDirectory)Tests\profile\GetUserProfilesForSocialGroupAsync.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\rta\RTAResync.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\rta\RTASuspendResume.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\rta\RTA_activation.lua">
<DeploymentContent>true</DeploymentContent>
</None>
@ -485,7 +509,7 @@
<None Include="$(MSBuildThisFileDirectory)Tests\social\social_manager_remove_realloc.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\social\social_manager_wait.lua" >
<None Include="$(MSBuildThisFileDirectory)Tests\social\social_manager_wait.lua">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\social\social_relationship_changed.lua">

Просмотреть файл

@ -463,6 +463,9 @@
<None Include="$(MSBuildThisFileDirectory)Tests\misc\xbox_live_context.lua">
<Filter>Tests\misc</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\misc\null_task_queue.lua">
<Filter>Tests\misc</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\social\social_manager_filter.lua">
<Filter>Tests\social</Filter>
</None>
@ -605,6 +608,9 @@
<None Include="$(MSBuildThisFileDirectory)Tests\misc\global_state.lua">
<Filter>Tests\misc</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\misc\override_locale.lua">
<Filter>Tests\misc</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\notification\gameinvitenotifications.lua">
<Filter>Tests\notification</Filter>
</None>
@ -795,5 +801,23 @@
<None Include="$(MSBuildThisFileDirectory)Tests\social\social_sub_unsub.lua">
<Filter>Tests\social</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\rta\RTAResync.lua">
<Filter>Tests\rta</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\rta\RTASuspendResume.lua">
<Filter>Tests\rta</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\gdk-gameinvite\game-mpainvite-send.lua">
<Filter>Tests\gdk-gameinvite</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\libHttp\manualDispatchTest.lua">
<Filter>Tests\libHttp</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\libHttp\websocket_cleanup_while_connected.lua">
<Filter>Tests\libHttp</Filter>
</None>
<None Include="$(MSBuildThisFileDirectory)Tests\libHttp\websocket_cleanup_while_connecting.lua">
<Filter>Tests\libHttp</Filter>
</None>
</ItemGroup>
</Project>

Просмотреть файл

@ -95,8 +95,15 @@ int XTaskQueueTerminateWithAsyncWait_Lua(lua_State *L)
int XTaskQueueSetCurrentProcessTaskQueue_Lua(lua_State *L)
{
auto luaHandle = GetUint64FromLua(L, 1, 0);
// CODE SNIPPET START: XTaskQueueSetCurrentProcessTaskQueue
XTaskQueueHandle queue = nullptr;
// CODE SKIP START
if (luaHandle != 0)
{
queue = reinterpret_cast<XTaskQueueHandle>(luaHandle);
}
// CODE SKIP END
XTaskQueueSetCurrentProcessTaskQueue(queue);
// CODE SNIPPET END
@ -112,6 +119,47 @@ int XTaskQueueGetCurrentProcessTaskQueue_Lua(lua_State *L)
// CODE SNIPPET END
LogToFile("XTaskQueueGetCurrentProcessTaskQueue 0x%0.8x", queue);
lua_pushinteger(L, reinterpret_cast<lua_Integer>(queue));
return LuaReturnHR(L, S_OK, 1);
}
std::thread g_dispatchThread{};
bool g_dispatch = false;
int StartManualDispatchThread_Lua(lua_State* L)
{
g_dispatch = true;
g_dispatchThread = std::thread{ []()
{
while (g_dispatch)
{
auto queue = Data()->queue;
bool workAvailable = true;
while (workAvailable)
{
workAvailable = XTaskQueueDispatch(queue, XTaskQueuePort::Work, 0);
}
workAvailable = true;
while (workAvailable)
{
workAvailable = XTaskQueueDispatch(queue, XTaskQueuePort::Completion, 0);
}
pal::Sleep(10);
}
}
};
g_dispatchThread.detach();
return LuaReturnHR(L, S_OK);
}
int StopManualDispatchThread_Lua(lua_State* L)
{
g_dispatch = false;
return LuaReturnHR(L, S_OK);
}
@ -125,7 +173,7 @@ void SetupAPIs_Async()
lua_register(Data()->L, "XTaskQueueTerminateWithAsyncWait", XTaskQueueTerminateWithAsyncWait_Lua);
lua_register(Data()->L, "XTaskQueueSetCurrentProcessTaskQueue", XTaskQueueSetCurrentProcessTaskQueue_Lua);
lua_register(Data()->L, "XTaskQueueGetCurrentProcessTaskQueue", XTaskQueueGetCurrentProcessTaskQueue_Lua);
//lua_register(Data()->L, "XTaskQueueGetPort", XTaskQueueGetPort_Lua);
//lua_register(Data()->L, "XTaskQueueCreateComposite", XTaskQueueCreateComposite_Lua);
//lua_register(Data()->L, "XTaskQueueSubmitCallback", XTaskQueueSubmitCallback_Lua);
@ -134,6 +182,10 @@ void SetupAPIs_Async()
//lua_register(Data()->L, "XTaskQueueUnregisterWaiter", XTaskQueueUnregisterWaiter_Lua);
//lua_register(Data()->L, "XTaskQueueRegisterMonitor", XTaskQueueRegisterMonitor_Lua);
//lua_register(Data()->L, "XTaskQueueUnregisterMonitor", XTaskQueueUnregisterMonitor_Lua);
// Helper methods
lua_register(Data()->L, "StartManualDispatchThread", StartManualDispatchThread_Lua);
lua_register(Data()->L, "StopManualDispatchThread", StopManualDispatchThread_Lua);
}

Просмотреть файл

@ -12,6 +12,9 @@ int HCInitialize_Lua(lua_State *L)
#endif
// CODE SNIPPET END
HCSettingsSetTraceLevel(HCTraceLevel::Verbose);
HCTraceSetTraceToDebugger(true);
LogToFile("HCInitialize: hr=%s", ConvertHR(hr).c_str());
return LuaReturnHR(L, hr);
}
@ -26,6 +29,33 @@ int HCCleanup_Lua(lua_State *L)
return LuaReturnHR(L, S_OK);
}
int HCCleanupAsync_Lua(lua_State* L)
{
CreateQueueIfNeeded();
// CODE SNIPPET START: HCCleanupAsync
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = Data()->queue;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*
HRESULT hr = XAsyncGetStatus(asyncBlock, false);
LogToFile("HCCleanupAsync result: hr=%s", ConvertHR(hr).c_str());
CallLuaFunctionWithHr(hr, "OnHCCleanupAsync"); // CODE SNIP SKIP
};
HRESULT hr = HCCleanupAsync(asyncBlock.get());
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* since the callback will take over ownership.
// If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*
asyncBlock.release();
}
// CODE SNIPPET END
LogToFile("HCCleanupAsync: hr=%s", ConvertHR(hr).c_str());
return LuaReturnHR(L, hr);
}
int HCGetLibVersion_Lua(lua_State *L)
{
@ -368,8 +398,7 @@ int HCWebSocketSetHeader_Lua(lua_State *L)
int HCWebSocketConnectAsync_Lua(lua_State *L)
{
//TODO: websocket.org is no longer in service; find a new server
std::string uri = GetStringFromLua(L, 1, "wss://echo.websocket.org");
std::string uri = GetStringFromLua(L, 1, "ws://localhost:9002");
std::string subProtocol = GetStringFromLua(L, 2, "");
// CODE SNIPPET START: HCWebSocketConnectAsync
@ -533,6 +562,31 @@ int HCMockResponseSetNetworkErrorCode_Lua(lua_State *L)
return LuaReturnHR(L, hr);
}
#if HC_PLATFORM == HC_PLATFORM_GDK
namespace xbox
{
namespace httpclient
{
extern void HCWinHttpSuspend();
extern void HCWinHttpResume();
}
}
int HCWinHttpSuspend_lua(lua_State *L)
{
UNREFERENCED_PARAMETER(L);
xbox::httpclient::HCWinHttpSuspend();
return 0;
}
int HCWinHttpResume_lua(lua_State *L)
{
UNREFERENCED_PARAMETER(L);
xbox::httpclient::HCWinHttpResume();
return 0;
}
#endif
void SetupAPIs_LibHttp()
{
//lua_register(Data()->L, "HCMemSetFunctions", HCMemSetFunctions_Lua);
@ -540,6 +594,7 @@ void SetupAPIs_LibHttp()
lua_register(Data()->L, "HCInitialize", HCInitialize_Lua);
lua_register(Data()->L, "HCCleanup", HCCleanup_Lua);
lua_register(Data()->L, "HCCleanupAsync", HCCleanupAsync_Lua);
lua_register(Data()->L, "HCGetLibVersion", HCGetLibVersion_Lua);
//lua_register(Data()->L, "HCAddCallRoutedHandler", HCAddCallRoutedHandler_Lua);
//lua_register(Data()->L, "HCRemoveCallRoutedHandler", HCRemoveCallRoutedHandler_Lua);
@ -586,5 +641,10 @@ void SetupAPIs_LibHttp()
lua_register(Data()->L, "HCMockAddMock", HCMockAddMock_Lua);
lua_register(Data()->L, "HCMockClearMocks", HCMockClearMocks_Lua);
lua_register(Data()->L, "HCMockResponseSetNetworkErrorCode", HCMockResponseSetNetworkErrorCode_Lua);
#if HC_PLATFORM == HC_PLATFORM_GDK
lua_register(Data()->L, "HCWinHttpSuspend", HCWinHttpSuspend_lua);
lua_register(Data()->L, "HCWinHttpResume", HCWinHttpResume_lua);
#endif
}

Просмотреть файл

@ -10,14 +10,21 @@ void StopSocialManagerDoWorkHelperCpp();
int XblInitialize_Lua(lua_State *L)
{
// Ensure we properly handle a null process queue
XTaskQueueSetCurrentProcessTaskQueue(nullptr);
bool bSetQueue = GetBoolFromLua(L, 1, true);
CreateQueueIfNeeded();
// CODE SNIPPET START: XblInitialize
XblInitArgs args = { };
args.queue = Data()->queue;
// CODE SKIP START
if(!bSetQueue)
{
//Use a default task queue. If the global task queue has been initialized to null,
//trying to use a default task queue for XblInitialize will return E_NO_TASK_QUEUE.
args.queue = nullptr;
}
// CODE SKIP END
#if !(HC_PLATFORM == HC_PLATFORM_XDK || HC_PLATFORM == HC_PLATFORM_UWP)
args.scid = "00000000-0000-0000-0000-000076029b4d";
// Alternate SCID for XboxLiveE2E Stats 2017 config
@ -35,7 +42,11 @@ int XblInitialize_Lua(lua_State *L)
#endif
HRESULT hr = XblInitialize(&args);
// CODE SNIPPET END
XblDisableAssertsForXboxLiveThrottlingInDevSandboxes(XblConfigSetting::ThisCodeNeedsToBeChanged);
if (SUCCEEDED(hr))
{
XblDisableAssertsForXboxLiveThrottlingInDevSandboxes(XblConfigSetting::ThisCodeNeedsToBeChanged);
}
LogToFile("XblInitialize: %s", ConvertHR(hr).c_str());
return LuaReturnHR(L, hr);
@ -206,6 +217,16 @@ int XblAddServiceCallRoutedHandler_Lua(lua_State *L)
return LuaReturnHR(L, S_OK);
}
int XblSetOverrideLocale_Lua(lua_State *L)
{
// CODE SNIPPET START: XblSetOverrideLocale
XblSetOverrideLocale("fr-FR");
// CODE SNIPPET END
LogToFile("XblSetOverrideLocale_Lua");
return LuaReturnHR(L, S_OK);
}
int XblRemoveServiceCallRoutedHandler_Lua(lua_State *L)
{
// CODE SNIPPET START: XblContextSettingsRemoveServiceCallRoutedHandler
@ -341,6 +362,7 @@ void SetupAPIs_Xbl()
lua_register(Data()->L, "XblDisableAssertsForXboxLiveThrottlingInDevSandboxes", XblDisableAssertsForXboxLiveThrottlingInDevSandboxes_Lua);
lua_register(Data()->L, "XblAddServiceCallRoutedHandler", XblAddServiceCallRoutedHandler_Lua);
lua_register(Data()->L, "XblRemoveServiceCallRoutedHandler", XblRemoveServiceCallRoutedHandler_Lua);
lua_register(Data()->L, "XblSetOverrideLocale", XblSetOverrideLocale_Lua);
// errors_c.h
lua_register(Data()->L, "XblGetErrorCondition", XblGetErrorCondition_Lua);

Просмотреть файл

@ -74,8 +74,37 @@ int XGameUiShowSendGameInviteAsync_Lua(lua_State* L)
return LuaReturnHR(L, hr);
}
int XGameUiShowMultiplayerActivityGameInviteAsync_Lua(lua_State* L)
{
#if HC_PLATFORM == HC_PLATFORM_GDK
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = Data()->queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*
//HRESULT hr = XGameUiShowMultiplayerActivityGameInviteResult(asyncBlock);
HRESULT hr = E_NOTIMPL; // requires GDK 2203+
CallLuaFunctionWithHr(hr, "OnXGameUiShowMultiplayerActivityGameInviteAsync");
};
//HRESULT hr = XGameUiShowMultiplayerActivityGameInviteAsync(asyncBlock.get(), Data()->xalUser);
HRESULT hr = E_NOTIMPL; // requires GDK 2203+
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* since the callback will take over ownership.
// If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*
asyncBlock.release();
}
#else
HRESULT hr = S_OK;
#endif
return LuaReturnHR(L, hr);
}
void SetupAPIs_GRTS()
{
lua_register(Data()->L, "XGameUiShowMultiplayerActivityGameInviteAsync", XGameUiShowMultiplayerActivityGameInviteAsync_Lua);
lua_register(Data()->L, "XGameUiShowSendGameInviteAsync", XGameUiShowSendGameInviteAsync_Lua);
lua_register(Data()->L, "XGameUiShowSendGameInviteAsyncToMPMLobby", XGameUiShowSendGameInviteAsyncToMPMLobby_Lua);
}

Просмотреть файл

@ -299,12 +299,15 @@ HRESULT MultiplayerManagerDoWork()
case XblMultiplayerEventType::HostChanged:
{
XblMultiplayerManagerMember member;
XblMultiplayerManagerMember member{};
hr = XblMultiplayerEventArgsMember(events[i].EventArgsHandle, &member);
assert(SUCCEEDED(hr));
XblMultiplayerManagerMember host{};
XblMultiplayerManagerLobbySessionHost(&host);
HRESULT hr2 = XblMultiplayerManagerLobbySessionHost(&host);
(void)(hr2); //suppress unused warning
//If a host leaves and there is no new host, XblMultiplayerEventArgsMember returns 0x80070714 HRESULT_FROM_WIN32(ERROR_RESOURCE_DATA_NOT_FOUND)
//Likewise, since there is no host, XblMultiplayerManagerLobbySessionHost returns 0x80070525 HRESULT_FROM_WIN32(ERROR_NO_SUCH_USER)
assert((SUCCEEDED(hr) && SUCCEEDED(hr2)) || (hr == 0x80070714 && hr2 == 0x80070525));
assert(member.Xuid == host.Xuid);

Просмотреть файл

@ -174,6 +174,19 @@ int XblRealTimeActivitySubscriptionGetId_Lua(lua_State *L)
return LuaReturnHR(L, S_OK);
}
// Declare test hook
HRESULT XblTestHooksTriggerRTAResync();
int XblTestHooksTriggerRTAResync_Lua(lua_State *L)
{
HRESULT hr = S_OK;
#if HC_PLATFORM != HC_PLATFORM_IOS
// For some reason XCode complaining about link errors with this test hook. Disabling on iOS until that can be investigated
hr = XblTestHooksTriggerRTAResync();
#endif
return LuaReturnHR(L, hr);
}
#if !XSAPI_NO_PPL && HC_PLATFORM_IS_MICROSOFT && HC_PLATFORM != HC_PLATFORM_GDK
#include "combaseapi.h"
#include "xsapi-cpp/services.h"
@ -298,6 +311,7 @@ void SetupAPIs_XblRta()
lua_register(Data()->L, "XblRealTimeActivityRemoveResyncHandler", XblRealTimeActivityRemoveResyncHandler_Lua);
lua_register(Data()->L, "XblRealTimeActivitySubscriptionGetState", XblRealTimeActivitySubscriptionGetState_Lua);
lua_register(Data()->L, "XblRealTimeActivitySubscriptionGetId", XblRealTimeActivitySubscriptionGetId_Lua);
lua_register(Data()->L, "XblTestHooksTriggerRTAResync", XblTestHooksTriggerRTAResync_Lua);
#if !XSAPI_NO_PPL && HC_PLATFORM_IS_MICROSOFT && HC_PLATFORM != HC_PLATFORM_GDK
lua_register(Data()->L, "XblRtaMultiplayerInit", XblRtaMultiplayerInit_Lua);

Просмотреть файл

@ -223,6 +223,7 @@ int XblSocialRemoveSocialRelationshipChangedHandler_Lua(lua_State *L)
{
// CODE SNIPPET START: XblSocialRemoveSocialRelationshipChangedHandler_C
HRESULT hr = XblSocialRemoveSocialRelationshipChangedHandler(Data()->xboxLiveContext, state.socialRelationshipChangedHandlerToken);
state.socialRelationshipChangedHandlerToken = 0;
// CODE SNIPPET END

Просмотреть файл

@ -61,7 +61,7 @@ JsonBlobMetadataResult DeserializeResult(std::string blobPathRoot, std::string j
{
metadata.displayName = blobJson["displayName"].GetString();
}
metadata.length = blobJson["size"].GetInt();
metadata.length = static_cast<size_t>(blobJson["size"].GetInt());
metadata.positionInList = index;
index++;
result.m_items.push_back(metadata);

Просмотреть файл

@ -344,6 +344,7 @@ void APIRunner_CleanupLeakCheck()
HRESULT RunTestWithoutCleanup(const std::string& scriptName)
{
Data()->m_stopTest = false;
assert(!scriptName.empty());
bool testLoaded = LoadFile(scriptName);

Просмотреть файл

@ -1,35 +1,35 @@
{
"commands": [
// remove "rem" from lines below to uncomment
"commands": [
// remove "rem" from lines below to uncomment
// multi-device examples
// one device should host, and one device should join
"rem host changetoyouralias",
"rem join changetoyouralias",
"rem runmultidevicetests",
"rem rt mp\\MP_JoinLobbyViaActivity.lua",
"rem rt multiplayerManager\\MPM_JoinLobbyViaActivity.lua",
"rem rt multiplayerManager\\MPM_JoinFixedGameSession.lua",
"rem rt multiplayerManager\\MPM_Match.lua",
"rem rt multiplayerManager\\MPM_Invite.lua",
"rem rt multiplayerManager\\MPM_InviteUI.lua",
// multi-device examples
// one device should host, and one device should join
"rem host changetoyouralias",
"rem join changetoyouralias",
"rem runmultidevicetests",
"rem rt mp\\MP_JoinLobbyViaActivity.lua",
"rem rt multiplayerManager\\MPM_JoinLobbyViaActivity.lua",
"rem rt multiplayerManager\\MPM_JoinFixedGameSession.lua",
"rem rt multiplayerManager\\MPM_Match.lua",
"rem rt multiplayerManager\\MPM_Invite.lua",
"rem rt multiplayerManager\\MPM_InviteUI.lua",
// fault injection
"rem faultinjection options 1 7 1", // faultinjection options failFreq freqChangeSpeed freqChangeAmount
"rem faultinjection user", // "faultinjection" enables specific fault injection on specific features
"rem faultinjection http", // "faultinjection" enables specific fault injection on specific features
// fault injection
"rem faultinjection options 1 7 1", // faultinjection options failFreq freqChangeSpeed freqChangeAmount
"rem faultinjection user", // "faultinjection" enables specific fault injection on specific features
"rem faultinjection http", // "faultinjection" enables specific fault injection on specific features
// mem hook tracking
"rem memtrack true", // result logged after runtests or rt command ends
// mem hook tracking
"rem memtrack true", // result logged after runtests or rt command ends
// single-device command examples
"rem runbarescript misc\\global_state.lua", // "runbarescript" will run the script without any XBL/XAL initializtion for special test needs
"rem rt achievements\\achievements_progress_notification.lua",
"rem rt achievements\\achievements_manager_performance_test.lua",
"rem rt achievements\\achievements_manager_update_achievements.lua",
"rem rt gdk-gameinvite\\game-invite.lua", // rt will run a single test
"rem repeat social\\social_manager_2.lua", // "repeat" will repeat this single test without cleanup forever
"rem loop", // "loop" will loop the entire cmds.json file including cleanup, forever
"runtests" // "runtests" will run all the single-device tests
]
// single-device command examples
"rem runbarescript misc\\global_state.lua", // "runbarescript" will run the script without any XBL/XAL initializtion for special test needs
"rem rt achievements\\achievements_progress_notification.lua",
"rem rt achievements\\achievements_manager_performance_test.lua",
"rem rt achievements\\achievements_manager_update_achievements.lua",
"rem rt gdk-gameinvite\\game-invite.lua", // rt will run a single test
"rem repeat social\\social_manager_2.lua", // "repeat" will repeat this single test without cleanup forever
"rem loop", // "loop" will loop the entire cmds.json file including cleanup, forever
"rts"
]
}

Просмотреть файл

@ -0,0 +1,29 @@
test = require 'u-test'
common = require 'common'
function TestGameMpaInviteSend_Handler()
XblMultiplayerActivitySetActivityAsync()
print("LUA: calling XGameInviteRegisterForEvent")
XGameInviteRegisterForEvent();
print("LUA: called XGameInviteRegisterForEvent")
end
function OnXblMultiplayerActivitySetActivityAsync()
XGameUiShowMultiplayerActivityGameInviteAsync();
end
function OnXGameUiShowMultiplayerActivityGameInviteAsync()
print("XGameUiShowMultiplayerActivityGameInviteAsync completed");
end
function OnXGameInviteRegisterForEvent()
print("LUA: OnXGameInviteRegisterForEvent");
end
test.skip = true
test.TestGameMpaInviteSend = function()
common.init(TestGameMpaInviteSend_Handler)
end

Просмотреть файл

@ -0,0 +1,33 @@
test = require 'u-test'
common = require 'common'
callCompleted=false;
function OnHCHttpCallPerformAsync()
print("HCHttpCallPerformAsync Complete")
HCHttpCallCloseHandle();
callCompleted=true;
SetCheckHR(1);
end
function OnHCCleanupAsync()
print("HCCleanupAsync Complete")
StopManualDispatchThread();
test.assert(callCompleted)
test.stopTest();
end
test.skip = true
test.ManualDispatchTest = function()
HCInitialize();
XTaskQueueCreate()
StartManualDispatchThread();
HCHttpCallCreate();
HCHttpCallRequestSetUrl();
HCHttpCallGetRequestUrl();
HCHttpCallRequestSetRequestBodyString();
HCHttpCallRequestSetHeader();
SetCheckHR(0); -- PerformAsync should fail here
HCHttpCallPerformAsync();
HCCleanupAsync();
end

Просмотреть файл

@ -0,0 +1,28 @@
test = require 'u-test'
common = require 'common'
-- Requires manually running local echo server
test.skip = true
test.websocketCleanupWhileConnected = function()
print("websocketCleanupWhileConnected")
HCInitialize();
HCWebSocketCreate();
HCWebSocketConnectAsync();
end
function OnHCWebSocketConnectAsync()
print("OnHCWebSocketConnectAsync")
HCCleanupAsync();
end
function OnHCWebsocketClosed()
print("OnHCWebsocketClosed");
HCWebSocketCloseHandle();
end
function OnHCCleanupAsync()
print("OnHCCleanupAsync");
test.stopTest();
end

Просмотреть файл

@ -0,0 +1,28 @@
test = require 'u-test'
common = require 'common'
-- Requires manually running local echo server
test.skip = true
test.websocketCleanupWhileConnecting = function()
print("websocketCleanupWhileConnecting")
HCInitialize();
HCWebSocketCreate();
HCWebSocketConnectAsync();
HCCleanupAsync();
end
function OnHCWebSocketConnectAsync()
print("OnHCWebSocketConnectAsync")
HCWebSocketCloseHandle();
end
function OnHCWebsocketClosed()
print("OnHCWebsocketClosed");
end
function OnHCCleanupAsync()
print("OnHCCleanupAsync");
test.stopTest();
end

Просмотреть файл

@ -0,0 +1,27 @@
test = require 'u-test'
-- Ensure we properly handle a null process queue
-- XblInitialize should fail with E_NO_TASK_QUEUE if the process task queue is set to nullptr
-- and we try and get a default queue (XblInitArgs queue is set to nullptr)
test.nullTaskQueue = function()
local taskQueue = XTaskQueueGetCurrentProcessTaskQueue()
XTaskQueueSetCurrentProcessTaskQueue(0)
XalPlatformWebSetEventHandler()
XalPlatformStorageSetEventHandlers()
XalInitialize()
SetCheckHR(0)
XblInitialize(0)
local hr = GetLastError()
print("XblInitialize: hr=" .. hr)
print("Expected: -2147024469 (E_NO_TASK_QUEUE)")
SetCheckHR(1)
test.equal(hr, -2147024469)
if hr ~= -2147024469 then -- -2147024469 == 0x800701AB == E_NO_TASK_QUEUE
print("Failure. hr=" .. hr)
else
print("Succeeded.")
end
XTaskQueueSetCurrentProcessTaskQueue(taskQueue)
test.stopTest();
end

Просмотреть файл

@ -0,0 +1,13 @@
test = require 'u-test'
common = require 'common'
-- Ensure we properly handle overriding locales
function OverrideLocale()
print("OverrideLocale");
XblSetOverrideLocale();
test.stopTest();
end
test.OverrideLocale = function()
common.init(OverrideLocale)
end

Просмотреть файл

@ -0,0 +1,19 @@
test = require 'u-test'
common = require 'common'
function RTAResync_Handler()
StartSocialManagerDoWorkLoop()
XblSocialManagerAddLocalUser()
end
function OnXblSocialManagerDoWork_LocalUserAddedEvent()
XblTestHooksTriggerRTAResync()
Sleep(5000)
XblSocialManagerRemoveLocalUser()
StopSocialManagerDoWorkLoop()
test.stopTest();
end
test.RTAResync = function()
common.init(RTAResync_Handler)
end

Просмотреть файл

@ -0,0 +1,37 @@
test = require 'u-test'
common = require 'common'
function RTASuspendResume_Handler()
isGdk = IsGDKPlatform()
if isGdk then
XblRealTimeActivityAddConnectionStateChangeHandler();
-- Add a real-time handler to force RTA connection
XblSocialAddSocialRelationshipChangedHandler();
else
test.stopTest()
end
end
connectCount = 0
function OnXblRealTimeActivityAddConnectionStateChangeHandler_Connected()
print("RTA connection connected");
connectCount = connectCount + 1
if connectCount == 1 then
--HCWinHttpSuspend();
else
--XblRealTimeActivityRemoveConnectionStateChangeHandler();
--XblSocialRemoveSocialRelationshipChangedHandler();
test.stopTest()
end
end
function OnXblRealTimeActivityAddConnectionStateChangeHandler_Disconnected()
print("RTA connection disconnected");
HCWinHttpResume();
end
test.skip = true;
test.RTASuspendResume = function()
common.init(RTASuspendResume_Handler)
end

Просмотреть файл

@ -0,0 +1,611 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Gaming.Xbox.Scarlett.x64">
<Configuration>Debug</Configuration>
<Platform>Gaming.Xbox.Scarlett.x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Profile|Gaming.Xbox.Scarlett.x64">
<Configuration>Profile</Configuration>
<Platform>Gaming.Xbox.Scarlett.x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Gaming.Xbox.Scarlett.x64">
<Configuration>Release</Configuration>
<Platform>Gaming.Xbox.Scarlett.x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Gaming.Xbox.XboxOne.x64">
<Configuration>Release</Configuration>
<Platform>Gaming.Xbox.XboxOne.x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Profile|Gaming.Xbox.XboxOne.x64">
<Configuration>Profile</Configuration>
<Platform>Gaming.Xbox.XboxOne.x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Gaming.Xbox.XboxOne.x64">
<Configuration>Debug</Configuration>
<Platform>Gaming.Xbox.XboxOne.x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Gaming.Desktop.x64">
<Configuration>Release</Configuration>
<Platform>Gaming.Desktop.x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Profile|Gaming.Desktop.x64">
<Configuration>Profile</Configuration>
<Platform>Gaming.Desktop.x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Gaming.Desktop.x64">
<Configuration>Debug</Configuration>
<Platform>Gaming.Desktop.x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<RootNamespace>APIRunner_GDK</RootNamespace>
<ProjectGuid>{46F31A54-4C74-41A8-B294-26B5689E51EF}</ProjectGuid>
<DefaultLanguage>en-US</DefaultLanguage>
<Keyword>Win32Proj</Keyword>
<!-- - - - -->
<VCProjectVersion>17.0</VCProjectVersion>
<TargetRuntime>Native</TargetRuntime>
<GDKExtLibNames>Xbox.Services.API.C</GDKExtLibNames>
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Condition="Exists($(ATGBuildProps))" Project="$(ATGBuildProps)" />
<Import Project="$(MSBuildThisFileDirectory)..\..\..\Build\xsapi.gdk.bwoi.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<EmbedManifest>false</EmbedManifest>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.Scarlett.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<EmbedManifest>false</EmbedManifest>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Xbox.XboxOne.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<EmbedManifest>false</EmbedManifest>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Xbox.Scarlett.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<EmbedManifest>false</EmbedManifest>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.XboxOne.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
<EmbedManifest>false</EmbedManifest>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.Scarlett.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
<EmbedManifest>false</EmbedManifest>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Desktop.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Desktop.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
<Import Project="..\..\APIExplorer\APIExplorer.Shared.vcxitems" Label="Shared" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.Scarlett.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Xbox.XboxOne.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Xbox.Scarlett.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.XboxOne.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.Scarlett.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Desktop.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Desktop.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'">
<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>
<LibraryPath>$(Console_SdkLibPath)</LibraryPath>
<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>
<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.Scarlett.x64'">
<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>
<LibraryPath>$(Console_SdkLibPath)</LibraryPath>
<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>
<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Xbox.XboxOne.x64'">
<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>
<LibraryPath>$(Console_SdkLibPath)</LibraryPath>
<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>
<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Xbox.Scarlett.x64'">
<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>
<LibraryPath>$(Console_SdkLibPath)</LibraryPath>
<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>
<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.XboxOne.x64'">
<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>
<LibraryPath>$(Console_SdkLibPath)</LibraryPath>
<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>
<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.Scarlett.x64'">
<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>
<LibraryPath>$(Console_SdkLibPath)</LibraryPath>
<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>
<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Desktop.x64'">
<LibraryPath>$(Console_SdkLibPath);$(LibraryPath)</LibraryPath>
<IncludePath>$(Console_SdkIncludeRoot);$(IncludePath)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Desktop.x64'">
<LibraryPath>$(Console_SdkLibPath);$(LibraryPath)</LibraryPath>
<IncludePath>$(Console_SdkIncludeRoot);$(IncludePath)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'">
<LibraryPath>$(Console_SdkLibPath);$(LibraryPath)</LibraryPath>
<IncludePath>$(Console_SdkIncludeRoot);$(IncludePath)</IncludePath>
<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<!-- XSAPI: add between these lines -->
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\DirectXTK12\Inc;Kits\ATGTK;Kits\ATGTelemetry\Gsdk;$(ProjectDir)..\..\APIExplorer\lua\src;$(ProjectDir)..\..\APIExplorer\Shared;$(ProjectDir)..\..\APIExplorer\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>SAMPLE_BUILD_WITH_CPP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Platform)'=='Gaming.Desktop.x64'">SAMPLE_BUILD_FOR_DESKTOP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<PropertyGroup>
<XblTraceBuildInfo>true</XblTraceBuildInfo>
</PropertyGroup>
<PropertyGroup>
<XsapiPropsFile>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), xsapi.staticlib.props))\xsapi.staticlib.props</XsapiPropsFile>
<XsapiEnableCpp>1</XsapiEnableCpp>
</PropertyGroup>
<Import Project="$(XsapiPropsFile)" Condition="Exists($(XsapiPropsFile))" />
<PropertyGroup>
<XsapiPathsFile>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), xsapi.paths.props))\xsapi.paths.props</XsapiPathsFile>
</PropertyGroup>
<Import Project="$(XsapiPathsFile)" Condition="Exists($(XsapiPathsFile))" />
<!-- XSAPI: add between these lines -->
<!-- BEGIN Shared pre-build / post-build events -->
<ItemDefinitionGroup>
<PreBuildEvent>
<Command>copy /Y "$(ProjectDir)APIRunnerSrc143-MicrosoftGame.Config" "$(ProjectDir)MicrosoftGame.Config"</Command>
</PreBuildEvent>
<PostBuildEvent>
<Command>xcopy /Y /I /E "$(ProjectDir)Assets\*.*" "$(TargetDir)Assets" &amp; xcopy /Y /I /E "$(ProjectDir)Media\*.*" "$(TargetDir)Media" &amp; xcopy /Y /I /E "$(ProjectDir)Media\Fonts\*.*" "$(TargetDir)" &amp; xcopy /Y /I /E "$(ProjectDir)Media\Textures\*.*" "$(TargetDir)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<!-- END Shared pre-build / post-build events -->
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.XboxOne.x64'">
<Link>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(XboxExtensionsDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\ATGTelemetry\GDK;Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories />
<ForcedUsingFiles />
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>ATG_ENABLE_TELEMETRY;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Xbox.Scarlett.x64'">
<Link>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(XboxExtensionsDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\ATGTelemetry\GDK;Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>
</AdditionalUsingDirectories>
<ForcedUsingFiles>
</ForcedUsingFiles>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>ATG_ENABLE_TELEMETRY;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Xbox.XboxOne.x64'">
<Link>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(XboxExtensionsDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\ATGTelemetry\GDK;Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories />
<ForcedUsingFiles />
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>ATG_ENABLE_TELEMETRY;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Xbox.Scarlett.x64'">
<Link>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(XboxExtensionsDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\ATGTelemetry\GDK;Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>
</AdditionalUsingDirectories>
<ForcedUsingFiles>
</ForcedUsingFiles>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>ATG_ENABLE_TELEMETRY;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.XboxOne.x64'">
<Link>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(XboxExtensionsDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<ClCompile>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeader>Use</PrecompiledHeader>
<MinimalRebuild>false</MinimalRebuild>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\ATGTelemetry\GDK;Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories />
<ForcedUsingFiles />
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ATG_ENABLE_TELEMETRY;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Xbox.Scarlett.x64'">
<Link>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(XboxExtensionsDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<ClCompile>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeader>Use</PrecompiledHeader>
<MinimalRebuild>false</MinimalRebuild>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\ATGTelemetry\GDK;Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>
</AdditionalUsingDirectories>
<ForcedUsingFiles>
</ForcedUsingFiles>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ATG_ENABLE_TELEMETRY;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Gaming.Desktop.x64'">
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Gaming.Desktop.x64'">
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level4</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Gaming.Desktop.x64'">
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>dbghelp.lib;uuid.lib;$(Console_Libs);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ClCompile>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeader>Use</PrecompiledHeader>
<MinimalRebuild>false</MinimalRebuild>
<AdditionalIncludeDirectories>$(ProjectDir);Kits\LiveTK;Kits\DirectXTK12\Inc;Kits\ATGTK;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<FXCompile>
<ShaderModel>5.1</ShaderModel>
</FXCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="APIRunner.GDK.h" />
<ClInclude Include="Kits\ATGTK\ControllerFont.h" />
<ClInclude Include="Kits\ATGTK\CSVReader.h" />
<ClInclude Include="Kits\ATGTK\d3dx12.h" />
<ClInclude Include="Kits\ATGTK\SampleGUI.h" />
<ClInclude Include="Kits\ATGTK\TextConsole.h" />
<ClInclude Include="Kits\LiveTK\UITwist.h" />
<ClInclude Include="pch.h" />
<ClInclude Include="StepTimer.h" />
<ClInclude Include="DeviceResources.h" />
<ClInclude Include="Kits\LiveTK\LiveInfoHUD.h" />
<ClInclude Include="Kits\LiveTK\LiveResources.h" />
<ClInclude Include="Kits\ATGTK\ATGColors.h" />
<ClInclude Include="Kits\ATGTelemetry\GDK\ATGTelemetry.h" />
<ClInclude Include="Kits\ATGTK\Json.h" />
<ClInclude Include="Kits\ATGTK\StringUtil.h" />
<ClInclude Include="Kits\ATGTK\FindMedia.h" />
<ClInclude Include="UIConstants.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\APIExplorer\Shared\Win\pal.cpp" />
<ClCompile Include="APIRunner.GDK.cpp" />
<ClCompile Include="Kits\ATGTK\SampleGUI.cpp" />
<ClCompile Include="Kits\ATGTK\TextConsole.cpp" />
<ClCompile Include="Kits\LiveTK\UITwist.cpp" />
<ClCompile Include="Main.cpp" />
<ClCompile Include="DeviceResources.cpp" />
<ClCompile Include="Kits\LiveTK\LiveInfoHUD.cpp" />
<ClCompile Include="Kits\LiveTK\LiveResources.cpp" />
<ClCompile Include="Kits\ATGTelemetry\GDK\ATGTelemetry.cpp" />
<ClCompile Include="Kits\ATGTK\StringUtil.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<MGCCompile Include="MicrosoftGame.Config" />
</ItemGroup>
<ItemGroup>
<None Include="Media\Fonts\SegoeUI_18.spritefont">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\SegoeUI_18_Bold.spritefont">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\SegoeUI_18_Italic.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\SegoeUI_22.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\SegoeUI_22_Bold.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\SegoeUI_22_Italic.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\SegoeUI_36.spritefont">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\SegoeUI_36_Bold.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\SegoeUI_36_Italic.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\XboxOneControllerLegend.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Media\Fonts\XboxOneControllerLegendSmall.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="Kits\DirectXTK12\DirectXTK12_GDK_2017.vcxproj">
<Project>{052c4858-c76f-4cea-8a1a-e8e5559e67c2}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<CopyFileToFolders Include="Media\Textures\GamerPic.png">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\Logo.png">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>Assets\%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\SmallLogo.png">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>Assets\%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\SplashScreen.png">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>Assets\%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\StoreLogo.png">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>Assets\%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\Mounted.png">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>Assets\%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\Owned.png">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>Assets\%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\Unmounted.png">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>Assets\%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\SampleUI.csv">
<DeploymentContent>true</DeploymentContent>
<DestinationFileName>Assets\%(Filename)%(Extension)</DestinationFileName>
</CopyFileToFolders>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

Просмотреть файл

@ -0,0 +1,163 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Common">
<UniqueIdentifier>916b6ff9-882e-4cf3-93d5-bea41c3e7cd0</UniqueIdentifier>
</Filter>
<Filter Include="Assets">
<UniqueIdentifier>0c10bab7-ebd0-49b3-89a5-df53a9e36cf4</UniqueIdentifier>
<Extensions>ico;cur;bmp;dds;dlg;fbx;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="ATG Tool Kit">
<UniqueIdentifier>fa3bbbb4-fde4-4785-907e-fbb24dde6491</UniqueIdentifier>
</Filter>
<Filter Include="Xbox Live Tool Kit">
<UniqueIdentifier>83010d7a-d0f5-4911-9741-7529fae5301c</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.h" />
<ClInclude Include="APIRunner.GDK.h" />
<ClInclude Include="StepTimer.h">
<Filter>Common</Filter>
</ClInclude>
<ClInclude Include="DeviceResources.h">
<Filter>Common</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\ATGColors.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\d3dx12.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\FindMedia.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\StringUtil.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\json.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="UIConstants.h" />
<ClInclude Include="Kits\ATGTelemetry\GDK\ATGTelemetry.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\ControllerFont.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\CSVReader.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\SampleGUI.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\LiveTK\UITwist.h">
<Filter>Xbox Live Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\LiveTK\LiveInfoHUD.h">
<Filter>Xbox Live Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\LiveTK\LiveResources.h">
<Filter>Xbox Live Tool Kit</Filter>
</ClInclude>
<ClInclude Include="Kits\ATGTK\TextConsole.h">
<Filter>ATG Tool Kit</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="pch.cpp" />
<ClCompile Include="APIRunner.GDK.cpp" />
<ClCompile Include="Main.cpp" />
<ClCompile Include="DeviceResources.cpp">
<Filter>Common</Filter>
</ClCompile>
<ClCompile Include="Kits\ATGTK\StringUtil.cpp">
<Filter>ATG Tool Kit</Filter>
</ClCompile>
<ClCompile Include="..\..\APIExplorer\Shared\Win\pal.cpp" />
<ClCompile Include="Kits\ATGTelemetry\GDK\ATGTelemetry.cpp">
<Filter>ATG Tool Kit</Filter>
</ClCompile>
<ClCompile Include="Kits\ATGTK\SampleGUI.cpp">
<Filter>ATG Tool Kit</Filter>
</ClCompile>
<ClCompile Include="Kits\LiveTK\UITwist.cpp">
<Filter>Xbox Live Tool Kit</Filter>
</ClCompile>
<ClCompile Include="Kits\LiveTK\LiveInfoHUD.cpp">
<Filter>Xbox Live Tool Kit</Filter>
</ClCompile>
<ClCompile Include="Kits\LiveTK\LiveResources.cpp">
<Filter>Xbox Live Tool Kit</Filter>
</ClCompile>
<ClCompile Include="Kits\ATGTK\TextConsole.cpp">
<Filter>ATG Tool Kit</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="Media\Fonts\SegoeUI_18.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\SegoeUI_18_Bold.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\SegoeUI_18_Italic.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\SegoeUI_22.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\SegoeUI_22_Bold.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\SegoeUI_22_Italic.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\SegoeUI_36.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\SegoeUI_36_Bold.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\SegoeUI_36_Italic.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\XboxOneControllerLegendSmall.spritefont">
<Filter>Assets</Filter>
</None>
<None Include="Media\Fonts\XboxOneControllerLegend.spritefont">
<Filter>Assets</Filter>
</None>
</ItemGroup>
<ItemGroup>
<MGCCompile Include="MicrosoftGame.Config" />
</ItemGroup>
<ItemGroup>
<CopyFileToFolders Include="Media\Textures\GamerPic.png">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\Logo.png">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\SmallLogo.png">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\SplashScreen.png">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\StoreLogo.png">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\Mounted.png">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\Owned.png">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\Unmounted.png">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="Assets\SampleUI.csv" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<Game configVersion="0">
<Identity Name="41336MicrosoftATG.XboxLiveE2E" Publisher="CN=A4954634-DF4B-47C7-AB70-D3215D246AF1" Version="1.7.0.0" />
<ExecutableList>
<Executable Name="APIRunner.143.GDK.Src.exe" Id="Game1"/>
</ExecutableList>
<MSAFullTrust>false</MSAFullTrust>
<MSAAppId>000000004C26FED0</MSAAppId>
<TitleId>76029B4D</TitleId>
<PersistentLocalStorage>
<SizeMB>1024</SizeMB>
</PersistentLocalStorage>
<ShellVisuals
DefaultDisplayName="APIRunner Src GDK Desktop Sample"
PublisherDisplayName="Xbox Advanced Technology Group"
Description="InGameStore Desktop Sample"
Square150x150Logo="Assets\Logo.png"
Square44x44Logo="Assets\SmallLogo.png"
BackgroundColor="#000000"
SplashScreenImage="Assets\SplashScreen.png"
StoreLogo="Assets\StoreLogo.png"
/>
</Game>

Просмотреть файл

@ -2335,7 +2335,7 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]);
}
private:
XblFunctionContext m_token{};
XblFunctionContext m_token{ 0 };
XblContextHandle m_context{ nullptr };
std::function<void(const XblMultiplayerSessionChangeEventArgs&)> m_handler;
};
@ -2367,7 +2367,7 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]);
}
private:
XblFunctionContext m_token{};
XblFunctionContext m_token{ 0 };
XblContextHandle m_context{ nullptr };
std::function<void()> m_handler;
};

Просмотреть файл

@ -171,9 +171,10 @@ R"(
"isBroadcasting": false,
"suggestion": null,
"titleHistory": {
"TitleName": "Forza Horizon 2",
"TitleId": "446059611",
"LastTimePlayed": "2015-01-26T22:54:54.6630000Z"
"titleName": "Forza Horizon 2",
"titleId": "446059611",
"lastTimePlayed": "2015-01-26T22:54:54.6630000Z",
"lastTimePlayedText": "8 months ago"
},
"multiplayerSummary": {
"InMultiplayerSession": 0,
@ -264,12 +265,19 @@ public:
}
else
{
if (response.HasMember("LastTimePlayed") && response["LastTimePlayed"].IsString())
if (response.HasMember("lastTimePlayed") && response["lastTimePlayed"].IsString())
{
time_t jsonTime;
JsonUtils::ExtractJsonTimeT(response, "LastTimePlayed", jsonTime);
JsonUtils::ExtractJsonTimeT(response, "lastTimePlayed", jsonTime);
VERIFY_ARE_EQUAL_UINT(titleHistory.lastTimeUserPlayed, jsonTime);
}
if (response.HasMember("lastTimePlayedText") && response["lastTimePlayedText"].IsString())
{
char jsonTimeStr[XBL_LAST_TIME_PLAYED_CHAR_SIZE];
JsonUtils::ExtractJsonStringToCharArray(response, "lastTimePlayedText", jsonTimeStr, XBL_LAST_TIME_PLAYED_CHAR_SIZE);
VERIFY_ARE_EQUAL_STR(titleHistory.lastTimeUserPlayedText, jsonTimeStr);
}
}
}
@ -431,7 +439,7 @@ public:
jsonResponse.Parse(peoplehubResponse);
JsonValue titleHistory{ rapidjson::kObjectType };
titleHistory.AddMember("LastTimePlayed", JsonValue{ rapidjson::kNullType }, jsonResponse.GetAllocator());
titleHistory.AddMember("lastTimePlayed", JsonValue{ rapidjson::kNullType }, jsonResponse.GetAllocator());
jsonResponse["people"][0]["titleHistory"] = titleHistory.Move();
HttpMock peopleHubMock{ "GET", "https://peoplehub.xboxlive.com/", 200, jsonResponse };

Просмотреть файл

@ -600,7 +600,7 @@ public:
}
std::shared_ptr<XblContext> m_xblContext;
XblFunctionContext m_token;
XblFunctionContext m_token{ 0 };
};
DEFINE_TEST_CASE(TestRTATitlePresence)
@ -666,7 +666,7 @@ public:
}
std::shared_ptr<XblContext> m_xblContext;
XblFunctionContext m_token;
XblFunctionContext m_token{ 0 };
};
DEFINE_TEST_CASE(TestRTADevicePresence)

Просмотреть файл

@ -190,6 +190,7 @@ public:
for (auto& subscription : subscriptions)
{
VERIFY_SUCCEEDED(rtaManager->RemoveSubscription(xboxLiveContext->User(), subscription));
subscription = std::make_shared<TestSubscription>(subscription->Uri);
VERIFY_SUCCEEDED(rtaManager->AddSubscription(xboxLiveContext->User(), subscription));
VERIFY_SUCCEEDED(rtaManager->RemoveSubscription(xboxLiveContext->User(), subscription));
}
@ -221,6 +222,7 @@ public:
monitor.Connecting.Wait();
VERIFY_SUCCEEDED(rtaManager->RemoveSubscription(xboxLiveContext->User(), subscription));
subscription = std::make_shared<TestSubscription>();
websocketConnectCompletion.Set();

Просмотреть файл

@ -34,9 +34,10 @@ const char defaultPeoplehubTemplate[] = R"(
"isBroadcasting": false,
"titleHistory":
{
"TitleName": "Forza Horizon 2",
"TitleId": "1234",
"LastTimePlayed": "2015-01-26T22:54:54.6630000Z"
"titleName": "Forza Horizon 2",
"titleId": "1234",
"lastTimePlayed": "2015-01-26T22:54:54.6630000Z",
"lastTimePlayedText": "8 months ago"
},
"suggestion": null,
"multiplayerSummary": {
@ -570,6 +571,7 @@ public:
// title history tests
VERIFY_IS_TRUE(user->titleHistory.hasUserPlayed);
VERIFY_IS_TRUE(VerifyTime(user->titleHistory.lastTimeUserPlayed, "2015-01-26T22:54:54.6630Z"));
VERIFY_ARE_EQUAL_STR("8 months ago", user->titleHistory.lastTimeUserPlayedText);
}
VERIFY_SUCCEEDED(XblSocialManagerDestroySocialUserGroup(filterGroup));

Просмотреть файл

@ -25,13 +25,25 @@
<XsapiToolset Condition="'$(PlatformToolset)'=='v140'">140</XsapiToolset>
<XsapiToolset Condition="'$(PlatformToolset)'=='v141'">141</XsapiToolset>
<XsapiToolset Condition="'$(PlatformToolset)'=='v142'">142</XsapiToolset>
<XsapiToolset Condition="'$(PlatformToolset)'=='v143'">142</XsapiToolset>
<XsapiToolset Condition="'$(XsapiToolset)'==''">141</XsapiToolset>
<XsapiProjectName Condition="'$(XsapiPlatform)' != 'Android'">Microsoft.Xbox.Services.$(XsapiToolset).$(XsapiPlatform).Cpp</XsapiProjectName>
<XsapiProjectName Condition="'$(XsapiPlatform)' == 'GDK'">Microsoft.Xbox.Services.$(XsapiToolset).GDK.C</XsapiProjectName>
</PropertyGroup>
<PropertyGroup Condition="'$(XsapiBuildFromSource)' == ''">
<XsapiBuildFromSource>true</XsapiBuildFromSource>
<!--Support for older XsapiBuildFromSource prop name that controlled both XSAPI & libHttpClient -->
<PropertyGroup Condition="'$(XsapiBuildFromSource)' != ''">
<XsapiLibBuildFromSource>$(XsapiBuildFromSource)</XsapiLibBuildFromSource>
<LibHttpClientBuildFromSource>$(XsapiBuildFromSource)</LibHttpClientBuildFromSource>
</PropertyGroup>
<!--Turn build from source on when including this file -->
<PropertyGroup Condition="'$(XsapiLibBuildFromSource)' == ''">
<XsapiLibBuildFromSource>true</XsapiLibBuildFromSource>
<XsapiBuildFromSource>true</XsapiBuildFromSource> <!--Support for older GDKs which still use the XsapiBuildFromSource prop -->
</PropertyGroup>
<PropertyGroup Condition="'$(LibHttpClientBuildFromSource)' == ''">
<LibHttpClientBuildFromSource>true</LibHttpClientBuildFromSource>
</PropertyGroup>
<PropertyGroup Condition="'$(XsapiAddProjectReference)' == ''">
@ -71,7 +83,7 @@
<ClCompile>
<PreprocessorDefinitions>_NO_ASYNCRTIMP;_NO_PPLXIMP;_NO_XSAPIIMP;XBL_API_EXPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(XsapiPlatform)' == 'GDK'">HC_WINHTTP_WEBSOCKETS;HC_PLATFORM_IS_MICROSOFT=1;HC_PLATFORM_GDK=4;HC_PLATFORM=HC_PLATFORM_GDK;HC_DATAMODEL=HC_DATAMODEL_LLP64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(XsapiBuildFromSource)' != ''">XSAPI_BUILT_FROM_SOURCE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(XsapiLibBuildFromSource)' != ''">XSAPI_BUILT_FROM_SOURCE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>;$(XsapiInclude);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
@ -102,6 +114,7 @@
<VisualStudioMajorVersion Condition="'$(VisualStudioVersion)' == '14.0'">14</VisualStudioMajorVersion>
<VisualStudioMajorVersion Condition="'$(VisualStudioVersion)' == '15.0'">15</VisualStudioMajorVersion>
<VisualStudioMajorVersion Condition="'$(VisualStudioVersion)' == '16.0'">15</VisualStudioMajorVersion>
<VisualStudioMajorVersion Condition="'$(VisualStudioVersion)' == '17.0'">15</VisualStudioMajorVersion>
</PropertyGroup>
<ItemDefinitionGroup>